From: Devang Patel Date: Mon, 20 Jul 2009 19:00:08 +0000 (+0000) Subject: Refactor metadata parsing routines into separate functions. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=256be96457faf173de2ac3f8145077b7e6fb41ba;p=oota-llvm.git Refactor metadata parsing routines into separate functions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76455 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 8092d577794..c0b74a2e4cd 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -365,6 +365,47 @@ bool LLParser::ParseNamedGlobal() { return ParseAlias(Name, NameLoc, Visibility); } +// MDString: +// ::= '!' STRINGCONSTANT +bool LLParser::ParseMDString(Constant *&MDS) { + std::string Str; + if (ParseStringConstant(Str)) return true; + MDS = Context.getMDString(Str.data(), Str.data() + Str.size()); + return false; +} + +// MDNode: +// ::= '!' MDNodeNumber +bool LLParser::ParseMDNode(Constant *&Node) { + // !{ ..., !42, ... } + unsigned MID = 0; + if (ParseUInt32(MID)) return true; + + // Check existing MDNode. + std::map::iterator I = MetadataCache.find(MID); + if (I != MetadataCache.end()) { + Node = I->second; + return false; + } + + // Check known forward references. + std::map >::iterator + FI = ForwardRefMDNodes.find(MID); + if (FI != ForwardRefMDNodes.end()) { + Node = FI->second.first; + return false; + } + + // Create MDNode forward reference + SmallVector Elts; + std::string FwdRefName = "llvm.mdnode.fwdref." + utostr(MID); + Elts.push_back(Context.getMDString(FwdRefName)); + MDNode *FwdNode = Context.getMDNode(Elts.data(), Elts.size()); + ForwardRefMDNodes[MID] = std::make_pair(FwdNode, Lex.getLoc()); + Node = FwdNode; + return false; +} + /// ParseStandaloneMetadata: /// !42 = !{...} bool LLParser::ParseStandaloneMetadata() { @@ -1647,36 +1688,12 @@ bool LLParser::ParseValID(ValID &ID) { // Standalone metadata reference // !{ ..., !42, ... } - unsigned MID = 0; - if (!ParseUInt32(MID)) { - std::map::iterator I = MetadataCache.find(MID); - if (I != MetadataCache.end()) - ID.ConstantVal = I->second; - else { - std::map >::iterator - FI = ForwardRefMDNodes.find(MID); - if (FI != ForwardRefMDNodes.end()) - ID.ConstantVal = FI->second.first; - else { - // Create MDNode forward reference - SmallVector Elts; - std::string FwdRefName = "llvm.mdnode.fwdref." + utostr(MID); - Elts.push_back(Context.getMDString(FwdRefName)); - MDNode *FwdNode = Context.getMDNode(Elts.data(), Elts.size()); - ForwardRefMDNodes[MID] = std::make_pair(FwdNode, Lex.getLoc()); - ID.ConstantVal = FwdNode; - } - } - + if (!ParseMDNode(ID.ConstantVal)) return false; - } - + // MDString: // ::= '!' STRINGCONSTANT - std::string Str; - if (ParseStringConstant(Str)) return true; - - ID.ConstantVal = Context.getMDString(Str.data(), Str.data() + Str.size()); + if (ParseMDString(ID.ConstantVal)) return true; return false; } case lltok::APSInt: diff --git a/lib/AsmParser/LLParser.h b/lib/AsmParser/LLParser.h index 30a49cd8848..57a19061132 100644 --- a/lib/AsmParser/LLParser.h +++ b/lib/AsmParser/LLParser.h @@ -147,6 +147,8 @@ namespace llvm { bool HasLinkage, unsigned Visibility); bool ParseAlias(const std::string &Name, LocTy Loc, unsigned Visibility); bool ParseStandaloneMetadata(); + bool ParseMDString(Constant *&S); + bool ParseMDNode(Constant *&N); // Type Parsing. bool ParseType(PATypeHolder &Result, bool AllowVoid = false);