<div dir="ltr"><br><div class="gmail_extra"><div class="gmail_quote">On Thu, Aug 8, 2013 at 11:40 AM, Eric Christopher <span dir="ltr"><<a href="mailto:echristo@gmail.com" target="_blank">echristo@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: echristo<br>
Date: Thu Aug  8 02:40:37 2013<br>
New Revision: 187963<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=187963&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=187963&view=rev</a><br>
Log:<br>
Make sure that if we're going to attempt to add a type to a DIE that<br>
the type exists.<br>
<br>
Fix up cases where we weren't checking for optional types and add<br>
an assert to addType to make sure we catch this in the future.<br>
<br>
Fix up a testcase that was using the tag for DW_TAG_array_type<br>
when it meant DW_TAG_enumeration_type.<br>
<br>
Modified:<br>
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp<br>
    llvm/trunk/lib/IR/DIBuilder.cpp<br>
    llvm/trunk/lib/IR/DebugInfo.cpp<br>
    llvm/trunk/test/CodeGen/ARM/debug-info-blocks.ll<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=187963&r1=187962&r2=187963&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=187963&r1=187962&r2=187963&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Thu Aug  8 02:40:37 2013<br>
@@ -776,8 +776,7 @@ DIE *CompileUnit::getOrCreateTypeDIE(con<br>
<br>
 /// addType - Add a new type attribute to the specified entity.<br>
 void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {<br>
-  if (!Ty.isType())<br>
-    return;<br>
+  assert(Ty && "Trying to add a type that doesn't exist?");<br></blockquote><div><br></div><div>This assertion fires on GTest sources and TSan unit tests. I'll try to minimize the reproducer shortly.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
   // Check for pre-existence.<br>
   DIEEntry *Entry = getDIEEntry(Ty);<br>
@@ -863,7 +862,8 @@ void CompileUnit::constructTypeDIE(DIE &<br>
<br>
   // Map to main type, void will not have a type.<br>
   DIType FromTy = DTy.getTypeDerivedFrom();<br>
-  addType(&Buffer, FromTy);<br>
+  if (FromTy)<br>
+    addType(&Buffer, FromTy);<br>
<br>
   // Add name if not anonymous or intermediate type.<br>
   if (!Name.empty())<br>
@@ -947,10 +947,11 @@ void CompileUnit::constructTypeDIE(DIE &<br>
   }<br>
     break;<br>
   case dwarf::DW_TAG_subroutine_type: {<br>
-    // Add return type.<br>
+    // Add return type. A void return won't have a type.<br>
     DIArray Elements = CTy.getTypeArray();<br>
     DIDescriptor RTy = Elements.getElement(0);<br>
-    addType(&Buffer, DIType(RTy));<br>
+    if (RTy)<br>
+      addType(&Buffer, DIType(RTy));<br>
<br>
     bool isPrototyped = true;<br>
     // Add arguments.<br>
@@ -1137,7 +1138,11 @@ CompileUnit::getOrCreateTemplateValuePar<br>
     return ParamDIE;<br>
<br>
   ParamDIE = new DIE(VP.getTag());<br>
-  addType(ParamDIE, VP.getType());<br>
+<br>
+  // Add the type if there is one, template template and template parameter<br>
+  // packs will not have a type.<br>
+  if (VP.getType())<br>
+    addType(ParamDIE, VP.getType());<br>
   if (!VP.getName().empty())<br>
     addString(ParamDIE, dwarf::DW_AT_name, VP.getName());<br>
   if (Value *Val = VP.getValue()) {<br>
@@ -1246,13 +1251,14 @@ DIE *CompileUnit::getOrCreateSubprogramD<br>
        Language == dwarf::DW_LANG_ObjC))<br>
     addFlag(SPDie, dwarf::DW_AT_prototyped);<br>
<br>
-  // Add Return Type.<br>
+  // Add Return Type. A void return type will not have a type.<br>
   DICompositeType SPTy = SP.getType();<br>
   assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&<br>
          "the type of a subprogram should be a subroutine");<br>
<br>
   DIArray Args = SPTy.getTypeArray();<br>
-  addType(SPDie, DIType(Args.getElement(0)));<br>
+  if (Args.getElement(0))<br>
+    addType(SPDie, DIType(Args.getElement(0)));<br>
<br>
   unsigned VK = SP.getVirtuality();<br>
   if (VK) {<br>
@@ -1502,9 +1508,8 @@ void CompileUnit::constructArrayTypeDIE(<br>
   if (CTy->isVector())<br>
     addFlag(&Buffer, dwarf::DW_AT_GNU_vector);<br>
<br>
-  // Emit derived type.<br>
+  // Emit the element type.<br>
   addType(&Buffer, CTy->getTypeDerivedFrom());<br>
-  DIArray Elements = CTy->getTypeArray();<br>
<br>
   // Get an anonymous type for index type.<br>
   // FIXME: This type should be passed down from the front end<br>
@@ -1522,6 +1527,7 @@ void CompileUnit::constructArrayTypeDIE(<br>
   }<br>
<br>
   // Add subranges to array type.<br>
+  DIArray Elements = CTy->getTypeArray();<br>
   for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {<br>
     DIDescriptor Element = Elements.getElement(i);<br>
     if (Element.getTag() == dwarf::DW_TAG_subrange_type)<br>
<br>
Modified: llvm/trunk/lib/IR/DIBuilder.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?rev=187963&r1=187962&r2=187963&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?rev=187963&r1=187962&r2=187963&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/IR/DIBuilder.cpp (original)<br>
+++ llvm/trunk/lib/IR/DIBuilder.cpp Thu Aug  8 02:40:37 2013<br>
@@ -759,7 +759,6 @@ DICompositeType DIBuilder::createArrayTy<br>
 /// createVectorType - Create debugging information entry for a vector.<br>
 DICompositeType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,<br>
                                             DIType Ty, DIArray Subscripts) {<br>
-<br>
   // A vector is an array type with the FlagVector flag applied.<br>
   Value *Elts[] = {<br>
     GetTagConstant(VMContext, dwarf::DW_TAG_array_type),<br>
<br>
Modified: llvm/trunk/lib/IR/DebugInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=187963&r1=187962&r2=187963&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=187963&r1=187962&r2=187963&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/IR/DebugInfo.cpp (original)<br>
+++ llvm/trunk/lib/IR/DebugInfo.cpp Thu Aug  8 02:40:37 2013<br>
@@ -483,6 +483,12 @@ bool DICompositeType::Verify() const {<br>
   if (!fieldIsMDNode(DbgNode, 12))<br>
     return false;<br>
<br>
+  // If this is an array type verify that we have a DIType in the derived type<br>
+  // field as that's the type of our element.<br>
+  if (getTag() == dwarf::DW_TAG_array_type)<br>
+    if (!DIType(getTypeDerivedFrom()))<br>
+      return false;<br>
+<br>
   return DbgNode->getNumOperands() >= 10 && DbgNode->getNumOperands() <= 14;<br>
 }<br>
<br>
<br>
Modified: llvm/trunk/test/CodeGen/ARM/debug-info-blocks.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/debug-info-blocks.ll?rev=187963&r1=187962&r2=187963&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/debug-info-blocks.ll?rev=187963&r1=187962&r2=187963&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/test/CodeGen/ARM/debug-info-blocks.ll (original)<br>
+++ llvm/trunk/test/CodeGen/ARM/debug-info-blocks.ll Thu Aug  8 02:40:37 2013<br>
@@ -95,25 +95,25 @@ define hidden void @foobar_func_block_in<br>
 !<a href="http://llvm.dbg.cu" target="_blank">llvm.dbg.cu</a> = !{!0}<br>
<br>
 !0 = metadata !{i32 786449, metadata !153, i32 16, metadata !"Apple clang version 2.1", i1 false, metadata !"", i32 2, metadata !147, metadata !26, metadata !148, null, null, metadata !""} ; [ DW_TAG_compile_unit ]<br>

-!1 = metadata !{i32 786433, metadata !160, metadata !0, metadata !"", i32 248, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !3, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]<br>
+!1 = metadata !{i32 786436, metadata !160, metadata !0, metadata !"", i32 248, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !3, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]<br>
 !2 = metadata !{i32 786473, metadata !160} ; [ DW_TAG_file_type ]<br>
 !3 = metadata !{metadata !4}<br>
 !4 = metadata !{i32 786472, metadata !"Ver1", i64 0} ; [ DW_TAG_enumerator ]<br>
-!5 = metadata !{i32 786433, metadata !160, metadata !0, metadata !"Mode", i32 79, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !7, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]<br>
+!5 = metadata !{i32 786436, metadata !160, metadata !0, metadata !"Mode", i32 79, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !7, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]<br>
 !6 = metadata !{i32 786473, metadata !161} ; [ DW_TAG_file_type ]<br>
 !7 = metadata !{metadata !8}<br>
 !8 = metadata !{i32 786472, metadata !"One", i64 0} ; [ DW_TAG_enumerator ]<br>
-!9 = metadata !{i32 786433, metadata !149, metadata !0, metadata !"", i32 15, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !11, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]<br>
+!9 = metadata !{i32 786436, metadata !149, metadata !0, metadata !"", i32 15, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !11, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]<br>
 !10 = metadata !{i32 786473, metadata !149} ; [ DW_TAG_file_type ]<br>
 !11 = metadata !{metadata !12, metadata !13}<br>
 !12 = metadata !{i32 786472, metadata !"Unknown", i64 0} ; [ DW_TAG_enumerator ]<br>
 !13 = metadata !{i32 786472, metadata !"Known", i64 1} ; [ DW_TAG_enumerator ]<br>
-!14 = metadata !{i32 786433, metadata !150, metadata !0, metadata !"", i32 20, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !16, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]<br>
+!14 = metadata !{i32 786436, metadata !150, metadata !0, metadata !"", i32 20, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !16, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]<br>
 !15 = metadata !{i32 786473, metadata !150} ; [ DW_TAG_file_type ]<br>
 !16 = metadata !{metadata !17, metadata !18}<br>
 !17 = metadata !{i32 786472, metadata !"Single", i64 0} ; [ DW_TAG_enumerator ]<br>
 !18 = metadata !{i32 786472, metadata !"Double", i64 1} ; [ DW_TAG_enumerator ]<br>
-!19 = metadata !{i32 786433, metadata !151, metadata !0, metadata !"", i32 14, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !21, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]<br>
+!19 = metadata !{i32 786436, metadata !151, metadata !0, metadata !"", i32 14, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !21, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]<br>
 !20 = metadata !{i32 786473, metadata !151} ; [ DW_TAG_file_type ]<br>
 !21 = metadata !{metadata !22}<br>
 !22 = metadata !{i32 786472, metadata !"Eleven", i64 0} ; [ DW_TAG_enumerator ]<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">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><br><br clear="all"><div><br></div>-- <br><div>Alexey Samsonov, MSK</div>
</div></div>