diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/AsmParser/LLLexer.cpp | 1 | ||||
| -rw-r--r-- | llvm/lib/AsmParser/LLParser.cpp | 42 | ||||
| -rw-r--r-- | llvm/lib/AsmParser/LLToken.h | 1 | ||||
| -rw-r--r-- | llvm/lib/IR/AsmWriter.cpp | 10 |
4 files changed, 51 insertions, 3 deletions
diff --git a/llvm/lib/AsmParser/LLLexer.cpp b/llvm/lib/AsmParser/LLLexer.cpp index 64a67c0ef2a..100cb2eb1e1 100644 --- a/llvm/lib/AsmParser/LLLexer.cpp +++ b/llvm/lib/AsmParser/LLLexer.cpp @@ -746,6 +746,7 @@ lltok::Kind LLLexer::LexIdentifier() { } DWKEYWORD(TAG, DwarfTag); DWKEYWORD(ATE, DwarfAttEncoding); + DWKEYWORD(LANG, DwarfLang); #undef DWKEYWORD // Check for [us]0x[0-9A-Fa-f]+ which are Hexadecimal constant generated by diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index 42ce206e3af..33f395a1f5a 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -2949,6 +2949,9 @@ struct DwarfTagField : public MDUnsignedField { struct DwarfAttEncodingField : public MDUnsignedField { DwarfAttEncodingField() : MDUnsignedField(0, dwarf::DW_ATE_hi_user) {} }; +struct DwarfLangField : public MDUnsignedField { + DwarfLangField() : MDUnsignedField(0, dwarf::DW_LANG_hi_user) {} +}; struct MDSignedField : public MDFieldImpl<int64_t> { int64_t Min; @@ -2960,6 +2963,9 @@ struct MDSignedField : public MDFieldImpl<int64_t> { : ImplTy(Default), Min(Min), Max(Max) {} }; +struct MDBoolField : public MDFieldImpl<bool> { + MDBoolField(bool Default = false) : ImplTy(Default) {} +}; struct MDField : public MDFieldImpl<Metadata *> { MDField() : ImplTy(nullptr) {} }; @@ -3018,6 +3024,24 @@ bool LLParser::ParseMDField(LocTy Loc, StringRef Name, DwarfTagField &Result) { } template <> +bool LLParser::ParseMDField(LocTy Loc, StringRef Name, DwarfLangField &Result) { + if (Lex.getKind() == lltok::APSInt) + return ParseMDField(Loc, Name, static_cast<MDUnsignedField &>(Result)); + + if (Lex.getKind() != lltok::DwarfLang) + return TokError("expected DWARF language"); + + unsigned Lang = dwarf::getLanguage(Lex.getStrVal()); + if (!Lang) + return TokError("invalid DWARF language" + Twine(" '") + Lex.getStrVal() + + "'"); + assert(Lang <= Result.Max && "Expected valid DWARF language"); + Result.assign(Lang); + Lex.Lex(); + return false; +} + +template <> bool LLParser::ParseMDField(LocTy Loc, StringRef Name, DwarfAttEncodingField &Result) { if (Lex.getKind() == lltok::APSInt) @@ -3057,6 +3081,22 @@ bool LLParser::ParseMDField(LocTy Loc, StringRef Name, } template <> +bool LLParser::ParseMDField(LocTy Loc, StringRef Name, MDBoolField &Result) { + switch (Lex.getKind()) { + default: + return TokError("expected 'true' or 'false'"); + case lltok::kw_true: + Result.assign(true); + break; + case lltok::kw_false: + Result.assign(false); + break; + } + Lex.Lex(); + return false; +} + +template <> bool LLParser::ParseMDField(LocTy Loc, StringRef Name, MDField &Result) { Metadata *MD; if (ParseMetadata(MD, nullptr)) @@ -3273,7 +3313,7 @@ bool LLParser::ParseMDCompositeType(MDNode *&Result, bool IsDistinct) { OPTIONAL(offset, MDUnsignedField, (0, UINT32_MAX)); \ OPTIONAL(flags, MDUnsignedField, (0, UINT32_MAX)); \ OPTIONAL(elements, MDField, ); \ - OPTIONAL(runtimeLang, MDUnsignedField, (0, UINT32_MAX)); \ + OPTIONAL(runtimeLang, DwarfLangField, ); \ OPTIONAL(vtableHolder, MDField, ); \ OPTIONAL(templateParams, MDField, ); \ OPTIONAL(identifier, MDStringField, ); diff --git a/llvm/lib/AsmParser/LLToken.h b/llvm/lib/AsmParser/LLToken.h index 65c59b5654b..ae43a14201a 100644 --- a/llvm/lib/AsmParser/LLToken.h +++ b/llvm/lib/AsmParser/LLToken.h @@ -200,6 +200,7 @@ namespace lltok { StringConstant, // "foo" DwarfTag, // DW_TAG_foo (includes "DW_TAG_") DwarfAttEncoding, // DW_ATE_foo (includes "DW_ATE_") + DwarfLang, // DW_LANG_foo (includes "DW_LANG_") // Type valued tokens (TyVal). Type, diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp index 77e2b2d64b9..0a585a097e2 100644 --- a/llvm/lib/IR/AsmWriter.cpp +++ b/llvm/lib/IR/AsmWriter.cpp @@ -1461,8 +1461,14 @@ static void writeMDCompositeType(raw_ostream &Out, const MDCompositeType *N, writeMetadataAsOperand(Out, N->getElements(), TypePrinter, Machine, Context); } - if (N->getRuntimeLang()) - Out << FS << "runtimeLang: " << N->getRuntimeLang(); + if (unsigned Lang = N->getRuntimeLang()) { + Out << FS << "runtimeLang: "; + if (const char *S = dwarf::LanguageString(Lang)) + Out << S; + else + Out << Lang; + } + if (N->getVTableHolder()) { Out << FS << "vtableHolder: "; writeMetadataAsOperand(Out, N->getVTableHolder(), TypePrinter, Machine, |

