diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/llvm/BasicBlock.h | 12 | ||||
-rw-r--r-- | include/llvm/Function.h | 22 | ||||
-rw-r--r-- | include/llvm/Module.h | 20 | ||||
-rw-r--r-- | include/llvm/SymbolTableListTraits.h | 10 |
4 files changed, 61 insertions, 3 deletions
diff --git a/include/llvm/BasicBlock.h b/include/llvm/BasicBlock.h index 8cc450c127..0a22f44b98 100644 --- a/include/llvm/BasicBlock.h +++ b/include/llvm/BasicBlock.h @@ -31,6 +31,7 @@ template<> struct ilist_traits<Instruction> static void destroySentinel(Instruction *I) { delete I; } static iplist<Instruction> &getList(BasicBlock *BB); static ValueSymbolTable *getSymTab(BasicBlock *ItemParent); + static int getListOffset(); }; /// This represents a single basic block in LLVM. A basic block is simply a @@ -194,8 +195,19 @@ public: /// the basic block). /// BasicBlock *splitBasicBlock(iterator I, const std::string &BBName = ""); + + + static unsigned getInstListOffset() { + BasicBlock *Obj = 0; + return reinterpret_cast<unsigned>(&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 d42c8d8aa2..3fdbd02500 100644 --- a/include/llvm/Function.h +++ b/include/llvm/Function.h @@ -37,6 +37,7 @@ template<> struct ilist_traits<BasicBlock> static void destroySentinel(BasicBlock *BB) { delete BB; } static iplist<BasicBlock> &getList(Function *F); static ValueSymbolTable *getSymTab(Function *ItemParent); + static int getListOffset(); }; template<> struct ilist_traits<Argument> @@ -47,6 +48,7 @@ template<> struct ilist_traits<Argument> static void destroySentinel(Argument *A) { delete A; } static iplist<Argument> &getList(Function *F); static ValueSymbolTable *getSymTab(Function *ItemParent); + static int getListOffset(); }; class Function : public GlobalValue, public Annotable { @@ -238,6 +240,15 @@ public: /// including any contained basic blocks. /// void dropAllReferences(); + + static unsigned getBasicBlockListOffset() { + Function *Obj = 0; + return reinterpret_cast<unsigned>(&Obj->BasicBlocks); + } + static unsigned getArgumentListOffset() { + Function *Obj = 0; + return reinterpret_cast<unsigned>(&Obj->ArgumentList); + } }; inline ValueSymbolTable * @@ -250,6 +261,17 @@ 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 e645f51c1c..1d82e2aad3 100644 --- a/include/llvm/Module.h +++ b/include/llvm/Module.h @@ -32,6 +32,7 @@ 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> { @@ -40,6 +41,7 @@ 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(); }; /// A Module instance is used to store all the information related to an @@ -313,6 +315,15 @@ public: /// that has "dropped all references", except operator delete. void dropAllReferences(); /// @} + + static unsigned getFunctionListOffset() { + Module *Obj = 0; + return reinterpret_cast<unsigned>(&Obj->FunctionList); + } + static unsigned getGlobalVariableListOffset() { + Module *Obj = 0; + return reinterpret_cast<unsigned>(&Obj->GlobalList); + } }; /// An iostream inserter for modules. @@ -331,6 +342,15 @@ ilist_traits<GlobalVariable>::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(); +} } // End llvm namespace diff --git a/include/llvm/SymbolTableListTraits.h b/include/llvm/SymbolTableListTraits.h index 099cfe0ca7..205b409e8e 100644 --- a/include/llvm/SymbolTableListTraits.h +++ b/include/llvm/SymbolTableListTraits.h @@ -39,10 +39,15 @@ template<typename Ty> struct ilist_traits; template<typename ValueSubClass, typename ItemParentClass> class SymbolTableListTraits { typedef ilist_traits<ValueSubClass> TraitsClass; - ItemParentClass *ItemParent; public: - SymbolTableListTraits() : ItemParent(0) {} + SymbolTableListTraits() {} + /// 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*>((char*)this- + TraitsClass::getListOffset()); + } static ValueSubClass *getPrev(ValueSubClass *V) { return V->getPrev(); } static ValueSubClass *getNext(ValueSubClass *V) { return V->getNext(); } static const ValueSubClass *getPrev(const ValueSubClass *V) { @@ -62,7 +67,6 @@ public: ilist_iterator<ValueSubClass> first, ilist_iterator<ValueSubClass> last); //private: - void setItemParent(ItemParentClass *IP) { ItemParent = IP; } template<typename TPtr> void setSymTabObject(TPtr *, TPtr); }; |