<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Oct 14, 2013 at 1:46 PM, David Blaikie <span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote"><div class="im">On Mon, Oct 14, 2013 at 1:33 PM, Manman Ren <span dir="ltr"><<a href="mailto:manman.ren@gmail.com" target="_blank">manman.ren@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: mren<br>
Date: Mon Oct 14 15:33:57 2013<br>
New Revision: 192618<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=192618&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=192618&view=rev</a><br>
Log:<br>
Debug Info: static member DIE creation.<br>
<br>
Clean up creation of static member DIEs. </blockquote><div><br></div></div><div>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.</div>
</div></div></div></blockquote><div><br></div><div>No, I don't see a crash. But I think this is cleaner and it is similar to how we handle subprograms.</div><div>For a DIE that we try to construct in multiple places, using getOrCreate is cleaner.</div>
<div><br></div><div>Manman</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div class="h5">

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">We can create static member DIEs from<br>
two places, so we call getOrCreateStaticMemberDIE from the two places.<br>
<br>
getOrCreateStaticMemberDIE will get or create the context DIE first, then it<br>
will check if the DIE already exists, if not, we create the static member DIE<br>
and add it to the context.<br>
<br>
Creation of static member DIEs are handled in a similar way as subprogram DIEs.<br>
<br>
Modified:<br>
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp<br>
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h<br>
<br>
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=192618&r1=192617&r2=192618&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=192618&r1=192617&r2=192618&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Mon Oct 14 15:33:57 2013<br>
@@ -1112,11 +1112,13 @@ void CompileUnit::constructTypeDIE(DIE &<br>
           ElemDie = new DIE(dwarf::DW_TAG_friend);<br>
           addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),<br>
                   dwarf::DW_AT_friend);<br>
-        } else if (DDTy.isStaticMember())<br>
-          ElemDie = createStaticMemberDIE(DDTy);<br>
-        else<br>
+          Buffer.addChild(ElemDie);<br>
+        } else if (DDTy.isStaticMember()) {<br>
+          ElemDie = getOrCreateStaticMemberDIE(DDTy);<br>
+        } else {<br>
           ElemDie = createMemberDIE(DDTy);<br>
-        Buffer.addChild(ElemDie);<br>
+          Buffer.addChild(ElemDie);<br>
+        }<br>
       } else if (Element.isObjCProperty()) {<br>
         DIObjCProperty Property(Element);<br>
         ElemDie = new DIE(Property.getTag());<br>
@@ -1454,11 +1456,7 @@ void CompileUnit::createGlobalVariableDI<br>
   if (SDMDecl.Verify()) {<br>
     assert(SDMDecl.isStaticMember() && "Expected static member decl");<br>
     // We need the declaration DIE that is in the static member's class.<br>
-    // But that class might not exist in the DWARF yet.<br>
-    // Creating the class will create the static member decl DIE.<br>
-    getOrCreateContextDIE(resolve(SDMDecl.getContext()));<br>
-    VariableDIE = getDIE(SDMDecl);<br>
-    assert(VariableDIE && "Static member decl has no context?");<br>
+    VariableDIE = getOrCreateStaticMemberDIE(SDMDecl);<br>
     IsStaticMember = true;<br>
   }<br>
<br>
@@ -1819,12 +1817,24 @@ DIE *CompileUnit::createMemberDIE(DIDeri<br>
   return MemberDie;<br>
 }<br>
<br>
-/// createStaticMemberDIE - Create new DIE for C++ static member.<br>
-DIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) {<br>
+/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.<br>
+DIE *CompileUnit::getOrCreateStaticMemberDIE(const DIDerivedType DT) {<br>
   if (!DT.Verify())<br>
     return NULL;<br>
<br>
-  DIE *StaticMemberDIE = new DIE(DT.getTag());<br>
+  // Construct the context before querying for the existence of the DIE in case<br>
+  // such construction creates the DIE.<br>
+  DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));<br>
+  assert(ContextDIE && "Static member should belong to a non-CU context.");<br>
+<br>
+  DIE *StaticMemberDIE = getDIE(DT);<br>
+  if (StaticMemberDIE)<br>
+    return StaticMemberDIE;<br>
+<br>
+  StaticMemberDIE = new DIE(DT.getTag());<br>
+  // Add to context owner.<br>
+  ContextDIE->addChild(StaticMemberDIE);<br>
+<br>
   DIType Ty = resolve(DT.getTypeDerivedFrom());<br>
<br>
   addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());<br>
<br>
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h?rev=192618&r1=192617&r2=192618&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h?rev=192618&r1=192617&r2=192618&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h (original)<br>
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h Mon Oct 14 15:33:57 2013<br>
@@ -329,8 +329,8 @@ private:<br>
   /// createMemberDIE - Create new member DIE.<br>
   DIE *createMemberDIE(DIDerivedType DT);<br>
<br>
-  /// createStaticMemberDIE - Create new static data member DIE.<br>
-  DIE *createStaticMemberDIE(DIDerivedType DT);<br>
+  /// getOrCreateStaticMemberDIE - Create new static data member DIE.<br>
+  DIE *getOrCreateStaticMemberDIE(DIDerivedType DT);<br>
<br>
   /// getLowerBoundDefault - Return the default lower bound for an array. If the<br>
   /// DWARF version doesn't handle the language, return -1.<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div></div><br></div></div>
</blockquote></div><br></div></div>