debugging LLVM generated executables???

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