From 077c0318dcf2e996df82924b232c55c525242949 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Wed, 4 Feb 2015 22:05:21 +0000 Subject: AsmParser: Move MDField details to source file, NFC Move all the types of `MDField` to an anonymous namespace in the source file. This also eliminates the duplication of `ParseMDField()` declarations in the header for each new field type. llvm-svn: 228211 --- llvm/lib/AsmParser/LLParser.cpp | 42 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'llvm/lib/AsmParser/LLParser.cpp') diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index 31c9d65d1e2..427b38ee3b8 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -2923,6 +2923,44 @@ bool LLParser::ParseMDNodeTail(MDNode *&N) { return ParseMDNodeID(N); } +namespace { + +/// Structure to represent an optional metadata field. +template struct MDFieldImpl { + typedef MDFieldImpl ImplTy; + FieldTy Val; + bool Seen; + + void assign(FieldTy Val) { + Seen = true; + this->Val = std::move(Val); + } + + explicit MDFieldImpl(FieldTy Default) + : Val(std::move(Default)), Seen(false) {} +}; +struct MDUnsignedField : public MDFieldImpl { + uint64_t Max; + + MDUnsignedField(uint64_t Default = 0, uint64_t Max = UINT64_MAX) + : ImplTy(Default), Max(Max) {} +}; +struct DwarfTagField : public MDUnsignedField { + DwarfTagField() : MDUnsignedField(0, ~0u >> 16) {} +}; +struct MDField : public MDFieldImpl { + MDField() : ImplTy(nullptr) {} +}; +struct MDStringField : public MDFieldImpl { + MDStringField() : ImplTy(std::string()) {} +}; +struct MDFieldList : public MDFieldImpl> { + MDFieldList() : ImplTy(SmallVector()) {} +}; + +} // end namespace + +template <> bool LLParser::ParseMDField(LocTy Loc, StringRef Name, MDUnsignedField &Result) { if (Lex.getKind() != lltok::APSInt || Lex.getAPSIntVal().isSigned()) @@ -2938,6 +2976,7 @@ bool LLParser::ParseMDField(LocTy Loc, StringRef Name, return false; } +template <> bool LLParser::ParseMDField(LocTy Loc, StringRef Name, DwarfTagField &Result) { if (Lex.getKind() == lltok::APSInt) return ParseMDField(Loc, Name, static_cast(Result)); @@ -2955,6 +2994,7 @@ bool LLParser::ParseMDField(LocTy Loc, StringRef Name, DwarfTagField &Result) { return false; } +template <> bool LLParser::ParseMDField(LocTy Loc, StringRef Name, MDField &Result) { Metadata *MD; if (ParseMetadata(MD, nullptr)) @@ -2964,6 +3004,7 @@ bool LLParser::ParseMDField(LocTy Loc, StringRef Name, MDField &Result) { return false; } +template <> bool LLParser::ParseMDField(LocTy Loc, StringRef Name, MDStringField &Result) { std::string S; if (ParseStringConstant(S)) @@ -2973,6 +3014,7 @@ bool LLParser::ParseMDField(LocTy Loc, StringRef Name, MDStringField &Result) { return false; } +template <> bool LLParser::ParseMDField(LocTy Loc, StringRef Name, MDFieldList &Result) { SmallVector MDs; if (ParseMDNodeVector(MDs)) -- cgit v1.2.3