RISCVFrameLowering.h revision 360784
1//===-- RISCVFrameLowering.h - Define frame lowering for RISCV -*- C++ -*--===// 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// This class implements RISCV-specific bits of TargetFrameLowering class. 10// 11//===----------------------------------------------------------------------===// 12 13#ifndef LLVM_LIB_TARGET_RISCV_RISCVFRAMELOWERING_H 14#define LLVM_LIB_TARGET_RISCV_RISCVFRAMELOWERING_H 15 16#include "llvm/CodeGen/TargetFrameLowering.h" 17 18namespace llvm { 19class RISCVSubtarget; 20 21class RISCVFrameLowering : public TargetFrameLowering { 22public: 23 explicit RISCVFrameLowering(const RISCVSubtarget &STI) 24 : TargetFrameLowering(StackGrowsDown, 25 /*StackAlignment=*/Align(16), 26 /*LocalAreaOffset=*/0), 27 STI(STI) {} 28 29 void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override; 30 void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override; 31 32 int getFrameIndexReference(const MachineFunction &MF, int FI, 33 unsigned &FrameReg) const override; 34 35 void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, 36 RegScavenger *RS) const override; 37 38 void processFunctionBeforeFrameFinalized(MachineFunction &MF, 39 RegScavenger *RS) const override; 40 41 bool hasFP(const MachineFunction &MF) const override; 42 43 bool hasBP(const MachineFunction &MF) const; 44 45 bool hasReservedCallFrame(const MachineFunction &MF) const override; 46 MachineBasicBlock::iterator 47 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, 48 MachineBasicBlock::iterator MI) const override; 49 50 // Get the first stack adjustment amount for SplitSPAdjust. 51 // Return 0 if we don't want to to split the SP adjustment in prologue and 52 // epilogue. 53 uint64_t getFirstSPAdjustAmount(const MachineFunction &MF) const; 54 55protected: 56 const RISCVSubtarget &STI; 57 58private: 59 void determineFrameLayout(MachineFunction &MF) const; 60 void adjustReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, 61 const DebugLoc &DL, Register DestReg, Register SrcReg, 62 int64_t Val, MachineInstr::MIFlag Flag) const; 63}; 64} 65#endif 66