14#ifndef LLVM_PASSES_CODEGENPASSBUILDER_H
15#define LLVM_PASSES_CODEGENPASSBUILDER_H
36#define DUMMY_FUNCTION_PASS(NAME, PASS_NAME) \
37 struct PASS_NAME : public OptionalPassInfoMixin<PASS_NAME> { \
38 template <typename... Ts> PASS_NAME(Ts &&...) {} \
39 PreservedAnalyses run(Function &, FunctionAnalysisManager &) { \
40 return PreservedAnalyses::all(); \
43#define DUMMY_MACHINE_MODULE_PASS(NAME, PASS_NAME) \
44 struct PASS_NAME : public OptionalPassInfoMixin<PASS_NAME> { \
45 template <typename... Ts> PASS_NAME(Ts &&...) {} \
46 PreservedAnalyses run(Module &, ModuleAnalysisManager &) { \
47 return PreservedAnalyses::all(); \
50#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME) \
51 struct PASS_NAME : public OptionalPassInfoMixin<PASS_NAME> { \
52 template <typename... Ts> PASS_NAME(Ts &&...) {} \
53 PreservedAnalyses run(MachineFunction &, \
54 MachineFunctionAnalysisManager &) { \
55 return PreservedAnalyses::all(); \
58#include "llvm/Passes/MachinePassRegistry.def"
60class PassManagerWrapper {
103 template <
typename PassT>
105 std::declval<Module &>(), std::declval<ModuleAnalysisManager &>()));
107 template <
typename PassT>
109 std::declval<Function &>(), std::declval<FunctionAnalysisManager &>()));
111 template <
typename PassT>
113 std::declval<MachineFunction &>(),
114 std::declval<MachineFunctionAnalysisManager &>()));
116 template <
typename PassT>
118 bool Force =
false,
StringRef Name = PassT::name()) {
120 "Only function passes are supported.");
121 if (!Force && !runBeforeAdding(Name))
126 template <
typename PassT>
130 "Only module passes are suported.");
132 "You cannot insert a module pass without first flushing the current "
133 "function pipelines to the module pipeline.");
134 if (!Force && !runBeforeAdding(Name))
139 template <
typename PassT>
144 "Only machine function passes are supported.");
146 if (!Force && !runBeforeAdding(Name))
149 for (
auto &
C : AfterCallbacks)
154 bool FreeMachineFunctions =
false);
159 "Requiring CGSCC ordering requires flushing the current function "
160 "pipelines to the MPM.");
161 AddInCGSCCOrder =
true;
167 "Stopping CGSCC ordering requires flushing the current function "
168 "pipelines to the MPM.");
169 AddInCGSCCOrder =
false;
377 BeforeCallbacks.emplace_back(
378 [](
StringRef Name) {
return ((Name != PassTs::name()) && ...); });
383 template <
typename TargetPassT,
typename InsertedPassT>
385 AfterCallbacks.emplace_back(
387 if (Name == TargetPassT::name() &&
388 runBeforeAdding(InsertedPassT::name())) {
396 bool ShouldAdd =
true;
397 for (
auto &
C : BeforeCallbacks)
398 ShouldAdd &=
C(Name);
402 void setStartStopPasses(
const TargetPassConfig::StartStopInfo &Info);
404 Error verifyStartStop(
const TargetPassConfig::StartStopInfo &Info)
const;
414 bool AddInCGSCCOrder =
false;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
This header defines various interfaces for pass management in LLVM.
ModuleAnalysisManager MAM
This file contains library features backported from future STL versions.
This file defines the SmallVector class.
Target-Independent Code Generator Pass Configuration Options pass.
virtual void addPreEmitPass(PassManagerWrapper &PMW)
This pass may be implemented by targets that want to run passes immediately before machine code is em...
void disablePass()
Allow the target to disable a specific pass by default.
void addMachineFunctionPass(PassT &&Pass, PassManagerWrapper &PMW, bool Force=false, StringRef Name=PassT::name())
CodeGenPassBuilder(TargetMachine &TM, const CGPassBuilderOption &Opts, PassInstrumentationCallbacks *PIC)
virtual void addPreRewrite(PassManagerWrapper &PMW)
addPreRewrite - Add passes to the optimized register allocation pipeline after register allocation is...
void insertPass(InsertedPassT &&Pass)
Insert InsertedPass pass after TargetPass pass.
void addFunctionPass(PassT &&Pass, PassManagerWrapper &PMW, bool Force=false, StringRef Name=PassT::name())
CodeGenPassBuilder & operator=(const CodeGenPassBuilder &)=delete
Error buildPipeline(ModulePassManager &MPM, ModuleAnalysisManager &MAM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut, CodeGenFileType FileType, MCContext &Ctx)
virtual void addPreRegAlloc(PassManagerWrapper &PMW)
This method may be implemented by targets that want to run passes immediately before register allocat...
decltype(std::declval< PassT & >().run( std::declval< Module & >(), std::declval< ModuleAnalysisManager & >())) is_module_pass_t
virtual ~CodeGenPassBuilder()
virtual void addPostRegAlloc(PassManagerWrapper &PMW)
This method may be implemented by targets that want to run passes after register allocation pass pipe...
bool isGlobalISelAbortEnabled() const
Check whether or not GlobalISel should abort on error.
virtual void addPreSched2(PassManagerWrapper &PMW)
This method may be implemented by targets that want to run passes after prolog-epilog insertion and b...
virtual void addPreEmitPass2(PassManagerWrapper &PMW)
Targets may add passes immediately before machine code is emitted in this callback.
virtual void addPreRegBankSelect(PassManagerWrapper &PMW)
This method may be implemented by targets that want to run passes immediately before the register ban...
virtual void addGlobalMergePass(PassManagerWrapper &PMW)
Target can override this to add GlobalMergePass before all IR passes.
decltype(std::declval< PassT & >().run( std::declval< Function & >(), std::declval< FunctionAnalysisManager & >())) is_function_pass_t
CodeGenOptLevel getOptLevel() const
virtual void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
This method may be implemented by targets that want to run passes immediately before legalization.
virtual void addPreISel(PassManagerWrapper &PMW)
{{@ For GlobalISel
virtual void addPostBBSections(PassManagerWrapper &PMW)
void addModulePass(PassT &&Pass, PassManagerWrapper &PMW, bool Force=false, StringRef Name=PassT::name())
PassInstrumentationCallbacks * getPassInstrumentationCallbacks() const
void stopAddingInCGSCCOrder(PassManagerWrapper &PMW)
virtual void addPreGlobalInstructionSelect(PassManagerWrapper &PMW)
This method may be implemented by targets that want to run passes immediately before the (global) ins...
virtual void addILPOpts(PassManagerWrapper &PMW)
Add passes that optimize instruction level parallelism for out-of-order targets.
PassInstrumentationCallbacks * PIC
virtual void addPostRewrite(PassManagerWrapper &PMW)
Add passes to be run immediately after virtual registers are rewritten to physical registers.
bool reportDiagnosticWhenGlobalISelFallback() const
Check whether or not a diagnostic should be emitted when GlobalISel uses the fallback path.
decltype(std::declval< PassT & >().run( std::declval< MachineFunction & >(), std::declval< MachineFunctionAnalysisManager & >())) is_machine_function_pass_t
virtual void addGCPasses(PassManagerWrapper &PMW)
addGCPasses - Add late codegen passes that analyze code for garbage collection.
CodeGenPassBuilder(const CodeGenPassBuilder &)=delete
void requireCGSCCOrder(PassManagerWrapper &PMW)
Lightweight error class with error context and mandatory checking.
Tagged union holding either a T or a Error.
Context object for machine code objects.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
friend class CodeGenPassBuilder
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same_v< PassT, PassManager > > addPass(PassT &&Pass)
bool isEmpty() const
Returns if the pass manager contains any passes.
Pass interface - Implemented by all 'passes'.
Represent a constant reference to a string, i.e.
Primary interface to the complete machine description for the target machine.
An abstract base class for streams implementations that also support a pwrite operation.
unique_function is a type-erasing functor similar to std::function.
This is an optimization pass for GlobalISel generic memory operations.
CodeGenFileType
These enums are meant to be passed into addPassesToEmitFile to indicate what type of file to emit,...
PassManager< Module > ModulePassManager
Convenience typedef for a pass manager over modules.
CodeGenOptLevel
Code generation optimization level.
PassManager< Function > FunctionPassManager
Convenience typedef for a pass manager over functions.
typename detail::detector< void, Op, Args... >::value_t is_detected
Detects if a given trait holds for some set of arguments 'Args'.
PassManager< MachineFunction > MachineFunctionPassManager
Convenience typedef for a pass manager over functions.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.