aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGabor Greif <ggreif@gmail.com>2009-03-07 10:00:35 +0000
committerGabor Greif <ggreif@gmail.com>2009-03-07 10:00:35 +0000
commitb547a181005cc255fa57c61c1c0dbafca5375fb4 (patch)
treeb410d6b76be08d5820401da6eb8f015fdd7d68fc
parent922a881f32df95170cb2c28e1a5ee0053d6f0f90 (diff)
downloadexternal_llvm-b547a181005cc255fa57c61c1c0dbafca5375fb4.zip
external_llvm-b547a181005cc255fa57c61c1c0dbafca5375fb4.tar.gz
external_llvm-b547a181005cc255fa57c61c1c0dbafca5375fb4.tar.bz2
Remove the burden of dealing with list offsets
from SymbolTableListTraits' clients, and intead request a nice declarative interface. Cleans up an IMHO ugly wart. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66331 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/BasicBlock.h15
-rw-r--r--include/llvm/Function.h28
-rw-r--r--include/llvm/Module.h40
-rw-r--r--include/llvm/SymbolTableListTraits.h9
4 files changed, 25 insertions, 67 deletions
diff --git a/include/llvm/BasicBlock.h b/include/llvm/BasicBlock.h
index 84dc6a6..0d40909 100644
--- a/include/llvm/BasicBlock.h
+++ b/include/llvm/BasicBlock.h
@@ -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
diff --git a/include/llvm/Function.h b/include/llvm/Function.h
index db13a0f..ff0b066 100644
--- a/include/llvm/Function.h
+++ b/include/llvm/Function.h
@@ -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
diff --git a/include/llvm/Module.h b/include/llvm/Module.h
index 92f5869..d706615 100644
--- a/include/llvm/Module.h
+++ b/include/llvm/Module.h
@@ -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
diff --git a/include/llvm/SymbolTableListTraits.h b/include/llvm/SymbolTableListTraits.h
index a6d3e68..b5ec20d 100644
--- a/include/llvm/SymbolTableListTraits.h
+++ b/include/llvm/SymbolTableListTraits.h
@@ -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);