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
Maybe Matching 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?