Mercurial > hg > Members > tobaru > cbc > CbC_llvm
comparison include/llvm/Pass.h @ 0:95c75e76d11b
LLVM 3.4
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 12 Dec 2013 13:56:28 +0900 |
parents | |
children | 54457678186b |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:95c75e76d11b |
---|---|
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 |