diff options
| author | Chris Lattner <sabre@nondot.org> | 2009-12-28 08:07:14 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2009-12-28 08:07:14 +0000 |
| commit | 1bc810bb8973cc1f875d622cdb679f15963c30af (patch) | |
| tree | b684d2003f65736a77bce655e88a52a712686425 /llvm/lib/VMCore/Metadata.cpp | |
| parent | f1ef03ad4d192f6355fe12ce502c1dab9973117b (diff) | |
| download | bcm5719-llvm-1bc810bb8973cc1f875d622cdb679f15963c30af.tar.gz bcm5719-llvm-1bc810bb8973cc1f875d622cdb679f15963c30af.zip | |
change NamedMDNode to use a pimpl for its operand list instead
of making it a declared part of the value.
llvm-svn: 92209
Diffstat (limited to 'llvm/lib/VMCore/Metadata.cpp')
| -rw-r--r-- | llvm/lib/VMCore/Metadata.cpp | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/llvm/lib/VMCore/Metadata.cpp b/llvm/lib/VMCore/Metadata.cpp index 84cab624c69..26b5294ac36 100644 --- a/llvm/lib/VMCore/Metadata.cpp +++ b/llvm/lib/VMCore/Metadata.cpp @@ -226,12 +226,19 @@ bool MDNode::getLocalFunction(Function *LocalFunction, //===----------------------------------------------------------------------===// // NamedMDNode implementation. // +static SmallVector<TrackingVH<MetadataBase>, 4> &getNMDOps(void *Operands) { + return *(SmallVector<TrackingVH<MetadataBase>, 4>*)Operands; +} + NamedMDNode::NamedMDNode(LLVMContext &C, const Twine &N, MetadataBase *const *MDs, unsigned NumMDs, Module *ParentModule) : MetadataBase(Type::getMetadataTy(C), Value::NamedMDNodeVal), Parent(0) { setName(N); - + + Operands = new SmallVector<TrackingVH<MetadataBase>, 4>(); + + SmallVector<TrackingVH<MetadataBase>, 4> &Node = getNMDOps(Operands); for (unsigned i = 0; i != NumMDs; ++i) Node.push_back(TrackingVH<MetadataBase>(MDs[i])); @@ -242,12 +249,35 @@ NamedMDNode::NamedMDNode(LLVMContext &C, const Twine &N, NamedMDNode *NamedMDNode::Create(const NamedMDNode *NMD, Module *M) { assert(NMD && "Invalid source NamedMDNode!"); SmallVector<MetadataBase *, 4> Elems; + Elems.reserve(NMD->getNumElements()); + for (unsigned i = 0, e = NMD->getNumElements(); i != e; ++i) Elems.push_back(NMD->getElement(i)); return new NamedMDNode(NMD->getContext(), NMD->getName().data(), Elems.data(), Elems.size(), M); } +NamedMDNode::~NamedMDNode() { + dropAllReferences(); + delete &getNMDOps(Operands); +} + +/// getNumElements - Return number of NamedMDNode elements. +unsigned NamedMDNode::getNumElements() const { + return (unsigned)getNMDOps(Operands).size(); +} + +/// getElement - Return specified element. +MetadataBase *NamedMDNode::getElement(unsigned i) const { + assert(i < getNumElements() && "Invalid element number!"); + return getNMDOps(Operands)[i]; +} + +/// addElement - Add metadata element. +void NamedMDNode::addElement(MetadataBase *M) { + getNMDOps(Operands).push_back(TrackingVH<MetadataBase>(M)); +} + /// eraseFromParent - Drop all references and remove the node from parent /// module. void NamedMDNode::eraseFromParent() { @@ -256,12 +286,9 @@ void NamedMDNode::eraseFromParent() { /// dropAllReferences - Remove all uses and clear node vector. void NamedMDNode::dropAllReferences() { - Node.clear(); + getNMDOps(Operands).clear(); } -NamedMDNode::~NamedMDNode() { - dropAllReferences(); -} //===----------------------------------------------------------------------===// // MetadataContextImpl implementation. |

