diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index d598b8ec675..149f76990d3 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -478,17 +478,8 @@ bool LLParser::ParseMDNodeID(MDNode *&Result) { if (ParseUInt32(MID)) return true; // Check existing MDNode. - std::map >::iterator I = MetadataCache.find(MID); - if (I != MetadataCache.end()) { - Result = I->second; - return false; - } - - // Check known forward references. - std::map, LocTy> >::iterator - FI = ForwardRefMDNodes.find(MID); - if (FI != ForwardRefMDNodes.end()) { - Result = FI->second.first; + if (MID < NumberedMetadata.size() && NumberedMetadata[MID] != 0) { + Result = NumberedMetadata[MID]; return false; } @@ -499,6 +490,10 @@ bool LLParser::ParseMDNodeID(MDNode *&Result) { Value *V = MDString::get(Context, FwdRefName); MDNode *FwdNode = MDNode::get(Context, &V, 1); ForwardRefMDNodes[MID] = std::make_pair(FwdNode, Lex.getLoc()); + + if (NumberedMetadata.size() <= MID) + NumberedMetadata.resize(MID+1); + NumberedMetadata[MID] = FwdNode; Result = FwdNode; return false; } @@ -553,16 +548,23 @@ bool LLParser::ParseStandaloneMetadata() { ParseToken(lltok::rbrace, "expected end of metadata node")) return true; - if (MetadataCache.count(MetadataID)) - return TokError("Metadata id is already used"); - MDNode *Init = MDNode::get(Context, Elts.data(), Elts.size()); - MetadataCache[MetadataID] = Init; + + // See if this was forward referenced, if so, handle it. std::map, LocTy> >::iterator FI = ForwardRefMDNodes.find(MetadataID); if (FI != ForwardRefMDNodes.end()) { FI->second.first->replaceAllUsesWith(Init); ForwardRefMDNodes.erase(FI); + + assert(NumberedMetadata[MetadataID] == Init && "Tracking VH didn't work"); + } else { + if (MetadataID >= NumberedMetadata.size()) + NumberedMetadata.resize(MetadataID+1); + + if (NumberedMetadata[MetadataID] != 0) + return TokError("Metadata id is already used"); + NumberedMetadata[MetadataID] = Init; } return false; diff --git a/lib/AsmParser/LLParser.h b/lib/AsmParser/LLParser.h index 7d5cfcf95a7..7802a1e489b 100644 --- a/lib/AsmParser/LLParser.h +++ b/lib/AsmParser/LLParser.h @@ -81,8 +81,7 @@ namespace llvm { std::map > ForwardRefTypes; std::map > ForwardRefTypeIDs; std::vector NumberedTypes; - /// MetadataCache - This map keeps track of parsed metadata constants. - std::map > MetadataCache; + std::vector > NumberedMetadata; std::map, LocTy> > ForwardRefMDNodes; SmallVector, 2> MDsOnInst; struct UpRefRecord {