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