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 18 namespace llvm { 19 class RISCVSubtarget; 20 21 class RISCVFrameLowering : public TargetFrameLowering { 22 public: 23 explicit RISCVFrameLowering(const RISCVSubtarget &STI) 24 : TargetFrameLowering(StackGrowsDown, 25 /*StackAlignment=*/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 hasReservedCallFrame(const MachineFunction &MF) const override; 44 MachineBasicBlock::iterator 45 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, 46 MachineBasicBlock::iterator MI) const override; 47 48 protected: 49 const RISCVSubtarget &STI; 50 51 private: 52 void determineFrameLayout(MachineFunction &MF) const; 53 void adjustReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, 54 const DebugLoc &DL, unsigned DestReg, unsigned SrcReg, 55 int64_t Val, MachineInstr::MIFlag Flag) const; 56 }; 57 } 58 #endif 59