Use TrackingVH instead of WeakVH for NamedMDNode's operands, since nodes
authorDan Gohman <gohman@apple.com>
Wed, 21 Jul 2010 18:01:42 +0000 (18:01 +0000)
committerDan Gohman <gohman@apple.com>
Wed, 21 Jul 2010 18:01:42 +0000 (18:01 +0000)
referenced by NamedMDNodes shouldn't be deleted.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@109021 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Metadata.h
lib/VMCore/Metadata.cpp

index 64ab6b7583ed7e89052aaf99c7816cbf5f91a359..7cfcb7007950ae18867be5e59becd66529337434 100644 (file)
@@ -185,7 +185,7 @@ class NamedMDNode : public Value, public ilist_node<NamedMDNode> {
 
   std::string Name;
   Module *Parent;
-  void *Operands; // SmallVector<WeakVH<MDNode>, 4>
+  void *Operands; // SmallVector<TrackingVH<MDNode>, 4>
 
   void setParent(Module *M) { Parent = M; }
 protected:
index b64bde548d1a188de5881fac6d38e664a4d11d8f..a89cffd8e0e06917d5875babcfb7ceea58d0bf5f 100644 (file)
@@ -346,8 +346,8 @@ void ilist_traits<NamedMDNode>::removeNodeFromList(NamedMDNode *N) {
   ST.remove(N->getName());
 }
 
-static SmallVector<WeakVH, 4> &getNMDOps(void *Operands) {
-  return *(SmallVector<WeakVH, 4>*)Operands;
+static SmallVector<TrackingVH<MDNode>, 4> &getNMDOps(void *Operands) {
+  return *(SmallVector<TrackingVH<MDNode>, 4>*)Operands;
 }
 
 NamedMDNode::NamedMDNode(LLVMContext &C, const Twine &N,
@@ -355,11 +355,11 @@ NamedMDNode::NamedMDNode(LLVMContext &C, const Twine &N,
                          unsigned NumMDs, Module *ParentModule)
   : Value(Type::getMetadataTy(C), Value::NamedMDNodeVal), Parent(0) {
   setName(N);
-  Operands = new SmallVector<WeakVH, 4>();
+  Operands = new SmallVector<TrackingVH<MDNode>, 4>();
 
-  SmallVector<WeakVH, 4> &Node = getNMDOps(Operands);
+  SmallVector<TrackingVH<MDNode>, 4> &Node = getNMDOps(Operands);
   for (unsigned i = 0; i != NumMDs; ++i)
-    Node.push_back(WeakVH(MDs[i]));
+    Node.push_back(TrackingVH<MDNode>(MDs[i]));
 
   if (ParentModule)
     ParentModule->getNamedMDList().push_back(this);
@@ -389,12 +389,12 @@ unsigned NamedMDNode::getNumOperands() const {
 /// getOperand - Return specified operand.
 MDNode *NamedMDNode::getOperand(unsigned i) const {
   assert(i < getNumOperands() && "Invalid Operand number!");
-  return dyn_cast_or_null<MDNode>(getNMDOps(Operands)[i]);
+  return dyn_cast_or_null<MDNode>(&*getNMDOps(Operands)[i]);
 }
 
 /// addOperand - Add metadata Operand.
 void NamedMDNode::addOperand(MDNode *M) {
-  getNMDOps(Operands).push_back(WeakVH(M));
+  getNMDOps(Operands).push_back(TrackingVH<MDNode>(M));
 }
 
 /// eraseFromParent - Drop all references and remove the node from parent