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"
15#include "llvm/MC/MCStreamer.h"
18#include "llvm/Support/Error.h"
22
23using namespace llvm;
24
26
27namespace {
28
29class BPFCodeGenPassBuilder : public CodeGenPassBuilder {
30 using Base = CodeGenPassBuilder;
31
32 BPFTargetMachine &getTM() const {
33 return static_cast<BPFTargetMachine &>(TM);
34 }
35
36public:
37 explicit BPFCodeGenPassBuilder(BPFTargetMachine &TM,
38 const CGPassBuilderOption &Opts,
39 PassInstrumentationCallbacks *PIC)
40 : CodeGenPassBuilder(TM, Opts, PIC) {}
41
42 void addIRPasses(PassManagerWrapper &PMW) override;
43 Error addInstSelector(PassManagerWrapper &PMW) override;
44 void addMachineSSAOptimization(PassManagerWrapper &PMW) override;
45 void addPreEmitPass(PassManagerWrapper &PMW) override;
46 void addAsmPrinterBegin(PassManagerWrapper &PMW) override;
47 void addAsmPrinter(PassManagerWrapper &PMW) override;
48 void addAsmPrinterEnd(PassManagerWrapper &PMW) override;
49};
50
51void BPFCodeGenPassBuilder::addIRPasses(PassManagerWrapper &PMW) {
52 addFunctionPass(AtomicExpandPass(TM), PMW);
53 flushFPMsToMPM(PMW);
54 addModulePass(BPFCheckAndAdjustIRPass(), PMW);
55
56 Base::addIRPasses(PMW);
57}
58
59Error BPFCodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
60 addMachineFunctionPass(BPFISelDAGToDAGPass(getTM()), PMW);
61 return Error::success();
62}
63
64void BPFCodeGenPassBuilder::addMachineSSAOptimization(PassManagerWrapper &PMW) {
65 addMachineFunctionPass(BPFMISimplifyPatchablePass(), PMW);
66
67 Base::addMachineSSAOptimization(PMW);
68
69 const BPFSubtarget *Subtarget = getTM().getSubtargetImpl();
70 if (!DisableMIPeephole) {
71 if (Subtarget->getHasAlu32())
72 addMachineFunctionPass(BPFMIPeepholePass(), PMW);
73 }
74}
75
76void BPFCodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) {
77 addMachineFunctionPass(BPFMIPreEmitCheckingPass(), PMW);
78 if (!DisableMIPeephole) {
79 addMachineFunctionPass(BPFMIExpandStackArgPseudosPass(), PMW);
80 addMachineFunctionPass(BPFMIPreEmitPeepholePass(), PMW);
81 }
82}
83
84void BPFCodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
85 addModulePass(BPFAsmPrinterBeginPass(), PMW, /*Force=*/true);
86}
87
88void BPFCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
89 addMachineFunctionPass(BPFAsmPrinterPass(), PMW);
90}
91
92void BPFCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
93 addModulePass(BPFAsmPrinterEndPass(), PMW);
94}
95
96} // namespace
97
99 return PassBuilder::parseSinglePassOption(Params, "allow-partial",
100 "BPFPreserveStaticOffsetPass");
101}
102
104#define GET_PASS_REGISTRY "BPFPassRegistry.def"
106
107 PB.registerPipelineStartEPCallback(
114 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
115 });
116 PB.registerPeepholeEPCallback([=](FunctionPassManager &FPM,
117 OptimizationLevel Level) {
118 FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions().hoistCommonInsts(true)));
120 });
121 PB.registerScalarOptimizerLateEPCallback(
122 [=](FunctionPassManager &FPM, OptimizationLevel Level) {
123 // Run this after loop unrolling but before
124 // SimplifyCFGPass(... .sinkCommonInsts(true))
126 });
127 PB.registerPipelineEarlySimplificationEPCallback(
130 });
131}
132
135 raw_pwrite_stream *DwoOut, CodeGenFileType FileType,
136 const CGPassBuilderOption &Opt, MCContext &Ctx,
138 auto CGPB = BPFCodeGenPassBuilder(*this, Opt, PIC);
139 return CGPB.buildPipeline(MPM, MAM, Out, DwoOut, FileType, Ctx);
140}
cl::opt< bool > DisableMIPeephole
static Expected< bool > parseBPFPreserveStaticOffsetOptions(StringRef Params)
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 ...
const GCNTargetMachine & getTM(const GCNSubtarget *STI)
This file provides the interface for the pass responsible for both simplifying and canonicalizing the...
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:77
CodeGenFileType
These enums are meant to be passed into addPassesToEmitFile to indicate what type of file to emit,...
Definition CodeGen.h:178
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