From b547a181005cc255fa57c61c1c0dbafca5375fb4 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Sat, 7 Mar 2009 10:00:35 +0000 Subject: [PATCH] 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 --- include/llvm/BasicBlock.h | 15 +++-------- include/llvm/Function.h | 28 +++++-------------- include/llvm/Module.h | 40 +++++++--------------------- include/llvm/SymbolTableListTraits.h | 9 +++++-- 4 files changed, 25 insertions(+), 67 deletions(-) diff --git a/include/llvm/BasicBlock.h b/include/llvm/BasicBlock.h index 84dc6a66261..0d40909f004 100644 --- a/include/llvm/BasicBlock.h +++ b/include/llvm/BasicBlock.h @@ -48,7 +48,6 @@ template<> struct ilist_traits static iplist &getList(BasicBlock *BB); static ValueSymbolTable *getSymTab(BasicBlock *ItemParent); - static int getListOffset(); private: mutable ilist_node Sentinel; }; @@ -186,6 +185,9 @@ public: /// const InstListType &getInstList() const { return InstList; } InstListType &getInstList() { return InstList; } + static iplist 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(&Obj->InstList)); - } }; -inline int -ilist_traits::getListOffset() { - return BasicBlock::getInstListOffset(); -} - } // End llvm namespace #endif diff --git a/include/llvm/Function.h b/include/llvm/Function.h index db13a0fa8a6..ff0b066a5e5 100644 --- a/include/llvm/Function.h +++ b/include/llvm/Function.h @@ -45,7 +45,6 @@ template<> struct ilist_traits static iplist &getList(Function *F); static ValueSymbolTable *getSymTab(Function *ItemParent); - static int getListOffset(); private: mutable ilist_node Sentinel; }; @@ -64,7 +63,6 @@ template<> struct ilist_traits static iplist &getList(Function *F); static ValueSymbolTable *getSymTab(Function *ItemParent); - static int getListOffset(); private: mutable ilist_node Sentinel; }; @@ -305,9 +303,15 @@ public: CheckLazyArguments(); return ArgumentList; } + static iplist Function::*getSublistAccess(Argument*) { + return &Function::ArgumentList; + } const BasicBlockListType &getBasicBlockList() const { return BasicBlocks; } BasicBlockListType &getBasicBlockList() { return BasicBlocks; } + static iplist 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(&Obj->BasicBlocks)); - } - static unsigned getArgumentListOffset() { - Function *Obj = 0; - return unsigned(reinterpret_cast(&Obj->ArgumentList)); - } }; inline ValueSymbolTable * @@ -414,17 +409,6 @@ ilist_traits::getSymTab(Function *F) { return F ? &F->getValueSymbolTable() : 0; } -inline int -ilist_traits::getListOffset() { - return Function::getBasicBlockListOffset(); -} - -inline int -ilist_traits::getListOffset() { - return Function::getArgumentListOffset(); -} - - } // End llvm namespace #endif diff --git a/include/llvm/Module.h b/include/llvm/Module.h index 92f58699cad..d706615ac71 100644 --- a/include/llvm/Module.h +++ b/include/llvm/Module.h @@ -33,7 +33,6 @@ template<> struct ilist_traits static void destroySentinel(Function *F) { delete F; } static iplist &getList(Module *M); static inline ValueSymbolTable *getSymTab(Module *M); - static int getListOffset(); }; template<> struct ilist_traits : public SymbolTableListTraits { @@ -42,7 +41,6 @@ template<> struct ilist_traits static void destroySentinel(GlobalVariable *GV) { delete GV; } static iplist &getList(Module *M); static inline ValueSymbolTable *getSymTab(Module *M); - static int getListOffset(); }; template<> struct ilist_traits : public SymbolTableListTraits { @@ -51,7 +49,6 @@ template<> struct ilist_traits static void destroySentinel(GlobalAlias *GA) { delete GA; } static iplist &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 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 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 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(&Obj->FunctionList)); - } - static unsigned getGlobalVariableListOffset() { - Module *Obj = 0; - return unsigned(reinterpret_cast(&Obj->GlobalList)); - } - static unsigned getAliasListOffset() { - Module *Obj = 0; - return unsigned(reinterpret_cast(&Obj->AliasList)); - } }; /// An iostream inserter for modules. @@ -436,21 +429,6 @@ ilist_traits::getSymTab(Module *M) { return M ? &M->getValueSymbolTable() : 0; } -inline int -ilist_traits::getListOffset() { - return Module::getFunctionListOffset(); -} - -inline int -ilist_traits::getListOffset() { - return Module::getGlobalVariableListOffset(); -} - -inline int -ilist_traits::getListOffset() { - return Module::getAliasListOffset(); -} - } // End llvm namespace #endif diff --git a/include/llvm/SymbolTableListTraits.h b/include/llvm/SymbolTableListTraits.h index a6d3e6820fc..b5ec20de600 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(reinterpret_cast(this)- - TraitsClass::getListOffset()); + typedef iplist ItemParentClass::*Sublist; + Sublist Sub(ItemParentClass:: + getSublistAccess(static_cast(0))); + size_t Offset(size_t(&((ItemParentClass*)0->*Sub))); + iplist* Anchor(static_cast*>(this)); + return reinterpret_cast(reinterpret_cast(Anchor)- + Offset); } void addNodeToList(ValueSubClass *V); -- 2.34.1