<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 12, 2015 at 5:42 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:42:09 2015<br>
New Revision: 229023<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=229023&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=229023&view=rev</a><br>
Log:<br>
AsmWriter/Bitcode: MDExpression<br>
<br>
Added:<br>
    llvm/trunk/test/Assembler/invalid-mdexpression-large.ll<br>
    llvm/trunk/test/Assembler/invalid-mdexpression-verify.ll<br>
    llvm/trunk/test/Assembler/mdexpression.ll<br>
Modified:<br>
    llvm/trunk/include/llvm/Bitcode/LLVMBitCodes.h<br>
    llvm/trunk/lib/AsmParser/LLLexer.cpp<br>
    llvm/trunk/lib/AsmParser/LLParser.cpp<br>
    llvm/trunk/lib/AsmParser/LLToken.h<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/utils/vim/llvm.vim<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=229023&r1=229022&r2=229023&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Bitcode/LLVMBitCodes.h?rev=229023&r1=229022&r2=229023&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:42:09 2015<br>
@@ -163,7 +163,8 @@ namespace bitc {<br>
     METADATA_TEMPLATE_TYPE = 25,  // [distinct, scope, name, type, ...]<br>
     METADATA_TEMPLATE_VALUE= 26,  // [distinct, scope, name, type, value, ...]<br>
     METADATA_GLOBAL_VAR    = 27,  // [distinct, ...]<br>
-    METADATA_LOCAL_VAR     = 28   // [distinct, ...]<br>
+    METADATA_LOCAL_VAR     = 28,  // [distinct, ...]<br>
+    METADATA_EXPRESSION    = 29   // [distinct, n x element]<br></blockquote><div><br>Maybe use something more like grammar production  syntax: 'element*' ?<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/LLLexer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLLexer.cpp?rev=229023&r1=229022&r2=229023&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLLexer.cpp?rev=229023&r1=229022&r2=229023&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/AsmParser/LLLexer.cpp (original)<br>
+++ llvm/trunk/lib/AsmParser/LLLexer.cpp Thu Feb 12 19:42:09 2015<br>
@@ -748,6 +748,7 @@ lltok::Kind LLLexer::LexIdentifier() {<br>
   DWKEYWORD(ATE, DwarfAttEncoding);<br>
   DWKEYWORD(VIRTUALITY, DwarfVirtuality);<br>
   DWKEYWORD(LANG, DwarfLang);<br>
+  DWKEYWORD(OP, DwarfOp);<br>
 #undef DWKEYWORD<br>
<br>
   // Check for [us]0x[0-9A-Fa-f]+ which are Hexadecimal constant generated by<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=229023&r1=229022&r2=229023&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=229023&r1=229022&r2=229023&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/AsmParser/LLParser.cpp (original)<br>
+++ llvm/trunk/lib/AsmParser/LLParser.cpp Thu Feb 12 19:42:09 2015<br>
@@ -3599,9 +3599,44 @@ bool LLParser::ParseMDLocalVariable(MDNo<br>
   return false;<br>
 }<br>
<br>
+/// ParseMDExpression:<br>
+///   ::= !MDExpression(0, 7, -1)<br>
 bool LLParser::ParseMDExpression(MDNode *&Result, bool IsDistinct) {<br>
-  return TokError("unimplemented parser");<br>
+  assert(Lex.getKind() == lltok::MetadataVar && "Expected metadata type name");<br>
+  Lex.Lex();<br>
+<br>
+  if (ParseToken(lltok::lparen, "expected '(' here"))<br>
+    return true;<br>
+<br>
+  SmallVector<uint64_t, 8> Elements;<br>
+  if (Lex.getKind() != lltok::rparen)<br>
+    do {<br>
+      if (Lex.getKind() == lltok::DwarfOp) {<br>
+        if (unsigned Op = dwarf::getOperationEncoding(Lex.getStrVal())) {<br>
+          Lex.Lex();<br>
+          Elements.push_back(Op);<br>
+          continue;<br>
+        }<br>
+        return TokError(Twine("invalid DWARF op '") + Lex.getStrVal() + "'");<br>
+      }<br>
+<br>
+      if (Lex.getKind() != lltok::APSInt || Lex.getAPSIntVal().isSigned())<br>
+        return TokError("expected unsigned integer");<br>
+<br>
+      auto &U = Lex.getAPSIntVal();<br>
+      if (U.ugt(UINT64_MAX))<br>
+        return TokError("element too large, limit is " + Twine(UINT64_MAX));<br>
+      Elements.push_back(U.getZExtValue());<br>
+      Lex.Lex();<br>
+    } while (EatIfPresent(lltok::comma));<br>
+<br>
+  if (ParseToken(lltok::rparen, "expected ')' here"))<br>
+    return true;<br>
+<br>
+  Result = GET_OR_DISTINCT(MDExpression, (Context, Elements));<br>
+  return false;<br>
 }<br>
+<br>
 bool LLParser::ParseMDObjCProperty(MDNode *&Result, bool IsDistinct) {<br>
   return TokError("unimplemented parser");<br>
 }<br>
<br>
Modified: llvm/trunk/lib/AsmParser/LLToken.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLToken.h?rev=229023&r1=229022&r2=229023&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLToken.h?rev=229023&r1=229022&r2=229023&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/AsmParser/LLToken.h (original)<br>
+++ llvm/trunk/lib/AsmParser/LLToken.h Thu Feb 12 19:42:09 2015<br>
@@ -198,10 +198,11 @@ namespace lltok {<br>
     LocalVar,          // %foo %"foo"<br>
     MetadataVar,       // !foo<br>
     StringConstant,    // "foo"<br>
-    DwarfTag,          // DW_TAG_foo (includes "DW_TAG_")<br>
-    DwarfAttEncoding,  // DW_ATE_foo (includes "DW_ATE_")<br>
-    DwarfVirtuality,   // DW_VIRTUALITY_foo (includes "DW_VIRTUALITY_")<br>
-    DwarfLang,         // DW_LANG_foo (includes "DW_LANG_")<br>
+    DwarfTag,          // DW_TAG_foo<br>
+    DwarfAttEncoding,  // DW_ATE_foo<br>
+    DwarfVirtuality,   // DW_VIRTUALITY_foo<br>
+    DwarfLang,         // DW_LANG_foo<br>
+    DwarfOp,           // DW_OP_foo<br>
<br>
     // Type valued tokens (TyVal).<br>
     Type,<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=229023&r1=229022&r2=229023&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=229023&r1=229022&r2=229023&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:42:09 2015<br>
@@ -1552,6 +1552,16 @@ std::error_code BitcodeReader::ParseMeta<br>
           NextMDValueNo++);<br>
       break;<br>
     }<br>
+    case bitc::METADATA_EXPRESSION: {<br>
+      if (Record.size() < 1)<br>
+        return Error("Invalid record");<br>
+<br>
+      MDValueList.AssignValue(<br>
+          GET_OR_DISTINCT(MDExpression, Record[0],<br>
+                          (Context, makeArrayRef(Record).slice(1))),<br>
+          NextMDValueNo++);<br>
+      break;<br>
+    }<br>
     case bitc::METADATA_STRING: {<br>
       std::string String(Record.begin(), Record.end());<br>
       llvm::UpgradeMDStringConstant(String);<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=229023&r1=229022&r2=229023&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp?rev=229023&r1=229022&r2=229023&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:42:09 2015<br>
@@ -1092,11 +1092,20 @@ static void WriteMDLocalVariable(const M<br>
   Record.clear();<br>
 }<br>
<br>
-static void WriteMDExpression(const MDExpression *, const ValueEnumerator &,<br>
-                              BitstreamWriter &, SmallVectorImpl<uint64_t> &,<br>
-                              unsigned) {<br>
-  llvm_unreachable("write not implemented");<br>
+static void WriteMDExpression(const MDExpression *N, const ValueEnumerator &,<br>
+                              BitstreamWriter &Stream,<br>
+                              SmallVectorImpl<uint64_t> &Record,<br>
+                              unsigned Abbrev) {<br>
+  Record.reserve(N->getElements().size() + 1);<br>
+<br>
+  Record.push_back(N->isDistinct());<br>
+  for (uint64_t I : N->getElements())<br>
+    Record.push_back(I);<br>
+<br>
+  Stream.EmitRecord(bitc::METADATA_EXPRESSION, Record, Abbrev);<br>
+  Record.clear();<br>
 }<br>
+<br>
 static void WriteMDObjCProperty(const MDObjCProperty *, const ValueEnumerator &,<br>
                                 BitstreamWriter &, SmallVectorImpl<uint64_t> &,<br>
                                 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=229023&r1=229022&r2=229023&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/AsmWriter.cpp?rev=229023&r1=229022&r2=229023&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/AsmWriter.cpp (original)<br>
+++ llvm/trunk/lib/IR/AsmWriter.cpp Thu Feb 12 19:42:09 2015<br>
@@ -1781,10 +1781,27 @@ static void writeMDLocalVariable(raw_ost<br>
   Out << ")";<br>
 }<br>
<br>
-static void writeMDExpression(raw_ostream &, const MDExpression *,<br>
-                              TypePrinting *, SlotTracker *, const Module *) {<br>
-  llvm_unreachable("write not implemented");<br>
+static void writeMDExpression(raw_ostream &Out, const MDExpression *N,<br>
+                              TypePrinting *TypePrinter, SlotTracker *Machine,<br>
+                              const Module *Context) {<br>
+  Out << "!MDExpression(";<br>
+  FieldSeparator FS;<br>
+  if (N->isValid()) {<br>
+    for (auto I = N->expr_op_begin(), E = N->expr_op_end(); I != E; ++I) {<br>
+      const char *OpStr = dwarf::OperationEncodingString(I->getOp());<br>
+      assert(OpStr && "Expected valid opcode");<br>
+<br>
+      Out << FS << OpStr;<br>
+      for (unsigned A = 0, AE = I->getNumArgs(); A != AE; ++A)<br>
+        Out << FS << I->getArg(A);<br>
+    }<br>
+  } else {<br>
+    for (const auto &I : N->getElements())<br>
+      Out << FS << I;<br>
+  }<br>
+  Out << ")";<br>
 }<br>
+<br>
 static void writeMDObjCProperty(raw_ostream &, const MDObjCProperty *,<br>
                                 TypePrinting *, SlotTracker *, const Module *) {<br>
   llvm_unreachable("write not implemented");<br>
<br>
Added: llvm/trunk/test/Assembler/invalid-mdexpression-large.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/invalid-mdexpression-large.ll?rev=229023&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/invalid-mdexpression-large.ll?rev=229023&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Assembler/invalid-mdexpression-large.ll (added)<br>
+++ llvm/trunk/test/Assembler/invalid-mdexpression-large.ll Thu Feb 12 19:42:09 2015<br>
@@ -0,0 +1,7 @@<br>
+; RUN: not llvm-as < %s -disable-output 2>&1 | FileCheck %s<br>
+<br>
+; CHECK-NOT: error<br>
+!0 = !MDExpression(18446744073709551615)<br>
+<br>
+; CHECK: <stdin>:[[@LINE+1]]:20: error: element too large, limit is 18446744073709551615<br>
+!1 = !MDExpression(18446744073709551616)<br>
<br>
Added: llvm/trunk/test/Assembler/invalid-mdexpression-verify.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/invalid-mdexpression-verify.ll?rev=229023&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/invalid-mdexpression-verify.ll?rev=229023&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Assembler/invalid-mdexpression-verify.ll (added)<br>
+++ llvm/trunk/test/Assembler/invalid-mdexpression-verify.ll Thu Feb 12 19:42:09 2015<br>
@@ -0,0 +1,9 @@<br>
+; RUN: not llvm-as -disable-output < %s 2>&1 | FileCheck -check-prefix VERIFY %s<br>
+; RUN: llvm-as -disable-verify < %s | llvm-dis | FileCheck -check-prefix NOVERIFY %s<br>
+<br>
+; NOVERIFY: !named = !{!0}<br>
+!named = !{!0}<br>
+<br>
+; NOVERIFY: !0 = !MDExpression(0, 1, 9, 7, 2)<br>
+; VERIFY: assembly parsed, but does not verify<br>
+!0 = !MDExpression(0, 1, 9, 7, 2)<br>
<br>
Added: llvm/trunk/test/Assembler/mdexpression.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/mdexpression.ll?rev=229023&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/mdexpression.ll?rev=229023&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Assembler/mdexpression.ll (added)<br>
+++ llvm/trunk/test/Assembler/mdexpression.ll Thu Feb 12 19:42:09 2015<br>
@@ -0,0 +1,16 @@<br>
+; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis | FileCheck %s<br>
+; RUN: verify-uselistorder %s<br>
+<br>
+; CHECK: !named = !{!0, !1, !2, !3, !4}<br>
+!named = !{!0, !1, !2, !3, !4}<br>
+<br>
+; CHECK:      !0 = !MDExpression()<br>
+; CHECK-NEXT: !1 = !MDExpression(DW_OP_deref)<br>
+; CHECK-NEXT: !2 = !MDExpression(DW_OP_plus, 3)<br>
+; CHECK-NEXT: !3 = !MDExpression(DW_OP_bit_piece, 3, 7)<br>
+; CHECK-NEXT: !4 = !MDExpression(DW_OP_deref, DW_OP_plus, 3, DW_OP_bit_piece, 3, 7)<br>
+!0 = !MDExpression()<br>
+!1 = !MDExpression(DW_OP_deref)<br>
+!2 = !MDExpression(DW_OP_plus, 3)<br>
+!3 = !MDExpression(DW_OP_bit_piece, 3, 7)<br>
+!4 = !MDExpression(DW_OP_deref, DW_OP_plus, 3, DW_OP_bit_piece, 3, 7)<br>
<br>
Modified: llvm/trunk/utils/vim/llvm.vim<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/vim/llvm.vim?rev=229023&r1=229022&r2=229023&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/vim/llvm.vim?rev=229023&r1=229022&r2=229023&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/utils/vim/llvm.vim (original)<br>
+++ llvm/trunk/utils/vim/llvm.vim Thu Feb 12 19:42:09 2015<br>
@@ -79,6 +79,7 @@ syn match   llvmIdentifier /![-a-zA-Z$._<br>
 syn match   llvmType /!\zs\a\+\ze\s*(/<br>
 syn match   llvmConstant /\<DW_TAG_[a-z_]\+\>/<br>
 syn match   llvmConstant /\<DW_ATE_[a-zA-Z_]\+\>/<br>
+syn match   llvmConstant /\<DW_OP_[a-zA-Z0-9_]\+\>/<br>
 syn match   llvmConstant /\<DW_LANG_[a-zA-Z0-9_]\+\>/<br>
 syn match   llvmConstant /\<DW_VIRTUALITY_[a-z_]\+\>/<br>
<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>