diff options
-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 | ||||
-rw-r--r-- | lib/VMCore/BasicBlock.cpp | 2 | ||||
-rw-r--r-- | lib/VMCore/Function.cpp | 2 | ||||
-rw-r--r-- | lib/VMCore/Module.cpp | 2 | ||||
-rw-r--r-- | lib/VMCore/SymbolTableListTraitsImpl.h | 17 |
8 files changed, 70 insertions, 17 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); }; diff --git a/lib/VMCore/BasicBlock.cpp b/lib/VMCore/BasicBlock.cpp index e10948e2ad..431bb5090a 100644 --- a/lib/VMCore/BasicBlock.cpp +++ b/lib/VMCore/BasicBlock.cpp @@ -72,8 +72,6 @@ template class SymbolTableListTraits<Instruction, BasicBlock>; BasicBlock::BasicBlock(const std::string &Name, Function *NewParent, BasicBlock *InsertBefore) : Value(Type::LabelTy, Value::BasicBlockVal), Parent(0) { - // Initialize the instlist. - InstList.setItemParent(this); // Make sure that we get added to a function LeakDetector::addGarbageObject(this); diff --git a/lib/VMCore/Function.cpp b/lib/VMCore/Function.cpp index 7949e39f84..e47798e12c 100644 --- a/lib/VMCore/Function.cpp +++ b/lib/VMCore/Function.cpp @@ -143,8 +143,6 @@ Function::Function(const FunctionType *Ty, LinkageTypes Linkage, : GlobalValue(PointerType::get(Ty), Value::FunctionVal, 0, 0, Linkage, name) { ParamAttrs = 0; CallingConvention = 0; - BasicBlocks.setItemParent(this); - ArgumentList.setItemParent(this); SymTab = new ValueSymbolTable(); assert((getReturnType()->isFirstClassType() ||getReturnType() == Type::VoidTy) diff --git a/lib/VMCore/Module.cpp b/lib/VMCore/Module.cpp index 465cb69445..ddd503dea1 100644 --- a/lib/VMCore/Module.cpp +++ b/lib/VMCore/Module.cpp @@ -64,8 +64,6 @@ template class SymbolTableListTraits<Function, Module>; Module::Module(const std::string &MID) : ModuleID(MID), DataLayout("") { - FunctionList.setItemParent(this); - GlobalList.setItemParent(this); ValSymTab = new ValueSymbolTable(); TypeSymTab = new TypeSymbolTable(); } diff --git a/lib/VMCore/SymbolTableListTraitsImpl.h b/lib/VMCore/SymbolTableListTraitsImpl.h index ce2c0c0cc7..b2b6a3fa34 100644 --- a/lib/VMCore/SymbolTableListTraitsImpl.h +++ b/lib/VMCore/SymbolTableListTraitsImpl.h @@ -29,19 +29,19 @@ template<typename TPtr> void SymbolTableListTraits<ValueSubClass,ItemParentClass> ::setSymTabObject(TPtr *Dest, TPtr Src) { // Get the old symtab and value list before doing the assignment. - ValueSymbolTable *OldST = TraitsClass::getSymTab(ItemParent); + ValueSymbolTable *OldST = TraitsClass::getSymTab(getListOwner()); // Do it. *Dest = Src; // Get the new SymTab object. - ValueSymbolTable *NewST = TraitsClass::getSymTab(ItemParent); + ValueSymbolTable *NewST = TraitsClass::getSymTab(getListOwner()); // If there is nothing to do, quick exit. if (OldST == NewST) return; // Move all the elements from the old symtab to the new one. - iplist<ValueSubClass> &ItemList = TraitsClass::getList(ItemParent); + iplist<ValueSubClass> &ItemList = TraitsClass::getList(getListOwner()); if (ItemList.empty()) return; if (OldST) { @@ -66,9 +66,10 @@ template<typename ValueSubClass, typename ItemParentClass> void SymbolTableListTraits<ValueSubClass,ItemParentClass> ::addNodeToList(ValueSubClass *V) { assert(V->getParent() == 0 && "Value already in a container!!"); - V->setParent(ItemParent); + ItemParentClass *Owner = getListOwner(); + V->setParent(Owner); if (V->hasName()) - if (ValueSymbolTable *ST = TraitsClass::getSymTab(ItemParent)) + if (ValueSymbolTable *ST = TraitsClass::getSymTab(Owner)) ST->reinsertValue(V); } @@ -77,7 +78,7 @@ void SymbolTableListTraits<ValueSubClass,ItemParentClass> ::removeNodeFromList(ValueSubClass *V) { V->setParent(0); if (V->hasName()) - if (ValueSymbolTable *ST = TraitsClass::getSymTab(ItemParent)) + if (ValueSymbolTable *ST = TraitsClass::getSymTab(getListOwner())) ST->removeValueName(V->getValueName()); } @@ -87,12 +88,12 @@ void SymbolTableListTraits<ValueSubClass,ItemParentClass> ilist_iterator<ValueSubClass> first, ilist_iterator<ValueSubClass> last) { // We only have to do work here if transferring instructions between BBs - ItemParentClass *NewIP = ItemParent, *OldIP = L2.ItemParent; + ItemParentClass *NewIP = getListOwner(), *OldIP = L2.getListOwner(); if (NewIP == OldIP) return; // No work to do at all... // We only have to update symbol table entries if we are transferring the // instructions to a different symtab object... - ValueSymbolTable *NewST = TraitsClass::getSymTab(ItemParent); + ValueSymbolTable *NewST = TraitsClass::getSymTab(NewIP); ValueSymbolTable *OldST = TraitsClass::getSymTab(OldIP); if (NewST != OldST) { for (; first != last; ++first) { |