49#ifndef LLVM_IR_PASSINSTRUMENTATION_H
50#define LLVM_IR_PASSINSTRUMENTATION_H
96 template <
typename CallableT>
98 ShouldRunOptionalPassCallbacks.emplace_back(std::move(
C));
101 template <
typename CallableT>
103 BeforeSkippedPassCallbacks.emplace_back(std::move(
C));
106 template <
typename CallableT>
108 BeforeNonSkippedPassCallbacks.emplace_back(std::move(
C));
111 template <
typename CallableT>
114 AfterPassCallbacks.insert(AfterPassCallbacks.begin(), std::move(
C));
116 AfterPassCallbacks.emplace_back(std::move(
C));
119 template <
typename CallableT>
122 AfterPassInvalidatedCallbacks.insert(
123 AfterPassInvalidatedCallbacks.begin(), std::move(
C));
125 AfterPassInvalidatedCallbacks.emplace_back(std::move(
C));
128 template <
typename CallableT>
130 BeforeAnalysisCallbacks.emplace_back(std::move(
C));
133 template <
typename CallableT>
136 AfterAnalysisCallbacks.insert(AfterAnalysisCallbacks.begin(),
139 AfterAnalysisCallbacks.emplace_back(std::move(
C));
142 template <
typename CallableT>
144 AnalysisInvalidatedCallbacks.emplace_back(std::move(
C));
147 template <
typename CallableT>
149 AnalysesClearedCallbacks.emplace_back(std::move(
C));
152 template <
typename CallableT>
154 ClassToPassNameCallbacks.emplace_back(std::move(
C));
168 ShouldRunOptionalPassCallbacks;
171 BeforeSkippedPassCallbacks;
174 BeforeNonSkippedPassCallbacks;
179 AfterPassInvalidatedCallbacks;
182 BeforeAnalysisCallbacks;
185 AfterAnalysisCallbacks;
188 AnalysisInvalidatedCallbacks;
191 AnalysesClearedCallbacks;
208 template <
typename PassT>
static bool isRequired(
const PassT &
Pass) {
209 return Pass.isRequired();
225 template <
typename IRUnitT,
typename PassT>
230 bool ShouldRun =
true;
231 if (!isRequired(
Pass)) {
232 for (
auto &
C : Callbacks->ShouldRunOptionalPassCallbacks)
233 ShouldRun &=
C(
Pass.name(),
IR);
237 for (
auto &
C : Callbacks->BeforeNonSkippedPassCallbacks)
240 for (
auto &
C : Callbacks->BeforeSkippedPassCallbacks)
250 template <
typename IRUnitT,
typename PassT>
254 for (
auto &
C : Callbacks->AfterPassCallbacks)
261 template <
typename IRUnitT,
typename PassT>
265 for (
auto &
C : Callbacks->AfterPassInvalidatedCallbacks)
271 template <
typename IRUnitT,
typename PassT>
274 for (
auto &
C : Callbacks->BeforeAnalysisCallbacks)
280 template <
typename IRUnitT,
typename PassT>
283 for (
auto &
C : Callbacks->AfterAnalysisCallbacks)
290 template <
typename IRUnitT,
typename PassT>
293 for (
auto &
C : Callbacks->AnalysisInvalidatedCallbacks)
301 for (
auto &
C : Callbacks->AnalysesClearedCallbacks)
310 template <
typename IRUnitT,
typename... ExtraArgsT>
316 template <
typename CallableT>
319 Callbacks->BeforeNonSkippedPassCallbacks.emplace_back(std::move(
C));
323 Callbacks->BeforeNonSkippedPassCallbacks.pop_back();
329 return Callbacks->getPassNameForClassName(ClassName);
335 const std::vector<StringRef> &Specials);
350 : Callbacks(Callbacks) {}
354 template <
typename IRUnitT,
typename AnalysisManagerT,
typename... ExtraArgTs>
355 Result run(IRUnitT &, AnalysisManagerT &, ExtraArgTs &&...) {
block Block Frequency Analysis
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
This file defines the DenseMap class.
This file defines IRUnitRef, a type-erased reference to the IR unit a pass or analysis is running on,...
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[]
A type-erased reference to the IR unit a pass or analysis is running on, together with the kind of IR...
Result run(IRUnitT &, AnalysisManagerT &, ExtraArgTs &&...)
PassInstrumentation Result
PassInstrumentationAnalysis(PassInstrumentationCallbacks *Callbacks=nullptr)
PassInstrumentationCallbacks object is shared, owned by something else, not this analysis.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
void registerAnalysesClearedCallback(CallableT C)
void registerBeforeAnalysisCallback(CallableT C)
void registerAfterPassInvalidatedCallback(CallableT C, bool ToFront=false)
void registerAnalysisInvalidatedCallback(CallableT C)
void(StringRef, IRUnitRef, const PreservedAnalyses &) AfterPassFunc
void registerAfterAnalysisCallback(CallableT C, bool ToFront=false)
void(StringRef, IRUnitRef) AnalysisInvalidatedFunc
void(StringRef, IRUnitRef) BeforeAnalysisFunc
friend class PassInstrumentation
void(StringRef, const PreservedAnalyses &) AfterPassInvalidatedFunc
LLVM_ABI void addClassToPassName(StringRef ClassName, StringRef PassName)
Add a class name to pass name mapping for use by pass instrumentation.
void(StringRef, IRUnitRef) AfterAnalysisFunc
void registerBeforeNonSkippedPassCallback(CallableT C)
void registerClassToPassNameCallback(CallableT C)
void registerBeforeSkippedPassCallback(CallableT C)
PassInstrumentationCallbacks(const PassInstrumentationCallbacks &)=delete
Copying PassInstrumentationCallbacks is not intended.
PassInstrumentationCallbacks()=default
bool(StringRef, IRUnitRef) BeforePassFunc
void(StringRef, IRUnitRef) BeforeNonSkippedPassFunc
void(StringRef) AnalysesClearedFunc
void(StringRef, IRUnitRef) BeforeSkippedPassFunc
void registerShouldRunOptionalPassCallback(CallableT C)
LLVM_ABI StringRef getPassNameForClassName(StringRef ClassName)
Get the pass name for a given pass class name. Empty if no match found.
void operator=(const PassInstrumentationCallbacks &)=delete
void registerAfterPassCallback(CallableT C, bool ToFront=false)
This class provides instrumentation entry points for the Pass Manager, doing calls to callbacks regis...
void runAfterPassInvalidated(const PassT &Pass, const PreservedAnalyses &PA) const
AfterPassInvalidated instrumentation point - takes Pass instance that has just been executed.
void pushBeforeNonSkippedPassCallback(CallableT C)
PassInstrumentation(PassInstrumentationCallbacks *CB=nullptr)
Callbacks object is not owned by PassInstrumentation, its life-time should at least match the life-ti...
bool invalidate(IRUnitT &, const class llvm::PreservedAnalyses &, ExtraArgsT...)
Handle invalidation from the pass manager when PassInstrumentation is used as the result of PassInstr...
void runBeforeAnalysis(const PassT &Analysis, const IRUnitT &IR) const
BeforeAnalysis instrumentation point - takes Analysis instance to be executed and constant reference ...
void runAnalysisInvalidated(const PassT &Analysis, const IRUnitT &IR) const
AnalysisInvalidated instrumentation point - takes Analysis instance that has just been invalidated an...
void runAnalysesCleared(StringRef Name) const
AnalysesCleared instrumentation point - takes name of IR that analyses operated on.
StringRef getPassNameForClassName(StringRef ClassName) const
Get the pass name for a given pass class name.
void popBeforeNonSkippedPassCallback()
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...
void runAfterAnalysis(const PassT &Analysis, const IRUnitT &IR) const
AfterAnalysis instrumentation point - takes Analysis instance that has just been executed and constan...
bool runBeforePass(const PassT &Pass, const IRUnitT &IR) const
BeforePass instrumentation point - takes Pass instance to be executed and constant reference to IR it...
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.
Represent a constant reference to a string, i.e.
unique_function is a type-erasing functor similar to std::function.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool isSpecialPass(StringRef PassID, const std::vector< StringRef > &Specials)
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...