1349cc55cSDimitry Andric //===-- CSKYFrameLowering.h - Define frame lowering for CSKY -*- C++ -*--===// 2349cc55cSDimitry Andric // 3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6349cc55cSDimitry Andric // 7349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 8349cc55cSDimitry Andric // 9349cc55cSDimitry Andric // This class implements CSKY-specific bits of TargetFrameLowering class. 10349cc55cSDimitry Andric // 11349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 12349cc55cSDimitry Andric 13349cc55cSDimitry Andric #ifndef LLVM_LIB_TARGET_CSKY_CSKYFRAMELOWERING_H 14349cc55cSDimitry Andric #define LLVM_LIB_TARGET_CSKY_CSKYFRAMELOWERING_H 15349cc55cSDimitry Andric 16349cc55cSDimitry Andric #include "llvm/CodeGen/TargetFrameLowering.h" 17349cc55cSDimitry Andric 18349cc55cSDimitry Andric namespace llvm { 19349cc55cSDimitry Andric class CSKYSubtarget; 20349cc55cSDimitry Andric 21349cc55cSDimitry Andric class CSKYFrameLowering : public TargetFrameLowering { 22349cc55cSDimitry Andric const CSKYSubtarget &STI; 23349cc55cSDimitry Andric 24*04eeddc0SDimitry Andric void determineFrameLayout(MachineFunction &MF) const; 25*04eeddc0SDimitry Andric void adjustReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, 26*04eeddc0SDimitry Andric const DebugLoc &DL, Register DestReg, Register SrcReg, 27*04eeddc0SDimitry Andric int64_t Val, MachineInstr::MIFlag Flag) const; 28*04eeddc0SDimitry Andric 29349cc55cSDimitry Andric public: CSKYFrameLowering(const CSKYSubtarget & STI)30349cc55cSDimitry Andric explicit CSKYFrameLowering(const CSKYSubtarget &STI) 31349cc55cSDimitry Andric : TargetFrameLowering(StackGrowsDown, 32349cc55cSDimitry Andric /*StackAlignment=*/Align(4), 33349cc55cSDimitry Andric /*LocalAreaOffset=*/0), 34349cc55cSDimitry Andric STI(STI) {} 35349cc55cSDimitry Andric 36349cc55cSDimitry Andric void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override; 37349cc55cSDimitry Andric void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override; 38349cc55cSDimitry Andric 39*04eeddc0SDimitry Andric StackOffset getFrameIndexReference(const MachineFunction &MF, int FI, 40*04eeddc0SDimitry Andric Register &FrameReg) const override; 41*04eeddc0SDimitry Andric 42*04eeddc0SDimitry Andric void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, 43*04eeddc0SDimitry Andric RegScavenger *RS) const override; 44*04eeddc0SDimitry Andric assignCalleeSavedSpillSlots(MachineFunction & MF,const TargetRegisterInfo * TRI,std::vector<CalleeSavedInfo> & CSI)45*04eeddc0SDimitry Andric bool assignCalleeSavedSpillSlots( 46*04eeddc0SDimitry Andric MachineFunction &MF, const TargetRegisterInfo *TRI, 47*04eeddc0SDimitry Andric std::vector<CalleeSavedInfo> &CSI) const override { 48*04eeddc0SDimitry Andric 49*04eeddc0SDimitry Andric std::reverse(CSI.begin(), CSI.end()); 50*04eeddc0SDimitry Andric 51*04eeddc0SDimitry Andric return false; 52*04eeddc0SDimitry Andric } 53*04eeddc0SDimitry Andric 54*04eeddc0SDimitry Andric bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, 55*04eeddc0SDimitry Andric MachineBasicBlock::iterator MI, 56*04eeddc0SDimitry Andric ArrayRef<CalleeSavedInfo> CSI, 57*04eeddc0SDimitry Andric const TargetRegisterInfo *TRI) const override; 58*04eeddc0SDimitry Andric bool 59*04eeddc0SDimitry Andric restoreCalleeSavedRegisters(MachineBasicBlock &MBB, 60*04eeddc0SDimitry Andric MachineBasicBlock::iterator MI, 61*04eeddc0SDimitry Andric MutableArrayRef<CalleeSavedInfo> CSI, 62*04eeddc0SDimitry Andric const TargetRegisterInfo *TRI) const override; 63*04eeddc0SDimitry Andric 64349cc55cSDimitry Andric bool hasFP(const MachineFunction &MF) const override; 65349cc55cSDimitry Andric bool hasBP(const MachineFunction &MF) const; 66*04eeddc0SDimitry Andric 67*04eeddc0SDimitry Andric bool hasReservedCallFrame(const MachineFunction &MF) const override; 68*04eeddc0SDimitry Andric 69*04eeddc0SDimitry Andric MachineBasicBlock::iterator 70*04eeddc0SDimitry Andric eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, 71*04eeddc0SDimitry Andric MachineBasicBlock::iterator MI) const override; 72349cc55cSDimitry Andric }; 73349cc55cSDimitry Andric } // namespace llvm 74349cc55cSDimitry Andric #endif 75