• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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