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