Questions about attaching DWARF source code debugging information to generated LLVM-IR.

Hey folks,

I'm wrestling with adding DWARF source code file/line information to my generated LLVM-IR from my Common Lisp compiler.

I think I'm doing everything properly using the llvm::DIBuilder class - but when I load my Common Lisp application and load a compiled bundle into it I don't seem to be able to access the metadata properly.

I can list source lines using "l -f dwarf0.lsp -l 1" but I can't set break-points or do much else.

I've prepared a test case and put it in my public folder on dropbox:

It's a flat text file containing six sections which you can jump to by searching for "SECTION" (all caps).
I've added a few lines at each SECTION entry with thoughts about what might be wrong or what is going on.

If one of you debugging gurus could take a few minutes to take a look at it and give me some pointers I'd really, really appreciate it!



I didn't make it clear that I load my Common Lisp application into "lldb" and then load a compiled bundle into my application using dlopen (I'm on OS X and I'm generating a kind of shared library called a "bundle"). Once everything is loaded, the functions from the bundle are accessible to my Common Lisp environment but I don't seem to be able to access the bundle metadata properly from lldb.



Hmm, are you using a version of LLVM with asserts enabled (I.e. A debug

I cut-and-paste your IR into a text file and ran (a debug version of) llc
on it, which caused the following assertion failure that seems related to
some DWARF mishap:

llc: ../lib/CodeGen/AsmPrinter/DwarfDebug.cpp:1400: void
llvm::DwarfDebug::beginFunction(const llvm::MachineFunction*): Assertion
`TheCU && "Unable to find compile unit!"' failed.
0 llc 0x00000000011d3ad6
1 llc 0x00000000011d3d5d
2 llc 0x00000000011d37ac
3 0x00007fa2aa6a7cb0
4 0x00007fa2a9afd425 gsignal + 53
5 0x00007fa2a9b00b8b abort + 379
6 0x00007fa2a9af60ee
7 0x00007fa2a9af6192
8 llc 0x00000000009b0799
9 llc 0x000000000099a197
10 llc 0x000000000077b14d
11 llc 0x0000000000cd7b81
12 llc 0x00000000010d2aa0
13 llc 0x00000000010d2c9b
14 llc 0x00000000010d3013
15 llc 0x00000000010d3628
16 llc 0x00000000010d383b
17 llc 0x000000000042781c
18 llc 0x00000000004267cd
19 0x00007fa2a9ae876d __libc_start_main + 237
20 llc 0x0000000000426129
Stack dump:
0. Program arguments: ./llvm/build-cmake/bin/llc christian.ll -o christian
1. Running pass 'Function Pass Manager' on module 'christian.ll'.
2. Running pass 'X86 Assembly / Object Emitter' on function '@repl'
Aborted (core dumped)

It looks like something is wrong with one of your function definition.
Glancing at the IR though, I can't tell what though..

(PS. I attached a debugger and got a partial dump of the MachineFunction
that causes the assertion in beginFunction. See attached.

Good luck,

machine_assert.txt (4.35 KB)


Thanks for taking time out to look at this.

I cut-and-pasted the IR into a text file and ran the following version of llc on it using "llc -filetype=obj dwarf1_paste.ll" and it didn't report any errors.
I'll take a closer look at the CompileUnit DWARF entry in the IR.

But in the mean-time, which version of llc are you using?

I'm using:

  LLVM version 3.3svn
  Optimized build with assertions.
  Built Apr 21 2013 (20:22:16).
  Default target: x86_64-apple-darwin12.3.0
  Host CPU: corei7-avx

  Registered Targets:
    arm - ARM
    cpp - C++ backend
    hexagon - Hexagon
    mblaze - MBlaze
    mips - Mips
    mips64 - Mips64 [experimental]
    mips64el - Mips64el [experimental]
    mipsel - Mipsel
    msp430 - MSP430 [experimental]
    nvptx - NVIDIA PTX 32-bit
    nvptx64 - NVIDIA PTX 64-bit
    ppc32 - PowerPC 32
    ppc64 - PowerPC 64
    sparc - Sparc
    sparcv9 - Sparc V9
    thumb - Thumb
    x86 - 32-bit X86: Pentium-Pro and above
    x86-64 - 64-bit X86: EM64T and AMD64
    xcore - XCore