[LLVMdev] DWARF not being generated for local variable, though MD looks right(?)

Matt Pharr matt.pharr at gmail.com
Fri Apr 29 17:49:57 PDT 2011


I'm running into a problem with generating debugging information that I'm not sure how to debug; I'd be happy to have some suggestions about where to start digging in.

In short, I believe that I'm correctly generating debug info (with DIBuilder, which has so far been quite nice!), and a scan of the meta-data in the IR looks generally right.  However, if I run dwarfdump on my object file, I'm not seeing any DIE information for the local variables.  I'm wondering what might be going wrong along the way.

More specifically, given a program that is equivalent to the following in C:

float foo() {
	float y = 1234;
	return y;
}

My compiler generates the following IR (pay no attention to the ___ at the end of "foo"..):

define i32 @foo___(<4 x i32>) nounwind readnone alwaysinline {
entry:
  tail call void @llvm.dbg.value(metadata !6, i64 0, metadata !4), !dbg !7
  ret i32 1234
}

declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone

!llvm.dbg.sp = !{!0}
!llvm.dbg.lv.foo___ = !{!4}

!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"foo", metadata !"foo", metadata !"foo___", metadata !1, i32 4, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 true, i32 (<4 x i32>)* @foo___, null, null} ; [ DW_TAG_subprogram ]
!1 = metadata !{i32 589865, metadata !"a.c", metadata !"/Users/mmp/foo/", metadata !2} ; [ DW_TAG_file_type ]
!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"a.c", metadata !"/Users/mmp/foo", metadata !"foo", i1 true, i1 true, metadata !"-g", i32 0} ; [ DW_TAG_compile_unit ]
!3 = metadata !{i32 589860, metadata !2, metadata !"int32", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]
!4 = metadata !{i32 590080, metadata !5, metadata !"y", metadata !1, i32 5, metadata !3, i32 0} ; [ DW_TAG_auto_variable ]
!5 = metadata !{i32 589835, metadata !0, i32 4, i32 0, metadata !1, i32 0} ; [ DW_TAG_lexical_block ]
!6 = metadata !{i32 1234}
!7 = metadata !{i32 5, i32 0, metadata !5, null}

However, if I run dwarfdump on the object file, there's nothing there for the variable 'y' (see below).  Note that I am able to get correct DWARF output for global variables, so presumably the rest of my infrastructure isn't totally broken.

Any guidance about how best to proceed would be greatly appreciated!

Thanks,
-matt


----------------------------------------------------------------------
 File: a.o (x86_64)
----------------------------------------------------------------------
.debug_info contents:

0x00000000: Compile Unit: length = 0x00000043  version = 0x0002  abbr_offset = 0x00000000  addr_size = 0x08  (next CU at 0x00000047)

0x0000000b: TAG_compile_unit [1] *
             AT_producer( "volta" )
             AT_language( DW_LANG_C99 )
             AT_name( "a.c" )
             AT_entry_pc( 0x0000000000000000 )
             AT_stmt_list( 0x00000000 )
             AT_comp_dir( "/Users/mmp/foo" )
             AT_APPLE_optimized( 0x01 )
             AT_APPLE_flags( "-g" )

0x00000039:     TAG_subprogram [2]  
                 AT_name( "foo" )
                 AT_MIPS_linkage_name( "foo___" )
                 AT_external( 0x01 )

0x00000046:     NULL






More information about the llvm-dev mailing list