move ElementVH out of the MDNode class into the MDNode.cpp file. Among
authorChris Lattner <sabre@nondot.org>
Mon, 28 Dec 2009 07:41:54 +0000 (07:41 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 28 Dec 2009 07:41:54 +0000 (07:41 +0000)
other things, this avoids vtable and rtti data for it being splatted in
every translation unit that uses it.

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

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

index fd8ea0c13b2c0044d1ce5a1b49a2a7753e548fdd..e7d9c1a868b5b87520121be435a811d5cb6e49d2 100644 (file)
@@ -84,6 +84,9 @@ public:
   }
 };
 
+  
+class MDNodeElement;
+  
 //===----------------------------------------------------------------------===//
 /// MDNode - a tuple of other values.
 /// These contain a list of the values that represent the metadata. 
@@ -91,29 +94,14 @@ public:
 class MDNode : public MetadataBase, public FoldingSetNode {
   MDNode(const MDNode &);                // DO NOT IMPLEMENT
 
-  friend class ElementVH;
-  // Use CallbackVH to hold MDNode elements.
-  struct ElementVH : public CallbackVH {
-    MDNode *Parent;
-    ElementVH() {}
-    ElementVH(Value *V, MDNode *P) : CallbackVH(V), Parent(P) {}
-    ~ElementVH() {}
-
-    virtual void deleted() {
-      Parent->replaceElement(this->operator Value*(), 0);
-    }
-
-    virtual void allUsesReplacedWith(Value *NV) {
-      Parent->replaceElement(this->operator Value*(), NV);
-    }
-  };
+  friend class MDNodeElement;
   
   static const unsigned short FunctionLocalBit = 1;
   
   // Replace each instance of F from the element list of this node with T.
   void replaceElement(Value *F, Value *T);
 
-  ElementVH *Node;
+  MDNodeElement *Node;
   unsigned NodeSize;
 
 protected:
@@ -128,11 +116,8 @@ public:
   ~MDNode();
   
   /// getElement - Return specified element.
-  Value *getElement(unsigned i) const {
-    assert(i < getNumElements() && "Invalid element number!");
-    return Node[i];
-  }
-
+  Value *getElement(unsigned i) const;
+  
   /// getNumElements - Return number of MDNode elements.
   unsigned getNumElements() const { return NodeSize; }
   
index d632f8d4fc1204ed4ef6a8da54d428ef48b4319f..84cab624c6934e3a5c5d1b0fe03e31b3c66bfc2c 100644 (file)
@@ -46,17 +46,47 @@ MDString *MDString::get(LLVMContext &Context, const char *Str) {
   return S;
 }
 
+//===----------------------------------------------------------------------===//
+// MDNodeElement implementation.
+//
+
+// Use CallbackVH to hold MDNode elements.
+namespace llvm {
+class MDNodeElement : public CallbackVH {
+  MDNode *Parent;
+public:
+  MDNodeElement() {}
+  MDNodeElement(Value *V, MDNode *P) : CallbackVH(V), Parent(P) {}
+  ~MDNodeElement() {}
+  
+  virtual void deleted();
+  virtual void allUsesReplacedWith(Value *NV);
+};
+} // end namespace llvm.
+
+
+void MDNodeElement::deleted() {
+  Parent->replaceElement(this->operator Value*(), 0);
+}
+
+void MDNodeElement::allUsesReplacedWith(Value *NV) {
+  Parent->replaceElement(this->operator Value*(), NV);
+}
+
+
+
 //===----------------------------------------------------------------------===//
 // MDNode implementation.
 //
+
 MDNode::MDNode(LLVMContext &C, Value *const *Vals, unsigned NumVals,
                bool isFunctionLocal)
   : MetadataBase(Type::getMetadataTy(C), Value::MDNodeVal) {
   NodeSize = NumVals;
-  Node = new ElementVH[NodeSize];
-  ElementVH *Ptr = Node;
+  Node = new MDNodeElement[NodeSize];
+  MDNodeElement *Ptr = Node;
   for (unsigned i = 0; i != NumVals; ++i) 
-    *Ptr++ = ElementVH(Vals[i], this);
+    *Ptr++ = MDNodeElement(Vals[i], this);
   if (isFunctionLocal)
     SubclassData |= FunctionLocalBit;
 }
@@ -91,6 +121,14 @@ MDNode::~MDNode() {
   Node = NULL;
 }
 
+/// getElement - Return specified element.
+Value *MDNode::getElement(unsigned i) const {
+  assert(i < getNumElements() && "Invalid element number!");
+  return Node[i];
+}
+
+
+
 // Replace value from this node's element list.
 void MDNode::replaceElement(Value *From, Value *To) {
   if (From == To || !getType())
@@ -119,7 +157,7 @@ void MDNode::replaceElement(Value *From, Value *To) {
   for (SmallVector<unsigned, 4>::iterator I = Indexes.begin(), E = Indexes.end(); 
        I != E; ++I) {
     unsigned Index = *I;
-    Node[Index] = ElementVH(To, this);
+    Node[Index] = MDNodeElement(To, this);
   }
 
   // Insert updated "this" into the context's folding node set.