From: Duncan P. N. Exon Smith Date: Fri, 13 Feb 2015 01:17:35 +0000 (+0000) Subject: AsmWriter: MDBasicType: Recognize DW_ATE in 'encoding' X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=95d71357275a05a4bfc346f5b513688e26531a91 AsmWriter: MDBasicType: Recognize DW_ATE in 'encoding' git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229006 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AsmParser/LLLexer.cpp b/lib/AsmParser/LLLexer.cpp index eb16608ad1e..64a67c0ef2a 100644 --- a/lib/AsmParser/LLLexer.cpp +++ b/lib/AsmParser/LLLexer.cpp @@ -738,11 +738,15 @@ lltok::Kind LLLexer::LexIdentifier() { INSTKEYWORD(landingpad, LandingPad); #undef INSTKEYWORD - if (Len >= strlen("DW_TAG_") && - !memcmp(StartChar, "DW_TAG_", strlen("DW_TAG_"))) { - StrVal.assign(StartChar, CurPtr); - return lltok::DwarfTag; - } +#define DWKEYWORD(TYPE, TOKEN) \ + if (Len >= strlen("DW_" #TYPE "_") && \ + !memcmp(StartChar, "DW_" #TYPE "_", strlen("DW_" #TYPE "_"))) { \ + StrVal.assign(StartChar, CurPtr); \ + return lltok::TOKEN; \ + } + DWKEYWORD(TAG, DwarfTag); + DWKEYWORD(ATE, DwarfAttEncoding); +#undef DWKEYWORD // Check for [us]0x[0-9A-Fa-f]+ which are Hexadecimal constant generated by // the CFE to avoid forcing it to deal with 64-bit numbers. diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 802421356ad..992ad1092be 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -2946,6 +2946,9 @@ struct ColumnField : public MDUnsignedField { struct DwarfTagField : public MDUnsignedField { DwarfTagField() : MDUnsignedField(0, dwarf::DW_TAG_hi_user) {} }; +struct DwarfAttEncodingField : public MDUnsignedField { + DwarfAttEncodingField() : MDUnsignedField(0, dwarf::DW_ATE_hi_user) {} +}; struct MDSignedField : public MDFieldImpl { int64_t Min; @@ -3014,6 +3017,25 @@ bool LLParser::ParseMDField(LocTy Loc, StringRef Name, DwarfTagField &Result) { return false; } +template <> +bool LLParser::ParseMDField(LocTy Loc, StringRef Name, + DwarfAttEncodingField &Result) { + if (Lex.getKind() == lltok::APSInt) + return ParseMDField(Loc, Name, static_cast(Result)); + + if (Lex.getKind() != lltok::DwarfAttEncoding) + return TokError("expected DWARF type attribute encoding"); + + unsigned Encoding = dwarf::getAttributeEncoding(Lex.getStrVal()); + if (!Encoding) + return TokError("invalid DWARF type attribute encoding" + Twine(" '") + + Lex.getStrVal() + "'"); + assert(Encoding <= Result.Max && "Expected valid DWARF language"); + Result.assign(Encoding); + Lex.Lex(); + return false; +} + template <> bool LLParser::ParseMDField(LocTy Loc, StringRef Name, MDSignedField &Result) { @@ -3202,7 +3224,7 @@ bool LLParser::ParseMDBasicType(MDNode *&Result, bool IsDistinct) { OPTIONAL(name, MDStringField, ); \ OPTIONAL(size, MDUnsignedField, (0, UINT32_MAX)); \ OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \ - OPTIONAL(encoding, MDUnsignedField, (0, UINT32_MAX)); + OPTIONAL(encoding, DwarfAttEncodingField, ); PARSE_MD_FIELDS(); #undef VISIT_MD_FIELDS diff --git a/lib/AsmParser/LLToken.h b/lib/AsmParser/LLToken.h index 4e5af1e89bd..65c59b5654b 100644 --- a/lib/AsmParser/LLToken.h +++ b/lib/AsmParser/LLToken.h @@ -199,6 +199,7 @@ namespace lltok { MetadataVar, // !foo StringConstant, // "foo" DwarfTag, // DW_TAG_foo (includes "DW_TAG_") + DwarfAttEncoding, // DW_ATE_foo (includes "DW_ATE_") // Type valued tokens (TyVal). Type, diff --git a/lib/IR/AsmWriter.cpp b/lib/IR/AsmWriter.cpp index f7ed216f79a..c2d25140d7a 100644 --- a/lib/IR/AsmWriter.cpp +++ b/lib/IR/AsmWriter.cpp @@ -1377,8 +1377,13 @@ static void writeMDBasicType(raw_ostream &Out, const MDBasicType *N, Out << FS << "size: " << N->getSizeInBits(); if (N->getAlignInBits()) Out << FS << "align: " << N->getAlignInBits(); - if (N->getEncoding()) - Out << FS << "encoding: " << N->getEncoding(); + if (unsigned Encoding = N->getEncoding()) { + Out << FS << "encoding: "; + if (const char *S = dwarf::AttributeEncodingString(Encoding)) + Out << S; + else + Out << Encoding; + } Out << ")"; } diff --git a/test/Assembler/debug-info.ll b/test/Assembler/debug-info.ll index 267e785209d..d376fea3a2f 100644 --- a/test/Assembler/debug-info.ll +++ b/test/Assembler/debug-info.ll @@ -20,10 +20,10 @@ !5 = !MDEnumerator(value: -8, name: "negeight") !6 = !MDEnumerator(value: 0, name: "") -; CHECK-NEXT: !6 = !MDBasicType(tag: DW_TAG_base_type, name: "name", size: 1, align: 2, encoding: 3) +; CHECK-NEXT: !6 = !MDBasicType(tag: DW_TAG_base_type, name: "name", size: 1, align: 2, encoding: DW_ATE_unsigned_char) ; CHECK-NEXT: !7 = !MDBasicType(tag: DW_TAG_unspecified_type, name: "decltype(nullptr)") ; CHECK-NEXT: !8 = !MDBasicType(tag: DW_TAG_base_type) -!7 = !MDBasicType(tag: DW_TAG_base_type, name: "name", size: 1, align: 2, encoding: 3) +!7 = !MDBasicType(tag: DW_TAG_base_type, name: "name", size: 1, align: 2, encoding: DW_ATE_unsigned_char) !8 = !MDBasicType(tag: DW_TAG_unspecified_type, name: "decltype(nullptr)") !9 = !MDBasicType(tag: DW_TAG_base_type) !10 = !MDBasicType(tag: DW_TAG_base_type, name: "", size: 0, align: 0, encoding: 0) diff --git a/utils/vim/llvm.vim b/utils/vim/llvm.vim index 57c71331105..6f32864ed3d 100644 --- a/utils/vim/llvm.vim +++ b/utils/vim/llvm.vim @@ -78,6 +78,7 @@ syn match llvmIdentifier /![-a-zA-Z$._][-a-zA-Z$._0-9]*\ze\s*$/ syn match llvmIdentifier /![-a-zA-Z$._][-a-zA-Z$._0-9]*\ze\s*[=!]/ syn match llvmType /!\zs\a\+\ze\s*(/ syn match llvmConstant /\/ +syn match llvmConstant /\/ " Syntax-highlight dejagnu test commands. syn match llvmSpecialComment /;\s*RUN:.*$/