Home | History | Annotate | Download | only in llvm
      1 //===-- llvm/Module.h - C++ class to represent a VM module ------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 /// @file
     11 /// Module.h This file contains the declarations for the Module class.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_MODULE_H
     16 #define LLVM_MODULE_H
     17 
     18 #include "llvm/Function.h"
     19 #include "llvm/GlobalVariable.h"
     20 #include "llvm/GlobalAlias.h"
     21 #include "llvm/Metadata.h"
     22 #include "llvm/ADT/OwningPtr.h"
     23 #include "llvm/Support/DataTypes.h"
     24 #include <vector>
     25 
     26 namespace llvm {
     27 
     28 class FunctionType;
     29 class GVMaterializer;
     30 class LLVMContext;
     31 class StructType;
     32 template<typename T> struct DenseMapInfo;
     33 template<typename KeyT, typename ValueT,
     34          typename KeyInfoT, typename ValueInfoT> class DenseMap;
     35 
     36 template<> struct ilist_traits<Function>
     37   : public SymbolTableListTraits<Function, Module> {
     38 
     39   // createSentinel is used to get hold of the node that marks the end of the
     40   // list... (same trick used here as in ilist_traits<Instruction>)
     41   Function *createSentinel() const {
     42     return static_cast<Function*>(&Sentinel);
     43   }
     44   static void destroySentinel(Function*) {}
     45 
     46   Function *provideInitialHead() const { return createSentinel(); }
     47   Function *ensureHead(Function*) const { return createSentinel(); }
     48   static void noteHead(Function*, Function*) {}
     49 
     50 private:
     51   mutable ilist_node<Function> Sentinel;
     52 };
     53 template<> struct ilist_traits<GlobalVariable>
     54   : public SymbolTableListTraits<GlobalVariable, Module> {
     55   // createSentinel is used to create a node that marks the end of the list.
     56   static GlobalVariable *createSentinel();
     57   static void destroySentinel(GlobalVariable *GV) { delete GV; }
     58 };
     59 template<> struct ilist_traits<GlobalAlias>
     60   : public SymbolTableListTraits<GlobalAlias, Module> {
     61   // createSentinel is used to create a node that marks the end of the list.
     62   static GlobalAlias *createSentinel();
     63   static void destroySentinel(GlobalAlias *GA) { delete GA; }
     64 };
     65 
     66 template<> struct ilist_traits<NamedMDNode>
     67   : public ilist_default_traits<NamedMDNode> {
     68   // createSentinel is used to get hold of a node that marks the end of
     69   // the list...
     70   NamedMDNode *createSentinel() const {
     71     return static_cast<NamedMDNode*>(&Sentinel);
     72   }
     73   static void destroySentinel(NamedMDNode*) {}
     74 
     75   NamedMDNode *provideInitialHead() const { return createSentinel(); }
     76   NamedMDNode *ensureHead(NamedMDNode*) const { return createSentinel(); }
     77   static void noteHead(NamedMDNode*, NamedMDNode*) {}
     78   void addNodeToList(NamedMDNode *) {}
     79   void removeNodeFromList(NamedMDNode *) {}
     80 private:
     81   mutable ilist_node<NamedMDNode> Sentinel;
     82 };
     83 
     84 /// A Module instance is used to store all the information related to an
     85 /// LLVM module. Modules are the top level container of all other LLVM
     86 /// Intermediate Representation (IR) objects. Each module directly contains a
     87 /// list of globals variables, a list of functions, a list of libraries (or
     88 /// other modules) this module depends on, a symbol table, and various data
     89 /// about the target's characteristics.
     90 ///
     91 /// A module maintains a GlobalValRefMap object that is used to hold all
     92 /// constant references to global variables in the module.  When a global
     93 /// variable is destroyed, it should have no entries in the GlobalValueRefMap.
     94 /// @brief The main container class for the LLVM Intermediate Representation.
     95 class Module {
     96 /// @name Types And Enumerations
     97 /// @{
     98 public:
     99   /// The type for the list of global variables.
    100   typedef iplist<GlobalVariable> GlobalListType;
    101   /// The type for the list of functions.
    102   typedef iplist<Function> FunctionListType;
    103   /// The type for the list of aliases.
    104   typedef iplist<GlobalAlias> AliasListType;
    105   /// The type for the list of named metadata.
    106   typedef ilist<NamedMDNode> NamedMDListType;
    107 
    108   /// The type for the list of dependent libraries.
    109   typedef std::vector<std::string> LibraryListType;
    110 
    111   /// The Global Variable iterator.
    112   typedef GlobalListType::iterator                      global_iterator;
    113   /// The Global Variable constant iterator.
    114   typedef GlobalListType::const_iterator          const_global_iterator;
    115 
    116   /// The Function iterators.
    117   typedef FunctionListType::iterator                           iterator;
    118   /// The Function constant iterator
    119   typedef FunctionListType::const_iterator               const_iterator;
    120 
    121   /// The Global Alias iterators.
    122   typedef AliasListType::iterator                        alias_iterator;
    123   /// The Global Alias constant iterator
    124   typedef AliasListType::const_iterator            const_alias_iterator;
    125 
    126   /// The named metadata iterators.
    127   typedef NamedMDListType::iterator             named_metadata_iterator;
    128   /// The named metadata constant interators.
    129   typedef NamedMDListType::const_iterator const_named_metadata_iterator;
    130   /// The Library list iterator.
    131   typedef LibraryListType::const_iterator lib_iterator;
    132 
    133   /// An enumeration for describing the endianess of the target machine.
    134   enum Endianness  { AnyEndianness, LittleEndian, BigEndian };
    135 
    136   /// An enumeration for describing the size of a pointer on the target machine.
    137   enum PointerSize { AnyPointerSize, Pointer32, Pointer64 };
    138 
    139 /// @}
    140 /// @name Member Variables
    141 /// @{
    142 private:
    143   LLVMContext &Context;           ///< The LLVMContext from which types and
    144                                   ///< constants are allocated.
    145   GlobalListType GlobalList;      ///< The Global Variables in the module
    146   FunctionListType FunctionList;  ///< The Functions in the module
    147   AliasListType AliasList;        ///< The Aliases in the module
    148   LibraryListType LibraryList;    ///< The Libraries needed by the module
    149   NamedMDListType NamedMDList;    ///< The named metadata in the module
    150   std::string GlobalScopeAsm;     ///< Inline Asm at global scope.
    151   ValueSymbolTable *ValSymTab;    ///< Symbol table for values
    152   OwningPtr<GVMaterializer> Materializer;  ///< Used to materialize GlobalValues
    153   std::string ModuleID;           ///< Human readable identifier for the module
    154   std::string TargetTriple;       ///< Platform target triple Module compiled on
    155   std::string DataLayout;         ///< Target data description
    156   void *NamedMDSymTab;            ///< NamedMDNode names.
    157 
    158   friend class Constant;
    159 
    160 /// @}
    161 /// @name Constructors
    162 /// @{
    163 public:
    164   /// The Module constructor. Note that there is no default constructor. You
    165   /// must provide a name for the module upon construction.
    166   explicit Module(StringRef ModuleID, LLVMContext& C);
    167   /// The module destructor. This will dropAllReferences.
    168   ~Module();
    169 
    170 /// @}
    171 /// @name Module Level Accessors
    172 /// @{
    173 
    174   /// Get the module identifier which is, essentially, the name of the module.
    175   /// @returns the module identifier as a string
    176   const std::string &getModuleIdentifier() const { return ModuleID; }
    177 
    178   /// Get the data layout string for the module's target platform.  This encodes
    179   /// the type sizes and alignments expected by this module.
    180   /// @returns the data layout as a string
    181   const std::string &getDataLayout() const { return DataLayout; }
    182 
    183   /// Get the target triple which is a string describing the target host.
    184   /// @returns a string containing the target triple.
    185   const std::string &getTargetTriple() const { return TargetTriple; }
    186 
    187   /// Get the target endian information.
    188   /// @returns Endianess - an enumeration for the endianess of the target
    189   Endianness getEndianness() const;
    190 
    191   /// Get the target pointer size.
    192   /// @returns PointerSize - an enumeration for the size of the target's pointer
    193   PointerSize getPointerSize() const;
    194 
    195   /// Get the global data context.
    196   /// @returns LLVMContext - a container for LLVM's global information
    197   LLVMContext &getContext() const { return Context; }
    198 
    199   /// Get any module-scope inline assembly blocks.
    200   /// @returns a string containing the module-scope inline assembly blocks.
    201   const std::string &getModuleInlineAsm() const { return GlobalScopeAsm; }
    202 
    203 /// @}
    204 /// @name Module Level Mutators
    205 /// @{
    206 
    207   /// Set the module identifier.
    208   void setModuleIdentifier(StringRef ID) { ModuleID = ID; }
    209 
    210   /// Set the data layout
    211   void setDataLayout(StringRef DL) { DataLayout = DL; }
    212 
    213   /// Set the target triple.
    214   void setTargetTriple(StringRef T) { TargetTriple = T; }
    215 
    216   /// Set the module-scope inline assembly blocks.
    217   void setModuleInlineAsm(StringRef Asm) {
    218     GlobalScopeAsm = Asm;
    219     if (!GlobalScopeAsm.empty() &&
    220         GlobalScopeAsm[GlobalScopeAsm.size()-1] != '\n')
    221       GlobalScopeAsm += '\n';
    222   }
    223 
    224   /// Append to the module-scope inline assembly blocks, automatically inserting
    225   /// a separating newline if necessary.
    226   void appendModuleInlineAsm(StringRef Asm) {
    227     GlobalScopeAsm += Asm;
    228     if (!GlobalScopeAsm.empty() &&
    229         GlobalScopeAsm[GlobalScopeAsm.size()-1] != '\n')
    230       GlobalScopeAsm += '\n';
    231   }
    232 
    233 /// @}
    234 /// @name Generic Value Accessors
    235 /// @{
    236 
    237   /// getNamedValue - Return the global value in the module with
    238   /// the specified name, of arbitrary type.  This method returns null
    239   /// if a global with the specified name is not found.
    240   GlobalValue *getNamedValue(StringRef Name) const;
    241 
    242   /// getMDKindID - Return a unique non-zero ID for the specified metadata kind.
    243   /// This ID is uniqued across modules in the current LLVMContext.
    244   unsigned getMDKindID(StringRef Name) const;
    245 
    246   /// getMDKindNames - Populate client supplied SmallVector with the name for
    247   /// custom metadata IDs registered in this LLVMContext.
    248   void getMDKindNames(SmallVectorImpl<StringRef> &Result) const;
    249 
    250 
    251   typedef DenseMap<StructType*, unsigned, DenseMapInfo<StructType*>,
    252                    DenseMapInfo<unsigned> > NumeredTypesMapTy;
    253 
    254   /// findUsedStructTypes - Walk the entire module and find all of the
    255   /// struct types that are in use, returning them in a vector.
    256   void findUsedStructTypes(std::vector<StructType*> &StructTypes) const;
    257 
    258   /// getTypeByName - Return the type with the specified name, or null if there
    259   /// is none by that name.
    260   StructType *getTypeByName(StringRef Name) const;
    261 
    262 /// @}
    263 /// @name Function Accessors
    264 /// @{
    265 
    266   /// getOrInsertFunction - Look up the specified function in the module symbol
    267   /// table.  Four possibilities:
    268   ///   1. If it does not exist, add a prototype for the function and return it.
    269   ///   2. If it exists, and has a local linkage, the existing function is
    270   ///      renamed and a new one is inserted.
    271   ///   3. Otherwise, if the existing function has the correct prototype, return
    272   ///      the existing function.
    273   ///   4. Finally, the function exists but has the wrong prototype: return the
    274   ///      function with a constantexpr cast to the right prototype.
    275   Constant *getOrInsertFunction(StringRef Name, FunctionType *T,
    276                                 AttrListPtr AttributeList);
    277 
    278   Constant *getOrInsertFunction(StringRef Name, FunctionType *T);
    279 
    280   /// getOrInsertFunction - Look up the specified function in the module symbol
    281   /// table.  If it does not exist, add a prototype for the function and return
    282   /// it.  This function guarantees to return a constant of pointer to the
    283   /// specified function type or a ConstantExpr BitCast of that type if the
    284   /// named function has a different type.  This version of the method takes a
    285   /// null terminated list of function arguments, which makes it easier for
    286   /// clients to use.
    287   Constant *getOrInsertFunction(StringRef Name,
    288                                 AttrListPtr AttributeList,
    289                                 Type *RetTy, ...)  END_WITH_NULL;
    290 
    291   /// getOrInsertFunction - Same as above, but without the attributes.
    292   Constant *getOrInsertFunction(StringRef Name, Type *RetTy, ...)
    293     END_WITH_NULL;
    294 
    295   Constant *getOrInsertTargetIntrinsic(StringRef Name,
    296                                        FunctionType *Ty,
    297                                        AttrListPtr AttributeList);
    298 
    299   /// getFunction - Look up the specified function in the module symbol table.
    300   /// If it does not exist, return null.
    301   Function *getFunction(StringRef Name) const;
    302 
    303 /// @}
    304 /// @name Global Variable Accessors
    305 /// @{
    306 
    307   /// getGlobalVariable - Look up the specified global variable in the module
    308   /// symbol table.  If it does not exist, return null. If AllowInternal is set
    309   /// to true, this function will return types that have InternalLinkage. By
    310   /// default, these types are not returned.
    311   GlobalVariable *getGlobalVariable(StringRef Name,
    312                                     bool AllowInternal = false) const;
    313 
    314   /// getNamedGlobal - Return the global variable in the module with the
    315   /// specified name, of arbitrary type.  This method returns null if a global
    316   /// with the specified name is not found.
    317   GlobalVariable *getNamedGlobal(StringRef Name) const {
    318     return getGlobalVariable(Name, true);
    319   }
    320 
    321   /// getOrInsertGlobal - Look up the specified global in the module symbol
    322   /// table.
    323   ///   1. If it does not exist, add a declaration of the global and return it.
    324   ///   2. Else, the global exists but has the wrong type: return the function
    325   ///      with a constantexpr cast to the right type.
    326   ///   3. Finally, if the existing global is the correct declaration, return
    327   ///      the existing global.
    328   Constant *getOrInsertGlobal(StringRef Name, Type *Ty);
    329 
    330 /// @}
    331 /// @name Global Alias Accessors
    332 /// @{
    333 
    334   /// getNamedAlias - Return the global alias in the module with the
    335   /// specified name, of arbitrary type.  This method returns null if a global
    336   /// with the specified name is not found.
    337   GlobalAlias *getNamedAlias(StringRef Name) const;
    338 
    339 /// @}
    340 /// @name Named Metadata Accessors
    341 /// @{
    342 
    343   /// getNamedMetadata - Return the NamedMDNode in the module with the
    344   /// specified name. This method returns null if a NamedMDNode with the
    345   /// specified name is not found.
    346   NamedMDNode *getNamedMetadata(const Twine &Name) const;
    347 
    348   /// getOrInsertNamedMetadata - Return the named MDNode in the module
    349   /// with the specified name. This method returns a new NamedMDNode if a
    350   /// NamedMDNode with the specified name is not found.
    351   NamedMDNode *getOrInsertNamedMetadata(StringRef Name);
    352 
    353   /// eraseNamedMetadata - Remove the given NamedMDNode from this module
    354   /// and delete it.
    355   void eraseNamedMetadata(NamedMDNode *NMD);
    356 
    357 /// @}
    358 /// @name Materialization
    359 /// @{
    360 
    361   /// setMaterializer - Sets the GVMaterializer to GVM.  This module must not
    362   /// yet have a Materializer.  To reset the materializer for a module that
    363   /// already has one, call MaterializeAllPermanently first.  Destroying this
    364   /// module will destroy its materializer without materializing any more
    365   /// GlobalValues.  Without destroying the Module, there is no way to detach or
    366   /// destroy a materializer without materializing all the GVs it controls, to
    367   /// avoid leaving orphan unmaterialized GVs.
    368   void setMaterializer(GVMaterializer *GVM);
    369   /// getMaterializer - Retrieves the GVMaterializer, if any, for this Module.
    370   GVMaterializer *getMaterializer() const { return Materializer.get(); }
    371 
    372   /// isMaterializable - True if the definition of GV has yet to be materialized
    373   /// from the GVMaterializer.
    374   bool isMaterializable(const GlobalValue *GV) const;
    375   /// isDematerializable - Returns true if this GV was loaded from this Module's
    376   /// GVMaterializer and the GVMaterializer knows how to dematerialize the GV.
    377   bool isDematerializable(const GlobalValue *GV) const;
    378 
    379   /// Materialize - Make sure the GlobalValue is fully read.  If the module is
    380   /// corrupt, this returns true and fills in the optional string with
    381   /// information about the problem.  If successful, this returns false.
    382   bool Materialize(GlobalValue *GV, std::string *ErrInfo = 0);
    383   /// Dematerialize - If the GlobalValue is read in, and if the GVMaterializer
    384   /// supports it, release the memory for the function, and set it up to be
    385   /// materialized lazily.  If !isDematerializable(), this method is a noop.
    386   void Dematerialize(GlobalValue *GV);
    387 
    388   /// MaterializeAll - Make sure all GlobalValues in this Module are fully read.
    389   /// If the module is corrupt, this returns true and fills in the optional
    390   /// string with information about the problem.  If successful, this returns
    391   /// false.
    392   bool MaterializeAll(std::string *ErrInfo = 0);
    393 
    394   /// MaterializeAllPermanently - Make sure all GlobalValues in this Module are
    395   /// fully read and clear the Materializer.  If the module is corrupt, this
    396   /// returns true, fills in the optional string with information about the
    397   /// problem, and DOES NOT clear the old Materializer.  If successful, this
    398   /// returns false.
    399   bool MaterializeAllPermanently(std::string *ErrInfo = 0);
    400 
    401 /// @}
    402 /// @name Direct access to the globals list, functions list, and symbol table
    403 /// @{
    404 
    405   /// Get the Module's list of global variables (constant).
    406   const GlobalListType   &getGlobalList() const       { return GlobalList; }
    407   /// Get the Module's list of global variables.
    408   GlobalListType         &getGlobalList()             { return GlobalList; }
    409   static iplist<GlobalVariable> Module::*getSublistAccess(GlobalVariable*) {
    410     return &Module::GlobalList;
    411   }
    412   /// Get the Module's list of functions (constant).
    413   const FunctionListType &getFunctionList() const     { return FunctionList; }
    414   /// Get the Module's list of functions.
    415   FunctionListType       &getFunctionList()           { return FunctionList; }
    416   static iplist<Function> Module::*getSublistAccess(Function*) {
    417     return &Module::FunctionList;
    418   }
    419   /// Get the Module's list of aliases (constant).
    420   const AliasListType    &getAliasList() const        { return AliasList; }
    421   /// Get the Module's list of aliases.
    422   AliasListType          &getAliasList()              { return AliasList; }
    423   static iplist<GlobalAlias> Module::*getSublistAccess(GlobalAlias*) {
    424     return &Module::AliasList;
    425   }
    426   /// Get the symbol table of global variable and function identifiers
    427   const ValueSymbolTable &getValueSymbolTable() const { return *ValSymTab; }
    428   /// Get the Module's symbol table of global variable and function identifiers.
    429   ValueSymbolTable       &getValueSymbolTable()       { return *ValSymTab; }
    430 
    431 /// @}
    432 /// @name Global Variable Iteration
    433 /// @{
    434 
    435   global_iterator       global_begin()       { return GlobalList.begin(); }
    436   const_global_iterator global_begin() const { return GlobalList.begin(); }
    437   global_iterator       global_end  ()       { return GlobalList.end(); }
    438   const_global_iterator global_end  () const { return GlobalList.end(); }
    439   bool                  global_empty() const { return GlobalList.empty(); }
    440 
    441 /// @}
    442 /// @name Function Iteration
    443 /// @{
    444 
    445   iterator                begin()       { return FunctionList.begin(); }
    446   const_iterator          begin() const { return FunctionList.begin(); }
    447   iterator                end  ()       { return FunctionList.end();   }
    448   const_iterator          end  () const { return FunctionList.end();   }
    449   size_t                  size() const  { return FunctionList.size(); }
    450   bool                    empty() const { return FunctionList.empty(); }
    451 
    452 /// @}
    453 /// @name Dependent Library Iteration
    454 /// @{
    455 
    456   /// @brief Get a constant iterator to beginning of dependent library list.
    457   inline lib_iterator lib_begin() const { return LibraryList.begin(); }
    458   /// @brief Get a constant iterator to end of dependent library list.
    459   inline lib_iterator lib_end()   const { return LibraryList.end();   }
    460   /// @brief Returns the number of items in the list of libraries.
    461   inline size_t       lib_size()  const { return LibraryList.size();  }
    462   /// @brief Add a library to the list of dependent libraries
    463   void addLibrary(StringRef Lib);
    464   /// @brief Remove a library from the list of dependent libraries
    465   void removeLibrary(StringRef Lib);
    466   /// @brief Get all the libraries
    467   inline const LibraryListType& getLibraries() const { return LibraryList; }
    468 
    469 /// @}
    470 /// @name Alias Iteration
    471 /// @{
    472 
    473   alias_iterator       alias_begin()            { return AliasList.begin(); }
    474   const_alias_iterator alias_begin() const      { return AliasList.begin(); }
    475   alias_iterator       alias_end  ()            { return AliasList.end();   }
    476   const_alias_iterator alias_end  () const      { return AliasList.end();   }
    477   size_t               alias_size () const      { return AliasList.size();  }
    478   bool                 alias_empty() const      { return AliasList.empty(); }
    479 
    480 
    481 /// @}
    482 /// @name Named Metadata Iteration
    483 /// @{
    484 
    485   named_metadata_iterator named_metadata_begin() { return NamedMDList.begin(); }
    486   const_named_metadata_iterator named_metadata_begin() const {
    487     return NamedMDList.begin();
    488   }
    489 
    490   named_metadata_iterator named_metadata_end() { return NamedMDList.end(); }
    491   const_named_metadata_iterator named_metadata_end() const {
    492     return NamedMDList.end();
    493   }
    494 
    495   size_t named_metadata_size() const { return NamedMDList.size();  }
    496   bool named_metadata_empty() const { return NamedMDList.empty(); }
    497 
    498 
    499 /// @}
    500 /// @name Utility functions for printing and dumping Module objects
    501 /// @{
    502 
    503   /// Print the module to an output stream with an optional
    504   /// AssemblyAnnotationWriter.
    505   void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW) const;
    506 
    507   /// Dump the module to stderr (for debugging).
    508   void dump() const;
    509 
    510   /// This function causes all the subinstructions to "let go" of all references
    511   /// that they are maintaining.  This allows one to 'delete' a whole class at
    512   /// a time, even though there may be circular references... first all
    513   /// references are dropped, and all use counts go to zero.  Then everything
    514   /// is delete'd for real.  Note that no operations are valid on an object
    515   /// that has "dropped all references", except operator delete.
    516   void dropAllReferences();
    517 /// @}
    518 };
    519 
    520 /// An raw_ostream inserter for modules.
    521 inline raw_ostream &operator<<(raw_ostream &O, const Module &M) {
    522   M.print(O, 0);
    523   return O;
    524 }
    525 
    526 } // End llvm namespace
    527 
    528 #endif
    529