Joe Groff
2011-Dec-29 20:41 UTC
[LLVMdev] DW_AT_location not getting generated for local variables
I figured out my previous problem with DIBuilder. However, now I can't seem to get the compiler to emit location information for local variables. Here's how my IR looks: --- define i32 @"\01_main"() { init: %exception1 = alloca i8* %0 = alloca i32 %"bar:Int32" = alloca i32 %1 = alloca i32 %2 = alloca i32* br label %code code: ; preds = %init call void @llvm.dbg.declare(metadata !{i32* %"bar:Int32"}, metadata !13) store i32 1, i32* %"bar:Int32", !dbg !16 store i32 1, i32* %1, !dbg !17 %3 = load i32* %"bar:Int32", !dbg !17 %4 = load i32* %1, !dbg !17 %5 = add i32 %3, %4, !dbg !17 store i32 %5, i32* %"bar:Int32", !dbg !17 store i32* %"bar:Int32", i32** %2, !dbg !18 %6 = load i32** %2, !dbg !18 %7 = load i32* %6, !dbg !18 store i32 %7, i32* %0, !dbg !18 br label %return, !dbg !18 return: ; preds = %code %8 = load i32* %0 ret i32 %8 exception: ; No predecessors! unreachable } declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !llvm.dbg.cu = !{!0} !0 = metadata !{i32 720913, i32 0, i32 49572, metadata !"foo.clay", metadata !"", metadata !"clay compiler 0.1git", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] !1 = metadata !{metadata !2} !2 = metadata !{i32 0} !3 = metadata !{metadata !4} !4 = metadata !{metadata !5} !5 = metadata !{i32 720942, i32 0, metadata !6, metadata !"foo", metadata !"foo", metadata !"\01_main", metadata !7, i32 1, metadata !8, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 false, i32 ()* @"\01_main", null, null, metadata !11} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 720953, null, metadata !"__main__", metadata !7, i32 1} ; [ DW_TAG_namespace ] !7 = metadata !{i32 720937, metadata !"foo.clay", metadata !"", null} ; [ DW_TAG_file_type ] !8 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !9, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !9 = metadata !{metadata !10} !10 = metadata !{i32 720932, null, metadata !"Int32", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !11 = metadata !{metadata !12} !12 = metadata !{metadata !13} !13 = metadata !{i32 721152, metadata !14, metadata !"bar", metadata !7, i32 2, metadata !10, i32 0, i32 0} ; [ DW_TAG_auto_variable ] !14 = metadata !{i32 720907, metadata !15, i32 1, i32 1, metadata !7, i32 1} ; [ DW_TAG_lexical_block ] !15 = metadata !{i32 720907, metadata !5, i32 1, i32 1, metadata !7, i32 0} ; [ DW_TAG_lexical_block ] !16 = metadata !{i32 2, i32 2, metadata !14, null} !17 = metadata !{i32 3, i32 3, metadata !14, null} !18 = metadata !{i32 4, i32 4, metadata !14, null} --- And this is what dwarfdump on the compiled object file shows. The TAG_variable entry for 'bar' is missing its AT_location. --- ---------------------------------------------------------------------- File: foo.o (x86_64) ---------------------------------------------------------------------- .debug_info contents: 0x00000000: Compile Unit: length = 0x000000a9 version = 0x0002 abbr_offset = 0x00000000 addr_size = 0x08 (next CU at 0x000000ad) 0x0000000b: TAG_compile_unit [1] * AT_producer( "clay compiler 0.1git" ) AT_language( Unknown DW_LANG constant: 0xc1a4 ) AT_name( "foo.clay" ) AT_entry_pc( 0x0000000000000000 ) AT_stmt_list( 0x00000000 ) 0x00000038: TAG_namespace [2] * AT_sibling( {0x0000005c} ) AT_name( "__main__" ) AT_decl_file( "/Users/joe/Documents/Code/others/clay/foo.clay" ) AT_decl_line( 1 ) 0x00000048: TAG_subprogram [3] AT_MIPS_linkage_name( "_main" ) AT_name( "foo" ) AT_decl_file( "/Users/joe/Documents/Code/others/clay/foo.clay" ) AT_decl_line( 1 ) AT_type( {0x0000005c} ( Int32 ) ) AT_external( 0x01 ) AT_declaration( 0x01 ) 0x0000005b: NULL 0x0000005c: TAG_base_type [4] AT_name( "Int32" ) AT_encoding( DW_ATE_signed ) AT_byte_size( 0x04 ) 0x00000065: TAG_subprogram [5] * AT_specification( {0x00000048} ( "_main" ) ) AT_low_pc( 0x0000000000000020 ) AT_high_pc( 0x0000000000000051 ) AT_frame_base( rbp ) 0x0000007c: TAG_lexical_block [6] * AT_low_pc( 0x0000000000000028 ) AT_high_pc( 0x000000000000004c ) 0x0000008d: TAG_lexical_block [6] * AT_low_pc( 0x0000000000000028 ) AT_high_pc( 0x000000000000004c ) 0x0000009e: TAG_variable [7] AT_name( "bar" ) AT_decl_file( "/Users/joe/Documents/Code/others/clay/foo.clay" ) AT_decl_line( 2 ) AT_type( {0x0000005c} ( Int32 ) ) 0x000000a9: NULL 0x000000aa: NULL 0x000000ab: NULL 0x000000ac: NULL --- Am I using llvm.dbg.declare correctly? Is there something missing in my metadata? -Joe -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20111229/3253161a/attachment.html>
Joe Groff
2012-Jan-02 19:55 UTC
[LLVMdev] DW_AT_location not getting generated for local variables
I found the problem. The llvm.dbg.declare call must have a !dbg tag, otherwise the location info is not generated. Changing the invocation in my original example to "call void @llvm.dbg.declare(metadata !{i32* %"bar:Int32"}, metadata !13), !dbg !16" causes MC to generate the local location as expected. -Joe On Thu, Dec 29, 2011 at 12:41 PM, Joe Groff <arcata at gmail.com> wrote:> I figured out my previous problem with DIBuilder. However, now I can't seem > to get the compiler to emit location information for local variables. Here's > how my IR looks: > > --- > define i32 @"\01_main"() { > init: > %exception1 = alloca i8* > %0 = alloca i32 > %"bar:Int32" = alloca i32 > %1 = alloca i32 > %2 = alloca i32* > br label %code > > code: ; preds = %init > call void @llvm.dbg.declare(metadata !{i32* %"bar:Int32"}, metadata !13) > store i32 1, i32* %"bar:Int32", !dbg !16 > store i32 1, i32* %1, !dbg !17 > %3 = load i32* %"bar:Int32", !dbg !17 > %4 = load i32* %1, !dbg !17 > %5 = add i32 %3, %4, !dbg !17 > store i32 %5, i32* %"bar:Int32", !dbg !17 > store i32* %"bar:Int32", i32** %2, !dbg !18 > %6 = load i32** %2, !dbg !18 > %7 = load i32* %6, !dbg !18 > store i32 %7, i32* %0, !dbg !18 > br label %return, !dbg !18 > > return: ; preds = %code > %8 = load i32* %0 > ret i32 %8 > > exception: ; No predecessors! > unreachable > } > > declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone > > !llvm.dbg.cu = !{!0} > > !0 = metadata !{i32 720913, i32 0, i32 49572, metadata !"foo.clay", metadata > !"", metadata !"clay compiler 0.1git", i1 true, i1 false, metadata !"", i32 > 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ > DW_TAG_compile_unit ] > !1 = metadata !{metadata !2} > !2 = metadata !{i32 0} > !3 = metadata !{metadata !4} > !4 = metadata !{metadata !5} > !5 = metadata !{i32 720942, i32 0, metadata !6, metadata !"foo", metadata > !"foo", metadata !"\01_main", metadata !7, i32 1, metadata !8, i1 false, i1 > true, i32 0, i32 0, i32 0, i32 0, i1 false, i32 ()* @"\01_main", null, null, > metadata !11} ; [ DW_TAG_subprogram ] > !6 = metadata !{i32 720953, null, metadata !"__main__", metadata !7, i32 1} > ; [ DW_TAG_namespace ] > !7 = metadata !{i32 720937, metadata !"foo.clay", metadata !"", null} ; [ > DW_TAG_file_type ] > !8 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, > i32 0, i32 0, i32 0, metadata !9, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] > !9 = metadata !{metadata !10} > !10 = metadata !{i32 720932, null, metadata !"Int32", null, i32 0, i64 32, > i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] > !11 = metadata !{metadata !12} > !12 = metadata !{metadata !13} > !13 = metadata !{i32 721152, metadata !14, metadata !"bar", metadata !7, i32 > 2, metadata !10, i32 0, i32 0} ; [ DW_TAG_auto_variable ] > !14 = metadata !{i32 720907, metadata !15, i32 1, i32 1, metadata !7, i32 1} > ; [ DW_TAG_lexical_block ] > !15 = metadata !{i32 720907, metadata !5, i32 1, i32 1, metadata !7, i32 0} > ; [ DW_TAG_lexical_block ] > !16 = metadata !{i32 2, i32 2, metadata !14, null} > !17 = metadata !{i32 3, i32 3, metadata !14, null} > !18 = metadata !{i32 4, i32 4, metadata !14, null} > --- > > And this is what dwarfdump on the compiled object file shows. The > TAG_variable entry for 'bar' is missing its AT_location. > > --- > ---------------------------------------------------------------------- > File: foo.o (x86_64) > ---------------------------------------------------------------------- > .debug_info contents: > > 0x00000000: Compile Unit: length = 0x000000a9 version = 0x0002 abbr_offset > = 0x00000000 addr_size = 0x08 (next CU at 0x000000ad) > > 0x0000000b: TAG_compile_unit [1] * > AT_producer( "clay compiler 0.1git" ) > AT_language( Unknown DW_LANG constant: 0xc1a4 ) > AT_name( "foo.clay" ) > AT_entry_pc( 0x0000000000000000 ) > AT_stmt_list( 0x00000000 ) > > 0x00000038: TAG_namespace [2] * > AT_sibling( {0x0000005c} ) > AT_name( "__main__" ) > AT_decl_file( > "/Users/joe/Documents/Code/others/clay/foo.clay" ) > AT_decl_line( 1 ) > > 0x00000048: TAG_subprogram [3] > AT_MIPS_linkage_name( "_main" ) > AT_name( "foo" ) > AT_decl_file( > "/Users/joe/Documents/Code/others/clay/foo.clay" ) > AT_decl_line( 1 ) > AT_type( {0x0000005c} ( Int32 ) ) > AT_external( 0x01 ) > AT_declaration( 0x01 ) > > 0x0000005b: NULL > > 0x0000005c: TAG_base_type [4] > AT_name( "Int32" ) > AT_encoding( DW_ATE_signed ) > AT_byte_size( 0x04 ) > > 0x00000065: TAG_subprogram [5] * > AT_specification( {0x00000048} ( "_main" ) ) > AT_low_pc( 0x0000000000000020 ) > AT_high_pc( 0x0000000000000051 ) > AT_frame_base( rbp ) > > 0x0000007c: TAG_lexical_block [6] * > AT_low_pc( 0x0000000000000028 ) > AT_high_pc( 0x000000000000004c ) > > 0x0000008d: TAG_lexical_block [6] * > AT_low_pc( 0x0000000000000028 ) > AT_high_pc( 0x000000000000004c ) > > 0x0000009e: TAG_variable [7] > AT_name( "bar" ) > AT_decl_file( > "/Users/joe/Documents/Code/others/clay/foo.clay" ) > AT_decl_line( 2 ) > AT_type( {0x0000005c} ( Int32 ) ) > > 0x000000a9: NULL > > 0x000000aa: NULL > > 0x000000ab: NULL > > 0x000000ac: NULL > --- > > Am I using llvm.dbg.declare correctly? Is there something missing in my > metadata? > > -Joe
Devang Patel
2012-Jan-03 17:47 UTC
[LLVMdev] DW_AT_location not getting generated for local variables
Hi Joe, On Jan 2, 2012, at 11:55 AM, Joe Groff wrote:> I found the problem. The llvm.dbg.declare call must have a !dbg tag, > otherwise the location info is not generated. Changing the invocation > in my original example to "call void @llvm.dbg.declare(metadata !{i32* > %"bar:Int32"}, metadata !13), !dbg !16" causes MC to generate the > local location as expected.We want to go in direction where metadata !13 (node for DW_TAG_auto_variable) will have enough location information for location so that !dbg is not required for llvm.dbg.declare intrinsic. - Devang> -Joe > > On Thu, Dec 29, 2011 at 12:41 PM, Joe Groff <arcata at gmail.com> wrote: >> I figured out my previous problem with DIBuilder. However, now I can't seem >> to get the compiler to emit location information for local variables. Here's >> how my IR looks: >> >> --- >> define i32 @"\01_main"() { >> init: >> %exception1 = alloca i8* >> %0 = alloca i32 >> %"bar:Int32" = alloca i32 >> %1 = alloca i32 >> %2 = alloca i32* >> br label %code >> >> code: ; preds = %init >> call void @llvm.dbg.declare(metadata !{i32* %"bar:Int32"}, metadata !13) >> store i32 1, i32* %"bar:Int32", !dbg !16 >> store i32 1, i32* %1, !dbg !17 >> %3 = load i32* %"bar:Int32", !dbg !17 >> %4 = load i32* %1, !dbg !17 >> %5 = add i32 %3, %4, !dbg !17 >> store i32 %5, i32* %"bar:Int32", !dbg !17 >> store i32* %"bar:Int32", i32** %2, !dbg !18 >> %6 = load i32** %2, !dbg !18 >> %7 = load i32* %6, !dbg !18 >> store i32 %7, i32* %0, !dbg !18 >> br label %return, !dbg !18 >> >> return: ; preds = %code >> %8 = load i32* %0 >> ret i32 %8 >> >> exception: ; No predecessors! >> unreachable >> } >> >> declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone >> >> !llvm.dbg.cu = !{!0} >> >> !0 = metadata !{i32 720913, i32 0, i32 49572, metadata !"foo.clay", metadata >> !"", metadata !"clay compiler 0.1git", i1 true, i1 false, metadata !"", i32 >> 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ >> DW_TAG_compile_unit ] >> !1 = metadata !{metadata !2} >> !2 = metadata !{i32 0} >> !3 = metadata !{metadata !4} >> !4 = metadata !{metadata !5} >> !5 = metadata !{i32 720942, i32 0, metadata !6, metadata !"foo", metadata >> !"foo", metadata !"\01_main", metadata !7, i32 1, metadata !8, i1 false, i1 >> true, i32 0, i32 0, i32 0, i32 0, i1 false, i32 ()* @"\01_main", null, null, >> metadata !11} ; [ DW_TAG_subprogram ] >> !6 = metadata !{i32 720953, null, metadata !"__main__", metadata !7, i32 1} >> ; [ DW_TAG_namespace ] >> !7 = metadata !{i32 720937, metadata !"foo.clay", metadata !"", null} ; [ >> DW_TAG_file_type ] >> !8 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, >> i32 0, i32 0, i32 0, metadata !9, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] >> !9 = metadata !{metadata !10} >> !10 = metadata !{i32 720932, null, metadata !"Int32", null, i32 0, i64 32, >> i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] >> !11 = metadata !{metadata !12} >> !12 = metadata !{metadata !13} >> !13 = metadata !{i32 721152, metadata !14, metadata !"bar", metadata !7, i32 >> 2, metadata !10, i32 0, i32 0} ; [ DW_TAG_auto_variable ] >> !14 = metadata !{i32 720907, metadata !15, i32 1, i32 1, metadata !7, i32 1} >> ; [ DW_TAG_lexical_block ] >> !15 = metadata !{i32 720907, metadata !5, i32 1, i32 1, metadata !7, i32 0} >> ; [ DW_TAG_lexical_block ] >> !16 = metadata !{i32 2, i32 2, metadata !14, null} >> !17 = metadata !{i32 3, i32 3, metadata !14, null} >> !18 = metadata !{i32 4, i32 4, metadata !14, null} >> --- >> >> And this is what dwarfdump on the compiled object file shows. The >> TAG_variable entry for 'bar' is missing its AT_location. >> >> --- >> ---------------------------------------------------------------------- >> File: foo.o (x86_64) >> ---------------------------------------------------------------------- >> .debug_info contents: >> >> 0x00000000: Compile Unit: length = 0x000000a9 version = 0x0002 abbr_offset >> = 0x00000000 addr_size = 0x08 (next CU at 0x000000ad) >> >> 0x0000000b: TAG_compile_unit [1] * >> AT_producer( "clay compiler 0.1git" ) >> AT_language( Unknown DW_LANG constant: 0xc1a4 ) >> AT_name( "foo.clay" ) >> AT_entry_pc( 0x0000000000000000 ) >> AT_stmt_list( 0x00000000 ) >> >> 0x00000038: TAG_namespace [2] * >> AT_sibling( {0x0000005c} ) >> AT_name( "__main__" ) >> AT_decl_file( >> "/Users/joe/Documents/Code/others/clay/foo.clay" ) >> AT_decl_line( 1 ) >> >> 0x00000048: TAG_subprogram [3] >> AT_MIPS_linkage_name( "_main" ) >> AT_name( "foo" ) >> AT_decl_file( >> "/Users/joe/Documents/Code/others/clay/foo.clay" ) >> AT_decl_line( 1 ) >> AT_type( {0x0000005c} ( Int32 ) ) >> AT_external( 0x01 ) >> AT_declaration( 0x01 ) >> >> 0x0000005b: NULL >> >> 0x0000005c: TAG_base_type [4] >> AT_name( "Int32" ) >> AT_encoding( DW_ATE_signed ) >> AT_byte_size( 0x04 ) >> >> 0x00000065: TAG_subprogram [5] * >> AT_specification( {0x00000048} ( "_main" ) ) >> AT_low_pc( 0x0000000000000020 ) >> AT_high_pc( 0x0000000000000051 ) >> AT_frame_base( rbp ) >> >> 0x0000007c: TAG_lexical_block [6] * >> AT_low_pc( 0x0000000000000028 ) >> AT_high_pc( 0x000000000000004c ) >> >> 0x0000008d: TAG_lexical_block [6] * >> AT_low_pc( 0x0000000000000028 ) >> AT_high_pc( 0x000000000000004c ) >> >> 0x0000009e: TAG_variable [7] >> AT_name( "bar" ) >> AT_decl_file( >> "/Users/joe/Documents/Code/others/clay/foo.clay" ) >> AT_decl_line( 2 ) >> AT_type( {0x0000005c} ( Int32 ) ) >> >> 0x000000a9: NULL >> >> 0x000000aa: NULL >> >> 0x000000ab: NULL >> >> 0x000000ac: NULL >> --- >> >> Am I using llvm.dbg.declare correctly? Is there something missing in my >> metadata? >> >> -Joe > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Possibly Parallel Threads
- [LLVMdev] DW_AT_location not getting generated for local variables
- [LLVMdev] Local variable information in scope
- [LLVMdev] Dropping the DW_ prefix from names in dwarfdump
- [LLVMdev] Dropping the DW_ prefix from names in dwarfdump
- [LLVMdev] Dropping the DW_ prefix from names in dwarfdump