aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-12-29 21:43:58 +0000
committerChris Lattner <sabre@nondot.org>2009-12-29 21:43:58 +0000
commite80250ec84e6e3aa916a66acc507241e7bde89c9 (patch)
treed034f36f69538836ecea5b158ec334d3d01c20dc
parent3f3a0f6b498e80ffaeb83f03c8697e5d54fd9337 (diff)
switch to TrackingVH instead of WeakVH, since these can never
be RAUW'd and go to null. This also gets us some sorely lacking type safety. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@92272 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/AsmParser/LLParser.cpp20
-rw-r--r--lib/AsmParser/LLParser.h6
2 files changed, 13 insertions, 13 deletions
diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp
index 3a2d24440d..0030617fe5 100644
--- a/lib/AsmParser/LLParser.cpp
+++ b/lib/AsmParser/LLParser.cpp
@@ -472,29 +472,30 @@ bool LLParser::ParseMDString(MetadataBase *&MDS) {
// MDNode:
// ::= '!' MDNodeNumber
+// FIXME: Take an MDNode*&.
bool LLParser::ParseMDNode(MetadataBase *&Node) {
// !{ ..., !42, ... }
unsigned MID = 0;
- if (ParseUInt32(MID)) return true;
+ if (ParseUInt32(MID)) return true;
// Check existing MDNode.
- std::map<unsigned, WeakVH>::iterator I = MetadataCache.find(MID);
+ std::map<unsigned, TrackingVH<MDNode> >::iterator I = MetadataCache.find(MID);
if (I != MetadataCache.end()) {
- Node = cast<MetadataBase>(I->second);
+ Node = I->second;
return false;
}
// Check known forward references.
- std::map<unsigned, std::pair<WeakVH, LocTy> >::iterator
+ std::map<unsigned, std::pair<TrackingVH<MDNode>, LocTy> >::iterator
FI = ForwardRefMDNodes.find(MID);
if (FI != ForwardRefMDNodes.end()) {
- Node = cast<MetadataBase>(FI->second.first);
+ Node = FI->second.first;
return false;
}
// Create MDNode forward reference
- SmallVector<Value *, 1> Elts;
std::string FwdRefName = "llvm.mdnode.fwdref." + utostr(MID);
+ SmallVector<Value *, 1> Elts;
Elts.push_back(MDString::get(Context, FwdRefName));
MDNode *FwdNode = MDNode::get(Context, Elts.data(), Elts.size());
ForwardRefMDNodes[MID] = std::make_pair(FwdNode, Lex.getLoc());
@@ -544,7 +545,7 @@ bool LLParser::ParseStandaloneMetadata() {
unsigned MetadataID = 0;
if (ParseUInt32(MetadataID))
return true;
- if (MetadataCache.find(MetadataID) != MetadataCache.end())
+ if (MetadataCache.count(MetadataID))
return TokError("Metadata id is already used");
if (ParseToken(lltok::equal, "expected '=' here"))
return true;
@@ -568,11 +569,10 @@ bool LLParser::ParseStandaloneMetadata() {
MDNode *Init = MDNode::get(Context, Elts.data(), Elts.size());
MetadataCache[MetadataID] = Init;
- std::map<unsigned, std::pair<WeakVH, LocTy> >::iterator
+ std::map<unsigned, std::pair<TrackingVH<MDNode>, LocTy> >::iterator
FI = ForwardRefMDNodes.find(MetadataID);
if (FI != ForwardRefMDNodes.end()) {
- MDNode *FwdNode = cast<MDNode>(FI->second.first);
- FwdNode->replaceAllUsesWith(Init);
+ FI->second.first->replaceAllUsesWith(Init);
ForwardRefMDNodes.erase(FI);
}
diff --git a/lib/AsmParser/LLParser.h b/lib/AsmParser/LLParser.h
index eec524a5e6..7e90182052 100644
--- a/lib/AsmParser/LLParser.h
+++ b/lib/AsmParser/LLParser.h
@@ -17,8 +17,8 @@
#include "LLLexer.h"
#include "llvm/Module.h"
#include "llvm/Type.h"
-#include <map>
#include "llvm/Support/ValueHandle.h"
+#include <map>
namespace llvm {
class Module;
@@ -80,8 +80,8 @@ namespace llvm {
std::map<unsigned, std::pair<PATypeHolder, LocTy> > ForwardRefTypeIDs;
std::vector<PATypeHolder> NumberedTypes;
/// MetadataCache - This map keeps track of parsed metadata constants.
- std::map<unsigned, WeakVH> MetadataCache;
- std::map<unsigned, std::pair<WeakVH, LocTy> > ForwardRefMDNodes;
+ std::map<unsigned, TrackingVH<MDNode> > MetadataCache;
+ std::map<unsigned, std::pair<TrackingVH<MDNode>, LocTy> > ForwardRefMDNodes;
SmallVector<std::pair<unsigned, MDNode *>, 2> MDsOnInst;
struct UpRefRecord {
/// Loc - This is the location of the upref.