aboutsummaryrefslogtreecommitdiff
path: root/lib/AsmParser/LLParser.cpp
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2009-07-20 19:00:08 +0000
committerDevang Patel <dpatel@apple.com>2009-07-20 19:00:08 +0000
commit256be96457faf173de2ac3f8145077b7e6fb41ba (patch)
tree1943e62b91480468f59b11ea38407b3f2b9eada2 /lib/AsmParser/LLParser.cpp
parenta3af370dc12f6d5100da5d614ab0a62da135569a (diff)
Refactor metadata parsing routines into separate functions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76455 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AsmParser/LLParser.cpp')
-rw-r--r--lib/AsmParser/LLParser.cpp71
1 files changed, 44 insertions, 27 deletions
diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp
index 8092d57779..c0b74a2e4c 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: