1dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//==-- AArch64FrameLowering.h - TargetFrameLowering for AArch64 --*- C++ -*-==//
272062f5744557e270a38192554c3126ea5f97434Tim Northover//
372062f5744557e270a38192554c3126ea5f97434Tim Northover//                     The LLVM Compiler Infrastructure
472062f5744557e270a38192554c3126ea5f97434Tim Northover//
572062f5744557e270a38192554c3126ea5f97434Tim Northover// This file is distributed under the University of Illinois Open Source
672062f5744557e270a38192554c3126ea5f97434Tim Northover// License. See LICENSE.TXT for details.
772062f5744557e270a38192554c3126ea5f97434Tim Northover//
872062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===//
972062f5744557e270a38192554c3126ea5f97434Tim Northover//
10dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//
1172062f5744557e270a38192554c3126ea5f97434Tim Northover//
1272062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===//
1372062f5744557e270a38192554c3126ea5f97434Tim Northover
14dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#ifndef AArch64_FRAMELOWERING_H
15dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define AArch64_FRAMELOWERING_H
1672062f5744557e270a38192554c3126ea5f97434Tim Northover
1772062f5744557e270a38192554c3126ea5f97434Tim Northover#include "llvm/Target/TargetFrameLowering.h"
1872062f5744557e270a38192554c3126ea5f97434Tim Northover
1972062f5744557e270a38192554c3126ea5f97434Tim Northovernamespace llvm {
20dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
2172062f5744557e270a38192554c3126ea5f97434Tim Northoverclass AArch64FrameLowering : public TargetFrameLowering {
2272062f5744557e270a38192554c3126ea5f97434Tim Northoverpublic:
23cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  explicit AArch64FrameLowering()
24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      : TargetFrameLowering(StackGrowsDown, 16, 0, 16,
25cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                            false /*StackRealignable*/) {}
2672062f5744557e270a38192554c3126ea5f97434Tim Northover
27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void emitCalleeSavedFrameMoves(MachineBasicBlock &MBB,
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 MachineBasicBlock::iterator MBBI,
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 unsigned FramePtr) const;
3072062f5744557e270a38192554c3126ea5f97434Tim Northover
31700ed80d3da5e98e05ceb90e9bfb66058581a6dbEli Bendersky  void eliminateCallFramePseudoInstr(MachineFunction &MF,
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                  MachineBasicBlock &MBB,
33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                  MachineBasicBlock::iterator I) const override;
3472062f5744557e270a38192554c3126ea5f97434Tim Northover
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// the function.
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void emitPrologue(MachineFunction &MF) const override;
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  int getFrameIndexOffset(const MachineFunction &MF, int FI) const override;
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  int getFrameIndexReference(const MachineFunction &MF, int FI,
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                             unsigned &FrameReg) const override;
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  int resolveFrameIndexReference(const MachineFunction &MF, int FI,
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 unsigned &FrameReg,
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 bool PreferFP = false) const;
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 MachineBasicBlock::iterator MI,
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 const std::vector<CalleeSavedInfo> &CSI,
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 const TargetRegisterInfo *TRI) const override;
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                  MachineBasicBlock::iterator MI,
53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                  const std::vector<CalleeSavedInfo> &CSI,
54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                  const TargetRegisterInfo *TRI) const override;
55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Can this function use the red zone for local allocations.
57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool canUseRedZone(const MachineFunction &MF) const;
58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool hasFP(const MachineFunction &MF) const override;
60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool hasReservedCallFrame(const MachineFunction &MF) const override;
61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                            RegScavenger *RS) const override;
6472062f5744557e270a38192554c3126ea5f97434Tim Northover};
6572062f5744557e270a38192554c3126ea5f97434Tim Northover
6672062f5744557e270a38192554c3126ea5f97434Tim Northover} // End llvm namespace
6772062f5744557e270a38192554c3126ea5f97434Tim Northover
6872062f5744557e270a38192554c3126ea5f97434Tim Northover#endif
69