[LLVMdev] Global constructors "get lost" when transforming bitcode files
Jonas Wagner
jonas.wagner at epfl.ch
Thu Jul 3 10:06:52 PDT 2014
Hello,
A strange problem appears when upgrading from release_34 to testing. Some
transformations to bitcode files cause registered global_ctors to not be
called. Here's an example (I've also attached the complete example and
pasted it below):
This works:
clang -fsanitize=address -flto -c -o sum.o sum.c
clang -fsanitize=address -o sum sum.o
This doesn't work:
clang -fsanitize=address -flto -c -o sum.o sum.c
llvm-dis sum.o
llvm-as sum.o.ll -o sum.o
clang -fsanitize=address -o sum sum.o
The second version segfaults when accessing shadow memory, because the
memory has not been initialized, because __asan_init_* was never called.
This is surprising, because in the llvm-disassembly the global constructor
still shows up.
The llvm-dis/llvm-as operation should be a no-op, yet the global_ctors get
lost in the process. This happens also with other operations that affect
global_ctors, e.g., with "opt -insert-gcov-profiling".
The problem does not occur in the release_34 branch, but I have seen it on
both testing and master.
Any idea where this could come from would be much appreciated!
Jonas
testcase:
cat >sum.c <<EOF
#include <stdio.h>
#include <assert.h>
int main() {
const int MAX_SIZE = 100;
int a[MAX_SIZE];
for (int i = 0; i < MAX_SIZE; ++i) {
a[i] = i * i + 4;
}
int n_numbers;
printf("How many numbers should I sum up? ");
scanf("%d", &n_numbers);
int sum = 0;
for (int i = 0; i < n_numbers; ++i) {
sum += a[i];
}
assert(sum >= 0);
printf("The sum is: %d\n", sum);
return 0;
}
EOF
set -ex
rm -f *.o *.ll sum
clang -fsanitize=address -flto -c -o sum.o sum.c
llvm-dis sum.o
llvm-as sum.o.ll -o sum.o
clang -fsanitize=address -o sum sum.o
echo 22 | ./sum
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140703/4e250d66/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: test_ctors.sh
Type: application/x-sh
Size: 638 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140703/4e250d66/attachment.sh>
More information about the llvm-dev
mailing list