116c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov//==-- ARMTargetFrameLowering.h - Define frame lowering for ARM --*- C++ -*-==// 2ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola// 3ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola// The LLVM Compiler Infrastructure 4ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 6ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola// License. See LICENSE.TXT for details. 7ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola// 8ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola//===----------------------------------------------------------------------===// 9ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola// 10ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola// 11ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola// 12ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola//===----------------------------------------------------------------------===// 13ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola 14ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola#ifndef ARM_FRAMEINFO_H 15ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola#define ARM_FRAMEINFO_H 16ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola 1716c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#include "llvm/Target/TargetFrameLowering.h" 18ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola 19ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindolanamespace llvm { 2033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov class ARMSubtarget; 21ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola 2216c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikovclass ARMFrameLowering : public TargetFrameLowering { 2333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikovprotected: 2433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov const ARMSubtarget &STI; 2533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov 26ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindolapublic: 27cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines explicit ARMFrameLowering(const ARMSubtarget &sti); 2833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov 2933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov /// emitProlog/emitEpilog - These methods insert prolog and epilog code into 3033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov /// the function. 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void emitPrologue(MachineFunction &MF) const override; 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override; 33d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov 34cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, 35cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov MachineBasicBlock::iterator MI, 36cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov const std::vector<CalleeSavedInfo> &CSI, 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const TargetRegisterInfo *TRI) const override; 38cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov 39cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineBasicBlock::iterator MI, 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const std::vector<CalleeSavedInfo> &CSI, 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const TargetRegisterInfo *TRI) const override; 43cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool hasFP(const MachineFunction &MF) const override; 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool hasReservedCallFrame(const MachineFunction &MF) const override; 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool canSimplifyCallFramePseudos(const MachineFunction &MF) const override; 4782f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov int getFrameIndexReference(const MachineFunction &MF, int FI, 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned &FrameReg) const override; 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int ResolveFrameIndexReference(const MachineFunction &MF, int FI, 5082f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov unsigned &FrameReg, int SPAdj) const; 5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int getFrameIndexOffset(const MachineFunction &MF, int FI) const override; 5282f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov 5394c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov void processFunctionBeforeCalleeSavedScan(MachineFunction &MF, 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegScavenger *RS) const override; 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void adjustForSegmentedStacks(MachineFunction &MF) const override; 5794c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov 58cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov private: 59cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov void emitPushInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, 60c6f9261711ac6666db5d99715531a41c1b1d98edJim Grosbach const std::vector<CalleeSavedInfo> &CSI, unsigned StmOpc, 61c6f9261711ac6666db5d99715531a41c1b1d98edJim Grosbach unsigned StrOpc, bool NoGap, 62f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen bool(*Func)(unsigned, bool), unsigned NumAlignedDPRCS2Regs, 6357caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov unsigned MIFlags = 0) const; 6406d65f515638dc996a4ecaf2a9692475aa4b46e3Evan Cheng void emitPopInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, 65c6f9261711ac6666db5d99715531a41c1b1d98edJim Grosbach const std::vector<CalleeSavedInfo> &CSI, unsigned LdmOpc, 66c6f9261711ac6666db5d99715531a41c1b1d98edJim Grosbach unsigned LdrOpc, bool isVarArg, bool NoGap, 67f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen bool(*Func)(unsigned, bool), 68f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen unsigned NumAlignedDPRCS2Regs) const; 69700ed80d3da5e98e05ceb90e9bfb66058581a6dbEli Bendersky 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void 7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines eliminateCallFramePseudoInstr(MachineFunction &MF, 7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineBasicBlock &MBB, 7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineBasicBlock::iterator MI) const override; 74ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola}; 75ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola 76ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola} // End llvm namespace 77ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola 78ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola#endif 79