LLVM: include/llvm/IR/PassInstrumentation.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49#ifndef LLVM_IR_PASSINSTRUMENTATION_H
50#define LLVM_IR_PASSINSTRUMENTATION_H
51
58#include
59
60namespace llvm {
61
67
68extern template struct LLVM_TEMPLATE_ABI Any::TypeId<const Module *>;
69extern template struct LLVM_TEMPLATE_ABI Any::TypeId<const Function *>;
70extern template struct LLVM_TEMPLATE_ABI Any::TypeId<const Loop *>;
71
72
73
75public:
76
77
78
79
80
81
82
83
84
85
95
96public:
98
99
102
103 template
105 ShouldRunOptionalPassCallbacks.emplace_back(std::move(C));
106 }
107
108 template
110 BeforeSkippedPassCallbacks.emplace_back(std::move(C));
111 }
112
113 template
115 BeforeNonSkippedPassCallbacks.emplace_back(std::move(C));
116 }
117
118 template
120 if (ToFront)
121 AfterPassCallbacks.insert(AfterPassCallbacks.begin(), std::move(C));
122 else
123 AfterPassCallbacks.emplace_back(std::move(C));
124 }
125
126 template
128 if (ToFront)
129 AfterPassInvalidatedCallbacks.insert(
130 AfterPassInvalidatedCallbacks.begin(), std::move(C));
131 else
132 AfterPassInvalidatedCallbacks.emplace_back(std::move(C));
133 }
134
135 template
137 BeforeAnalysisCallbacks.emplace_back(std::move(C));
138 }
139
140 template
142 if (ToFront)
143 AfterAnalysisCallbacks.insert(AfterAnalysisCallbacks.begin(),
144 std::move(C));
145 else
146 AfterAnalysisCallbacks.emplace_back(std::move(C));
147 }
148
149 template
151 AnalysisInvalidatedCallbacks.emplace_back(std::move(C));
152 }
153
154 template
156 AnalysesClearedCallbacks.emplace_back(std::move(C));
157 }
158
159 template
161 ClassToPassNameCallbacks.emplace_back(std::move(C));
162 }
163
164
166
168
169private:
171
172
173
175 ShouldRunOptionalPassCallbacks;
176
178 BeforeSkippedPassCallbacks;
179
181 BeforeNonSkippedPassCallbacks;
182
184
186 AfterPassInvalidatedCallbacks;
187
189 BeforeAnalysisCallbacks;
190
192 AfterAnalysisCallbacks;
193
195 AnalysisInvalidatedCallbacks;
196
198 AnalysesClearedCallbacks;
199
202};
203
204
205
208
209
210
211
212
213
214
215 template
216 using has_required_t = decltype(std::declval<PassT &>().isRequired());
217
218 template static bool isRequired(const PassT &Pass) {
220 return Pass.isRequired();
221 return false;
222 }
223
224public:
225
226
227
228
231
232
233
234
235
236
237 template <typename IRUnitT, typename PassT>
239 if (!Callbacks)
240 return true;
241
242 bool ShouldRun = true;
243 if (!isRequired(Pass)) {
244 for (auto &C : Callbacks->ShouldRunOptionalPassCallbacks)
246 }
247
248 if (ShouldRun) {
249 for (auto &C : Callbacks->BeforeNonSkippedPassCallbacks)
251 } else {
252 for (auto &C : Callbacks->BeforeSkippedPassCallbacks)
254 }
255
256 return ShouldRun;
257 }
258
259
260
261
262 template <typename IRUnitT, typename PassT>
265 if (Callbacks)
266 for (auto &C : Callbacks->AfterPassCallbacks)
268 }
269
270
271
272
273 template <typename IRUnitT, typename PassT>
276 if (Callbacks)
277 for (auto &C : Callbacks->AfterPassInvalidatedCallbacks)
279 }
280
281
282
283 template <typename IRUnitT, typename PassT>
285 if (Callbacks)
286 for (auto &C : Callbacks->BeforeAnalysisCallbacks)
288 }
289
290
291
292 template <typename IRUnitT, typename PassT>
294 if (Callbacks)
295 for (auto &C : Callbacks->AfterAnalysisCallbacks)
297 }
298
299
300
301
302 template <typename IRUnitT, typename PassT>
304 if (Callbacks)
305 for (auto &C : Callbacks->AnalysisInvalidatedCallbacks)
307 }
308
309
310
312 if (Callbacks)
313 for (auto &C : Callbacks->AnalysesClearedCallbacks)
314 C(Name);
315 }
316
317
318
319
320
321
322 template <typename IRUnitT, typename... ExtraArgsT>
324 ExtraArgsT...) {
325 return false;
326 }
327
328 template
330 if (Callbacks)
331 Callbacks->BeforeNonSkippedPassCallbacks.emplace_back(std::move(C));
332 }
334 if (Callbacks)
335 Callbacks->BeforeNonSkippedPassCallbacks.pop_back();
336 }
337
338
340 if (Callbacks)
341 return Callbacks->getPassNameForClassName(ClassName);
342 return {};
343 }
344};
345
347 const std::vector &Specials);
348
349
350
355
357
358public:
359
360
362 : Callbacks(Callbacks) {}
363
365
366 template <typename IRUnitT, typename AnalysisManagerT, typename... ExtraArgTs>
367 Result run(IRUnitT &, AnalysisManagerT &, ExtraArgTs &&...) {
369 }
370};
371
372
373}
374
375#endif
This file provides Any, a non-template class modeled in the spirit of std::any.
block Block Frequency Analysis
#define LLVM_TEMPLATE_ABI
This file defines the DenseMap class.
This header defines various interfaces for pass management in LLVM.
Legalize the Machine IR a function s Machine IR
This file defines the SmallVector class.
static const char PassName[]
Represents a single loop in the control flow graph.
A Module instance is used to store all the information related to an LLVM module.
Result run(IRUnitT &, AnalysisManagerT &, ExtraArgTs &&...)
Definition PassInstrumentation.h:367
PassInstrumentation Result
Definition PassInstrumentation.h:364
PassInstrumentationAnalysis(PassInstrumentationCallbacks *Callbacks=nullptr)
PassInstrumentationCallbacks object is shared, owned by something else, not this analysis.
Definition PassInstrumentation.h:361
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
Definition PassInstrumentation.h:74
void registerAnalysesClearedCallback(CallableT C)
Definition PassInstrumentation.h:155
void registerBeforeAnalysisCallback(CallableT C)
Definition PassInstrumentation.h:136
void registerAfterPassInvalidatedCallback(CallableT C, bool ToFront=false)
Definition PassInstrumentation.h:127
void registerAnalysisInvalidatedCallback(CallableT C)
Definition PassInstrumentation.h:150
void registerAfterAnalysisCallback(CallableT C, bool ToFront=false)
Definition PassInstrumentation.h:141
friend class PassInstrumentation
Definition PassInstrumentation.h:170
void(StringRef, const PreservedAnalyses &) AfterPassInvalidatedFunc
Definition PassInstrumentation.h:90
void(StringRef, Any) BeforeNonSkippedPassFunc
Definition PassInstrumentation.h:88
void registerBeforeNonSkippedPassCallback(CallableT C)
Definition PassInstrumentation.h:114
void registerClassToPassNameCallback(CallableT C)
Definition PassInstrumentation.h:160
void registerBeforeSkippedPassCallback(CallableT C)
Definition PassInstrumentation.h:109
PassInstrumentationCallbacks(const PassInstrumentationCallbacks &)=delete
Copying PassInstrumentationCallbacks is not intended.
PassInstrumentationCallbacks()=default
bool(StringRef, Any) BeforePassFunc
Definition PassInstrumentation.h:86
void(StringRef) AnalysesClearedFunc
Definition PassInstrumentation.h:94
void registerShouldRunOptionalPassCallback(CallableT C)
Definition PassInstrumentation.h:104
void(StringRef, Any) BeforeSkippedPassFunc
Definition PassInstrumentation.h:87
void operator=(const PassInstrumentationCallbacks &)=delete
void(StringRef, Any) AfterAnalysisFunc
Definition PassInstrumentation.h:92
void(StringRef, Any) BeforeAnalysisFunc
Definition PassInstrumentation.h:91
void(StringRef, Any) AnalysisInvalidatedFunc
Definition PassInstrumentation.h:93
void(StringRef, Any, const PreservedAnalyses &) AfterPassFunc
Definition PassInstrumentation.h:89
void registerAfterPassCallback(CallableT C, bool ToFront=false)
Definition PassInstrumentation.h:119
This class provides instrumentation entry points for the Pass Manager, doing calls to callbacks regis...
Definition PassInstrumentation.h:206
void runAfterPassInvalidated(const PassT &Pass, const PreservedAnalyses &PA) const
AfterPassInvalidated instrumentation point - takes Pass instance that has just been executed.
Definition PassInstrumentation.h:274
void pushBeforeNonSkippedPassCallback(CallableT C)
Definition PassInstrumentation.h:329
PassInstrumentation(PassInstrumentationCallbacks *CB=nullptr)
Callbacks object is not owned by PassInstrumentation, its life-time should at least match the life-ti...
Definition PassInstrumentation.h:229
bool invalidate(IRUnitT &, const class llvm::PreservedAnalyses &, ExtraArgsT...)
Handle invalidation from the pass manager when PassInstrumentation is used as the result of PassInstr...
Definition PassInstrumentation.h:323
void runBeforeAnalysis(const PassT &Analysis, const IRUnitT &IR) const
BeforeAnalysis instrumentation point - takes Analysis instance to be executed and constant reference ...
Definition PassInstrumentation.h:284
void runAnalysisInvalidated(const PassT &Analysis, const IRUnitT &IR) const
AnalysisInvalidated instrumentation point - takes Analysis instance that has just been invalidated an...
Definition PassInstrumentation.h:303
void runAnalysesCleared(StringRef Name) const
AnalysesCleared instrumentation point - takes name of IR that analyses operated on.
Definition PassInstrumentation.h:311
StringRef getPassNameForClassName(StringRef ClassName) const
Get the pass name for a given pass class name.
Definition PassInstrumentation.h:339
void popBeforeNonSkippedPassCallback()
Definition PassInstrumentation.h:333
void runAfterPass(const PassT &Pass, const IRUnitT &IR, const PreservedAnalyses &PA) const
AfterPass instrumentation point - takes Pass instance that has just been executed and constant refere...
Definition PassInstrumentation.h:263
void runAfterAnalysis(const PassT &Analysis, const IRUnitT &IR) const
AfterAnalysis instrumentation point - takes Analysis instance that has just been executed and constan...
Definition PassInstrumentation.h:293
bool runBeforePass(const PassT &Pass, const IRUnitT &IR) const
BeforePass instrumentation point - takes Pass instance to be executed and constant reference to IR it...
Definition PassInstrumentation.h:238
Pass interface - Implemented by all 'passes'.
A set of analyses that are preserved following a run of a transformation pass.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
unique_function is a type-erasing functor similar to std::function.
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool isSpecialPass(StringRef PassID, const std::vector< StringRef > &Specials)
typename detail::detector< void, Op, Args... >::value_t is_detected
Detects if a given trait holds for some set of arguments 'Args'.
A CRTP mix-in that provides informational APIs needed for analysis passes.
A special type used by analysis passes to provide an address that identifies that particular analysis...