From: Chris Lattner Date: Mon, 28 Dec 2009 07:41:54 +0000 (+0000) Subject: move ElementVH out of the MDNode class into the MDNode.cpp file. Among X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=c5e08a963973f43c10869cd249c0718d307dd031;p=oota-llvm.git 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@92207 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h index fd8ea0c13b2..e7d9c1a868b 100644 --- a/include/llvm/Metadata.h +++ b/include/llvm/Metadata.h @@ -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; } diff --git a/lib/VMCore/Metadata.cpp b/lib/VMCore/Metadata.cpp index d632f8d4fc1..84cab624c69 100644 --- a/lib/VMCore/Metadata.cpp +++ b/lib/VMCore/Metadata.cpp @@ -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::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.