1251607Sdim//===-- SystemZFrameLowering.h - Frame lowering for SystemZ -----*- C++ -*-===//
2251607Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6251607Sdim//
7251607Sdim//===----------------------------------------------------------------------===//
8251607Sdim
9280031Sdim#ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZFRAMELOWERING_H
10280031Sdim#define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZFRAMELOWERING_H
11251607Sdim
12251607Sdim#include "llvm/ADT/IndexedMap.h"
13327952Sdim#include "llvm/CodeGen/TargetFrameLowering.h"
14251607Sdim
15251607Sdimnamespace llvm {
16251607Sdimclass SystemZTargetMachine;
17251607Sdimclass SystemZSubtarget;
18251607Sdim
19251607Sdimclass SystemZFrameLowering : public TargetFrameLowering {
20251607Sdim  IndexedMap<unsigned> RegSpillOffsets;
21251607Sdim
22251607Sdimpublic:
23276479Sdim  SystemZFrameLowering();
24251607Sdim
25261991Sdim  // Override TargetFrameLowering.
26276479Sdim  bool isFPCloseToIncomingSP() const override { return false; }
27360784Sdim  bool
28360784Sdim  assignCalleeSavedSpillSlots(MachineFunction &MF,
29360784Sdim                              const TargetRegisterInfo *TRI,
30360784Sdim                              std::vector<CalleeSavedInfo> &CSI) const override;
31288943Sdim  void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
32288943Sdim                            RegScavenger *RS) const override;
33276479Sdim  bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
34276479Sdim                                 MachineBasicBlock::iterator MBBI,
35276479Sdim                                 const std::vector<CalleeSavedInfo> &CSI,
36276479Sdim                                 const TargetRegisterInfo *TRI) const override;
37276479Sdim  bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
38276479Sdim                                   MachineBasicBlock::iterator MBBII,
39327952Sdim                                   std::vector<CalleeSavedInfo> &CSI,
40276479Sdim                                   const TargetRegisterInfo *TRI) const
41276479Sdim    override;
42276479Sdim  void processFunctionBeforeFrameFinalized(MachineFunction &MF,
43276479Sdim                                           RegScavenger *RS) const override;
44288943Sdim  void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
45276479Sdim  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
46276479Sdim  bool hasFP(const MachineFunction &MF) const override;
47276479Sdim  bool hasReservedCallFrame(const MachineFunction &MF) const override;
48360784Sdim  int getFrameIndexReference(const MachineFunction &MF, int FI,
49360784Sdim                             unsigned &FrameReg) const override;
50309124Sdim  MachineBasicBlock::iterator
51309124Sdim  eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
52309124Sdim                                MachineBasicBlock::iterator MI) const override;
53251607Sdim
54251607Sdim  // Return the byte offset from the incoming stack pointer of Reg's
55251607Sdim  // ABI-defined save slot.  Return 0 if no slot is defined for Reg.
56251607Sdim  unsigned getRegSpillOffset(unsigned Reg) const {
57251607Sdim    return RegSpillOffsets[Reg];
58251607Sdim  }
59360784Sdim
60360784Sdim  // Get or create the frame index of where the old frame pointer is stored.
61360784Sdim  int getOrCreateFramePointerSaveIndex(MachineFunction &MF) const;
62251607Sdim};
63251607Sdim} // end namespace llvm
64251607Sdim
65251607Sdim#endif
66