[llvm] r192618 - Debug Info: static member DIE creation.

David Blaikie dblaikie at gmail.com
Mon Oct 14 13:46:39 PDT 2013


On Mon, Oct 14, 2013 at 1:33 PM, Manman Ren <manman.ren at gmail.com> wrote:

> Author: mren
> Date: Mon Oct 14 15:33:57 2013
> New Revision: 192618
>
> URL: http://llvm.org/viewvc/llvm-project?rev=192618&view=rev
> Log:
> Debug Info: static member DIE creation.
>
> Clean up creation of static member DIEs.


What was the motivation for this change? I've a sneaking suspicion this
would be a crash not unlike some of the other member-adding code that I was
playing with a week or two ago. If that's the case, a test case would be
appropriate.


> We can create static member DIEs from
> two places, so we call getOrCreateStaticMemberDIE from the two places.
>
> getOrCreateStaticMemberDIE will get or create the context DIE first, then
> it
> will check if the DIE already exists, if not, we create the static member
> DIE
> and add it to the context.
>
> Creation of static member DIEs are handled in a similar way as subprogram
> DIEs.
>
> Modified:
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=192618&r1=192617&r2=192618&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Mon Oct 14
> 15:33:57 2013
> @@ -1112,11 +1112,13 @@ void CompileUnit::constructTypeDIE(DIE &
>            ElemDie = new DIE(dwarf::DW_TAG_friend);
>            addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
>                    dwarf::DW_AT_friend);
> -        } else if (DDTy.isStaticMember())
> -          ElemDie = createStaticMemberDIE(DDTy);
> -        else
> +          Buffer.addChild(ElemDie);
> +        } else if (DDTy.isStaticMember()) {
> +          ElemDie = getOrCreateStaticMemberDIE(DDTy);
> +        } else {
>            ElemDie = createMemberDIE(DDTy);
> -        Buffer.addChild(ElemDie);
> +          Buffer.addChild(ElemDie);
> +        }
>        } else if (Element.isObjCProperty()) {
>          DIObjCProperty Property(Element);
>          ElemDie = new DIE(Property.getTag());
> @@ -1454,11 +1456,7 @@ void CompileUnit::createGlobalVariableDI
>    if (SDMDecl.Verify()) {
>      assert(SDMDecl.isStaticMember() && "Expected static member decl");
>      // We need the declaration DIE that is in the static member's class.
> -    // But that class might not exist in the DWARF yet.
> -    // Creating the class will create the static member decl DIE.
> -    getOrCreateContextDIE(resolve(SDMDecl.getContext()));
> -    VariableDIE = getDIE(SDMDecl);
> -    assert(VariableDIE && "Static member decl has no context?");
> +    VariableDIE = getOrCreateStaticMemberDIE(SDMDecl);
>      IsStaticMember = true;
>    }
>
> @@ -1819,12 +1817,24 @@ DIE *CompileUnit::createMemberDIE(DIDeri
>    return MemberDie;
>  }
>
> -/// createStaticMemberDIE - Create new DIE for C++ static member.
> -DIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) {
> +/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
> +DIE *CompileUnit::getOrCreateStaticMemberDIE(const DIDerivedType DT) {
>    if (!DT.Verify())
>      return NULL;
>
> -  DIE *StaticMemberDIE = new DIE(DT.getTag());
> +  // Construct the context before querying for the existence of the DIE
> in case
> +  // such construction creates the DIE.
> +  DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
> +  assert(ContextDIE && "Static member should belong to a non-CU
> context.");
> +
> +  DIE *StaticMemberDIE = getDIE(DT);
> +  if (StaticMemberDIE)
> +    return StaticMemberDIE;
> +
> +  StaticMemberDIE = new DIE(DT.getTag());
> +  // Add to context owner.
> +  ContextDIE->addChild(StaticMemberDIE);
> +
>    DIType Ty = resolve(DT.getTypeDerivedFrom());
>
>    addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h?rev=192618&r1=192617&r2=192618&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h Mon Oct 14
> 15:33:57 2013
> @@ -329,8 +329,8 @@ private:
>    /// createMemberDIE - Create new member DIE.
>    DIE *createMemberDIE(DIDerivedType DT);
>
> -  /// createStaticMemberDIE - Create new static data member DIE.
> -  DIE *createStaticMemberDIE(DIDerivedType DT);
> +  /// getOrCreateStaticMemberDIE - Create new static data member DIE.
> +  DIE *getOrCreateStaticMemberDIE(DIDerivedType DT);
>
>    /// getLowerBoundDefault - Return the default lower bound for an array.
> If the
>    /// DWARF version doesn't handle the language, return -1.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131014/714da76b/attachment.html>


More information about the llvm-commits mailing list