SystemZFrameLowering.h revision 280031
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
10280031Sdim#ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZFRAMELOWERING_H
11280031Sdim#define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZFRAMELOWERING_H
12251607Sdim
13251607Sdim#include "llvm/ADT/IndexedMap.h"
14251607Sdim#include "llvm/Target/TargetFrameLowering.h"
15251607Sdim
16251607Sdimnamespace llvm {
17251607Sdimclass SystemZTargetMachine;
18251607Sdimclass SystemZSubtarget;
19251607Sdim
20251607Sdimclass SystemZFrameLowering : public TargetFrameLowering {
21251607Sdim  IndexedMap<unsigned> RegSpillOffsets;
22251607Sdim
23251607Sdimpublic:
24276479Sdim  SystemZFrameLowering();
25251607Sdim
26261991Sdim  // Override TargetFrameLowering.
27276479Sdim  bool isFPCloseToIncomingSP() const override { return false; }
28276479Sdim  const SpillSlot *getCalleeSavedSpillSlots(unsigned &NumEntries) const
29276479Sdim    override;
30276479Sdim  void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
31276479Sdim                                            RegScavenger *RS) const override;
32276479Sdim  bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
33276479Sdim                                 MachineBasicBlock::iterator MBBI,
34276479Sdim                                 const std::vector<CalleeSavedInfo> &CSI,
35276479Sdim                                 const TargetRegisterInfo *TRI) const override;
36276479Sdim  bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
37276479Sdim                                   MachineBasicBlock::iterator MBBII,
38276479Sdim                                   const std::vector<CalleeSavedInfo> &CSI,
39276479Sdim                                   const TargetRegisterInfo *TRI) const
40276479Sdim    override;
41276479Sdim  void processFunctionBeforeFrameFinalized(MachineFunction &MF,
42276479Sdim                                           RegScavenger *RS) const override;
43276479Sdim  void emitPrologue(MachineFunction &MF) const override;
44276479Sdim  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
45276479Sdim  bool hasFP(const MachineFunction &MF) const override;
46276479Sdim  int getFrameIndexOffset(const MachineFunction &MF, int FI) const override;
47276479Sdim  bool hasReservedCallFrame(const MachineFunction &MF) const override;
48276479Sdim  void eliminateCallFramePseudoInstr(MachineFunction &MF,
49276479Sdim                                     MachineBasicBlock &MBB,
50276479Sdim                                     MachineBasicBlock::iterator MI) const
51276479Sdim    override;
52251607Sdim
53251607Sdim  // Return the number of bytes in the callee-allocated part of the frame.
54251607Sdim  uint64_t getAllocatedStackSize(const MachineFunction &MF) const;
55251607Sdim
56251607Sdim  // Return the byte offset from the incoming stack pointer of Reg's
57251607Sdim  // ABI-defined save slot.  Return 0 if no slot is defined for Reg.
58251607Sdim  unsigned getRegSpillOffset(unsigned Reg) const {
59251607Sdim    return RegSpillOffsets[Reg];
60251607Sdim  }
61251607Sdim};
62251607Sdim} // end namespace llvm
63251607Sdim
64251607Sdim#endif
65