53class WebAssemblyCodeGenPassBuilder
55 WebAssemblyTargetMachine> {
78 disablePass<RegisterCoalescerPass>();
81 void addIRPasses(PassManagerWrapper &PMW)
const;
82 void addISelPrepare(PassManagerWrapper &PMW)
const;
83 Error addInstSelector(PassManagerWrapper &PMW)
const;
84 Error addRegAssignAndRewriteFast(PassManagerWrapper &PMW)
const;
85 Expected<bool> addRegAssignAndRewriteOptimized(PassManagerWrapper &PMW)
const;
86 void addPreEmitPass(PassManagerWrapper &PMW)
const;
87 void addAsmPrinterBegin(PassManagerWrapper &PMW)
const;
88 void addAsmPrinter(PassManagerWrapper &PMW)
const;
89 void addAsmPrinterEnd(PassManagerWrapper &PMW)
const;
95 addModulePass(WebAssemblyAddMissingPrototypesPass(), PMW);
98 addModulePass(LowerGlobalDtorsPass(), PMW);
102 addModulePass(WebAssemblyFixFunctionBitcastsPass(), PMW);
105 if (getOptLevel() != CodeGenOptLevel::None)
106 addFunctionPass(WebAssemblyOptimizeReturnedPass(), PMW);
115 addFunctionPass(LowerInvokePass(), PMW);
118 addFunctionPass(UnreachableBlockElimPass(), PMW);
127 addModulePass(WebAssemblyLowerEmscriptenEHSjLjPass(), PMW);
131 addFunctionPass(IndirectBrExpandPass(TM), PMW);
134 addFunctionPass(WebAssemblyReduceToAnyAllTruePass(TM), PMW);
136 Base::addIRPasses(PMW);
139void WebAssemblyCodeGenPassBuilder::addISelPrepare(
140 PassManagerWrapper &PMW)
const {
143 addFunctionPass(WebAssemblyRefTypeMem2LocalPass(), PMW);
146 addModulePass(WebAssemblyCoalesceFeaturesAndStripAtomicsPass(TM), PMW);
149 addFunctionPass(AtomicExpandPass(TM), PMW);
151 Base::addISelPrepare(PMW);
154Error WebAssemblyCodeGenPassBuilder::addInstSelector(
155 PassManagerWrapper &PMW)
const {
156 addMachineFunctionPass(WebAssemblyISelDAGToDAGPass(TM, getOptLevel()), PMW);
161 addMachineFunctionPass(WebAssemblyArgumentMovePass(), PMW);
166 addMachineFunctionPass(WebAssemblySetP2AlignOperandsPass(), PMW);
169 addMachineFunctionPass(WebAssemblyFixBrTableDefaultsPass(), PMW);
173 addMachineFunctionPass(WebAssemblyCleanCodeAfterTrapPass(), PMW);
178Error WebAssemblyCodeGenPassBuilder::addRegAssignAndRewriteFast(
179 PassManagerWrapper &PMW)
const {
183Expected<bool> WebAssemblyCodeGenPassBuilder::addRegAssignAndRewriteOptimized(
184 PassManagerWrapper &PMW)
const {
188void WebAssemblyCodeGenPassBuilder::addPreEmitPass(
189 PassManagerWrapper &PMW)
const {
190 Base::addPreEmitPass(PMW);
193 addMachineFunctionPass(WebAssemblyNullifyDebugValueListsPass(), PMW);
197 addMachineFunctionPass(UnreachableMachineBlockElimPass(), PMW);
200 addMachineFunctionPass(WebAssemblyFixIrreducibleControlFlowPass(), PMW);
205 addMachineFunctionPass(WebAssemblyLateEHPreparePass(), PMW);
210 addMachineFunctionPass(WebAssemblyReplacePhysRegsPass(), PMW);
213 if (getOptLevel() != CodeGenOptLevel::None) {
215 addMachineFunctionPass(WebAssemblyOptimizeLiveIntervalsPass(), PMW);
218 addMachineFunctionPass(WebAssemblyMemIntrinsicResultsPass(), PMW);
226 addMachineFunctionPass(WebAssemblyRegStackifyPass(getOptLevel()), PMW);
228 if (getOptLevel() != CodeGenOptLevel::None) {
232 addMachineFunctionPass(WebAssemblyRegColoringPass(), PMW);
237 addMachineFunctionPass(WebAssemblyCFGSortPass(), PMW);
240 addMachineFunctionPass(WebAssemblyCFGStackifyPass(), PMW);
244 addMachineFunctionPass(WebAssemblyExplicitLocalsPass(), PMW);
247 addMachineFunctionPass(WebAssemblyLowerBrUnlessPass(), PMW);
250 if (getOptLevel() != CodeGenOptLevel::None)
251 addMachineFunctionPass(WebAssemblyPeepholePass(), PMW);
254 addMachineFunctionPass(WebAssemblyRegNumberingPass(), PMW);
258 addMachineFunctionPass(WebAssemblyDebugFixupPass(), PMW);
262 addModulePass(WebAssemblyMCLowerPrePass(), PMW);
265void WebAssemblyCodeGenPassBuilder::addAsmPrinterBegin(
266 PassManagerWrapper &PMW)
const {
267 addModulePass(WebAssemblyAsmPrinterBeginPass(), PMW,
true);
270void WebAssemblyCodeGenPassBuilder::addAsmPrinter(
271 PassManagerWrapper &PMW)
const {
272 addMachineFunctionPass(WebAssemblyAsmPrinterPass(), PMW);
275void WebAssemblyCodeGenPassBuilder::addAsmPrinterEnd(
276 PassManagerWrapper &PMW)
const {
277 addModulePass(WebAssemblyAsmPrinterEndPass(), PMW);
283#define GET_PASS_REGISTRY "WebAssemblyPassRegistry.def"
292 auto CGPB = WebAssemblyCodeGenPassBuilder(*
this, Opt,
PIC);
293 return CGPB.buildPipeline(MPM,
MAM, Out, DwoOut, FileType, Ctx);
Interfaces for producing common pass manager configurations.
ModuleAnalysisManager MAM
PassInstrumentationCallbacks PIC
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
This file defines the Pass Instrumentation classes that provide instrumentation points into the pass ...
cl::opt< bool > WasmEnableEH
cl::opt< bool > WasmEnableSjLj
cl::opt< bool > WasmEnableEmEH
cl::opt< bool > WasmEnableEmSjLj
cl::opt< bool > WasmDisableExplicitLocals
This file implements WebAssemblyException information analysis.
This file declares the WebAssembly-specific subclass of TargetMachine.
This file contains the entry points for global functions defined in the LLVM WebAssembly back-end.
This class provides access to building LLVM's passes.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Context object for machine code objects.
This class provides access to building LLVM's passes.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
ExceptionHandling ExceptionModel
What exception model to use.
void registerPassBuilderCallbacks(PassBuilder &PbB) override
Allow the target to modify the pass pipeline.
Error buildCodeGenPipeline(ModulePassManager &MPM, ModuleAnalysisManager &MAM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut, CodeGenFileType FileType, const CGPassBuilderOption &Opt, MCContext &Ctx, PassInstrumentationCallbacks *PIC) override
An abstract base class for streams implementations that also support a pwrite operation.
Interfaces for registering analysis passes, producing common pass manager configurations,...
cl::opt< bool > WasmEnableEmEH
cl::opt< bool > WasmEnableEH
cl::opt< bool > WasmEnableSjLj
cl::opt< bool > WasmEnableEmSjLj
cl::opt< bool > WasmDisableExplicitLocals
cl::opt< bool > WasmEnableEH
cl::opt< bool > WasmEnableSjLj
cl::opt< bool > WasmEnableEmEH
cl::opt< bool > WasmEnableEmSjLj
cl::opt< bool > WasmDisableExplicitLocals
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.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.