<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 12, 2015 at 5:20 PM, Duncan P. N. Exon Smith <span dir="ltr"><<a href="mailto:dexonsmith@apple.com" target="_blank">dexonsmith@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dexonsmith<br>
Date: Thu Feb 12 19:20:38 2015<br>
New Revision: 229009<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=229009&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=229009&view=rev</a><br>
Log:<br>
AsmWriter/Bitcode: MDDerivedType and MDCompositeType<br>
<br>
Added:<br>
    llvm/trunk/test/Assembler/invalid-mdcompositetype-missing-tag.ll<br>
    llvm/trunk/test/Assembler/invalid-mdderivedtype-missing-basetype.ll<br>
    llvm/trunk/test/Assembler/invalid-mdderivedtype-missing-tag.ll<br>
Modified:<br>
    llvm/trunk/include/llvm/Bitcode/LLVMBitCodes.h<br>
    llvm/trunk/lib/AsmParser/LLParser.cpp<br>
    llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp<br>
    llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp<br>
    llvm/trunk/lib/IR/AsmWriter.cpp<br>
    llvm/trunk/test/Assembler/debug-info.ll<br>
<br>
Modified: llvm/trunk/include/llvm/Bitcode/LLVMBitCodes.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Bitcode/LLVMBitCodes.h?rev=229009&r1=229008&r2=229009&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Bitcode/LLVMBitCodes.h?rev=229009&r1=229008&r2=229009&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Bitcode/LLVMBitCodes.h (original)<br>
+++ llvm/trunk/include/llvm/Bitcode/LLVMBitCodes.h Thu Feb 12 19:20:38 2015<br>
@@ -151,7 +151,9 @@ namespace bitc {<br>
     METADATA_SUBRANGE      = 13,  // [distinct, count, lo]<br>
     METADATA_ENUMERATOR    = 14,  // [distinct, value, name?]<br>
     METADATA_BASIC_TYPE    = 15,  // [distinct, tag, name, size, align, enc]<br>
-    METADATA_FILE          = 16   // [distinct, filename, directory]<br>
+    METADATA_FILE          = 16,  // [distinct, filename, directory]<br>
+    METADATA_DERIVED_TYPE  = 17,  // [distinct, ...]<br>
+    METADATA_COMPOSITE_TYPE= 18   // [distinct, ...]<br></blockquote><div><br>Any reason the schema isn't enumerated here?<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
   };<br>
<br>
   // The constants block (CONSTANTS_BLOCK_ID) describes emission for each<br>
<br>
Modified: llvm/trunk/lib/AsmParser/LLParser.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=229009&r1=229008&r2=229009&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=229009&r1=229008&r2=229009&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/AsmParser/LLParser.cpp (original)<br>
+++ llvm/trunk/lib/AsmParser/LLParser.cpp Thu Feb 12 19:20:38 2015<br>
@@ -3233,12 +3233,61 @@ bool LLParser::ParseMDBasicType(MDNode *<br>
   return false;<br>
 }<br>
<br>
+/// ParseMDDerivedType:<br>
+///   ::= !MDDerivedType(tag: DW_TAG_pointer_type, name: "int", file: !0,<br>
+///                      line: 7, scope: !1, baseType: !2, size: 32,<br>
+///                      align: 32, offset: 0, flags: 0, extraData: !3)<br>
 bool LLParser::ParseMDDerivedType(MDNode *&Result, bool IsDistinct) {<br>
-  return TokError("unimplemented parser");<br>
+#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED)                                    \<br>
+  REQUIRED(tag, DwarfTagField, );                                              \<br>
+  OPTIONAL(name, MDStringField, );                                             \<br>
+  OPTIONAL(file, MDField, );                                                   \<br>
+  OPTIONAL(line, LineField, );                                                 \<br>
+  OPTIONAL(scope, MDField, );                                                  \<br>
+  REQUIRED(baseType, MDField, );                                               \<br>
+  OPTIONAL(size, MDUnsignedField, (0, UINT32_MAX));                            \<br>
+  OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX));                           \<br>
+  OPTIONAL(offset, MDUnsignedField, (0, UINT32_MAX));                          \<br>
+  OPTIONAL(flags, MDUnsignedField, (0, UINT32_MAX));                           \<br>
+  OPTIONAL(extraData, MDField, );<br>
+  PARSE_MD_FIELDS();<br>
+#undef VISIT_MD_FIELDS<br>
+<br>
+  Result = GET_OR_DISTINCT(MDDerivedType,<br>
+                           (Context, tag.Val, name.Val, file.Val, line.Val,<br>
+                            scope.Val, baseType.Val, size.Val, align.Val,<br>
+                            offset.Val, flags.Val, extraData.Val));<br>
+  return false;<br>
 }<br>
+<br>
 bool LLParser::ParseMDCompositeType(MDNode *&Result, bool IsDistinct) {<br>
-  return TokError("unimplemented parser");<br>
+#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED)                                    \<br>
+  REQUIRED(tag, DwarfTagField, );                                              \<br>
+  OPTIONAL(name, MDStringField, );                                             \<br>
+  OPTIONAL(file, MDField, );                                                   \<br>
+  OPTIONAL(line, LineField, );                                                 \<br>
+  OPTIONAL(scope, MDField, );                                                  \<br>
+  OPTIONAL(baseType, MDField, );                                               \<br>
+  OPTIONAL(size, MDUnsignedField, (0, UINT32_MAX));                            \<br>
+  OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX));                           \<br>
+  OPTIONAL(offset, MDUnsignedField, (0, UINT32_MAX));                          \<br>
+  OPTIONAL(flags, MDUnsignedField, (0, UINT32_MAX));                           \<br>
+  OPTIONAL(elements, MDField, );                                               \<br>
+  OPTIONAL(runtimeLang, MDUnsignedField, (0, UINT32_MAX));                     \<br>
+  OPTIONAL(vtableHolder, MDField, );                                           \<br>
+  OPTIONAL(templateParams, MDField, );                                         \<br>
+  OPTIONAL(identifier, MDStringField, );<br>
+  PARSE_MD_FIELDS();<br>
+#undef VISIT_MD_FIELDS<br>
+<br>
+  Result = GET_OR_DISTINCT(<br>
+      MDCompositeType,<br>
+      (Context, tag.Val, name.Val, file.Val, line.Val, scope.Val, baseType.Val,<br>
+       size.Val, align.Val, offset.Val, flags.Val, elements.Val,<br>
+       runtimeLang.Val, vtableHolder.Val, templateParams.Val, identifier.Val));<br>
+  return false;<br>
 }<br>
+<br>
 bool LLParser::ParseMDSubroutineType(MDNode *&Result, bool IsDistinct) {<br>
   return TokError("unimplemented parser");<br>
 }<br>
<br>
Modified: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=229009&r1=229008&r2=229009&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=229009&r1=229008&r2=229009&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)<br>
+++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Thu Feb 12 19:20:38 2015<br>
@@ -1183,12 +1183,17 @@ std::error_code BitcodeReader::ParseMeta<br>
<br>
   SmallVector<uint64_t, 64> Record;<br>
<br>
+  auto getMD =<br>
+      [&](unsigned ID) -> Metadata *{ return MDValueList.getValueFwdRef(ID); };<br>
+  auto getMDOrNull = [&](unsigned ID) -> Metadata *{<br>
+    if (ID)<br>
+      return getMD(ID - 1);<br>
+    return nullptr;<br>
+  };<br>
   auto getMDString = [&](unsigned ID) -> MDString *{<br>
     // This requires that the ID is not really a forward reference.  In<br>
     // particular, the MDString must already have been resolved.<br>
-    if (ID)<br>
-      return cast<MDString>(MDValueList.getValueFwdRef(ID - 1));<br>
-    return nullptr;<br>
+    return cast_or_null<MDString>(getMDOrNull(ID));<br>
   };<br>
<br>
 #define GET_OR_DISTINCT(CLASS, DISTINCT, ARGS)                                 \<br>
@@ -1382,6 +1387,36 @@ std::error_code BitcodeReader::ParseMeta<br>
           NextMDValueNo++);<br>
       break;<br>
     }<br>
+    case bitc::METADATA_DERIVED_TYPE: {<br>
+      if (Record.size() != 12)<br>
+        return Error("Invalid record");<br>
+<br>
+      MDValueList.AssignValue(<br>
+          GET_OR_DISTINCT(MDDerivedType, Record[0],<br>
+                          (Context, Record[1], getMDString(Record[2]),<br>
+                           getMDOrNull(Record[3]), Record[4],<br>
+                           getMDOrNull(Record[5]), getMD(Record[6]), Record[7],<br>
+                           Record[8], Record[9], Record[10],<br>
+                           getMDOrNull(Record[11]))),<br>
+          NextMDValueNo++);<br>
+      break;<br>
+    }<br>
+    case bitc::METADATA_COMPOSITE_TYPE: {<br>
+      if (Record.size() != 16)<br>
+        return Error("Invalid record");<br>
+<br>
+      MDValueList.AssignValue(<br>
+          GET_OR_DISTINCT(MDCompositeType, Record[0],<br>
+                          (Context, Record[1], getMDString(Record[2]),<br>
+                           getMDOrNull(Record[3]), Record[4],<br>
+                           getMDOrNull(Record[5]), getMDOrNull(Record[6]),<br>
+                           Record[7], Record[8], Record[9], Record[10],<br>
+                           getMDOrNull(Record[11]), Record[12],<br>
+                           getMDOrNull(Record[13]), getMDOrNull(Record[14]),<br>
+                           getMDString(Record[15]))),<br>
+          NextMDValueNo++);<br>
+      break;<br>
+    }<br>
     case bitc::METADATA_FILE: {<br>
       if (Record.size() != 3)<br>
         return Error("Invalid record");<br>
<br>
Modified: llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp?rev=229009&r1=229008&r2=229009&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp?rev=229009&r1=229008&r2=229009&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp (original)<br>
+++ llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp Thu Feb 12 19:20:38 2015<br>
@@ -853,16 +853,54 @@ static void WriteMDBasicType(const MDBas<br>
   Record.clear();<br>
 }<br>
<br>
-static void WriteMDDerivedType(const MDDerivedType *, const ValueEnumerator &,<br>
-                               BitstreamWriter &, SmallVectorImpl<uint64_t> &,<br>
-                               unsigned) {<br>
-  llvm_unreachable("write not implemented");<br>
+static void WriteMDDerivedType(const MDDerivedType *N,<br>
+                               const ValueEnumerator &VE,<br>
+                               BitstreamWriter &Stream,<br>
+                               SmallVectorImpl<uint64_t> &Record,<br>
+                               unsigned Abbrev) {<br></blockquote><div><br>Maybe once this is all in we can see if there's a way to tabularize or generalize all this code... ? (both reading and writing)<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+  Record.push_back(N->isDistinct());<br>
+  Record.push_back(N->getTag());<br>
+  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));<br>
+  Record.push_back(VE.getMetadataOrNullID(N->getFile()));<br>
+  Record.push_back(N->getLine());<br>
+  Record.push_back(VE.getMetadataOrNullID(N->getScope()));<br>
+  Record.push_back(VE.getMetadataID(N->getBaseType()));<br>
+  Record.push_back(N->getSizeInBits());<br>
+  Record.push_back(N->getAlignInBits());<br>
+  Record.push_back(N->getOffsetInBits());<br>
+  Record.push_back(N->getFlags());<br>
+  Record.push_back(VE.getMetadataOrNullID(N->getExtraData()));<br>
+<br>
+  Stream.EmitRecord(bitc::METADATA_DERIVED_TYPE, Record, Abbrev);<br>
+  Record.clear();<br>
 }<br>
-static void WriteMDCompositeType(const MDCompositeType *,<br>
-                                 const ValueEnumerator &, BitstreamWriter &,<br>
-                                 SmallVectorImpl<uint64_t> &, unsigned) {<br>
-  llvm_unreachable("write not implemented");<br>
+<br>
+static void WriteMDCompositeType(const MDCompositeType *N,<br>
+                                 const ValueEnumerator &VE,<br>
+                                 BitstreamWriter &Stream,<br>
+                                 SmallVectorImpl<uint64_t> &Record,<br>
+                                 unsigned Abbrev) {<br>
+  Record.push_back(N->isDistinct());<br>
+  Record.push_back(N->getTag());<br>
+  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));<br>
+  Record.push_back(VE.getMetadataOrNullID(N->getFile()));<br>
+  Record.push_back(N->getLine());<br>
+  Record.push_back(VE.getMetadataOrNullID(N->getScope()));<br>
+  Record.push_back(VE.getMetadataOrNullID(N->getBaseType()));<br>
+  Record.push_back(N->getSizeInBits());<br>
+  Record.push_back(N->getAlignInBits());<br>
+  Record.push_back(N->getOffsetInBits());<br>
+  Record.push_back(N->getFlags());<br>
+  Record.push_back(VE.getMetadataOrNullID(N->getElements()));<br>
+  Record.push_back(N->getRuntimeLang());<br>
+  Record.push_back(VE.getMetadataOrNullID(N->getVTableHolder()));<br>
+  Record.push_back(VE.getMetadataOrNullID(N->getTemplateParams()));<br>
+  Record.push_back(VE.getMetadataOrNullID(N->getRawIdentifier()));<br>
+<br>
+  Stream.EmitRecord(bitc::METADATA_COMPOSITE_TYPE, Record, Abbrev);<br>
+  Record.clear();<br>
 }<br>
+<br>
 static void WriteMDSubroutineType(const MDSubroutineType *,<br>
                                   const ValueEnumerator &, BitstreamWriter &,<br>
                                   SmallVectorImpl<uint64_t> &, unsigned) {<br>
<br>
Modified: llvm/trunk/lib/IR/AsmWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/AsmWriter.cpp?rev=229009&r1=229008&r2=229009&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/AsmWriter.cpp?rev=229009&r1=229008&r2=229009&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/AsmWriter.cpp (original)<br>
+++ llvm/trunk/lib/IR/AsmWriter.cpp Thu Feb 12 19:20:38 2015<br>
@@ -1387,15 +1387,97 @@ static void writeMDBasicType(raw_ostream<br>
   Out << ")";<br>
 }<br>
<br>
-static void writeMDDerivedType(raw_ostream &, const MDDerivedType *,<br>
-                               TypePrinting *, SlotTracker *, const Module *) {<br>
-  llvm_unreachable("write not implemented");<br>
+static void writeMDDerivedType(raw_ostream &Out, const MDDerivedType *N,<br>
+                               TypePrinting *TypePrinter, SlotTracker *Machine,<br>
+                               const Module *Context) {<br>
+  Out << "!MDDerivedType(";<br>
+  FieldSeparator FS;<br>
+  writeTag(Out, FS, N);<br>
+  if (!N->getName().empty())<br>
+    Out << FS << "name: \"" << N->getName() << "\"";<br>
+  if (N->getFile()) {<br>
+    Out << FS << "file: ";<br>
+    writeMetadataAsOperand(Out, N->getFile(), TypePrinter, Machine,<br>
+                           Context);<br>
+  }<br>
+  if (N->getLine())<br>
+    Out << FS << "line: " << N->getLine();<br>
+  if (N->getScope()) {<br>
+    Out << FS << "scope: ";<br>
+    writeMetadataAsOperand(Out, N->getScope(), TypePrinter, Machine, Context);<br>
+  }<br>
+  Out << FS << "baseType: ";<br>
+  writeMetadataAsOperand(Out, N->getBaseType(), TypePrinter, Machine, Context);<br>
+  if (N->getSizeInBits())<br>
+    Out << FS << "size: " << N->getSizeInBits();<br>
+  if (N->getAlignInBits())<br>
+    Out << FS << "align: " << N->getAlignInBits();<br>
+  if (N->getOffsetInBits())<br>
+    Out << FS << "offset: " << N->getOffsetInBits();<br>
+  if (N->getFlags())<br>
+    Out << FS << "flags: " << N->getFlags();<br>
+  if (N->getExtraData()) {<br>
+    Out << FS << "extraData: ";<br>
+    writeMetadataAsOperand(Out, N->getExtraData(), TypePrinter, Machine,<br>
+                           Context);<br>
+  }<br>
+  Out << ")";<br>
 }<br>
-static void writeMDCompositeType(raw_ostream &, const MDCompositeType *,<br>
-                                 TypePrinting *, SlotTracker *,<br>
-                                 const Module *) {<br>
-  llvm_unreachable("write not implemented");<br>
+<br>
+static void writeMDCompositeType(raw_ostream &Out, const MDCompositeType *N,<br>
+                                 TypePrinting *TypePrinter,<br>
+                                 SlotTracker *Machine, const Module *Context) {<br>
+  Out << "!MDCompositeType(";<br>
+  FieldSeparator FS;<br>
+  writeTag(Out, FS, N);<br>
+  if (!N->getName().empty())<br>
+    Out << FS << "name: \"" << N->getName() << "\"";<br>
+  if (N->getFile()) {<br>
+    Out << FS << "file: ";<br>
+    writeMetadataAsOperand(Out, N->getFile(), TypePrinter, Machine,<br>
+                           Context);<br>
+  }<br>
+  if (N->getLine())<br>
+    Out << FS << "line: " << N->getLine();<br>
+  if (N->getScope()) {<br>
+    Out << FS << "scope: ";<br>
+    writeMetadataAsOperand(Out, N->getScope(), TypePrinter, Machine, Context);<br>
+  }<br>
+  if (N->getBaseType()) {<br>
+    Out << FS << "baseType: ";<br>
+    writeMetadataAsOperand(Out, N->getBaseType(), TypePrinter, Machine,<br>
+                           Context);<br>
+  }<br>
+  if (N->getSizeInBits())<br>
+    Out << FS << "size: " << N->getSizeInBits();<br>
+  if (N->getAlignInBits())<br>
+    Out << FS << "align: " << N->getAlignInBits();<br>
+  if (N->getOffsetInBits())<br>
+    Out << FS << "offset: " << N->getOffsetInBits();<br>
+  if (N->getFlags())<br>
+    Out << FS << "flags: " << N->getFlags();<br>
+  if (N->getElements()) {<br>
+    Out << FS << "elements: ";<br>
+    writeMetadataAsOperand(Out, N->getElements(), TypePrinter, Machine,<br>
+                           Context);<br>
+  }<br>
+  if (N->getRuntimeLang())<br>
+    Out << FS << "runtimeLang: " << N->getRuntimeLang();<br>
+  if (N->getVTableHolder()) {<br>
+    Out << FS << "vtableHolder: ";<br>
+    writeMetadataAsOperand(Out, N->getVTableHolder(), TypePrinter, Machine,<br>
+                           Context);<br>
+  }<br>
+  if (N->getTemplateParams()) {<br>
+    Out << FS << "templateParams: ";<br>
+    writeMetadataAsOperand(Out, N->getTemplateParams(), TypePrinter, Machine,<br>
+                           Context);<br>
+  }<br>
+  if (!N->getIdentifier().empty())<br>
+    Out << FS << "identifier: \"" << N->getIdentifier() << "\"";<br>
+  Out << ")";<br>
 }<br>
+<br>
 static void writeMDSubroutineType(raw_ostream &, const MDSubroutineType *,<br>
                                   TypePrinting *, SlotTracker *,<br>
                                   const Module *) {<br>
<br>
Modified: llvm/trunk/test/Assembler/debug-info.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/debug-info.ll?rev=229009&r1=229008&r2=229009&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/debug-info.ll?rev=229009&r1=229008&r2=229009&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Assembler/debug-info.ll (original)<br>
+++ llvm/trunk/test/Assembler/debug-info.ll Thu Feb 12 19:20:38 2015<br>
@@ -1,8 +1,8 @@<br>
 ; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis | FileCheck %s<br>
 ; RUN: verify-uselistorder %s<br>
<br>
-; CHECK: !named = !{!0, !0, !1, !2, !3, !4, !5, !6, !7, !8, !8, !9, !10, !11, !12}<br>
-!named = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12, !13, !14}<br>
+; CHECK: !named = !{!0, !0, !1, !2, !3, !4, !5, !6, !7, !8, !8, !9, !10, !11, !12, !13, !14, !15, !16, !17, !18, !19, !20, !21, !22, !23}<br>
+!named = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12, !13, !14, !15, !16, !17, !18, !19, !20, !21, !22, !23, !24, !25}<br>
<br>
 ; CHECK:      !0 = !MDSubrange(count: 3)<br>
 ; CHECK-NEXT: !1 = !MDSubrange(count: 3, lowerBound: 4)<br>
@@ -36,3 +36,27 @@<br>
 !12 = !MDFile(filename: "path/to/file", directory: "/path/to/dir")<br>
 !13 = !{null, null}<br>
 !14 = !MDFile(filename: "", directory: "")<br>
+<br>
+; CHECK-NEXT: !13 = !MDDerivedType(tag: DW_TAG_pointer_type, baseType: !6, size: 32, align: 32)<br>
+!15 = !MDDerivedType(tag: DW_TAG_pointer_type, baseType: !7, size: 32, align: 32)<br>
+<br>
+; CHECK-NEXT: !14 = !MDCompositeType(tag: DW_TAG_structure_type, name: "MyType", file: !9, line: 2, size: 32, align: 32, identifier: "MangledMyType")<br>
+; CHECK-NEXT: !15 = distinct !MDCompositeType(tag: DW_TAG_structure_type, name: "Base", file: !9, line: 3, scope: !14, size: 128, align: 32, offset: 64, flags: 3, elements: !16, runtimeLang: 6, vtableHolder: !15, templateParams: !18, identifier: "MangledBase")<br>
+; CHECK-NEXT: !16 = !{!17}<br>
+; CHECK-NEXT: !17 = !MDDerivedType(tag: DW_TAG_member, name: "field", file: !9, line: 4, scope: !15, baseType: !6, size: 32, align: 32, offset: 32, flags: 3)<br>
+; CHECK-NEXT: !18 = !{!6}<br>
+; CHECK-NEXT: !19 = !MDCompositeType(tag: DW_TAG_structure_type, name: "Derived", file: !9, line: 3, scope: !14, baseType: !15, size: 128, align: 32, offset: 64, flags: 3, elements: !20, runtimeLang: 6, vtableHolder: !15, templateParams: !18, identifier: "MangledBase")<br>
+; CHECK-NEXT: !20 = !{!21}<br>
+; CHECK-NEXT: !21 = !MDDerivedType(tag: DW_TAG_inheritance, scope: !19, baseType: !15)<br>
+; CHECK-NEXT: !22 = !MDDerivedType(tag: DW_TAG_ptr_to_member_type, baseType: !6, size: 32, align: 32, extraData: !15)<br>
+; CHECK-NEXT: !23 = !MDCompositeType(tag: DW_TAG_structure_type)<br>
+!16 = !MDCompositeType(tag: DW_TAG_structure_type, name: "MyType", file: !11, line: 2, size: 32, align: 32, identifier: "MangledMyType")<br>
+!17 = !MDCompositeType(tag: DW_TAG_structure_type, name: "Base", file: !11, line: 3, scope: !16, size: 128, align: 32, offset: 64, flags: 3, elements: !18, runtimeLang: 6, vtableHolder: !17, templateParams: !20, identifier: "MangledBase")<br>
+!18 = !{!19}<br>
+!19 = !MDDerivedType(tag: DW_TAG_member, name: "field", file: !11, line: 4, scope: !17, baseType: !7, size: 32, align: 32, offset: 32, flags: 3)<br>
+!20 = !{!7}<br>
+!21 = !MDCompositeType(tag: DW_TAG_structure_type, name: "Derived", file: !11, line: 3, scope: !16, baseType: !17, size: 128, align: 32, offset: 64, flags: 3, elements: !22, runtimeLang: 6, vtableHolder: !17, templateParams: !20, identifier: "MangledBase")<br>
+!22 = !{!23}<br>
+!23 = !MDDerivedType(tag: DW_TAG_inheritance, scope: !21, baseType: !17)<br>
+!24 = !MDDerivedType(tag: DW_TAG_ptr_to_member_type, baseType: !7, size: 32, align: 32, extraData: !17)<br>
+!25 = !MDCompositeType(tag: DW_TAG_structure_type)<br>
<br>
Added: llvm/trunk/test/Assembler/invalid-mdcompositetype-missing-tag.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/invalid-mdcompositetype-missing-tag.ll?rev=229009&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/invalid-mdcompositetype-missing-tag.ll?rev=229009&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Assembler/invalid-mdcompositetype-missing-tag.ll (added)<br>
+++ llvm/trunk/test/Assembler/invalid-mdcompositetype-missing-tag.ll Thu Feb 12 19:20:38 2015<br>
@@ -0,0 +1,4 @@<br>
+; RUN: not llvm-as < %s -disable-output 2>&1 | FileCheck %s<br>
+<br>
+; CHECK: [[@LINE+1]]:36: error: missing required field 'tag'<br>
+!25 = !MDCompositeType(name: "Type")<br>
<br>
Added: llvm/trunk/test/Assembler/invalid-mdderivedtype-missing-basetype.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/invalid-mdderivedtype-missing-basetype.ll?rev=229009&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/invalid-mdderivedtype-missing-basetype.ll?rev=229009&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Assembler/invalid-mdderivedtype-missing-basetype.ll (added)<br>
+++ llvm/trunk/test/Assembler/invalid-mdderivedtype-missing-basetype.ll Thu Feb 12 19:20:38 2015<br>
@@ -0,0 +1,4 @@<br>
+; RUN: not llvm-as < %s -disable-output 2>&1 | FileCheck %s<br>
+<br>
+; CHECK: [[@LINE+1]]:45: error: missing required field 'baseType'<br>
+!0 = !MDDerivedType(tag: DW_TAG_pointer_type)<br>
<br>
Added: llvm/trunk/test/Assembler/invalid-mdderivedtype-missing-tag.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/invalid-mdderivedtype-missing-tag.ll?rev=229009&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/invalid-mdderivedtype-missing-tag.ll?rev=229009&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Assembler/invalid-mdderivedtype-missing-tag.ll (added)<br>
+++ llvm/trunk/test/Assembler/invalid-mdderivedtype-missing-tag.ll Thu Feb 12 19:20:38 2015<br>
@@ -0,0 +1,4 @@<br>
+; RUN: not llvm-as < %s -disable-output 2>&1 | FileCheck %s<br>
+<br>
+; CHECK: [[@LINE+1]]:34: error: missing required field 'tag'<br>
+!0 = !MDDerivedType(baseType: !{})<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></div></div>