forked from OSchip/llvm-project
Remove the burden of dealing with list offsets
from SymbolTableListTraits' clients, and intead request a nice declarative interface. Cleans up an IMHO ugly wart. llvm-svn: 66331
This commit is contained in:
parent
6acb4d6f7e
commit
5cd1b25822
|
@ -48,7 +48,6 @@ template<> struct ilist_traits<Instruction>
|
|||
|
||||
static iplist<Instruction> &getList(BasicBlock *BB);
|
||||
static ValueSymbolTable *getSymTab(BasicBlock *ItemParent);
|
||||
static int getListOffset();
|
||||
private:
|
||||
mutable ilist_node<Instruction> Sentinel;
|
||||
};
|
||||
|
@ -186,6 +185,9 @@ public:
|
|||
///
|
||||
const InstListType &getInstList() const { return InstList; }
|
||||
InstListType &getInstList() { return InstList; }
|
||||
static iplist<Instruction> BasicBlock::*getSublistAccess(Instruction*) {
|
||||
return &BasicBlock::InstList;
|
||||
}
|
||||
|
||||
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
||||
static inline bool classof(const BasicBlock *) { return true; }
|
||||
|
@ -224,19 +226,8 @@ public:
|
|||
/// the basic block).
|
||||
///
|
||||
BasicBlock *splitBasicBlock(iterator I, const std::string &BBName = "");
|
||||
|
||||
|
||||
static unsigned getInstListOffset() {
|
||||
BasicBlock *Obj = 0;
|
||||
return unsigned(reinterpret_cast<uintptr_t>(&Obj->InstList));
|
||||
}
|
||||
};
|
||||
|
||||
inline int
|
||||
ilist_traits<Instruction>::getListOffset() {
|
||||
return BasicBlock::getInstListOffset();
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
|
|
|
@ -45,7 +45,6 @@ template<> struct ilist_traits<BasicBlock>
|
|||
|
||||
static iplist<BasicBlock> &getList(Function *F);
|
||||
static ValueSymbolTable *getSymTab(Function *ItemParent);
|
||||
static int getListOffset();
|
||||
private:
|
||||
mutable ilist_node<BasicBlock> Sentinel;
|
||||
};
|
||||
|
@ -64,7 +63,6 @@ template<> struct ilist_traits<Argument>
|
|||
|
||||
static iplist<Argument> &getList(Function *F);
|
||||
static ValueSymbolTable *getSymTab(Function *ItemParent);
|
||||
static int getListOffset();
|
||||
private:
|
||||
mutable ilist_node<Argument> Sentinel;
|
||||
};
|
||||
|
@ -305,9 +303,15 @@ public:
|
|||
CheckLazyArguments();
|
||||
return ArgumentList;
|
||||
}
|
||||
static iplist<Argument> Function::*getSublistAccess(Argument*) {
|
||||
return &Function::ArgumentList;
|
||||
}
|
||||
|
||||
const BasicBlockListType &getBasicBlockList() const { return BasicBlocks; }
|
||||
BasicBlockListType &getBasicBlockList() { return BasicBlocks; }
|
||||
static iplist<BasicBlock> Function::*getSublistAccess(BasicBlock*) {
|
||||
return &Function::BasicBlocks;
|
||||
}
|
||||
|
||||
const BasicBlock &getEntryBlock() const { return front(); }
|
||||
BasicBlock &getEntryBlock() { return front(); }
|
||||
|
@ -393,15 +397,6 @@ public:
|
|||
/// including any contained basic blocks.
|
||||
///
|
||||
void dropAllReferences();
|
||||
|
||||
static unsigned getBasicBlockListOffset() {
|
||||
Function *Obj = 0;
|
||||
return unsigned(reinterpret_cast<uintptr_t>(&Obj->BasicBlocks));
|
||||
}
|
||||
static unsigned getArgumentListOffset() {
|
||||
Function *Obj = 0;
|
||||
return unsigned(reinterpret_cast<uintptr_t>(&Obj->ArgumentList));
|
||||
}
|
||||
};
|
||||
|
||||
inline ValueSymbolTable *
|
||||
|
@ -414,17 +409,6 @@ ilist_traits<Argument>::getSymTab(Function *F) {
|
|||
return F ? &F->getValueSymbolTable() : 0;
|
||||
}
|
||||
|
||||
inline int
|
||||
ilist_traits<BasicBlock>::getListOffset() {
|
||||
return Function::getBasicBlockListOffset();
|
||||
}
|
||||
|
||||
inline int
|
||||
ilist_traits<Argument>::getListOffset() {
|
||||
return Function::getArgumentListOffset();
|
||||
}
|
||||
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
|
|
|
@ -33,7 +33,6 @@ template<> struct ilist_traits<Function>
|
|||
static void destroySentinel(Function *F) { delete F; }
|
||||
static iplist<Function> &getList(Module *M);
|
||||
static inline ValueSymbolTable *getSymTab(Module *M);
|
||||
static int getListOffset();
|
||||
};
|
||||
template<> struct ilist_traits<GlobalVariable>
|
||||
: public SymbolTableListTraits<GlobalVariable, Module> {
|
||||
|
@ -42,7 +41,6 @@ template<> struct ilist_traits<GlobalVariable>
|
|||
static void destroySentinel(GlobalVariable *GV) { delete GV; }
|
||||
static iplist<GlobalVariable> &getList(Module *M);
|
||||
static inline ValueSymbolTable *getSymTab(Module *M);
|
||||
static int getListOffset();
|
||||
};
|
||||
template<> struct ilist_traits<GlobalAlias>
|
||||
: public SymbolTableListTraits<GlobalAlias, Module> {
|
||||
|
@ -51,7 +49,6 @@ template<> struct ilist_traits<GlobalAlias>
|
|||
static void destroySentinel(GlobalAlias *GA) { delete GA; }
|
||||
static iplist<GlobalAlias> &getList(Module *M);
|
||||
static inline ValueSymbolTable *getSymTab(Module *M);
|
||||
static int getListOffset();
|
||||
};
|
||||
|
||||
/// A Module instance is used to store all the information related to an
|
||||
|
@ -294,14 +291,23 @@ public:
|
|||
const GlobalListType &getGlobalList() const { return GlobalList; }
|
||||
/// Get the Module's list of global variables.
|
||||
GlobalListType &getGlobalList() { return GlobalList; }
|
||||
static iplist<GlobalVariable> Module::*getSublistAccess(GlobalVariable*) {
|
||||
return &Module::GlobalList;
|
||||
}
|
||||
/// Get the Module's list of functions (constant).
|
||||
const FunctionListType &getFunctionList() const { return FunctionList; }
|
||||
/// Get the Module's list of functions.
|
||||
FunctionListType &getFunctionList() { return FunctionList; }
|
||||
static iplist<Function> Module::*getSublistAccess(Function*) {
|
||||
return &Module::FunctionList;
|
||||
}
|
||||
/// Get the Module's list of aliases (constant).
|
||||
const AliasListType &getAliasList() const { return AliasList; }
|
||||
/// Get the Module's list of aliases.
|
||||
AliasListType &getAliasList() { return AliasList; }
|
||||
static iplist<GlobalAlias> Module::*getSublistAccess(GlobalAlias*) {
|
||||
return &Module::AliasList;
|
||||
}
|
||||
/// Get the symbol table of global variable and function identifiers
|
||||
const ValueSymbolTable &getValueSymbolTable() const { return *ValSymTab; }
|
||||
/// Get the Module's symbol table of global variable and function identifiers.
|
||||
|
@ -395,19 +401,6 @@ public:
|
|||
/// that has "dropped all references", except operator delete.
|
||||
void dropAllReferences();
|
||||
/// @}
|
||||
|
||||
static unsigned getFunctionListOffset() {
|
||||
Module *Obj = 0;
|
||||
return unsigned(reinterpret_cast<uintptr_t>(&Obj->FunctionList));
|
||||
}
|
||||
static unsigned getGlobalVariableListOffset() {
|
||||
Module *Obj = 0;
|
||||
return unsigned(reinterpret_cast<uintptr_t>(&Obj->GlobalList));
|
||||
}
|
||||
static unsigned getAliasListOffset() {
|
||||
Module *Obj = 0;
|
||||
return unsigned(reinterpret_cast<uintptr_t>(&Obj->AliasList));
|
||||
}
|
||||
};
|
||||
|
||||
/// An iostream inserter for modules.
|
||||
|
@ -436,21 +429,6 @@ ilist_traits<GlobalAlias>::getSymTab(Module *M) {
|
|||
return M ? &M->getValueSymbolTable() : 0;
|
||||
}
|
||||
|
||||
inline int
|
||||
ilist_traits<Function>::getListOffset() {
|
||||
return Module::getFunctionListOffset();
|
||||
}
|
||||
|
||||
inline int
|
||||
ilist_traits<GlobalVariable>::getListOffset() {
|
||||
return Module::getGlobalVariableListOffset();
|
||||
}
|
||||
|
||||
inline int
|
||||
ilist_traits<GlobalAlias>::getListOffset() {
|
||||
return Module::getAliasListOffset();
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
|
|
|
@ -45,8 +45,13 @@ public:
|
|||
/// getListOwner - Return the object that owns this list. If this is a list
|
||||
/// of instructions, it returns the BasicBlock that owns them.
|
||||
ItemParentClass *getListOwner() {
|
||||
return reinterpret_cast<ItemParentClass*>(reinterpret_cast<char*>(this)-
|
||||
TraitsClass::getListOffset());
|
||||
typedef iplist<ValueSubClass> ItemParentClass::*Sublist;
|
||||
Sublist Sub(ItemParentClass::
|
||||
getSublistAccess(static_cast<ValueSubClass*>(0)));
|
||||
size_t Offset(size_t(&((ItemParentClass*)0->*Sub)));
|
||||
iplist<ValueSubClass>* Anchor(static_cast<iplist<ValueSubClass>*>(this));
|
||||
return reinterpret_cast<ItemParentClass*>(reinterpret_cast<char*>(Anchor)-
|
||||
Offset);
|
||||
}
|
||||
|
||||
void addNodeToList(ValueSubClass *V);
|
||||
|
|
Loading…
Reference in New Issue