I'm trying to write a llvm pass to add debug info into a non-debug-info
bitcode
file. I have been read http://llvm.org/docs/SourceLevelDebugging.html. And I use
DIBuilder to produce the debug metadata. I know I can't get all information
form
ir code . So I add some manual info as test data. After executing my pass, I can
find debug info metadata in my generated bitcode. Those metadata include
"DICompileUnit" , "DIFile", "DIVariable"
,"DISubprogram", "DILexicalBlock".
Just like
------------------------------------------------------------------------------
84 !0 = metadata !{i32 786449, i32 0, i32 4, metadata !"hello.cpp",
metadata
!"/proj/mtk04456", metadata !"clang version", i1 true,
i1 true, metadata
!"flag", i32 0, metadata !1, metadata !1, metadata !1, metadata !1} ;
[
DW_TAG_compile_unit ] [/p roj/mtk04456/hello.cpp] [DW_LANG_C_plus_plus]
------------------------------------------------------------------------------
First problem happen : DICompileUnit doesn't find the last four metadata
(i.e.
enums types, retained types, subprograms, global variables). But
DIBuilder::CreateCompileUnit(...) doesn't need any MDNode* arg. It will find
those four metadata in the function. I don't know why it can't point to
right
reference. So I use MDNode::getOperand(..)->replaceAllUseWith(...) to replace
those four metadata with right MDNode.
But when I compile my new bitcode to elf file. ( clang++ -g hello.bc -o exec)
I can't find my debug info when I use readelf. ( readelf -w exec > log )
There just have one TAG .
Number TAG
1 DW_TAG_compile_unit [no children]
DW_AT_producer DW_FORM_strp
DW_AT_language DW_FORM_data2
DW_AT_name DW_FORM_strp
DW_AT_low_pc DW_FORM_addr
DW_AT_stmt_list DW_FORM_data4
DW_AT_comp_dir DW_FORM_strp
Unknown AT value: 3fe1 DW_FORM_flag
Unknown AT value: 3fe2 DW_FORM_strp
I can't find other dwarf TAG in my object file.
Is the metadata wrong? Or I loss some step when I generate metadata?
If you need my pass's source. Please give me your mail. I will mail it for
you.
Thanks!!
Eric Christopher
2012-Aug-22 22:55 UTC
[LLVMdev] Dwarf debug info misses while clang codegen
On Aug 21, 2012, at 2:16 AM, Kevin <keigi1203 at gmail.com> wrote:> I'm trying to write a llvm pass to add debug info into a non-debug-info bitcode > file. I have been read http://llvm.org/docs/SourceLevelDebugging.html. And I use > DIBuilder to produce the debug metadata. I know I can't get all information form > ir code . So I add some manual info as test data. After executing my pass, I can > find debug info metadata in my generated bitcode. Those metadata include > "DICompileUnit" , "DIFile", "DIVariable" ,"DISubprogram", "DILexicalBlock". > > Just like > ------------------------------------------------------------------------------ > 84 !0 = metadata !{i32 786449, i32 0, i32 4, metadata !"hello.cpp", metadata > !"/proj/mtk04456", metadata !"clang version", i1 true, i1 true, metadata > !"flag", i32 0, metadata !1, metadata !1, metadata !1, metadata !1} ; [ > DW_TAG_compile_unit ] [/p roj/mtk04456/hello.cpp] [DW_LANG_C_plus_plus] > > ------------------------------------------------------------------------------ > > First problem happen : DICompileUnit doesn't find the last four metadata (i.e. > enums types, retained types, subprograms, global variables). But > DIBuilder::CreateCompileUnit(...) doesn't need any MDNode* arg. It will find > those four metadata in the function. I don't know why it can't point to right > reference. So I use MDNode::getOperand(..)->replaceAllUseWith(...) to replace > those four metadata with right MDNode. > > But when I compile my new bitcode to elf file. ( clang++ -g hello.bc -o exec) > I can't find my debug info when I use readelf. ( readelf -w exec > log ) > There just have one TAG . > > Number TAG > 1 DW_TAG_compile_unit [no children] > DW_AT_producer DW_FORM_strp > DW_AT_language DW_FORM_data2 > DW_AT_name DW_FORM_strp > DW_AT_low_pc DW_FORM_addr > DW_AT_stmt_list DW_FORM_data4 > DW_AT_comp_dir DW_FORM_strp > Unknown AT value: 3fe1 DW_FORM_flag > Unknown AT value: 3fe2 DW_FORM_strp > > I can't find other dwarf TAG in my object file. > > Is the metadata wrong? Or I loss some step when I generate metadata? > If you need my pass's source. Please give me your mail. I will mail it for you. > Thanks!!Likely your metadata is incorrect. You should also use replaceOperand not RAUW with metadata. Metadata as defined is to be write once, read many. Also, as I've stated in the past, I have no idea what you're doing or what you're trying to accomplish with it though. -eric
Seemingly Similar Threads
- [LLVMdev] relocation visitor
- [LLVMdev] [lldb-dev] How is variable info retrieved in debugging for executables generated by llvm backend?
- Debug symbols are missing in elf
- [LLVMdev] [lldb-dev] How is variable info retrieved in debugging for executables generated by llvm backend?
- [LLVMdev] How is variable info retrieved in debugging for executables generated by llvm backend?