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.

llvm-svn: 92207
This commit is contained in:
Chris Lattner 2009-12-28 07:41:54 +00:00
parent f81add3fdf
commit 74a6ad6f29
2 changed files with 49 additions and 26 deletions

View 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; }

View 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.