diff --git a/llvm/include/llvm/Metadata.h b/llvm/include/llvm/Metadata.h index fd8ea0c13b2c..e7d9c1a868b5 100644 --- a/llvm/include/llvm/Metadata.h +++ b/llvm/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/llvm/lib/VMCore/Metadata.cpp b/llvm/lib/VMCore/Metadata.cpp index d632f8d4fc12..84cab624c693 100644 --- a/llvm/lib/VMCore/Metadata.cpp +++ b/llvm/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.