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