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