1//==-- AArch64FrameLowering.h - TargetFrameLowering for AArch64 --*- 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
14#ifndef LLVM_LIB_TARGET_AARCH64_AARCH64FRAMELOWERING_H
15#define LLVM_LIB_TARGET_AARCH64_AARCH64FRAMELOWERING_H
16
17#include "llvm/Target/TargetFrameLowering.h"
18
19namespace llvm {
20
21class AArch64FrameLowering : public TargetFrameLowering {
22public:
23  explicit AArch64FrameLowering()
24      : TargetFrameLowering(StackGrowsDown, 16, 0, 16,
25                            true /*StackRealignable*/) {}
26
27  void emitCalleeSavedFrameMoves(MachineBasicBlock &MBB,
28                                 MachineBasicBlock::iterator MBBI,
29                                 unsigned FramePtr) const;
30
31  void eliminateCallFramePseudoInstr(MachineFunction &MF,
32                                  MachineBasicBlock &MBB,
33                                  MachineBasicBlock::iterator I) const override;
34
35  /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
36  /// the function.
37  void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
38  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
39
40  bool canUseAsPrologue(const MachineBasicBlock &MBB) const override;
41
42  int getFrameIndexReference(const MachineFunction &MF, int FI,
43                             unsigned &FrameReg) const override;
44  int resolveFrameIndexReference(const MachineFunction &MF, int FI,
45                                 unsigned &FrameReg,
46                                 bool PreferFP = false) const;
47  bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
48                                 MachineBasicBlock::iterator MI,
49                                 const std::vector<CalleeSavedInfo> &CSI,
50                                 const TargetRegisterInfo *TRI) const override;
51
52  bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
53                                  MachineBasicBlock::iterator MI,
54                                  const std::vector<CalleeSavedInfo> &CSI,
55                                  const TargetRegisterInfo *TRI) const override;
56
57  /// \brief Can this function use the red zone for local allocations.
58  bool canUseRedZone(const MachineFunction &MF) const;
59
60  bool hasFP(const MachineFunction &MF) const override;
61  bool hasReservedCallFrame(const MachineFunction &MF) const override;
62
63  void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
64                            RegScavenger *RS) const override;
65
66  /// Returns true if the target will correctly handle shrink wrapping.
67  bool enableShrinkWrapping(const MachineFunction &MF) const override {
68    return true;
69  }
70};
71
72} // End llvm namespace
73
74#endif
75