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