[SystemZ] Clean up register scavenging code
[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 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