Home | History | Annotate | Download | only in llvm
      1 //===- llvm/Pass.h - Base class for Passes ----------------------*- 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 // This file defines a base class that indicates that a specified class is a
     11 // transformation pass implementation.
     12 //
     13 // Passes are designed this way so that it is possible to run passes in a cache
     14 // and organizationally optimal order without having to specify it at the front
     15 // end.  This allows arbitrary passes to be strung together and have them
     16 // executed as efficiently as possible.
     17 //
     18 // Passes should extend one of the classes below, depending on the guarantees
     19 // that it can make about what will be modified as it is run.  For example, most
     20 // global optimizations should derive from FunctionPass, because they do not add
     21 // or delete functions, they operate on the internals of the function.
     22 //
     23 // Note that this file #includes PassSupport.h and PassAnalysisSupport.h (at the
     24 // bottom), so the APIs exposed by these files are also automatically available
     25 // to all users of this file.
     26 //
     27 //===----------------------------------------------------------------------===//
     28 
     29 #ifndef LLVM_PASS_H
     30 #define LLVM_PASS_H
     31 
     32 #include "llvm/Support/Compiler.h"
     33 #include <string>
     34 
     35 namespace llvm {
     36 
     37 class BasicBlock;
     38 class Function;
     39 class Module;
     40 class AnalysisUsage;
     41 class PassInfo;
     42 class ImmutablePass;
     43 class PMStack;
     44 class AnalysisResolver;
     45 class PMDataManager;
     46 class raw_ostream;
     47 class StringRef;
     48 
     49 // AnalysisID - Use the PassInfo to identify a pass...
     50 typedef const void* AnalysisID;
     51 
     52 /// Different types of internal pass managers. External pass managers
     53 /// (PassManager and FunctionPassManager) are not represented here.
     54 /// Ordering of pass manager types is important here.
     55 enum PassManagerType {
     56   PMT_Unknown = 0,
     57   PMT_ModulePassManager = 1, ///< MPPassManager
     58   PMT_CallGraphPassManager,  ///< CGPassManager
     59   PMT_FunctionPassManager,   ///< FPPassManager
     60   PMT_LoopPassManager,       ///< LPPassManager
     61   PMT_RegionPassManager,     ///< RGPassManager
     62   PMT_BasicBlockPassManager, ///< BBPassManager
     63   PMT_Last
     64 };
     65 
     66 // Different types of passes.
     67 enum PassKind {
     68   PT_BasicBlock,
     69   PT_Region,
     70   PT_Loop,
     71   PT_Function,
     72   PT_CallGraphSCC,
     73   PT_Module,
     74   PT_PassManager
     75 };
     76 
     77 //===----------------------------------------------------------------------===//
     78 /// Pass interface - Implemented by all 'passes'.  Subclass this if you are an
     79 /// interprocedural optimization or you do not fit into any of the more
     80 /// constrained passes described below.
     81 ///
     82 class Pass {
     83   AnalysisResolver *Resolver;  // Used to resolve analysis
     84   const void *PassID;
     85   PassKind Kind;
     86   void operator=(const Pass&) LLVM_DELETED_FUNCTION;
     87   Pass(const Pass &) LLVM_DELETED_FUNCTION;
     88 
     89 public:
     90   explicit Pass(PassKind K, char &pid) : Resolver(0), PassID(&pid), Kind(K) { }
     91   virtual ~Pass();
     92 
     93 
     94   PassKind getPassKind() const { return Kind; }
     95 
     96   /// getPassName - Return a nice clean name for a pass.  This usually
     97   /// implemented in terms of the name that is registered by one of the
     98   /// Registration templates, but can be overloaded directly.
     99   ///
    100   virtual const char *getPassName() const;
    101 
    102   /// getPassID - Return the PassID number that corresponds to this pass.
    103   AnalysisID getPassID() const {
    104     return PassID;
    105   }
    106 
    107   /// doInitialization - Virtual method overridden by subclasses to do
    108   /// any necessary initialization before any pass is run.
    109   ///
    110   virtual bool doInitialization(Module &)  { return false; }
    111 
    112   /// doFinalization - Virtual method overriden by subclasses to do any
    113   /// necessary clean up after all passes have run.
    114   ///
    115   virtual bool doFinalization(Module &) { return false; }
    116 
    117   /// print - Print out the internal state of the pass.  This is called by
    118   /// Analyze to print out the contents of an analysis.  Otherwise it is not
    119   /// necessary to implement this method.  Beware that the module pointer MAY be
    120   /// null.  This automatically forwards to a virtual function that does not
    121   /// provide the Module* in case the analysis doesn't need it it can just be
    122   /// ignored.
    123   ///
    124   virtual void print(raw_ostream &O, const Module *M) const;
    125   void dump() const; // dump - Print to stderr.
    126 
    127   /// createPrinterPass - Get a Pass appropriate to print the IR this
    128   /// pass operates on (Module, Function or MachineFunction).
    129   virtual Pass *createPrinterPass(raw_ostream &O,
    130                                   const std::string &Banner) const = 0;
    131 
    132   /// Each pass is responsible for assigning a pass manager to itself.
    133   /// PMS is the stack of available pass manager.
    134   virtual void assignPassManager(PMStack &,
    135                                  PassManagerType) {}
    136   /// Check if available pass managers are suitable for this pass or not.
    137   virtual void preparePassManager(PMStack &);
    138 
    139   ///  Return what kind of Pass Manager can manage this pass.
    140   virtual PassManagerType getPotentialPassManagerType() const;
    141 
    142   // Access AnalysisResolver
    143   void setResolver(AnalysisResolver *AR);
    144   AnalysisResolver *getResolver() const { return Resolver; }
    145 
    146   /// getAnalysisUsage - This function should be overriden by passes that need
    147   /// analysis information to do their job.  If a pass specifies that it uses a
    148   /// particular analysis result to this function, it can then use the
    149   /// getAnalysis<AnalysisType>() function, below.
    150   ///
    151   virtual void getAnalysisUsage(AnalysisUsage &) const;
    152 
    153   /// releaseMemory() - This member can be implemented by a pass if it wants to
    154   /// be able to release its memory when it is no longer needed.  The default
    155   /// behavior of passes is to hold onto memory for the entire duration of their
    156   /// lifetime (which is the entire compile time).  For pipelined passes, this
    157   /// is not a big deal because that memory gets recycled every time the pass is
    158   /// invoked on another program unit.  For IP passes, it is more important to
    159   /// free memory when it is unused.
    160   ///
    161   /// Optionally implement this function to release pass memory when it is no
    162   /// longer used.
    163   ///
    164   virtual void releaseMemory();
    165 
    166   /// getAdjustedAnalysisPointer - This method is used when a pass implements
    167   /// an analysis interface through multiple inheritance.  If needed, it should
    168   /// override this to adjust the this pointer as needed for the specified pass
    169   /// info.
    170   virtual void *getAdjustedAnalysisPointer(AnalysisID ID);
    171   virtual ImmutablePass *getAsImmutablePass();
    172   virtual PMDataManager *getAsPMDataManager();
    173 
    174   /// verifyAnalysis() - This member can be implemented by a analysis pass to
    175   /// check state of analysis information.
    176   virtual void verifyAnalysis() const;
    177 
    178   // dumpPassStructure - Implement the -debug-passes=PassStructure option
    179   virtual void dumpPassStructure(unsigned Offset = 0);
    180 
    181   // lookupPassInfo - Return the pass info object for the specified pass class,
    182   // or null if it is not known.
    183   static const PassInfo *lookupPassInfo(const void *TI);
    184 
    185   // lookupPassInfo - Return the pass info object for the pass with the given
    186   // argument string, or null if it is not known.
    187   static const PassInfo *lookupPassInfo(StringRef Arg);
    188 
    189   // createPass - Create a object for the specified pass class,
    190   // or null if it is not known.
    191   static Pass *createPass(AnalysisID ID);
    192 
    193   /// getAnalysisIfAvailable<AnalysisType>() - Subclasses use this function to
    194   /// get analysis information that might be around, for example to update it.
    195   /// This is different than getAnalysis in that it can fail (if the analysis
    196   /// results haven't been computed), so should only be used if you can handle
    197   /// the case when the analysis is not available.  This method is often used by
    198   /// transformation APIs to update analysis results for a pass automatically as
    199   /// the transform is performed.
    200   ///
    201   template<typename AnalysisType> AnalysisType *
    202     getAnalysisIfAvailable() const; // Defined in PassAnalysisSupport.h
    203 
    204   /// mustPreserveAnalysisID - This method serves the same function as
    205   /// getAnalysisIfAvailable, but works if you just have an AnalysisID.  This
    206   /// obviously cannot give you a properly typed instance of the class if you
    207   /// don't have the class name available (use getAnalysisIfAvailable if you
    208   /// do), but it can tell you if you need to preserve the pass at least.
    209   ///
    210   bool mustPreserveAnalysisID(char &AID) const;
    211 
    212   /// getAnalysis<AnalysisType>() - This function is used by subclasses to get
    213   /// to the analysis information that they claim to use by overriding the
    214   /// getAnalysisUsage function.
    215   ///
    216   template<typename AnalysisType>
    217   AnalysisType &getAnalysis() const; // Defined in PassAnalysisSupport.h
    218 
    219   template<typename AnalysisType>
    220   AnalysisType &getAnalysis(Function &F); // Defined in PassAnalysisSupport.h
    221 
    222   template<typename AnalysisType>
    223   AnalysisType &getAnalysisID(AnalysisID PI) const;
    224 
    225   template<typename AnalysisType>
    226   AnalysisType &getAnalysisID(AnalysisID PI, Function &F);
    227 };
    228 
    229 
    230 //===----------------------------------------------------------------------===//
    231 /// ModulePass class - This class is used to implement unstructured
    232 /// interprocedural optimizations and analyses.  ModulePasses may do anything
    233 /// they want to the program.
    234 ///
    235 class ModulePass : public Pass {
    236 public:
    237   /// createPrinterPass - Get a module printer pass.
    238   Pass *createPrinterPass(raw_ostream &O, const std::string &Banner) const;
    239 
    240   /// runOnModule - Virtual method overriden by subclasses to process the module
    241   /// being operated on.
    242   virtual bool runOnModule(Module &M) = 0;
    243 
    244   virtual void assignPassManager(PMStack &PMS,
    245                                  PassManagerType T);
    246 
    247   ///  Return what kind of Pass Manager can manage this pass.
    248   virtual PassManagerType getPotentialPassManagerType() const;
    249 
    250   explicit ModulePass(char &pid) : Pass(PT_Module, pid) {}
    251   // Force out-of-line virtual method.
    252   virtual ~ModulePass();
    253 };
    254 
    255 
    256 //===----------------------------------------------------------------------===//
    257 /// ImmutablePass class - This class is used to provide information that does
    258 /// not need to be run.  This is useful for things like target information and
    259 /// "basic" versions of AnalysisGroups.
    260 ///
    261 class ImmutablePass : public ModulePass {
    262 public:
    263   /// initializePass - This method may be overriden by immutable passes to allow
    264   /// them to perform various initialization actions they require.  This is
    265   /// primarily because an ImmutablePass can "require" another ImmutablePass,
    266   /// and if it does, the overloaded version of initializePass may get access to
    267   /// these passes with getAnalysis<>.
    268   ///
    269   virtual void initializePass();
    270 
    271   virtual ImmutablePass *getAsImmutablePass() { return this; }
    272 
    273   /// ImmutablePasses are never run.
    274   ///
    275   bool runOnModule(Module &) { return false; }
    276 
    277   explicit ImmutablePass(char &pid)
    278   : ModulePass(pid) {}
    279 
    280   // Force out-of-line virtual method.
    281   virtual ~ImmutablePass();
    282 };
    283 
    284 //===----------------------------------------------------------------------===//
    285 /// FunctionPass class - This class is used to implement most global
    286 /// optimizations.  Optimizations should subclass this class if they meet the
    287 /// following constraints:
    288 ///
    289 ///  1. Optimizations are organized globally, i.e., a function at a time
    290 ///  2. Optimizing a function does not cause the addition or removal of any
    291 ///     functions in the module
    292 ///
    293 class FunctionPass : public Pass {
    294 public:
    295   explicit FunctionPass(char &pid) : Pass(PT_Function, pid) {}
    296 
    297   /// createPrinterPass - Get a function printer pass.
    298   Pass *createPrinterPass(raw_ostream &O, const std::string &Banner) const;
    299 
    300   /// runOnFunction - Virtual method overriden by subclasses to do the
    301   /// per-function processing of the pass.
    302   ///
    303   virtual bool runOnFunction(Function &F) = 0;
    304 
    305   virtual void assignPassManager(PMStack &PMS,
    306                                  PassManagerType T);
    307 
    308   ///  Return what kind of Pass Manager can manage this pass.
    309   virtual PassManagerType getPotentialPassManagerType() const;
    310 };
    311 
    312 
    313 
    314 //===----------------------------------------------------------------------===//
    315 /// BasicBlockPass class - This class is used to implement most local
    316 /// optimizations.  Optimizations should subclass this class if they
    317 /// meet the following constraints:
    318 ///   1. Optimizations are local, operating on either a basic block or
    319 ///      instruction at a time.
    320 ///   2. Optimizations do not modify the CFG of the contained function, or any
    321 ///      other basic block in the function.
    322 ///   3. Optimizations conform to all of the constraints of FunctionPasses.
    323 ///
    324 class BasicBlockPass : public Pass {
    325 public:
    326   explicit BasicBlockPass(char &pid) : Pass(PT_BasicBlock, pid) {}
    327 
    328   /// createPrinterPass - Get a basic block printer pass.
    329   Pass *createPrinterPass(raw_ostream &O, const std::string &Banner) const;
    330 
    331   using llvm::Pass::doInitialization;
    332   using llvm::Pass::doFinalization;
    333 
    334   /// doInitialization - Virtual method overridden by BasicBlockPass subclasses
    335   /// to do any necessary per-function initialization.
    336   ///
    337   virtual bool doInitialization(Function &);
    338 
    339   /// runOnBasicBlock - Virtual method overriden by subclasses to do the
    340   /// per-basicblock processing of the pass.
    341   ///
    342   virtual bool runOnBasicBlock(BasicBlock &BB) = 0;
    343 
    344   /// doFinalization - Virtual method overriden by BasicBlockPass subclasses to
    345   /// do any post processing needed after all passes have run.
    346   ///
    347   virtual bool doFinalization(Function &);
    348 
    349   virtual void assignPassManager(PMStack &PMS,
    350                                  PassManagerType T);
    351 
    352   ///  Return what kind of Pass Manager can manage this pass.
    353   virtual PassManagerType getPotentialPassManagerType() const;
    354 };
    355 
    356 /// If the user specifies the -time-passes argument on an LLVM tool command line
    357 /// then the value of this boolean will be true, otherwise false.
    358 /// @brief This is the storage for the -time-passes option.
    359 extern bool TimePassesIsEnabled;
    360 
    361 } // End llvm namespace
    362 
    363 // Include support files that contain important APIs commonly used by Passes,
    364 // but that we want to separate out to make it easier to read the header files.
    365 //
    366 #include "llvm/PassSupport.h"
    367 #include "llvm/PassAnalysisSupport.h"
    368 
    369 #endif
    370