Home | History | Annotate | Download | only in SystemZ
      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 "llvm/ADT/IndexedMap.h"
     14 #include "llvm/Target/TargetFrameLowering.h"
     15 
     16 namespace llvm {
     17 class SystemZTargetMachine;
     18 class SystemZSubtarget;
     19 
     20 class SystemZFrameLowering : public TargetFrameLowering {
     21   IndexedMap<unsigned> RegSpillOffsets;
     22 
     23 public:
     24   SystemZFrameLowering();
     25 
     26   // Override TargetFrameLowering.
     27   bool isFPCloseToIncomingSP() const override { return false; }
     28   const SpillSlot *getCalleeSavedSpillSlots(unsigned &NumEntries) const
     29     override;
     30   void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
     31                                             RegScavenger *RS) const override;
     32   bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
     33                                  MachineBasicBlock::iterator MBBI,
     34                                  const std::vector<CalleeSavedInfo> &CSI,
     35                                  const TargetRegisterInfo *TRI) const override;
     36   bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
     37                                    MachineBasicBlock::iterator MBBII,
     38                                    const std::vector<CalleeSavedInfo> &CSI,
     39                                    const TargetRegisterInfo *TRI) const
     40     override;
     41   void processFunctionBeforeFrameFinalized(MachineFunction &MF,
     42                                            RegScavenger *RS) const override;
     43   void emitPrologue(MachineFunction &MF) const override;
     44   void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
     45   bool hasFP(const MachineFunction &MF) const override;
     46   int getFrameIndexOffset(const MachineFunction &MF, int FI) const override;
     47   bool hasReservedCallFrame(const MachineFunction &MF) const override;
     48   void eliminateCallFramePseudoInstr(MachineFunction &MF,
     49                                      MachineBasicBlock &MBB,
     50                                      MachineBasicBlock::iterator MI) const
     51     override;
     52 
     53   // Return the number of bytes in the callee-allocated part of the frame.
     54   uint64_t getAllocatedStackSize(const MachineFunction &MF) const;
     55 
     56   // Return the byte offset from the incoming stack pointer of Reg's
     57   // ABI-defined save slot.  Return 0 if no slot is defined for Reg.
     58   unsigned getRegSpillOffset(unsigned Reg) const {
     59     return RegSpillOffsets[Reg];
     60   }
     61 };
     62 } // end namespace llvm
     63 
     64 #endif
     65