diff --git a/llvm/lib/Target/BPF/BPFFrameLowering.cpp b/llvm/lib/Target/BPF/BPFFrameLowering.cpp index 00780b4d1406f..135cd6b2fb343 100644 --- a/llvm/lib/Target/BPF/BPFFrameLowering.cpp +++ b/llvm/lib/Target/BPF/BPFFrameLowering.cpp @@ -36,3 +36,18 @@ void BPFFrameLowering::determineCalleeSaves(MachineFunction &MF, SavedRegs.reset(BPF::R8); SavedRegs.reset(BPF::R9); } + +StackOffset BPFFrameLowering::getFrameIndexReference(const MachineFunction &MF, + int FI, + Register &FrameReg) const { + const MachineFrameInfo &MFI = MF.getFrameInfo(); + const TargetRegisterInfo *RI = MF.getSubtarget().getRegisterInfo(); + + FrameReg = RI->getFrameRegister(MF); + + // BPF uses a fixed frame pointer (R10), and offsets are already relative to + // it. No StackSize adjustment (as in the default implementation) is needed. + return StackOffset::getFixed(MFI.getObjectOffset(FI) - + getOffsetOfLocalArea() + + MFI.getOffsetAdjustment()); +} diff --git a/llvm/lib/Target/BPF/BPFFrameLowering.h b/llvm/lib/Target/BPF/BPFFrameLowering.h index 6beffcbe69dd0..76ddce740d383 100644 --- a/llvm/lib/Target/BPF/BPFFrameLowering.h +++ b/llvm/lib/Target/BPF/BPFFrameLowering.h @@ -35,6 +35,9 @@ class BPFFrameLowering : public TargetFrameLowering { return MBB.erase(MI); } + StackOffset getFrameIndexReference(const MachineFunction &MF, int FI, + Register &FrameReg) const override; + protected: bool hasFPImpl(const MachineFunction &MF) const override; };