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