PPCFrameLowering.h revision 6948897e478cbd66626159776a8017b3c18579b9
1//===-- PPCFrameLowering.h - Define frame lowering for PowerPC --*- 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//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_POWERPC_PPCFRAMELOWERING_H
14#define LLVM_LIB_TARGET_POWERPC_PPCFRAMELOWERING_H
15
16#include "PPC.h"
17#include "llvm/ADT/STLExtras.h"
18#include "llvm/Target/TargetFrameLowering.h"
19#include "llvm/Target/TargetMachine.h"
20
21namespace llvm {
22class PPCSubtarget;
23
24class PPCFrameLowering: public TargetFrameLowering {
25  const PPCSubtarget &Subtarget;
26  const unsigned ReturnSaveOffset;
27  const unsigned TOCSaveOffset;
28  const unsigned FramePointerSaveOffset;
29  const unsigned LinkageSize;
30  const unsigned BasePointerSaveOffset;
31
32public:
33  PPCFrameLowering(const PPCSubtarget &STI);
34
35  unsigned determineFrameLayout(MachineFunction &MF,
36                                bool UpdateMF = true,
37                                bool UseEstimate = false) const;
38
39  /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
40  /// the function.
41  void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
42  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
43
44  bool hasFP(const MachineFunction &MF) const override;
45  bool needsFP(const MachineFunction &MF) const;
46  void replaceFPWithRealFP(MachineFunction &MF) const;
47
48  void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
49                                     RegScavenger *RS = nullptr) const override;
50  void processFunctionBeforeFrameFinalized(MachineFunction &MF,
51                                     RegScavenger *RS = nullptr) const override;
52  void addScavengingSpillSlot(MachineFunction &MF, RegScavenger *RS) const;
53
54  bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
55                                 MachineBasicBlock::iterator MI,
56                                 const std::vector<CalleeSavedInfo> &CSI,
57                                 const TargetRegisterInfo *TRI) const override;
58
59  void eliminateCallFramePseudoInstr(MachineFunction &MF,
60                                  MachineBasicBlock &MBB,
61                                  MachineBasicBlock::iterator I) const override;
62
63  bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
64                                  MachineBasicBlock::iterator MI,
65                                  const std::vector<CalleeSavedInfo> &CSI,
66                                  const TargetRegisterInfo *TRI) const override;
67
68  /// targetHandlesStackFrameRounding - Returns true if the target is
69  /// responsible for rounding up the stack frame (probably at emitPrologue
70  /// time).
71  bool targetHandlesStackFrameRounding() const override { return true; }
72
73  /// getReturnSaveOffset - Return the previous frame offset to save the
74  /// return address.
75  unsigned getReturnSaveOffset() const { return ReturnSaveOffset; }
76
77  /// getTOCSaveOffset - Return the previous frame offset to save the
78  /// TOC register -- 64-bit SVR4 ABI only.
79  unsigned getTOCSaveOffset() const { return TOCSaveOffset; }
80
81  /// getFramePointerSaveOffset - Return the previous frame offset to save the
82  /// frame pointer.
83  unsigned getFramePointerSaveOffset() const { return FramePointerSaveOffset; }
84
85  /// getBasePointerSaveOffset - Return the previous frame offset to save the
86  /// base pointer.
87  unsigned getBasePointerSaveOffset() const { return BasePointerSaveOffset; }
88
89  /// getLinkageSize - Return the size of the PowerPC ABI linkage area.
90  ///
91  unsigned getLinkageSize() const { return LinkageSize; }
92
93  const SpillSlot *
94  getCalleeSavedSpillSlots(unsigned &NumEntries) const override;
95};
96} // End llvm namespace
97
98#endif
99