xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYFrameLowering.h (revision 04eeddc0aa8e0a417a16eaf9d7d095207f4a8623)
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