1276479Sdim//==-- AArch64FrameLowering.h - TargetFrameLowering for AArch64 --*- C++ -*-==//
2249259Sdim//
3249259Sdim//                     The LLVM Compiler Infrastructure
4249259Sdim//
5249259Sdim// This file is distributed under the University of Illinois Open Source
6249259Sdim// License. See LICENSE.TXT for details.
7249259Sdim//
8249259Sdim//===----------------------------------------------------------------------===//
9249259Sdim//
10249259Sdim//
11276479Sdim//
12249259Sdim//===----------------------------------------------------------------------===//
13249259Sdim
14280031Sdim#ifndef LLVM_LIB_TARGET_AARCH64_AARCH64FRAMELOWERING_H
15280031Sdim#define LLVM_LIB_TARGET_AARCH64_AARCH64FRAMELOWERING_H
16249259Sdim
17249259Sdim#include "llvm/Target/TargetFrameLowering.h"
18249259Sdim
19249259Sdimnamespace llvm {
20249259Sdim
21249259Sdimclass AArch64FrameLowering : public TargetFrameLowering {
22276479Sdimpublic:
23276479Sdim  explicit AArch64FrameLowering()
24276479Sdim      : TargetFrameLowering(StackGrowsDown, 16, 0, 16,
25288943Sdim                            true /*StackRealignable*/) {}
26249259Sdim
27276479Sdim  void emitCalleeSavedFrameMoves(MachineBasicBlock &MBB,
28276479Sdim                                 MachineBasicBlock::iterator MBBI,
29276479Sdim                                 unsigned FramePtr) const;
30249259Sdim
31276479Sdim  void eliminateCallFramePseudoInstr(MachineFunction &MF,
32276479Sdim                                  MachineBasicBlock &MBB,
33276479Sdim                                  MachineBasicBlock::iterator I) const override;
34249259Sdim
35249259Sdim  /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
36249259Sdim  /// the function.
37288943Sdim  void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
38276479Sdim  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
39249259Sdim
40296417Sdim  bool canUseAsPrologue(const MachineBasicBlock &MBB) const override;
41296417Sdim
42276479Sdim  int getFrameIndexReference(const MachineFunction &MF, int FI,
43276479Sdim                             unsigned &FrameReg) const override;
44276479Sdim  int resolveFrameIndexReference(const MachineFunction &MF, int FI,
45276479Sdim                                 unsigned &FrameReg,
46276479Sdim                                 bool PreferFP = false) const;
47276479Sdim  bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
48276479Sdim                                 MachineBasicBlock::iterator MI,
49276479Sdim                                 const std::vector<CalleeSavedInfo> &CSI,
50276479Sdim                                 const TargetRegisterInfo *TRI) const override;
51249259Sdim
52276479Sdim  bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
53276479Sdim                                  MachineBasicBlock::iterator MI,
54276479Sdim                                  const std::vector<CalleeSavedInfo> &CSI,
55276479Sdim                                  const TargetRegisterInfo *TRI) const override;
56249259Sdim
57276479Sdim  /// \brief Can this function use the red zone for local allocations.
58276479Sdim  bool canUseRedZone(const MachineFunction &MF) const;
59249259Sdim
60276479Sdim  bool hasFP(const MachineFunction &MF) const override;
61276479Sdim  bool hasReservedCallFrame(const MachineFunction &MF) const override;
62249259Sdim
63288943Sdim  void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
64288943Sdim                            RegScavenger *RS) const override;
65296417Sdim
66296417Sdim  /// Returns true if the target will correctly handle shrink wrapping.
67296417Sdim  bool enableShrinkWrapping(const MachineFunction &MF) const override {
68296417Sdim    return true;
69296417Sdim  }
70249259Sdim};
71249259Sdim
72249259Sdim} // End llvm namespace
73249259Sdim
74249259Sdim#endif
75