1251607Sdim//===-- SystemZFrameLowering.h - Frame lowering for SystemZ -----*- C++ -*-===// 2251607Sdim// 3251607Sdim// The LLVM Compiler Infrastructure 4251607Sdim// 5251607Sdim// This file is distributed under the University of Illinois Open Source 6251607Sdim// License. See LICENSE.TXT for details. 7251607Sdim// 8251607Sdim//===----------------------------------------------------------------------===// 9251607Sdim 10251607Sdim#ifndef SYSTEMZFRAMELOWERING_H 11251607Sdim#define SYSTEMZFRAMELOWERING_H 12251607Sdim 13251607Sdim#include "SystemZSubtarget.h" 14251607Sdim#include "llvm/ADT/IndexedMap.h" 15251607Sdim#include "llvm/Target/TargetFrameLowering.h" 16251607Sdim 17251607Sdimnamespace llvm { 18251607Sdimclass SystemZTargetMachine; 19251607Sdimclass SystemZSubtarget; 20251607Sdim 21251607Sdimclass SystemZFrameLowering : public TargetFrameLowering { 22251607Sdim IndexedMap<unsigned> RegSpillOffsets; 23251607Sdim 24251607Sdimprotected: 25251607Sdim const SystemZTargetMachine &TM; 26251607Sdim const SystemZSubtarget &STI; 27251607Sdim 28251607Sdimpublic: 29251607Sdim SystemZFrameLowering(const SystemZTargetMachine &tm, 30251607Sdim const SystemZSubtarget &sti); 31251607Sdim 32263509Sdim // Override TargetFrameLowering. 33263509Sdim virtual bool isFPCloseToIncomingSP() const LLVM_OVERRIDE { return false; } 34263509Sdim virtual const SpillSlot *getCalleeSavedSpillSlots(unsigned &NumEntries) const 35263509Sdim LLVM_OVERRIDE; 36251607Sdim virtual void 37251607Sdim processFunctionBeforeCalleeSavedScan(MachineFunction &MF, 38251607Sdim RegScavenger *RS) const LLVM_OVERRIDE; 39251607Sdim virtual bool 40251607Sdim spillCalleeSavedRegisters(MachineBasicBlock &MBB, 41251607Sdim MachineBasicBlock::iterator MBBI, 42251607Sdim const std::vector<CalleeSavedInfo> &CSI, 43251607Sdim const TargetRegisterInfo *TRI) const 44251607Sdim LLVM_OVERRIDE; 45251607Sdim virtual bool 46251607Sdim restoreCalleeSavedRegisters(MachineBasicBlock &MBB, 47251607Sdim MachineBasicBlock::iterator MBBII, 48251607Sdim const std::vector<CalleeSavedInfo> &CSI, 49251607Sdim const TargetRegisterInfo *TRI) const 50251607Sdim LLVM_OVERRIDE; 51263509Sdim virtual void processFunctionBeforeFrameFinalized(MachineFunction &MF, 52263509Sdim RegScavenger *RS) const; 53251607Sdim virtual void emitPrologue(MachineFunction &MF) const LLVM_OVERRIDE; 54251607Sdim virtual void emitEpilogue(MachineFunction &MF, 55251607Sdim MachineBasicBlock &MBB) const LLVM_OVERRIDE; 56251607Sdim virtual bool hasFP(const MachineFunction &MF) const LLVM_OVERRIDE; 57251607Sdim virtual int getFrameIndexOffset(const MachineFunction &MF, 58251607Sdim int FI) const LLVM_OVERRIDE; 59251607Sdim virtual bool hasReservedCallFrame(const MachineFunction &MF) const 60251607Sdim LLVM_OVERRIDE; 61251607Sdim virtual void 62251607Sdim eliminateCallFramePseudoInstr(MachineFunction &MF, 63251607Sdim MachineBasicBlock &MBB, 64251607Sdim MachineBasicBlock::iterator MI) const 65251607Sdim LLVM_OVERRIDE; 66251607Sdim 67251607Sdim // Return the number of bytes in the callee-allocated part of the frame. 68251607Sdim uint64_t getAllocatedStackSize(const MachineFunction &MF) const; 69251607Sdim 70251607Sdim // Return the byte offset from the incoming stack pointer of Reg's 71251607Sdim // ABI-defined save slot. Return 0 if no slot is defined for Reg. 72251607Sdim unsigned getRegSpillOffset(unsigned Reg) const { 73251607Sdim return RegSpillOffsets[Reg]; 74251607Sdim } 75251607Sdim}; 76251607Sdim} // end namespace llvm 77251607Sdim 78251607Sdim#endif 79