[LLVMdev] Newbie question(?): How to correctly create debug info, when generating IR
Eric Christopher
echristo at gmail.com
Fri Dec 28 12:37:44 PST 2012
Easiest way is to look at how clang generates debug info. See
clang/lib/CodeGen/CGDebugInfo.cpp.
-eric
On Fri, Dec 28, 2012 at 9:33 AM, Mario de Sousa <msousa at fe.up.pt> wrote:
>
>
> Hello all,
>
>
> Summary & Context:
> -------------------------------
> I am starting to write a front-end for some domain specific programming
> languages. Code generation seems to be working fine.
>
> However, I am having trouble generating debug info, to be used by gdb.
>
>
> The problem:
> --------------------
> I generate a foo.ll file, that is later compiled into an executable foo.
>
> The foo.ll file I generate already contains metadata for datatypes,
> compile
> unit, subprograms, etc...
>
> When debuging foo with ddd, I get the message that the file
> <root_path>/sysdeps/i386/elf/start.S
> does not exist. In other words, the debugger does not seem to know about
> the
> existence of foo.xx, the original source file.
>
> I have compiled a small helloworld.c program, and compared the debug info
> in
> helloworld and foo, using 'readelf --debug-dump'.
>
> I have noticed that in helloworld, the .debug_aranges section has 2
> address
> ranges,
> - one pointing to a DW_TAG_compile_unit referencing the
> /sysdeps/i386/elf/start.S file
> - the other pointing to a DW_TAG_compile_unit with the helloworld,c file.
>
> However, in the foo program, the .debug_aranges section has only 1 address
> range, pointing to a DW_TAG_compile_unit referencing the
> /sysdeps/i386/elf/start.S file.
> The second DW_TAG_compile_unit referencing the foo.xx file is present in
> the
> .debug_info section, but is not being referenced!
>
> Strangely, some information that seems to be an address range referencing
> the
> foo.xx DW_TAG_compile_unit, is present in the .debug_pubtypes section. Why
> is
> this in the wrong section??
>
>
>
> The question:
> =========
>
> Does anybody have any idea what it is I am doing wrong?
>
> The issue seems to be related to generating the info for a CompileUnit.
> Currently, I am doing this:
> dibuilder = new DIBuilder(themodule);
> dibuilder->createCompileUnit(Lang,
> StringRef("foo.xx")), /*finename*/
> StringRef(".") /*Dir*/,
> StringRef("XXX") /*Producer*/,
> false /*isOptimized*/,
> StringRef("") /*Flags*/,
> 0 /*RV: Runtime Version?*/);
> DIFile file = dibuilder->createFile(StringRef("foo.x"), StringRef("."));
> DICompileUnit compile_unit = DICompileUnit(file);
> dibuilder->createFunction(compile_unit /*Scope*/,
> StringRef(function_name), StringRef(function_name),
> file,
> 42 /* line number*/,
> di_func_type,
> false /*isLocalToUnit*/, true /*isDefinition*/,
> 42 /*ScopeLine*/
> );
> ...
> ...
> dibuilder->finalize();
> module->dump();
>
>
> To me, it seems wrong to create two compile units, one with
> dibuilder->createCompileUnit()
> and the other directly
> DICompileUnit compile_unit = DICompileUnit(file);
>
> However, I could not figure out how to get a handle to the compile unit
> generated by dibuilder->createCompileUnit(), in order to pass it to
> dibuilder->createFunction().
>
>
>
>
> I can provide a lot more detail, but I do not want to bore you with
> this.
> If there is any info you need in order to help me out, please just ask,
> and I
> will do my best to provide it.
>
>
>
> Cheers,
>
> Mario.
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121228/694d7163/attachment.html>
More information about the llvm-dev
mailing list