1dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//==-- AArch64FrameLowering.h - TargetFrameLowering for AArch64 --*- C++ -*-==// 272062f5744557e270a38192554c3126ea5f97434Tim Northover// 372062f5744557e270a38192554c3126ea5f97434Tim Northover// The LLVM Compiler Infrastructure 472062f5744557e270a38192554c3126ea5f97434Tim Northover// 572062f5744557e270a38192554c3126ea5f97434Tim Northover// This file is distributed under the University of Illinois Open Source 672062f5744557e270a38192554c3126ea5f97434Tim Northover// License. See LICENSE.TXT for details. 772062f5744557e270a38192554c3126ea5f97434Tim Northover// 872062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===// 972062f5744557e270a38192554c3126ea5f97434Tim Northover// 10dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// 1172062f5744557e270a38192554c3126ea5f97434Tim Northover// 1272062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===// 1372062f5744557e270a38192554c3126ea5f97434Tim Northover 14dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#ifndef AArch64_FRAMELOWERING_H 15dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define AArch64_FRAMELOWERING_H 1672062f5744557e270a38192554c3126ea5f97434Tim Northover 1772062f5744557e270a38192554c3126ea5f97434Tim Northover#include "llvm/Target/TargetFrameLowering.h" 1872062f5744557e270a38192554c3126ea5f97434Tim Northover 1972062f5744557e270a38192554c3126ea5f97434Tim Northovernamespace llvm { 20dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2172062f5744557e270a38192554c3126ea5f97434Tim Northoverclass AArch64FrameLowering : public TargetFrameLowering { 2272062f5744557e270a38192554c3126ea5f97434Tim Northoverpublic: 23cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines explicit AArch64FrameLowering() 24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : TargetFrameLowering(StackGrowsDown, 16, 0, 16, 25cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines false /*StackRealignable*/) {} 2672062f5744557e270a38192554c3126ea5f97434Tim Northover 27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void emitCalleeSavedFrameMoves(MachineBasicBlock &MBB, 28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MachineBasicBlock::iterator MBBI, 29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned FramePtr) const; 3072062f5744557e270a38192554c3126ea5f97434Tim Northover 31700ed80d3da5e98e05ceb90e9bfb66058581a6dbEli Bendersky void eliminateCallFramePseudoInstr(MachineFunction &MF, 32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MachineBasicBlock &MBB, 33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MachineBasicBlock::iterator I) const override; 3472062f5744557e270a38192554c3126ea5f97434Tim Northover 35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// emitProlog/emitEpilog - These methods insert prolog and epilog code into 36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// the function. 37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void emitPrologue(MachineFunction &MF) const override; 38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override; 39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines int getFrameIndexOffset(const MachineFunction &MF, int FI) const override; 41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines int getFrameIndexReference(const MachineFunction &MF, int FI, 42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned &FrameReg) const override; 43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines int resolveFrameIndexReference(const MachineFunction &MF, int FI, 44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned &FrameReg, 45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool PreferFP = false) const; 46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, 47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MachineBasicBlock::iterator MI, 48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const std::vector<CalleeSavedInfo> &CSI, 49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const TargetRegisterInfo *TRI) const override; 50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, 52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MachineBasicBlock::iterator MI, 53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const std::vector<CalleeSavedInfo> &CSI, 54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const TargetRegisterInfo *TRI) const override; 55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \brief Can this function use the red zone for local allocations. 57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool canUseRedZone(const MachineFunction &MF) const; 58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool hasFP(const MachineFunction &MF) const override; 60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool hasReservedCallFrame(const MachineFunction &MF) const override; 61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void processFunctionBeforeCalleeSavedScan(MachineFunction &MF, 63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RegScavenger *RS) const override; 6472062f5744557e270a38192554c3126ea5f97434Tim Northover}; 6572062f5744557e270a38192554c3126ea5f97434Tim Northover 6672062f5744557e270a38192554c3126ea5f97434Tim Northover} // End llvm namespace 6772062f5744557e270a38192554c3126ea5f97434Tim Northover 6872062f5744557e270a38192554c3126ea5f97434Tim Northover#endif 69