aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Metadata.h29
-rw-r--r--lib/VMCore/Metadata.cpp46
2 files changed, 49 insertions, 26 deletions
diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h
index fd8ea0c13b..e7d9c1a868 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 d632f8d4fc..84cab624c6 100644
--- a/lib/VMCore/Metadata.cpp
+++ b/lib/VMCore/Metadata.cpp
@@ -47,16 +47,46 @@ MDString *MDString::get(LLVMContext &Context, const char *Str) {
}
//===----------------------------------------------------------------------===//
+// 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.