23#ifndef LLVM_CODEGEN_MACHINEPASSMANAGER_H
24#define LLVM_CODEGEN_MACHINEPASSMANAGER_H
38extern template class AnalysisManager<MachineFunction>;
65 template <
typename PassT>
89 using Base::getResult;
96 using Base::getCachedResult;
138 bool VerifyMachineFunction =
false)
139 : RequireCodeGenSCCOrder(RequireCodeGenSCCOrder),
140 VerifyMachineFunction(VerifyMachineFunction) {}
155 Base::addPass(std::forward<PassT>(
Pass));
157 addDoInitialization<PassT>(
P);
158 addDoFinalization<PassT>(
P);
161 addRunOnModule<PassT>(
P);
165 template <
typename PassT>
166 using has_init_t =
decltype(std::declval<PassT &>().doInitialization(
167 std::declval<Module &>(),
168 std::declval<MachineFunctionAnalysisManager &>()));
170 template <
typename PassT>
171 std::enable_if_t<!is_detected<has_init_t, PassT>::value>
172 addDoInitialization(PassConceptT *
Pass) {}
174 template <
typename PassT>
175 std::enable_if_t<is_detected<has_init_t, PassT>::value>
176 addDoInitialization(PassConceptT *
Pass) {
178 detail::PassModel<MachineFunction, PassT, PreservedAnalyses,
179 MachineFunctionAnalysisManager>;
180 auto *
P =
static_cast<PassModelT *
>(
Pass);
181 InitializationFuncs.emplace_back(
182 [=](
Module &M, MachineFunctionAnalysisManager &MFAM) {
183 return P->Pass.doInitialization(M, MFAM);
187 template <
typename PassT>
188 using has_fini_t =
decltype(std::declval<PassT &>().doFinalization(
189 std::declval<Module &>(),
190 std::declval<MachineFunctionAnalysisManager &>()));
192 template <
typename PassT>
193 std::enable_if_t<!is_detected<has_fini_t, PassT>::value>
194 addDoFinalization(PassConceptT *
Pass) {}
196 template <
typename PassT>
197 std::enable_if_t<is_detected<has_fini_t, PassT>::value>
198 addDoFinalization(PassConceptT *
Pass) {
200 detail::PassModel<MachineFunction, PassT, PreservedAnalyses,
201 MachineFunctionAnalysisManager>;
202 auto *
P =
static_cast<PassModelT *
>(
Pass);
203 FinalizationFuncs.emplace_back(
204 [=](
Module &M, MachineFunctionAnalysisManager &MFAM) {
205 return P->Pass.doFinalization(M, MFAM);
209 template <
typename PassT>
210 using is_machine_module_pass_t =
decltype(std::declval<PassT &>().run(
211 std::declval<Module &>(),
212 std::declval<MachineFunctionAnalysisManager &>()));
214 template <
typename PassT>
215 using is_machine_function_pass_t =
decltype(std::declval<PassT &>().run(
216 std::declval<MachineFunction &>(),
217 std::declval<MachineFunctionAnalysisManager &>()));
219 template <
typename PassT>
220 std::enable_if_t<!is_detected<is_machine_module_pass_t, PassT>::value>
221 addRunOnModule(PassConceptT *
Pass) {}
223 template <
typename PassT>
224 std::enable_if_t<is_detected<is_machine_module_pass_t, PassT>::value>
225 addRunOnModule(PassConceptT *
Pass) {
226 static_assert(is_detected<is_machine_function_pass_t, PassT>::value,
227 "machine module pass needs to define machine function pass "
231 detail::PassModel<MachineFunction, PassT, PreservedAnalyses,
232 MachineFunctionAnalysisManager>;
233 auto *
P =
static_cast<PassModelT *
>(
Pass);
234 MachineModulePasses.emplace(
236 [=](
Module &
M, MachineFunctionAnalysisManager &MFAM) {
237 return P->Pass.run(M, MFAM);
241 using FuncTy =
Error(
Module &, MachineFunctionAnalysisManager &);
242 SmallVector<llvm::unique_function<FuncTy>, 4> InitializationFuncs;
243 SmallVector<llvm::unique_function<FuncTy>, 4> FinalizationFuncs;
245 using PassIndex =
decltype(
Passes)::size_type;
246 std::map<PassIndex, llvm::unique_function<FuncTy>> MachineModulePasses;
249 bool RequireCodeGenSCCOrder;
251 bool VerifyMachineFunction;
print lazy value Lazy Value Info Printer Pass
Machine Check Debug Module
FunctionAnalysisManager FAM
ModuleAnalysisManager MAM
This header defines various interfaces for pass management in LLVM.
This file defines the SmallVector class.
A container for analyses that lazily runs them and caches their results.
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Lightweight error class with error context and mandatory checking.
An AnalysisManager<MachineFunction> that also exposes IR analysis results.
MachineFunctionAnalysisManager & operator=(MachineFunctionAnalysisManager &&)=default
PassT::Result * getCachedResult(Function &F)
Get the cached result of an analysis pass for a Function.
ModuleAnalysisManager * MAM
PassT::Result * getCachedResult(Module &M)
Get the cached result of an analysis pass for a Module.
MachineFunctionAnalysisManager(MachineFunctionAnalysisManager &&)=default
PassT::Result & getResult(Module &M)
Get the result of an analysis pass for a Module.
MachineFunctionAnalysisManager(FunctionAnalysisManager &FAM, ModuleAnalysisManager &MAM)
FunctionAnalysisManager * FAM
MachineFunctionAnalysisManager()
PassT::Result & getResult(Function &F)
Get the result of an analysis pass for a Function.
MachineFunctionPassManager adds/removes below features to/from the base PassManager template instanti...
void addPass(PassT &&Pass)
MachineFunctionPassManager & operator=(MachineFunctionPassManager &&)=default
MachineFunctionPassManager(bool RequireCodeGenSCCOrder=false, bool VerifyMachineFunction=false)
MachineFunctionPassManager(MachineFunctionPassManager &&)=default
A Module instance is used to store all the information related to an LLVM module.
Manages a sequence of passes over a particular unit of IR.
Pass interface - Implemented by all 'passes'.
This is an optimization pass for GlobalISel generic memory operations.
Template for the abstract base class used to dispatch polymorphically over pass objects.