<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Feb 11, 2015, at 10:21 AM, David Blaikie <<a href="mailto:dblaikie@gmail.com" class="">dblaikie@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><br class=""><div class="gmail_extra"><br class=""><div class="gmail_quote">On Wed, Feb 11, 2015 at 9:45 AM, Adrian Prantl <span dir="ltr" class=""><<a href="mailto:aprantl@apple.com" target="_blank" class="">aprantl@apple.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: adrian<br class="">
Date: Wed Feb 11 11:45:15 2015<br class="">
New Revision: 228855<br class="">
<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=228855&view=rev" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=228855&view=rev</a><br class="">
Log:<br class="">
Fix PR19351. While building up a composite type it is important to use<br class="">
a non-uniqueable temporary node that is only turned into a permanent<br class="">
unique or distinct node after it is finished.<br class="">
Otherwise an intermediate node may get accidentally uniqued with another<br class="">
node as illustrated by the testcase.<br class=""></blockquote><div class=""><br class="">Awesome - thanks!<br class=""> </div></div></div></div></div></blockquote><div><br class=""></div><div>We should probably rename getOrCreateLimitedType() now, as it has nothing to do with limited debug info any more. Any suggestions?</div><div><br class=""></div><div>-- adrian</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br class="">
Paired commit with LLVM.<br class="">
<br class="">
Added:<br class="">
    cfe/trunk/test/CodeGen/debug-info-same-line.c<br class="">
Modified:<br class="">
    cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br class="">
<br class="">
Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=228855&r1=228854&r2=228855&view=diff" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=228855&r1=228854&r2=228855&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)<br class="">
+++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Wed Feb 11 11:45:15 2015<br class="">
@@ -621,6 +621,21 @@ static SmallString<256> getUniqueTagType<br class="">
   return FullName;<br class="">
 }<br class="">
<br class="">
+static llvm::dwarf::Tag getTagForRecord(const RecordDecl *RD) {<br class="">
+   llvm::dwarf::Tag Tag;<br class="">
+  if (RD->isStruct() || RD->isInterface())<br class="">
+    Tag = llvm::dwarf::DW_TAG_structure_type;<br class="">
+  else if (RD->isUnion())<br class="">
+    Tag = llvm::dwarf::DW_TAG_union_type;<br class="">
+  else {<br class="">
+    // FIXME: This could be a struct type giving a default visibility different<br class="">
+    // than C++ class type, but needs llvm metadata changes first.<br class="">
+    assert(RD->isClass());<br class="">
+    Tag = llvm::dwarf::DW_TAG_class_type;<br class="">
+  }<br class="">
+  return Tag;<br class="">
+}<br class="">
+<br class="">
 // Creates a forward declaration for a RecordDecl in the given context.<br class="">
 llvm::DICompositeType<br class="">
 CGDebugInfo::getOrCreateRecordFwdDecl(const RecordType *Ty,<br class="">
@@ -632,20 +647,12 @@ CGDebugInfo::getOrCreateRecordFwdDecl(co<br class="">
   unsigned Line = getLineNumber(RD->getLocation());<br class="">
   StringRef RDName = getClassName(RD);<br class="">
<br class="">
-  llvm::dwarf::Tag Tag;<br class="">
-  if (RD->isStruct() || RD->isInterface())<br class="">
-    Tag = llvm::dwarf::DW_TAG_structure_type;<br class="">
-  else if (RD->isUnion())<br class="">
-    Tag = llvm::dwarf::DW_TAG_union_type;<br class="">
-  else {<br class="">
-    assert(RD->isClass());<br class="">
-    Tag = llvm::dwarf::DW_TAG_class_type;<br class="">
-  }<br class="">
<br class="">
   // Create the type.<br class="">
   SmallString<256> FullName = getUniqueTagTypeName(Ty, CGM, TheCU);<br class="">
-  llvm::DICompositeType RetTy = DBuilder.createReplaceableForwardDecl(<br class="">
-      Tag, RDName, Ctx, DefUnit, Line, 0, 0, 0, FullName);<br class="">
+  llvm::DICompositeType RetTy = DBuilder.createReplaceableCompositeType(<br class="">
+      getTagForRecord(RD), RDName, Ctx, DefUnit, Line, 0, 0, 0,<br class="">
+      llvm::DIDescriptor::FlagFwdDecl, FullName);<br class="">
   ReplaceMap.emplace_back(<br class="">
       std::piecewise_construct, std::make_tuple(Ty),<br class="">
       std::make_tuple(static_cast<llvm::Metadata *>(RetTy)));<br class="">
@@ -1567,7 +1574,8 @@ llvm::DIType CGDebugInfo::CreateTypeDefi<br class="">
   assert(FwdDecl.isCompositeType() &&<br class="">
          "The debug type of a RecordType should be a llvm::DICompositeType");<br class="">
<br class="">
-  if (FwdDecl.isForwardDecl())<br class="">
+  const RecordDecl *D = RD->getDefinition();<br class="">
+  if (!D || !D->isCompleteDefinition())<br class="">
     return FwdDecl;<br class="">
<br class="">
   if (const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD))<br class="">
@@ -1602,6 +1610,10 @@ llvm::DIType CGDebugInfo::CreateTypeDefi<br class="">
   llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys);<br class="">
   DBuilder.replaceArrays(FwdDecl, Elements);<br class="">
<br class="">
+  if (FwdDecl->isTemporary())<br class="">
+    FwdDecl = llvm::DICompositeType(llvm::MDNode::replaceWithPermanent(<br class="">
+      llvm::TempMDNode(FwdDecl.get())));<br class="">
+<br class="">
   RegionMap[Ty->getDecl()].reset(FwdDecl);<br class="">
   return FwdDecl;<br class="">
 }<br class="">
@@ -1653,7 +1665,7 @@ llvm::DIType CGDebugInfo::CreateType(con<br class="">
   // debug type since we won't be able to lay out the entire type.<br class="">
   ObjCInterfaceDecl *Def = ID->getDefinition();<br class="">
   if (!Def || !Def->getImplementation()) {<br class="">
-    llvm::DIType FwdDecl = DBuilder.createReplaceableForwardDecl(<br class="">
+    llvm::DIType FwdDecl = DBuilder.createReplaceableCompositeType(<br class="">
         llvm::dwarf::DW_TAG_structure_type, ID->getName(), TheCU, DefUnit, Line,<br class="">
         RuntimeLang);<br class="">
     ObjCInterfaceCache.push_back(ObjCInterfaceCacheEntry(Ty, FwdDecl, Unit));<br class="">
@@ -1933,9 +1945,9 @@ llvm::DIType CGDebugInfo::CreateEnumType<br class="">
     llvm::DIFile DefUnit = getOrCreateFile(ED->getLocation());<br class="">
     unsigned Line = getLineNumber(ED->getLocation());<br class="">
     StringRef EDName = ED->getName();<br class="">
-    llvm::DIType RetTy = DBuilder.createReplaceableForwardDecl(<br class="">
+    llvm::DIType RetTy = DBuilder.createReplaceableCompositeType(<br class="">
         llvm::dwarf::DW_TAG_enumeration_type, EDName, EDContext, DefUnit, Line,<br class="">
-        0, Size, Align, FullName);<br class="">
+        0, Size, Align, llvm::DIDescriptor::FlagFwdDecl, FullName);<br class="">
     ReplaceMap.emplace_back(<br class="">
         std::piecewise_construct, std::make_tuple(Ty),<br class="">
         std::make_tuple(static_cast<llvm::Metadata *>(RetTy)));<br class="">
@@ -2249,19 +2261,8 @@ llvm::DICompositeType CGDebugInfo::Creat<br class="">
<br class="">
   SmallString<256> FullName = getUniqueTagTypeName(Ty, CGM, TheCU);<br class="">
<br class="">
-  if (RD->isUnion())<br class="">
-    RealDecl = DBuilder.createUnionType(RDContext, RDName, DefUnit, Line, Size,<br class="">
-                                        Align, 0, llvm::DIArray(), 0, FullName);<br class="">
-  else if (RD->isClass()) {<br class="">
-    // FIXME: This could be a struct type giving a default visibility different<br class="">
-    // than C++ class type, but needs llvm metadata changes first.<br class="">
-    RealDecl = DBuilder.createClassType(<br class="">
-        RDContext, RDName, DefUnit, Line, Size, Align, 0, 0, llvm::DIType(),<br class="">
-        llvm::DIArray(), llvm::DIType(), llvm::DIArray(), FullName);<br class="">
-  } else<br class="">
-    RealDecl = DBuilder.createStructType(<br class="">
-        RDContext, RDName, DefUnit, Line, Size, Align, 0, llvm::DIType(),<br class="">
-        llvm::DIArray(), 0, llvm::DIType(), FullName);<br class="">
+  RealDecl = DBuilder.createReplaceableCompositeType(getTagForRecord(RD),<br class="">
+      RDName, RDContext, DefUnit, Line, 0, Size, Align, 0, FullName);<br class="">
<br class="">
   RegionMap[Ty->getDecl()].reset(RealDecl);<br class="">
   TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);<br class="">
<br class="">
Added: cfe/trunk/test/CodeGen/debug-info-same-line.c<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-info-same-line.c?rev=228855&view=auto" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-info-same-line.c?rev=228855&view=auto</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/test/CodeGen/debug-info-same-line.c (added)<br class="">
+++ cfe/trunk/test/CodeGen/debug-info-same-line.c Wed Feb 11 11:45:15 2015<br class="">
@@ -0,0 +1,7 @@<br class="">
+// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm %s -g -o - | FileCheck %s<br class="">
+// Here two temporary nodes are identical (but should not get uniqued) while<br class="">
+// building the full debug type.<br class="">
+typedef struct { long x; } foo; typedef struct {  foo *x; } bar;<br class="">
+// CHECK: [ DW_TAG_structure_type ] [line 4, size 64,<br class="">
+// CHECK: [ DW_TAG_structure_type ] [line 4, size 64,<br class="">
+bar b;<br class="">
<br class="">
<br class="">
_______________________________________________<br class="">
cfe-commits mailing list<br class="">
<a href="mailto:cfe-commits@cs.uiuc.edu" class="">cfe-commits@cs.uiuc.edu</a><br class="">
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank" class="">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br class="">
</blockquote></div><br class=""></div></div>
</div></blockquote></div><br class=""></body></html>