1//===-- SystemZFrameLowering.h - Frame lowering for SystemZ -----*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef SYSTEMZFRAMELOWERING_H 11#define SYSTEMZFRAMELOWERING_H 12 13#include "SystemZSubtarget.h" 14#include "llvm/ADT/IndexedMap.h" 15#include "llvm/Target/TargetFrameLowering.h" 16 17namespace llvm { 18class SystemZTargetMachine; 19class SystemZSubtarget; 20 21class SystemZFrameLowering : public TargetFrameLowering { 22 IndexedMap<unsigned> RegSpillOffsets; 23 24protected: 25 const SystemZTargetMachine &TM; 26 const SystemZSubtarget &STI; 27 28public: 29 SystemZFrameLowering(const SystemZTargetMachine &tm, 30 const SystemZSubtarget &sti); 31 32 // Override TargetFrameLowering. 33 virtual bool isFPCloseToIncomingSP() const LLVM_OVERRIDE { return false; } 34 virtual const SpillSlot *getCalleeSavedSpillSlots(unsigned &NumEntries) const 35 LLVM_OVERRIDE; 36 virtual void 37 processFunctionBeforeCalleeSavedScan(MachineFunction &MF, 38 RegScavenger *RS) const LLVM_OVERRIDE; 39 virtual bool 40 spillCalleeSavedRegisters(MachineBasicBlock &MBB, 41 MachineBasicBlock::iterator MBBI, 42 const std::vector<CalleeSavedInfo> &CSI, 43 const TargetRegisterInfo *TRI) const 44 LLVM_OVERRIDE; 45 virtual bool 46 restoreCalleeSavedRegisters(MachineBasicBlock &MBB, 47 MachineBasicBlock::iterator MBBII, 48 const std::vector<CalleeSavedInfo> &CSI, 49 const TargetRegisterInfo *TRI) const 50 LLVM_OVERRIDE; 51 virtual void processFunctionBeforeFrameFinalized(MachineFunction &MF, 52 RegScavenger *RS) const; 53 virtual void emitPrologue(MachineFunction &MF) const LLVM_OVERRIDE; 54 virtual void emitEpilogue(MachineFunction &MF, 55 MachineBasicBlock &MBB) const LLVM_OVERRIDE; 56 virtual bool hasFP(const MachineFunction &MF) const LLVM_OVERRIDE; 57 virtual int getFrameIndexOffset(const MachineFunction &MF, 58 int FI) const LLVM_OVERRIDE; 59 virtual bool hasReservedCallFrame(const MachineFunction &MF) const 60 LLVM_OVERRIDE; 61 virtual void 62 eliminateCallFramePseudoInstr(MachineFunction &MF, 63 MachineBasicBlock &MBB, 64 MachineBasicBlock::iterator MI) const 65 LLVM_OVERRIDE; 66 67 // Return the number of bytes in the callee-allocated part of the frame. 68 uint64_t getAllocatedStackSize(const MachineFunction &MF) const; 69 70 // Return the byte offset from the incoming stack pointer of Reg's 71 // ABI-defined save slot. Return 0 if no slot is defined for Reg. 72 unsigned getRegSpillOffset(unsigned Reg) const { 73 return RegSpillOffsets[Reg]; 74 } 75}; 76} // end namespace llvm 77 78#endif 79