LLVM 24.0.0git
BPFCodeGenPassBuilder.cpp
Go to the documentation of this file.
1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "BPF.h"
10#include "BPFAsmPrinter.h"
11#include "BPFSubtarget.h"
12#include "BPFTargetMachine.h"
19#include "llvm/MC/MCStreamer.h"
22#include "llvm/Support/Error.h"
26
27using namespace llvm;
28
30
31namespace {
32
33class BPFCodeGenPassBuilder : public CodeGenPassBuilder {
34 using Base = CodeGenPassBuilder;
35
36 BPFTargetMachine &getTM() const {
37 return static_cast<BPFTargetMachine &>(TM);
38 }
39
40public:
41 explicit BPFCodeGenPassBuilder(BPFTargetMachine &TM,
42 const CGPassBuilderOption &Opts,
43 PassInstrumentationCallbacks *PIC)
44 : CodeGenPassBuilder(TM, Opts, PIC) {}
45
46 void addIRPasses(PassManagerWrapper &PMW) override;
47
48 Error addInstSelector(PassManagerWrapper &PMW) override;
49
50 Error addIRTranslator(PassManagerWrapper &PMW) override;
51 Error addLegalizeMachineIR(PassManagerWrapper &PMW) override;
52 Error addRegBankSelect(PassManagerWrapper &PMW) override;
53 Error addGlobalInstructionSelect(PassManagerWrapper &PMW) override;
54
55 void addMachineSSAOptimization(PassManagerWrapper &PMW) override;
56 void addPreEmitPass(PassManagerWrapper &PMW) override;
57 void addAsmPrinterBegin(PassManagerWrapper &PMW) override;
58 void addAsmPrinter(PassManagerWrapper &PMW) override;
59 void addAsmPrinterEnd(PassManagerWrapper &PMW) override;
60};
61
62void BPFCodeGenPassBuilder::addIRPasses(PassManagerWrapper &PMW) {
63 const BPFSubtarget *Subtarget = getTM().getSubtargetImpl();
64
65 addFunctionPass(AtomicExpandPass(TM), PMW);
66 flushFPMsToMPM(PMW);
67 addModulePass(BPFCheckAndAdjustIRPass(), PMW);
68 if (Subtarget->hasFuncTable())
69 addModulePass(BPFFuncTablePass(), PMW);
70
71 Base::addIRPasses(PMW);
72}
73
74Error BPFCodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
75 addMachineFunctionPass(BPFISelDAGToDAGPass(getTM()), PMW);
76 return Error::success();
77}
78
79Error BPFCodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
80 addMachineFunctionPass(IRTranslatorPass(getOptLevel()), PMW);
81 return Error::success();
82}
83
84Error BPFCodeGenPassBuilder::addLegalizeMachineIR(PassManagerWrapper &PMW) {
85 addMachineFunctionPass(LegalizerPass(), PMW);
86 return Error::success();
87}
88
89Error BPFCodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
90 addMachineFunctionPass(RegBankSelectPass(), PMW);
91 return Error::success();
92}
93
94Error BPFCodeGenPassBuilder::addGlobalInstructionSelect(
95 PassManagerWrapper &PMW) {
96 addMachineFunctionPass(InstructionSelectPass(), PMW);
97 return Error::success();
98}
99
100void BPFCodeGenPassBuilder::addMachineSSAOptimization(PassManagerWrapper &PMW) {
101 addMachineFunctionPass(BPFMISimplifyPatchablePass(), PMW);
102
103 Base::addMachineSSAOptimization(PMW);
104
105 const BPFSubtarget *Subtarget = getTM().getSubtargetImpl();
106 if (!DisableMIPeephole) {
107 if (Subtarget->getHasAlu32())
108 addMachineFunctionPass(BPFMIPeepholePass(), PMW);
109 }
110}
111
112void BPFCodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) {
113 addMachineFunctionPass(BPFMIPreEmitCheckingPass(), PMW);
114 if (!DisableMIPeephole) {
115 addMachineFunctionPass(BPFMIExpandStackArgPseudosPass(), PMW);
116 addMachineFunctionPass(BPFMIPreEmitPeepholePass(), PMW);
117 }
118}
119
120void BPFCodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
121 addModulePass(BPFAsmPrinterBeginPass(), PMW, /*Force=*/true);
122}
123
124void BPFCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
125 addMachineFunctionPass(BPFAsmPrinterPass(), PMW);
126}
127
128void BPFCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
129 addModulePass(BPFAsmPrinterEndPass(), PMW);
130}
131
132} // namespace
133
135 return PassBuilder::parseSinglePassOption(Params, "allow-partial",
136 "BPFPreserveStaticOffsetPass");
137}
138
140#define GET_PASS_REGISTRY "BPFPassRegistry.def"
142
143 PB.registerPipelineStartEPCallback(
150 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
151 });
152 PB.registerPeepholeEPCallback([=](FunctionPassManager &FPM,
153 OptimizationLevel Level) {
154 FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions().hoistCommonInsts(true)));
156 });
157 PB.registerScalarOptimizerLateEPCallback(
158 [=](FunctionPassManager &FPM, OptimizationLevel Level) {
159 // Run this after loop unrolling but before
160 // SimplifyCFGPass(... .sinkCommonInsts(true))
162 });
163 PB.registerPipelineEarlySimplificationEPCallback(
166 });
167}
168
171 raw_pwrite_stream *DwoOut, CodeGenFileType FileType,
172 const CGPassBuilderOption &Opt, MCContext &Ctx,
174 auto CGPB = BPFCodeGenPassBuilder(*this, Opt, PIC);
175 return CGPB.buildPipeline(MPM, MAM, Out, DwoOut, FileType, Ctx);
176}
cl::opt< bool > DisableMIPeephole
static Expected< bool > parseBPFPreserveStaticOffsetOptions(StringRef Params)
Interfaces for producing common pass manager configurations.
This file declares the IRTranslator pass.
ModuleAnalysisManager MAM
PassBuilder PB(Mod->getContext(), Machine, PassOpts->PTO, std::nullopt, &PIC)
PassInstrumentationCallbacks PIC
This file defines the Pass Instrumentation classes that provide instrumentation points into the pass ...
This file describes the interface of the MachineFunctionPass responsible for assigning the generic vi...
const GCNTargetMachine & getTM(const GCNSubtarget *STI)
This file provides the interface for the pass responsible for both simplifying and canonicalizing the...
bool hasFuncTable() const
bool getHasAlu32() const
void registerPassBuilderCallbacks(PassBuilder &PB) 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
This class provides access to building LLVM's passes.
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
static ErrorSuccess success()
Create a success value.
Definition Error.h:336
Tagged union holding either a T or a Error.
Definition Error.h:485
const TargetSubtargetInfo * getSubtargetImpl(const Function &) const override
Virtual method implemented by subclasses that returns a reference to that target's TargetSubtargetInf...
Context object for machine code objects.
Definition MCContext.h:83
This class provides access to building LLVM's passes.
static LLVM_ABI Expected< bool > parseSinglePassOption(StringRef Params, StringRef OptionName, StringRef PassName)
Handle passes only accept one bool-valued parameter.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same_v< PassT, PassManager > > addPass(PassT &&Pass)
A pass to simplify and canonicalize the CFG of a function.
Definition SimplifyCFG.h:30
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
An abstract base class for streams implementations that also support a pwrite operation.
Interfaces for registering analysis passes, producing common pass manager configurations,...
This is an optimization pass for GlobalISel generic memory operations.
ModuleToFunctionPassAdaptor createModuleToFunctionPassAdaptor(FunctionPassT &&Pass, bool EagerlyInvalidate=false)
A function to deduce a function pass type and wrap it in the templated adaptor.
ThinOrFullLTOPhase
This enumerates the LLVM full LTO or ThinLTO optimization phases.
Definition Pass.h:75
CodeGenFileType
These enums are meant to be passed into addPassesToEmitFile to indicate what type of file to emit,...
Definition CodeGen.h:309
PassManager< Module > ModulePassManager
Convenience typedef for a pass manager over modules.
PassManager< Function > FunctionPassManager
Convenience typedef for a pass manager over functions.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39