[LLVMdev] Next round of DWARF issues/questions

Talin viridia at gmail.com
Mon Nov 8 22:52:10 PST 2010


On Mon, Nov 8, 2010 at 9:56 AM, Devang Patel <dpatel at apple.com> wrote:

>
> On Nov 6, 2010, at 7:35 PM, Talin wrote:
>
> 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.
>
> 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.
>
> #1) Class sizes coming out as zero.
>
> In my frontend, I call DebugFactory::CreateCompositeTypeEx as follows:
>
>   DICompositeType di = dbgFactory_.CreateCompositeTypeEx(
>       type->typeClass() == Type::Class ? dwarf::DW_TAG_class_type :
> dwarf::DW_TAG_structure_type,
>       dbgCompileUnit_,
>       type->typeDefn()->linkageName().c_str(),
>       genDIFile(type->typeDefn()),
>       getSourceLineNumber(type->typeDefn()->location()),
>       getSizeOfInBits(type->irType()),
>       getAlignOfInBits(type->irType()),
>       getInt64Val(0), 0,
>       DIType(),
>       dbgFactory_.GetOrCreateArray(members.data(), members.size()));
>
> 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):
>
>    !15 = metadata !{i32 589826, metadata !2, metadata !"tart.core.Object",
> metadata !12, i32 9,
>       i64 mul (i64 ptrtoint (%tart.core.Object* getelementptr
> (%tart.core.Object* null, i32 1) to i64), i64 8),
>
>
>
> 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.
>

I'm not sure I understand what you are saying - isn't
llvm::ConstantExpr::getSizeOf() and llvm::ConstantExpr::getAlignOf() the
proper way to compute the size and alignment of a field? If those functions
can't be used for debug info, then that's really inconvenient - I don't want
to have to write my own calculations for it, since (a) I'm likely to get it
wrong in some subtle way, and (b) I'd be duplicating code, since the same
calculations need to be done in a lot of other places.

>
>        i6 4 mul (i64 ptrtoint (%tart.core.Object* getelementptr ({ i1,
> %tart.core.Object }* null, i64 0, i32 1) to i64), i64 8),
>       i64 0, i32 0, null, metadata !16, i32 0, null} ; [ DW_TAG_class_type
> ]
>
> However, when I print out the debugging information via dwarfdump, you can
> see that the size of the object is zero:
>
> <1>< 2233>      DW_TAG_class_type
>                 DW_AT_sibling               <2295>
>                 DW_AT_name                  tart.core.Object
> *                DW_AT_byte_size             0*
>                 DW_AT_decl_file             65
>                 DW_AT_decl_line             9
> <2>< 2258>      DW_TAG_member
>                 DW_AT_name                  __tib
>                 DW_AT_type                  <2228>
>                 DW_AT_decl_file             65
>                 DW_AT_decl_line             10
>                 DW_AT_data_member_location  DW_OP_plus_uconst 0
> <2>< 2274>      DW_TAG_member
>                 DW_AT_name                  __gcstate
>                 DW_AT_type                  <156>
>                 DW_AT_decl_file             65
>                 DW_AT_decl_line             11
>                 DW_AT_data_member_location  DW_OP_plus_uconst 0
>
> In addition, it appears that all of the field offsets are zero as well -
> see the DIEs immediately following the class definition.
>
> #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:
>
> define {} @ReflectionTest.testModuleReflection(%ReflectionTest* %self) gc
> "tart-gc" {
> prologue:
>   %m = alloca %tart.reflect.Module*
>   call void @llvm.dbg.value(metadata !{%ReflectionTest* %self}, i64 0,
> metadata !1176)
>   call void @llvm.dbg.declare(metadata !{%tart.reflect.Module** %m},
> metadata !1177)
>   %0 = bitcast %tart.reflect.Module** %m to i8**, !dbg !1178
>   call void @llvm.gcroot(i8** %0, i8* null), !dbg !1178
>
>
> 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.'
>
>
> Are using -O0? You do not have line number info with dbg.declare intrinsic.
> FWIW, following works ...
>
> define void @foo() nounwind ssp {
> entry:
>   %i = alloca i32, align 4
>   call void @llvm.dbg.declare(metadata !{i32* %i}, metadata !5), !dbg !8
>   store i32 2, i32* %i, align 4, !dbg !9
>   ret void, !dbg !10
> }
>
> -
> Devang
>
>
>


-- 
-- Talin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20101108/30755104/attachment.html>


More information about the llvm-dev mailing list