Hi everyone,
I have a question that seems simple, but has been confounding me for several hours. I'd like to debug a binary produced with LLVM. For the life of me, I can't get any symbols into gdb and llvm-db won't even start the program nor load any useful information about it. Here's my current strategy (which isn't working):
llvm-gcc -g -O0 -c -emit-llvm helloworld.c
opt -load=mypass.dylib -mypass < helloworld.o > helloworld-mypass.o
llvm-ld -native -o helloworld helloworld-mypass.o
gdb helloworld
I've tried several variations on the above.
Any suggestions?
Note, what is critical about the whole thing is I must run "mypass" on the bytecode file. I'm hoping there's an easy fix, that will both allow me to run my arbitrary pass, and debug a program.
thanks,
-Mark
Hi everyone again,
I did discover the following works (see below). However, does anyone know of the "proper" way with LLVM?
llvm-gcc -g -c -emit-llvm helloworld.c
opt -load=mypass.dylib -mypass < helloworld.o > helloworld-mypass.o
llc -fast -f -o helloworld.s helloworld-mypass.o
as -o helloworld-prime.o
gcc -o helloworld helloworld-prime.o
gdb helloworld
I think you probably need to pass -O0 to llvm-ld. The link-time optimizations are probably killing your debug info.
--Owen
I think you probably need to pass -O0 to llvm-ld. The link-time optimizations are probably killing your debug info.
No dice. Doing it this way makes gdb spew out this:
warning: Could not find object file "/var/folders/cQ/cQ+L3+RP2RWOpE+8ZNQdPU+++TI/-Tmp-//ccVljWhn.o" - no debug information available for "defs.h"
And then no debug symbols are available.
I also discovered a major down side to the "solution" I found last night. While the line number data does get successfully transfered into gdb, I cannot inspect any variables. Those appear to have been lost.
Any other suggestions out there?
thanks!
-mark
Just re-sending this. Anyone have any suggestions on how to proceed with debugging LLVM produced executables? The problem appears to be register-allocated variables. Global variables and syntax lines do get symbols using the llc / as method I described below. -Mark
Just re-sending this. Anyone have any suggestions on how to proceed
with debugging LLVM produced executables? The problem appears to be
register-allocated variables. Global variables and syntax lines do
get symbols using the llc / as method I described below. -Mark
Have you considered adding your pass to llvm-backend.cpp in llvmgcc? This would allow you to use llvm-gcc from the command line, without having to invoke individual tools directly.
-Chris
I could do that, but before I venture there, if I did that, could I have llvm-gcc produce native object files (not LLVM bytecode) that way (using my pass)? thanks, -Mark
I could do that, but before I venture there, if I did that, could I
have llvm-gcc produce native object files (not LLVM bytecode) that way
(using my pass)? thanks, -Mark
Yes, of course. 'llvm-gcc -O0 -g foo.c -o foo.o -c' would compile to native .o file using your pass.
-Chris