AArch64FrameLowering.h revision 276479
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
14276479Sdim#ifndef AArch64_FRAMELOWERING_H
15276479Sdim#define AArch64_FRAMELOWERING_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,
25276479Sdim                            false /*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.
37276479Sdim  void emitPrologue(MachineFunction &MF) const override;
38276479Sdim  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
39249259Sdim
40276479Sdim  int getFrameIndexOffset(const MachineFunction &MF, int FI) const override;
41276479Sdim  int getFrameIndexReference(const MachineFunction &MF, int FI,
42276479Sdim                             unsigned &FrameReg) const override;
43276479Sdim  int resolveFrameIndexReference(const MachineFunction &MF, int FI,
44276479Sdim                                 unsigned &FrameReg,
45276479Sdim                                 bool PreferFP = false) const;
46276479Sdim  bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
47276479Sdim                                 MachineBasicBlock::iterator MI,
48276479Sdim                                 const std::vector<CalleeSavedInfo> &CSI,
49276479Sdim                                 const TargetRegisterInfo *TRI) const override;
50249259Sdim
51276479Sdim  bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
52276479Sdim                                  MachineBasicBlock::iterator MI,
53276479Sdim                                  const std::vector<CalleeSavedInfo> &CSI,
54276479Sdim                                  const TargetRegisterInfo *TRI) const override;
55249259Sdim
56276479Sdim  /// \brief Can this function use the red zone for local allocations.
57276479Sdim  bool canUseRedZone(const MachineFunction &MF) const;
58249259Sdim
59276479Sdim  bool hasFP(const MachineFunction &MF) const override;
60276479Sdim  bool hasReservedCallFrame(const MachineFunction &MF) const override;
61249259Sdim
62276479Sdim  void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
63276479Sdim                                            RegScavenger *RS) const override;
64249259Sdim};
65249259Sdim
66249259Sdim} // End llvm namespace
67249259Sdim
68249259Sdim#endif
69