25#define DEBUG_TYPE "bpf-mi-checking"
43 void processAtomicInsts();
106 &BPFMCRegisterClasses[BPF::GPRRegClassID];
107 std::vector<unsigned> GPR32LiveDefs;
108 std::vector<unsigned> GPR64DeadDefs;
113 if (!MO.isReg() || MO.isUse())
116 RegIsGPR64 = GPR64RegClass->
contains(MO.getReg());
124 GPR32LiveDefs.push_back(MO.getReg());
131 GPR64DeadDefs.push_back(MO.getReg());
135 if (GPR32LiveDefs.empty())
140 if (GPR64DeadDefs.empty())
144 for (
auto I : GPR32LiveDefs)
152void BPFMIPreEmitChecking::processAtomicInsts() {
159 if (
MI.getOpcode() != BPF::XADDW &&
MI.getOpcode() != BPF::XADDD)
163 if (hasLiveDefs(
MI,
TRI)) {
168 F,
"Invalid usage of the XADD return value",
DL});
177 "BPF PreEmit Checking",
false,
false)
179char BPFMIPreEmitChecking::
ID = 0;
181 return new BPFMIPreEmitChecking();
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
unsigned const TargetRegisterInfo * TRI
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, ArrayRef< StringLiteral > StandardNames)
Initialize the set of available library functions based on the specified target triple.
Diagnostic information for unsupported feature in backend.
FunctionPass class - This class is used to implement most global optimizations.
bool skipFunction(const Function &F) const
Optional passes call this function to check whether the pass should be skipped.
MCRegisterClass - Base class of TargetRegisterClass.
bool contains(MCRegister Reg) const
contains - Return true if the specified register is included in this register class.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
virtual bool runOnMachineFunction(MachineFunction &MF)=0
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
Function & getFunction()
Return the LLVM function that this machine code represents.
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This is an optimization pass for GlobalISel generic memory operations.
FunctionPass * createBPFMIPreEmitCheckingPass()
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void initializeBPFMIPreEmitCheckingPass(PassRegistry &)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.