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