Path: blob/main/contrib/llvm-project/llvm/lib/Target/BPF/BPFRegisterInfo.cpp
96353 views
//===-- BPFRegisterInfo.cpp - BPF Register Information ----------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file contains the BPF implementation of the TargetRegisterInfo class.9//10//===----------------------------------------------------------------------===//1112#include "BPFRegisterInfo.h"13#include "BPF.h"14#include "BPFSubtarget.h"15#include "llvm/CodeGen/MachineFrameInfo.h"16#include "llvm/CodeGen/MachineFunction.h"17#include "llvm/CodeGen/MachineInstrBuilder.h"18#include "llvm/CodeGen/RegisterScavenging.h"19#include "llvm/CodeGen/TargetFrameLowering.h"20#include "llvm/CodeGen/TargetInstrInfo.h"21#include "llvm/IR/DiagnosticInfo.h"22#include "llvm/Support/CommandLine.h"23#include "llvm/Support/ErrorHandling.h"2425#define GET_REGINFO_TARGET_DESC26#include "BPFGenRegisterInfo.inc"27using namespace llvm;2829static cl::opt<int>30BPFStackSizeOption("bpf-stack-size",31cl::desc("Specify the BPF stack size limit"),32cl::init(512));3334BPFRegisterInfo::BPFRegisterInfo()35: BPFGenRegisterInfo(BPF::R0) {}3637const MCPhysReg *38BPFRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {39return CSR_SaveList;40}4142BitVector BPFRegisterInfo::getReservedRegs(const MachineFunction &MF) const {43BitVector Reserved(getNumRegs());44markSuperRegs(Reserved, BPF::W10); // [W|R]10 is read only frame pointer45markSuperRegs(Reserved, BPF::W11); // [W|R]11 is pseudo stack pointer46return Reserved;47}4849static void WarnSize(int Offset, MachineFunction &MF, DebugLoc& DL,50MachineBasicBlock& MBB) {51if (Offset <= -BPFStackSizeOption) {52if (!DL)53/* try harder to get some debug loc */54for (auto &I : MBB)55if (I.getDebugLoc()) {56DL = I.getDebugLoc();57break;58}5960const Function &F = MF.getFunction();61DiagnosticInfoUnsupported DiagStackSize(62F,63"Looks like the BPF stack limit is exceeded. "64"Please move large on stack variables into BPF per-cpu array map. For "65"non-kernel uses, the stack can be increased using -mllvm "66"-bpf-stack-size.\n",67DL);68F.getContext().diagnose(DiagStackSize);69}70}7172bool BPFRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,73int SPAdj, unsigned FIOperandNum,74RegScavenger *RS) const {75assert(SPAdj == 0 && "Unexpected");7677unsigned i = 0;78MachineInstr &MI = *II;79MachineBasicBlock &MBB = *MI.getParent();80MachineFunction &MF = *MBB.getParent();81DebugLoc DL = MI.getDebugLoc();8283while (!MI.getOperand(i).isFI()) {84++i;85assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");86}8788Register FrameReg = getFrameRegister(MF);89int FrameIndex = MI.getOperand(i).getIndex();90const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();9192if (MI.getOpcode() == BPF::MOV_rr) {93int Offset = MF.getFrameInfo().getObjectOffset(FrameIndex);9495WarnSize(Offset, MF, DL, MBB);96MI.getOperand(i).ChangeToRegister(FrameReg, false);97Register reg = MI.getOperand(i - 1).getReg();98BuildMI(MBB, ++II, DL, TII.get(BPF::ADD_ri), reg)99.addReg(reg)100.addImm(Offset);101return false;102}103104int Offset = MF.getFrameInfo().getObjectOffset(FrameIndex) +105MI.getOperand(i + 1).getImm();106107if (!isInt<32>(Offset))108llvm_unreachable("bug in frame offset");109110WarnSize(Offset, MF, DL, MBB);111112if (MI.getOpcode() == BPF::FI_ri) {113// architecture does not really support FI_ri, replace it with114// MOV_rr <target_reg>, frame_reg115// ADD_ri <target_reg>, imm116Register reg = MI.getOperand(i - 1).getReg();117118BuildMI(MBB, ++II, DL, TII.get(BPF::MOV_rr), reg)119.addReg(FrameReg);120BuildMI(MBB, II, DL, TII.get(BPF::ADD_ri), reg)121.addReg(reg)122.addImm(Offset);123124// Remove FI_ri instruction125MI.eraseFromParent();126} else {127MI.getOperand(i).ChangeToRegister(FrameReg, false);128MI.getOperand(i + 1).ChangeToImmediate(Offset);129}130return false;131}132133Register BPFRegisterInfo::getFrameRegister(const MachineFunction &MF) const {134return BPF::R10;135}136137138