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