OSDN Git Service

simplify the way how traits get hold of the symbol table
authorGabor Greif <ggreif@gmail.com>
Sat, 7 Mar 2009 12:33:24 +0000 (12:33 +0000)
committerGabor Greif <ggreif@gmail.com>
Sat, 7 Mar 2009 12:33:24 +0000 (12:33 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66336 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/BasicBlock.h
include/llvm/Module.h
include/llvm/SymbolTableListTraits.h
lib/VMCore/BasicBlock.cpp

index 0de7100..072f615 100644 (file)
@@ -45,8 +45,6 @@ template<> struct ilist_traits<Instruction>
   Instruction *provideInitialHead() const { return createSentinel(); }
   Instruction *ensureHead(Instruction*) const { return createSentinel(); }
   static void noteHead(Instruction*, Instruction*) {}
-
-  static ValueSymbolTable *getSymTab(BasicBlock *ItemParent);
 private:
   mutable ilist_node<Instruction> Sentinel;
 };
@@ -184,10 +182,15 @@ public:
   ///
   const InstListType &getInstList() const { return InstList; }
         InstListType &getInstList()       { return InstList; }
+
+  /// getSublistAccess() - returns pointer to member of instruction list
   static iplist<Instruction> BasicBlock::*getSublistAccess(Instruction*) {
     return &BasicBlock::InstList;
   }
 
+  /// getValueSymbolTable() - returns pointer to symbol table (if any)
+  ValueSymbolTable *getValueSymbolTable();
+
   /// Methods for support type inquiry through isa, cast, and dyn_cast:
   static inline bool classof(const BasicBlock *) { return true; }
   static inline bool classof(const Value *V) {
index 2564ddc..9d0b2b6 100644 (file)
@@ -31,21 +31,18 @@ template<> struct ilist_traits<Function>
   // createSentinel is used to create a node that marks the end of the list.
   static Function *createSentinel();
   static void destroySentinel(Function *F) { delete F; }
-  static inline ValueSymbolTable *getSymTab(Module *M);
 };
 template<> struct ilist_traits<GlobalVariable>
   : public SymbolTableListTraits<GlobalVariable, Module> {
   // createSentinel is used to create a node that marks the end of the list.
   static GlobalVariable *createSentinel();
   static void destroySentinel(GlobalVariable *GV) { delete GV; }
-  static inline ValueSymbolTable *getSymTab(Module *M);
 };
 template<> struct ilist_traits<GlobalAlias>
   : public SymbolTableListTraits<GlobalAlias, Module> {
   // createSentinel is used to create a node that marks the end of the list.
   static GlobalAlias *createSentinel();
   static void destroySentinel(GlobalAlias *GA) { delete GA; }
-  static inline ValueSymbolTable *getSymTab(Module *M);
 };
 
 /// A Module instance is used to store all the information related to an
@@ -409,22 +406,6 @@ inline raw_ostream &operator<<(raw_ostream &O, const Module &M) {
   M.print(O, 0);
   return O;
 }
-  
-
-inline ValueSymbolTable *
-ilist_traits<Function>::getSymTab(Module *M) {
-  return M ? &M->getValueSymbolTable() : 0;
-}
-
-inline ValueSymbolTable *
-ilist_traits<GlobalVariable>::getSymTab(Module *M) {
-  return M ? &M->getValueSymbolTable() : 0;
-}
-
-inline ValueSymbolTable *
-ilist_traits<GlobalAlias>::getSymTab(Module *M) {
-  return M ? &M->getValueSymbolTable() : 0;
-}
 
 } // End llvm namespace
 
index 44f64dc..337b76f 100644 (file)
@@ -55,8 +55,12 @@ public:
   }
 
   static iplist<ValueSubClass> &getList(ItemParentClass *Par) {
-  return Par->*(Par->getSublistAccess((ValueSubClass*)0));
-}
+    return Par->*(Par->getSublistAccess((ValueSubClass*)0));
+  }
+
+  static ValueSymbolTable *getSymTab(ItemParentClass *Par) {
+    return Par ? toPtr(Par->getValueSymbolTable()) : 0;
+  }
 
   void addNodeToList(ValueSubClass *V);
   void removeNodeFromList(ValueSubClass *V);
@@ -66,6 +70,8 @@ public:
 //private:
   template<typename TPtr>
   void setSymTabObject(TPtr *, TPtr);
+  static ValueSymbolTable *toPtr(ValueSymbolTable *P) { return P; }
+  static ValueSymbolTable *toPtr(ValueSymbolTable &R) { return &R; }
 };
 
 } // End llvm namespace
index f682231..3065766 100644 (file)
 #include <algorithm>
 using namespace llvm;
 
-inline ValueSymbolTable *
-ilist_traits<Instruction>::getSymTab(BasicBlock *BB) {
-  if (BB)
-    if (Function *F = BB->getParent())
-      return &F->getValueSymbolTable();
+ValueSymbolTable *BasicBlock::getValueSymbolTable() {
+  if (Function *F = getParent())
+    return &F->getValueSymbolTable();
   return 0;
 }