NamedMDNode(const NamedMDNode &); // DO NOT IMPLEMENT
Module *Parent;
- SmallVector<TrackingVH<MetadataBase>, 4> Node;
+ void *Operands; // SmallVector<TrackingVH<MetadataBase>, 4>
void setParent(Module *M) { Parent = M; }
protected:
inline const Module *getParent() const { return Parent; }
/// getElement - Return specified element.
- MetadataBase *getElement(unsigned i) const {
- assert(i < getNumElements() && "Invalid element number!");
- return Node[i];
- }
-
+ MetadataBase *getElement(unsigned i) const;
+
/// getNumElements - Return number of NamedMDNode elements.
- unsigned getNumElements() const {
- return (unsigned)Node.size();
- }
+ unsigned getNumElements() const;
/// addElement - Add metadata element.
- void addElement(MetadataBase *M) {
- Node.push_back(TrackingVH<MetadataBase>(M));
- }
-
+ void addElement(MetadataBase *M);
+
/// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const NamedMDNode *) { return true; }
static bool classof(const Value *V) {
//===----------------------------------------------------------------------===//
// 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]));
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() {
/// dropAllReferences - Remove all uses and clear node vector.
void NamedMDNode::dropAllReferences() {
- Node.clear();
+ getNMDOps(Operands).clear();
}
-NamedMDNode::~NamedMDNode() {
- dropAllReferences();
-}
//===----------------------------------------------------------------------===//
// MetadataContextImpl implementation.