Remove the burden of dealing with list offsets
authorGabor Greif <ggreif@gmail.com>
Sat, 7 Mar 2009 10:00:35 +0000 (10:00 +0000)
committerGabor Greif <ggreif@gmail.com>
Sat, 7 Mar 2009 10:00:35 +0000 (10:00 +0000)
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
include/llvm/Function.h
include/llvm/Module.h
include/llvm/SymbolTableListTraits.h

index 84dc6a66261346ac7914d20512124b462fabb4ed..0d40909f0043f7b92192e86841dda0f5c5e96324 100644 (file)
@@ -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
index db13a0fa8a62dd3af2ceaf1d904528f9148d5d4c..ff0b066a5e505fa9dfd04da876e857043a49d5dd 100644 (file)
@@ -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
index 92f58699cad83a5f8c5424e5fe79f5f77672a60e..d706615ac715b13ca5fef1cdb135b861f934bdd6 100644 (file)
@@ -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
index a6d3e6820fc2928dcf09e3b86e6231c57250a103..b5ec20de600a703f6f475a58154355e345e57d57 100644 (file)
@@ -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);