X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FModule.h;h=7a139cc1e0a92638daf8312e9b74a668c100b3b2;hb=617dd7baa6dfd3a7b5ee72ace37f6b6aeaa6006b;hp=d706615ac715b13ca5fef1cdb135b861f934bdd6;hpb=b547a181005cc255fa57c61c1c0dbafca5375fb4;p=oota-llvm.git diff --git a/include/llvm/Module.h b/include/llvm/Module.h index d706615ac71..7a139cc1e0a 100644 --- a/include/llvm/Module.h +++ b/include/llvm/Module.h @@ -25,30 +25,36 @@ namespace llvm { class GlobalValueRefMap; // Used by ConstantVals.cpp class FunctionType; +class LLVMContext; template<> struct ilist_traits : public SymbolTableListTraits { - // 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 iplist &getList(Module *M); - static inline ValueSymbolTable *getSymTab(Module *M); + + // createSentinel is used to get hold of the node that marks the end of the + // list... (same trick used here as in ilist_traits) + Function *createSentinel() const { + return static_cast(&Sentinel); + } + static void destroySentinel(Function*) {} + + Function *provideInitialHead() const { return createSentinel(); } + Function *ensureHead(Function*) const { return createSentinel(); } + static void noteHead(Function*, Function*) {} + +private: + mutable ilist_node Sentinel; }; template<> struct ilist_traits : public SymbolTableListTraits { // 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 iplist &getList(Module *M); - static inline ValueSymbolTable *getSymTab(Module *M); }; template<> struct ilist_traits : public SymbolTableListTraits { // 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 iplist &getList(Module *M); - static inline ValueSymbolTable *getSymTab(Module *M); }; /// A Module instance is used to store all the information related to an @@ -104,6 +110,8 @@ public: /// @name Member Variables /// @{ private: + LLVMContext& Context; ///< The LLVMContext from which types and + ///< constants are allocated. GlobalListType GlobalList; ///< The Global Variables in the module FunctionListType FunctionList; ///< The Functions in the module AliasListType AliasList; ///< The Aliases in the module @@ -123,7 +131,7 @@ private: public: /// The Module constructor. Note that there is no default constructor. You /// must provide a name for the module upon construction. - explicit Module(const std::string &ModuleID); + explicit Module(const std::string &ModuleID, LLVMContext& C); /// The module destructor. This will dropAllReferences. ~Module(); @@ -152,6 +160,10 @@ public: /// @returns PointerSize - an enumeration for the size of the target's pointer PointerSize getPointerSize() const; + /// Get the global data context. + /// @returns LLVMContext - a container for LLVM's global information + LLVMContext& getContext() const { return Context; } + /// Get any module-scope inline assembly blocks. /// @returns a string containing the module-scope inline assembly blocks. const std::string &getModuleInlineAsm() const { return GlobalScopeAsm; } @@ -412,22 +424,6 @@ inline raw_ostream &operator<<(raw_ostream &O, const Module &M) { M.print(O, 0); return O; } - - -inline ValueSymbolTable * -ilist_traits::getSymTab(Module *M) { - return M ? &M->getValueSymbolTable() : 0; -} - -inline ValueSymbolTable * -ilist_traits::getSymTab(Module *M) { - return M ? &M->getValueSymbolTable() : 0; -} - -inline ValueSymbolTable * -ilist_traits::getSymTab(Module *M) { - return M ? &M->getValueSymbolTable() : 0; -} } // End llvm namespace