diff options
author | Devang Patel <dpatel@apple.com> | 2009-07-20 19:00:08 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2009-07-20 19:00:08 +0000 |
commit | 12f2c9dc98c8856dca5a43bd8512904c9d0287b0 (patch) | |
tree | 1943e62b91480468f59b11ea38407b3f2b9eada2 | |
parent | 4b0f4eff1fd931c782ea277b15c389dc34079c0c (diff) | |
download | external_llvm-12f2c9dc98c8856dca5a43bd8512904c9d0287b0.zip external_llvm-12f2c9dc98c8856dca5a43bd8512904c9d0287b0.tar.gz external_llvm-12f2c9dc98c8856dca5a43bd8512904c9d0287b0.tar.bz2 |
Refactor metadata parsing routines into separate functions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76455 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AsmParser/LLParser.cpp | 71 | ||||
-rw-r--r-- | lib/AsmParser/LLParser.h | 2 |
2 files changed, 46 insertions, 27 deletions
diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 8092d57..c0b74a2 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<unsigned, Constant *>::iterator I = MetadataCache.find(MID); + if (I != MetadataCache.end()) { + Node = I->second; + return false; + } + + // Check known forward references. + std::map<unsigned, std::pair<Constant *, LocTy> >::iterator + FI = ForwardRefMDNodes.find(MID); + if (FI != ForwardRefMDNodes.end()) { + Node = FI->second.first; + return false; + } + + // Create MDNode forward reference + SmallVector<Value *, 1> 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<unsigned, Constant *>::iterator I = MetadataCache.find(MID); - if (I != MetadataCache.end()) - ID.ConstantVal = I->second; - else { - std::map<unsigned, std::pair<Constant *, LocTy> >::iterator - FI = ForwardRefMDNodes.find(MID); - if (FI != ForwardRefMDNodes.end()) - ID.ConstantVal = FI->second.first; - else { - // Create MDNode forward reference - SmallVector<Value *, 1> 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 30a49cd..57a1906 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); |