[SystemZ] Fix caller-allocated save slot FIXME
[oota-llvm.git] / lib / Target / SystemZ / SystemZFrameLowering.h
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 const SpillSlot *getCalleeSavedSpillSlots(unsigned &NumEntries) const
34     LLVM_OVERRIDE;
35   virtual void
36     processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
37                                          RegScavenger *RS) const LLVM_OVERRIDE;
38   virtual bool
39     spillCalleeSavedRegisters(MachineBasicBlock &MBB,
40                               MachineBasicBlock::iterator MBBI,
41                               const std::vector<CalleeSavedInfo> &CSI,
42                               const TargetRegisterInfo *TRI) const
43     LLVM_OVERRIDE;
44   virtual bool
45     restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
46                                 MachineBasicBlock::iterator MBBII,
47                                 const std::vector<CalleeSavedInfo> &CSI,
48                                 const TargetRegisterInfo *TRI) const
49     LLVM_OVERRIDE;
50   virtual void emitPrologue(MachineFunction &MF) const LLVM_OVERRIDE;
51   virtual void emitEpilogue(MachineFunction &MF,
52                             MachineBasicBlock &MBB) const LLVM_OVERRIDE;
53   virtual bool hasFP(const MachineFunction &MF) const LLVM_OVERRIDE;
54   virtual int getFrameIndexOffset(const MachineFunction &MF,
55                                   int FI) const LLVM_OVERRIDE;
56   virtual bool hasReservedCallFrame(const MachineFunction &MF) const
57     LLVM_OVERRIDE;
58   virtual void
59   eliminateCallFramePseudoInstr(MachineFunction &MF,
60                                 MachineBasicBlock &MBB,
61                                 MachineBasicBlock::iterator MI) const
62     LLVM_OVERRIDE;
63
64   // Return the number of bytes in the callee-allocated part of the frame.
65   uint64_t getAllocatedStackSize(const MachineFunction &MF) const;
66
67   // Return the number of frame bytes that should be reserved for
68   // an emergency spill slot, for use by the register scaveneger.
69   // Return 0 if register scaveging won't be needed.
70   unsigned getEmergencySpillSlotSize(const MachineFunction &MF) const;
71
72   // Return the offset from the frame pointer of the emergency spill slot,
73   // which always fits within a 12-bit unsigned displacement field.
74   // Only valid if getEmergencySpillSlotSize(MF) returns nonzero.
75   unsigned getEmergencySpillSlotOffset(const MachineFunction &MF) const;
76
77   // Return the byte offset from the incoming stack pointer of Reg's
78   // ABI-defined save slot.  Return 0 if no slot is defined for Reg.
79   unsigned getRegSpillOffset(unsigned Reg) const {
80     return RegSpillOffsets[Reg];
81   }
82 };
83 } // end namespace llvm
84
85 #endif