| //===-- RISCVFrameLowering.cpp - RISCV Frame Information ------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file contains the RISCV implementation of TargetFrameLowering class. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "RISCVFrameLowering.h" |
| #include "RISCVSubtarget.h" |
| #include "llvm/CodeGen/MachineFrameInfo.h" |
| #include "llvm/CodeGen/MachineFunction.h" |
| #include "llvm/CodeGen/MachineInstrBuilder.h" |
| #include "llvm/CodeGen/MachineRegisterInfo.h" |
| |
| using namespace llvm; |
| |
| bool RISCVFrameLowering::hasFP(const MachineFunction &MF) const { return true; } |
| |
| void RISCVFrameLowering::emitPrologue(MachineFunction &MF, |
| MachineBasicBlock &MBB) const {} |
| |
| void RISCVFrameLowering::emitEpilogue(MachineFunction &MF, |
| MachineBasicBlock &MBB) const {} |
| |
| int RISCVFrameLowering::getFrameIndexReference(const MachineFunction &MF, |
| int FI, |
| unsigned &FrameReg) const { |
| const MachineFrameInfo &MFI = MF.getFrameInfo(); |
| const TargetRegisterInfo *RI = MF.getSubtarget().getRegisterInfo(); |
| |
| // Callee-saved registers should be referenced relative to the stack |
| // pointer (positive offset), otherwise use the frame pointer (negative |
| // offset). |
| const std::vector<CalleeSavedInfo> &CSI = MFI.getCalleeSavedInfo(); |
| int MinCSFI = 0; |
| int MaxCSFI = -1; |
| |
| int Offset = MFI.getObjectOffset(FI) - getOffsetOfLocalArea() + |
| MFI.getOffsetAdjustment(); |
| |
| if (CSI.size()) { |
| MinCSFI = CSI[0].getFrameIdx(); |
| MaxCSFI = CSI[CSI.size() - 1].getFrameIdx(); |
| } |
| |
| FrameReg = RI->getFrameRegister(MF); |
| if (FI >= MinCSFI && FI <= MaxCSFI) { |
| FrameReg = RISCV::X2; |
| Offset += MF.getFrameInfo().getStackSize(); |
| } |
| return Offset; |
| } |