[llvm-commits] [llvm] r92207 - in /llvm/trunk: include/llvm/Metadata.h lib/VMCore/Metadata.cpp

Chris Lattner sabre at nondot.org
Sun Dec 27 23:41:54 PST 2009


Author: lattner
Date: Mon Dec 28 01:41:54 2009
New Revision: 92207

URL: http://llvm.org/viewvc/llvm-project?rev=92207&view=rev
Log:
move ElementVH out of the MDNode class into the MDNode.cpp file.  Among
other things, this avoids vtable and rtti data for it being splatted in 
every translation unit that uses it.

Modified:
    llvm/trunk/include/llvm/Metadata.h
    llvm/trunk/lib/VMCore/Metadata.cpp

Modified: llvm/trunk/include/llvm/Metadata.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Metadata.h?rev=92207&r1=92206&r2=92207&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Metadata.h (original)
+++ llvm/trunk/include/llvm/Metadata.h Mon Dec 28 01:41:54 2009
@@ -84,6 +84,9 @@
   }
 };
 
+  
+class MDNodeElement;
+  
 //===----------------------------------------------------------------------===//
 /// MDNode - a tuple of other values.
 /// These contain a list of the values that represent the metadata. 
@@ -91,29 +94,14 @@
 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 @@
   ~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; }
   

Modified: llvm/trunk/lib/VMCore/Metadata.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Metadata.cpp?rev=92207&r1=92206&r2=92207&view=diff

==============================================================================
--- llvm/trunk/lib/VMCore/Metadata.cpp (original)
+++ llvm/trunk/lib/VMCore/Metadata.cpp Mon Dec 28 01:41:54 2009
@@ -47,16 +47,46 @@
 }
 
 //===----------------------------------------------------------------------===//
+// 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 @@
   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 @@
   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.





More information about the llvm-commits mailing list