diff options
Diffstat (limited to 'llvm/lib/AsmParser/LLParser.cpp')
-rw-r--r-- | llvm/lib/AsmParser/LLParser.cpp | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index 39c613599e6..e72686d045c 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -3260,6 +3260,9 @@ struct DwarfVirtualityField : public MDUnsignedField { struct DwarfLangField : public MDUnsignedField { DwarfLangField() : MDUnsignedField(0, dwarf::DW_LANG_hi_user) {} }; +struct EmissionKindField : public MDUnsignedField { + EmissionKindField() : MDUnsignedField(0, DICompileUnit::LastEmissionKind) {} +}; struct DIFlagField : public MDUnsignedField { DIFlagField() : MDUnsignedField(0, UINT32_MAX) {} @@ -3400,6 +3403,24 @@ bool LLParser::ParseMDField(LocTy Loc, StringRef Name, DwarfLangField &Result) { } template <> +bool LLParser::ParseMDField(LocTy Loc, StringRef Name, EmissionKindField &Result) { + if (Lex.getKind() == lltok::APSInt) + return ParseMDField(Loc, Name, static_cast<MDUnsignedField &>(Result)); + + if (Lex.getKind() != lltok::EmissionKind) + return TokError("expected emission kind"); + + auto Kind = DICompileUnit::getEmissionKind(Lex.getStrVal()); + if (!Kind) + return TokError("invalid emission kind" + Twine(" '") + Lex.getStrVal() + + "'"); + assert(*Kind <= Result.Max && "Expected valid emission kind"); + Result.assign(*Kind); + Lex.Lex(); + return false; +} + +template <> bool LLParser::ParseMDField(LocTy Loc, StringRef Name, DwarfAttEncodingField &Result) { if (Lex.getKind() == lltok::APSInt) @@ -3772,7 +3793,8 @@ bool LLParser::ParseDIFile(MDNode *&Result, bool IsDistinct) { /// ParseDICompileUnit: /// ::= !DICompileUnit(language: DW_LANG_C99, file: !0, producer: "clang", /// isOptimized: true, flags: "-O2", runtimeVersion: 1, -/// splitDebugFilename: "abc.debug", emissionKind: 1, +/// splitDebugFilename: "abc.debug", +/// emissionKind: FullDebug, /// enums: !1, retainedTypes: !2, subprograms: !3, /// globals: !4, imports: !5, macros: !6, dwoId: 0x0abcd) bool LLParser::ParseDICompileUnit(MDNode *&Result, bool IsDistinct) { @@ -3787,7 +3809,7 @@ bool LLParser::ParseDICompileUnit(MDNode *&Result, bool IsDistinct) { OPTIONAL(flags, MDStringField, ); \ OPTIONAL(runtimeVersion, MDUnsignedField, (0, UINT32_MAX)); \ OPTIONAL(splitDebugFilename, MDStringField, ); \ - OPTIONAL(emissionKind, MDUnsignedField, (0, UINT32_MAX)); \ + OPTIONAL(emissionKind, EmissionKindField, ); \ OPTIONAL(enums, MDField, ); \ OPTIONAL(retainedTypes, MDField, ); \ OPTIONAL(subprograms, MDField, ); \ |