diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h index 95100c27496..7b48d8afbfa 100644 --- a/include/llvm/Metadata.h +++ b/include/llvm/Metadata.h @@ -200,6 +200,15 @@ public: return new NamedMDNode(N, MDs, NumMDs, M); } + /// eraseFromParent - Drop all references and remove the node from parent + /// module. + void eraseFromParent(); + + /// dropAllReferences - Remove all uses and clear node vector. + void dropAllReferences(); + + ~NamedMDNode(); + typedef SmallVectorImpl::const_iterator const_elem_iterator; /// getParent - Get the module that holds this named metadata collection. diff --git a/lib/VMCore/Metadata.cpp b/lib/VMCore/Metadata.cpp index bf0611f9e46..f548e549441 100644 --- a/lib/VMCore/Metadata.cpp +++ b/lib/VMCore/Metadata.cpp @@ -83,3 +83,20 @@ NamedMDNode::NamedMDNode(const Twine &N, MetadataBase*const* MDs, if (ParentModule) ParentModule->getNamedMDList().push_back(this); } + +/// eraseFromParent - Drop all references and remove the node from parent +/// module. +void NamedMDNode::eraseFromParent() { + dropAllReferences(); + getParent()->getNamedMDList().erase(this); +} + +/// dropAllReferences - Remove all uses and clear node vector. +void NamedMDNode::dropAllReferences() { + // FIXME: Update metadata use list. + Node.clear(); +} + +NamedMDNode::~NamedMDNode() { + dropAllReferences(); +}