Alexander Potapenko
2011-Apr-05 12:49 UTC
[LLVMdev] Transition C->bitcode->assembly->object looses frame pointers
Hi James, We've indeed passed the appropriate (and even excessive) flags to the appropriate pipeline parts, that is: llvm-gcc -O1 -fno-omit-frame-pointers -g $in -emit-llvm -S -o $name.ll llc --disable-fp-elim $name.ll -o $name.S g++ -fno-omit-frame-pointers -c $name.S , but that didn't work Alex On Tue, Apr 5, 2011 at 4:40 PM, James Molloy <James.Molloy at arm.com> wrote:> Hi, > > The -disable-fp-elim flag must be passed to the part of the compilation process that actually performs that optimisation pass - when you run clang/llvm-gcc in one invocation, obviously it will just be that invocation, but in your first case it would be the llc command. That is where the IR gets lowered, so is where the FP elimination takes place. > > Pass flags are not, as far as I'm aware, propagated in generated bitcode files - the same flags need to be given to each part of the pipeline. > > Hope this helps, > > James >
Alexander Potapenko
2011-Apr-05 13:01 UTC
[LLVMdev] Transition C->bitcode->assembly->object looses frame pointers
Below is an example of using backtrace() obtained from man backtrace and the test results: $ gcc bt.c -o bt-gcc $ ./bt-gcc 4 backtrace() returned 4 addresses ./bt-gcc() [0x4007e3] ./bt-gcc() [0x400874] ./bt-gcc() [0x40089b] ./bt-gcc() [0x400894] $ llvm-gcc bt.c -o bt-llvm-gcc $ ./bt-llvm-gcc 4 backtrace() returned 4 addresses ./bt-llvm-gcc() [0x40074b] ./bt-llvm-gcc() [0x400809] ./bt-llvm-gcc() [0x400837] ./bt-llvm-gcc() [0x400830] $ llvm-gcc -fno-omit-frame-pointer -g bt.c -emit-llvm -S -o bt.ll $ llc --disable-fp-elim bt.ll -o bt.S $ gcc -fno-omit-frame-pointer bt.S -o bt-llc $ ./bt-llc 4 backtrace() returned 1 addresses ./bt-llc() [0x4007f0] $ cat bt.c #include <execinfo.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> void myfunc3(void) { int j, nptrs; #define SIZE 100 void *buffer[100]; char **strings; nptrs = backtrace(buffer, SIZE); printf("backtrace() returned %d addresses\n", nptrs); /* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO) would produce similar output to the following: */ strings = backtrace_symbols(buffer, nptrs); if (strings == NULL) { perror("backtrace_symbols"); exit(EXIT_FAILURE); } for (j = 0; j < nptrs; j++) printf("%s\n", strings[j]); free(strings); } static void /* "static" means don't export the symbol... */ myfunc2(void) { myfunc3(); } void myfunc(int ncalls) { if (ncalls > 1) myfunc(ncalls - 1); else myfunc2(); } int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "%s num-calls\n", argv[0]); exit(EXIT_FAILURE); } myfunc(atoi(argv[1])); exit(EXIT_SUCCESS); } On Tue, Apr 5, 2011 at 4:49 PM, Alexander Potapenko <ramosian.glider at gmail.com> wrote:> Hi James, > > We've indeed passed the appropriate (and even excessive) flags to the > appropriate pipeline parts, that is: > > llvm-gcc -O1 -fno-omit-frame-pointers -g $in -emit-llvm -S -o $name.ll > llc --disable-fp-elim $name.ll -o $name.S > g++ -fno-omit-frame-pointers -c $name.S > > , but that didn't work > > Alex > > On Tue, Apr 5, 2011 at 4:40 PM, James Molloy <James.Molloy at arm.com> wrote: >> Hi, >> >> The -disable-fp-elim flag must be passed to the part of the compilation process that actually performs that optimisation pass - when you run clang/llvm-gcc in one invocation, obviously it will just be that invocation, but in your first case it would be the llc command. That is where the IR gets lowered, so is where the FP elimination takes place. >> >> Pass flags are not, as far as I'm aware, propagated in generated bitcode files - the same flags need to be given to each part of the pipeline. >> >> Hope this helps, >> >> James >> >
Duncan Sands
2011-Apr-05 13:20 UTC
[LLVMdev] Transition C->bitcode->assembly->object looses frame pointers
Hi Alexander,> We've indeed passed the appropriate (and even excessive) flags to the > appropriate pipeline parts, that is: > > llvm-gcc -O1 -fno-omit-frame-pointers -g $in -emit-llvm -S -o $name.ll > llc --disable-fp-elim $name.ll -o $name.S > g++ -fno-omit-frame-pointers -c $name.S > > , but that didn't workit should work, so at this point I suggest you provide a concrete example in which frame pointers are nonetheless eliminated. Ciao, Duncan.
Duncan Sands
2011-Apr-05 13:45 UTC
[LLVMdev] Transition C->bitcode->assembly->object looses frame pointers
Hi Alexander, while I can reproduce the problem with your example, inspection of the assembler shows that the frame pointer is being correctly set up in each function. So I don't think the problem is due to frame pointer elimination. Ciao, Duncan.
Possibly Parallel Threads
- [LLVMdev] Transition C->bitcode->assembly->object looses frame pointers
- [LLVMdev] Transition C->bitcode->assembly->object looses frame pointers
- [LLVMdev] Transition C->bitcode->assembly->object looses frame pointers
- [LLVMdev] Transition C->bitcode->assembly->object looses frame pointers
- [LLVMdev] Transition C->bitcode->assembly->object looses frame pointers