Use ilist_tratis to autoinsert and remove NamedMDNode from MDSymbolTable.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93247 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Devang Patel 2010-01-12 18:34:06 +00:00
parent 3bda20112e
commit 26028f27dd
5 changed files with 31 additions and 18 deletions

View File

@ -184,8 +184,8 @@ private:
/// NamedMDNode is always named. All NamedMDNode operand has a type of metadata.
class NamedMDNode : public Value, public ilist_node<NamedMDNode> {
friend class SymbolTableListTraits<NamedMDNode, Module>;
friend class ilist_traits<NamedMDNode>;
friend class LLVMContextImpl;
NamedMDNode(const NamedMDNode &); // DO NOT IMPLEMENT
std::string Name;

View File

@ -57,6 +57,7 @@ template<> struct ilist_traits<GlobalAlias>
static GlobalAlias *createSentinel();
static void destroySentinel(GlobalAlias *GA) { delete GA; }
};
template<> struct ilist_traits<NamedMDNode>
: public SymbolTableListTraits<NamedMDNode, Module> {
// createSentinel is used to get hold of a node that marks the end of
@ -69,6 +70,8 @@ template<> struct ilist_traits<NamedMDNode>
NamedMDNode *provideInitialHead() const { return createSentinel(); }
NamedMDNode *ensureHead(NamedMDNode*) const { return createSentinel(); }
static void noteHead(NamedMDNode*, NamedMDNode*) {}
void addNodeToList(NamedMDNode *N);
void removeNodeFromList(NamedMDNode *N);
private:
mutable ilist_node<NamedMDNode> Sentinel;
};
@ -324,10 +327,6 @@ public:
/// NamedMDNode with the specified name is not found.
NamedMDNode *getOrInsertNamedMetadata(StringRef Name);
/// addMDNodeName - Insert an entry in the NamedMDNode symbol table mapping
/// Name to NMD.
void addMDNodeName(StringRef Name, NamedMDNode *NMD);
/// @}
/// @name Type Accessors
/// @{

View File

@ -17,6 +17,7 @@
#include "llvm/Value.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/System/DataTypes.h"
#include "llvm/ADT/ilist_node.h"
namespace llvm {
template<typename ValueSubClass, typename ItemParentClass>
@ -39,7 +40,6 @@ class ValueSymbolTable {
friend class SymbolTableListTraits<Function, Module>;
friend class SymbolTableListTraits<GlobalVariable, Module>;
friend class SymbolTableListTraits<GlobalAlias, Module>;
friend class SymbolTableListTraits<NamedMDNode, Module>;
/// @name Types
/// @{
public:
@ -133,6 +133,7 @@ private:
/// essentially a StringMap wrapper.
class MDSymbolTable {
friend class SymbolTableListTraits<NamedMDNode, Module>;
/// @name Types
/// @{
private:

View File

@ -239,6 +239,26 @@ void MDNode::replaceOperand(MDNodeOperand *Op, Value *To) {
//===----------------------------------------------------------------------===//
// NamedMDNode implementation.
//
namespace llvm {
// SymbolTableListTraits specialization for MDSymbolTable.
void ilist_traits<NamedMDNode>
::addNodeToList(NamedMDNode *N) {
assert(N->getParent() == 0 && "Value already in a container!!");
Module *Owner = getListOwner();
N->setParent(Owner);
MDSymbolTable &ST = Owner->getMDSymbolTable();
ST.insert(N->getName(), N);
}
void ilist_traits<NamedMDNode>::removeNodeFromList(NamedMDNode *N) {
N->setParent(0);
Module *Owner = getListOwner();
MDSymbolTable &ST = Owner->getMDSymbolTable();
ST.remove(N->getName());
}
}
static SmallVector<WeakVH, 4> &getNMDOps(void *Operands) {
return *(SmallVector<WeakVH, 4>*)Operands;
}
@ -254,10 +274,8 @@ NamedMDNode::NamedMDNode(LLVMContext &C, StringRef N,
for (unsigned i = 0; i != NumMDs; ++i)
Node.push_back(WeakVH(MDs[i]));
if (ParentModule) {
if (ParentModule)
ParentModule->getNamedMDList().push_back(this);
ParentModule->addMDNodeName(N, this);
}
}
NamedMDNode *NamedMDNode::Create(const NamedMDNode *NMD, Module *M) {
@ -295,7 +313,6 @@ void NamedMDNode::addOperand(MDNode *M) {
/// eraseFromParent - Drop all references and remove the node from parent
/// module.
void NamedMDNode::eraseFromParent() {
getParent()->getMDSymbolTable().remove(getName());
getParent()->getNamedMDList().erase(this);
}
@ -306,8 +323,10 @@ void NamedMDNode::dropAllReferences() {
/// setName - Set the name of this named metadata.
void NamedMDNode::setName(StringRef N) {
if (!N.empty())
Name = N.str();
assert (!N.empty() && "Invalid named metadata name!");
Name = N.str();
if (Parent)
Parent->getMDSymbolTable().insert(N, this);
}
/// getName - Return a constant reference to this named metadata's name.

View File

@ -325,12 +325,6 @@ NamedMDNode *Module::getOrInsertNamedMetadata(StringRef Name) {
return NMD;
}
/// addMDNodeName - Insert an entry in the NamedMDNode symbol table mapping
/// Name to NMD.
void Module::addMDNodeName(StringRef Name, NamedMDNode *NMD) {
NamedMDSymTab->insert(Name, NMD);
}
//===----------------------------------------------------------------------===//
// Methods for easy access to the types in the module.
//