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 17 namespace llvm { 18 class SystemZTargetMachine; 19 class SystemZSubtarget; 20 21 class SystemZFrameLowering : public TargetFrameLowering { 22 IndexedMap<unsigned> RegSpillOffsets; 23 24 protected: 25 const SystemZTargetMachine &TM; 26 const SystemZSubtarget &STI; 27 28 public: 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