On Mon, Nov 8, 2010 at 9:56 AM, Devang Patel <span dir="ltr"><<a href="mailto:dpatel@apple.com">dpatel@apple.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div style="word-wrap:break-word"><br><div><div class="im"><div>On Nov 6, 2010, at 7:35 PM, Talin wrote:</div><br><blockquote type="cite">After to speaking to Devang and a number of other people at the developer's conference, I was able to make some forward progress on getting debugging to work. I'm now able to actually single-step through my program and set breakpoints, and examine function parameters.<div>



<br></div><div>However, I'm also seeing a lot of new problems which weren't exposed before. After spending the better part of two days working on them, I'd like to describe them here and get some advice on what I might be doing wrong.</div>



<div><br></div><div>#1) Class sizes coming out as zero.</div><div><br></div><div>In my frontend, I call DebugFactory::CreateCompositeTypeEx as follows:</div><div><br></div><div><font face="'courier new', monospace">  DICompositeType di = dbgFactory_.CreateCompositeTypeEx(</font></div>



<div><font face="'courier new', monospace">      type->typeClass() == Type::Class ? dwarf::DW_TAG_class_type : dwarf::DW_TAG_structure_type,</font></div><div><font face="'courier new', monospace">      dbgCompileUnit_,</font></div>



<div><font face="'courier new', monospace">      type->typeDefn()->linkageName().c_str(),</font></div><div><font face="'courier new', monospace">      genDIFile(type->typeDefn()),</font></div>

<div><font face="'courier new', monospace">      getSourceLineNumber(type->typeDefn()->location()),</font></div><div><font face="'courier new', monospace">      getSizeOfInBits(type->irType()),</font></div>



<div><font face="'courier new', monospace">      getAlignOfInBits(type->irType()),</font></div><div><font face="'courier new', monospace">      getInt64Val(0), 0,</font></div>

<div><font face="'courier new', monospace">      DIType(),</font></div><div><font face="'courier new', monospace">      dbgFactory_.GetOrCreateArray(members.data(), members.size()));</font></div>

<div> <br clear="all">The 'getSizeOfInBits()' function and the others like it basically call llvm::ConstantExpr::getSizeOf() and then multiple the result by 8. Looking at the generated IR, I can see that the expressions look correct to me (I've added some line breaks for clarity):</div>



<div><br></div><div><div><font face="'courier new', monospace">   !15 = metadata !{i32 589826, metadata !2, metadata !"tart.core.Object", metadata !12, i32 9,</font></div><div><font face="'courier new', monospace">      i64 mul (i64 ptrtoint (%tart.core.Object* getelementptr (%tart.core.Object* null, i32 1) to i64), i64 8),</font></div>

</div></blockquote><div><br></div><div><br></div></div>This does not work. The DebugInfo accessors uses getSizeInBits() to get an integer for the size. You will have to modify it to get the value.</div><div><div><div></div>

<div class="h5"><font face="'courier new', monospace"><br></font><blockquote type="cite"><div>

<div><font face="'courier new', monospace">      i6 4 mul (i64 ptrtoint (%tart.core.Object* getelementptr ({ i1, %tart.core.Object }* null, i64 0, i32 1) to i64), i64 8),</font></div><div>

<font face="'courier new', monospace">      i64 0, i32 0, null, metadata !16, i32 0, null} ; [ DW_TAG_class_type ]</font></div></div><div><br></div><div>However, when I print out the debugging information via dwarfdump, you can see that the size of the object is zero:</div>



<div><br></div><div><div><font face="'courier new', monospace"><1>< 2233>      DW_TAG_class_type</font></div><div><font face="'courier new', monospace">                DW_AT_sibling               <2295></font></div>



<div><font face="'courier new', monospace">                DW_AT_name                  tart.core.Object</font></div><div><font face="'courier new', monospace"><b>                DW_AT_byte_size             0</b></font></div>



<div><font face="'courier new', monospace">                DW_AT_decl_file             65</font></div><div><font face="'courier new', monospace">                DW_AT_decl_line             9</font></div>

<div><font face="'courier new', monospace"><2>< 2258>      DW_TAG_member</font></div><div><font face="'courier new', monospace">                DW_AT_name                  __tib</font></div>

<div><font face="'courier new', monospace">                DW_AT_type                  <2228></font></div><div><font face="'courier new', monospace">                DW_AT_decl_file             65</font></div>



<div><font face="'courier new', monospace">                DW_AT_decl_line             10</font></div><div><font face="'courier new', monospace">                DW_AT_data_member_location  DW_OP_plus_uconst 0</font></div>



<div><font face="'courier new', monospace"><2>< 2274>      DW_TAG_member</font></div><div><font face="'courier new', monospace">                DW_AT_name                  __gcstate</font></div>



<div><font face="'courier new', monospace">                DW_AT_type                  <156></font></div><div><font face="'courier new', monospace">                DW_AT_decl_file             65</font></div>



<div><font face="'courier new', monospace">                DW_AT_decl_line             11</font></div><div><font face="'courier new', monospace">                DW_AT_data_member_location  DW_OP_plus_uconst 0</font></div>



</div><div><br></div><div>In addition, it appears that all of the field offsets are zero as well - see the DIEs immediately following the class definition.</div><div><br></div><div>#2) I can't seem to get llvm.dbg.declare() to work for local variables, although it appears to work fine for function parameters. For example, look at the following snippet of IR:</div>



<div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><font face="'courier new', monospace">define {} @ReflectionTest.testModuleReflection(%ReflectionTest* %self) gc "tart-gc" {</font></div>



</div><div><div><font face="'courier new', monospace">prologue:</font></div></div><div><div><font face="'courier new', monospace">  %m = alloca %tart.reflect.Module*</font></div>

</div><div><div><font face="'courier new', monospace">  call void @llvm.dbg.value(metadata !{%ReflectionTest* %self}, i64 0, metadata !1176)</font></div></div><div><div><font face="'courier new', monospace">  call void @llvm.dbg.declare(metadata !{%tart.reflect.Module** %m}, metadata !1177)</font></div>



</div><div><div><font face="'courier new', monospace">  %0 = bitcast %tart.reflect.Module** %m to i8**, !dbg !1178</font></div></div><div><div><font face="'courier new', monospace">  call void @llvm.gcroot(i8** %0, i8* null), !dbg !1178</font></div>



</div></blockquote><div><br></div><div>In the debugger, I can examine the value of 'self', however when I attempt to print the value of 'm', gdb reports 'No symbol "m" in current context.'</div>

</blockquote><div><br></div></div></div><div>Are using -O0? You do not have line number info with dbg.declare intrinsic. FWIW, following works ...</div><div><br></div><div><div>define void @foo() nounwind ssp {</div><div>

entry:</div><div>  %i = alloca i32, align 4</div><div>  call void @llvm.dbg.declare(metadata !{i32* %i}, metadata !5), !dbg !8</div><div>  store i32 2, i32* %i, align 4, !dbg !9</div><div>  ret void, !dbg !10</div><div>}</div>

</div></div></div></blockquote><div><br></div><div>Hmm, well I modified the front-end to add the line number on the dbg.declare, and I still have the same problem - the debugger can see the function parameter 'self' but not the local variable 'm'. Here's what the IR looks like for me:</div>

<div><br></div></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">define {} @ReflectionTest.testModuleReflection(%ReflectionTest* %self) gc "tart-gc" {</font></div>

</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">prologue:</font></div></div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  %m = alloca %tart.reflect.Module*, !dbg !1410</font></div>

</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  call void @llvm.dbg.value(metadata !{%ReflectionTest* %self}, i64 0, metadata !1411)</font></div></div>

</div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  call void @llvm.dbg.declare(metadata !{%tart.reflect.Module** %m}, metadata !1412)</font></div></div></div>

<div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  %0 = bitcast %tart.reflect.Module** %m to i8**, !dbg !1413</font></div></div></div><div class="gmail_quote"><div>

<div><font class="Apple-style-span" face="'courier new', monospace">  call void @llvm.gcroot(i8** %0, i8* null), !dbg !1413</font></div></div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  %gc_root = alloca %"tart.reflect.Type[]"*, !dbg !1414</font></div>

</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  %1 = bitcast %"tart.reflect.Type[]"** %gc_root to i8**, !dbg !1414</font></div></div></div>

<div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  call void @llvm.gcroot(i8** %1, i8* null), !dbg !1414</font></div></div></div><div class="gmail_quote"><div><div>

<font class="Apple-style-span" face="'courier new', monospace">  %gc_root25 = alloca %"tart.reflect.Method[]"*, !dbg !1416</font></div></div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  %2 = bitcast %"tart.reflect.Method[]"** %gc_root25 to i8**, !dbg !1416</font></div>

</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  call void @llvm.gcroot(i8** %2, i8* null), !dbg !1416</font></div></div></div><div class="gmail_quote">

<div><div><font class="Apple-style-span" face="'courier new', monospace">  %gc_root29 = alloca %"tart.reflect.Method[]"*, !dbg !1418</font></div></div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  %3 = bitcast %"tart.reflect.Method[]"** %gc_root29 to i8**, !dbg !1418</font></div>

</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  call void @llvm.gcroot(i8** %3, i8* null), !dbg !1418</font></div></div></div><div class="gmail_quote">

<div><div><font class="Apple-style-span" face="'courier new', monospace">  %gc_root33 = alloca %"tart.reflect.Type[]"*, !dbg !1419</font></div></div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  %4 = bitcast %"tart.reflect.Type[]"** %gc_root33 to i8**, !dbg !1419</font></div>

</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  call void @llvm.gcroot(i8** %4, i8* null), !dbg !1419</font></div></div></div><div class="gmail_quote">

<div><div><font class="Apple-style-span" face="'courier new', monospace">  %gc_root36 = alloca %1*, !dbg !1420</font></div></div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  %5 = bitcast %1** %gc_root36 to i8**, !dbg !1420</font></div>

</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  call void @llvm.gcroot(i8** %5, i8* null), !dbg !1420</font></div></div></div><div class="gmail_quote">

<div><div><font class="Apple-style-span" face="'courier new', monospace">  %gc_root40 = alloca %1*, !dbg !1420</font></div></div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  %6 = bitcast %1** %gc_root40 to i8**, !dbg !1420</font></div>

</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  call void @llvm.gcroot(i8** %6, i8* null), !dbg !1420</font></div></div></div><div class="gmail_quote">

<div><div><font class="Apple-style-span" face="'courier new', monospace">  %gc_root43 = alloca %1*, !dbg !1422</font></div></div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  %7 = bitcast %1** %gc_root43 to i8**, !dbg !1422</font></div>

</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  call void @llvm.gcroot(i8** %7, i8* null), !dbg !1422</font></div></div></div><div class="gmail_quote">

<div><div><font class="Apple-style-span" face="'courier new', monospace">  %gc_root47 = alloca %1*, !dbg !1422</font></div></div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  %8 = bitcast %1** %gc_root47 to i8**, !dbg !1422</font></div>

</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  call void @llvm.gcroot(i8** %8, i8* null), !dbg !1422</font></div></div></div><div class="gmail_quote">

<div><div><font class="Apple-style-span" face="'courier new', monospace">  %gc_root50 = alloca %1*, !dbg !1424</font></div></div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  %9 = bitcast %1** %gc_root50 to i8**, !dbg !1424</font></div>

</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  call void @llvm.gcroot(i8** %9, i8* null), !dbg !1424</font></div></div></div><div class="gmail_quote">

<div><div><font class="Apple-style-span" face="'courier new', monospace">  %gc_root54 = alloca %1*, !dbg !1424</font></div></div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  %10 = bitcast %1** %gc_root54 to i8**, !dbg !1424</font></div>

</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="'courier new', monospace">  call void @llvm.gcroot(i8** %10, i8* null), !dbg !1424</font></div></div></div><div class="gmail_quote">

<div><div><font class="Apple-style-span" face="'courier new', monospace">  br label %entry, !dbg !725</font></div></div></div></blockquote><div class="gmail_quote"><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div style="word-wrap:break-word"><div><div></div><div>-</div><div>Devang</div><br></div><br></div></blockquote></div><br><br clear="all"><br>-- <br>-- Talin<br>