ARMFrameLowering.h revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
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 17a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "ARMSubtarget.h" 1816c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#include "llvm/Target/TargetFrameLowering.h" 19ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola 20ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindolanamespace llvm { 2133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov class ARMSubtarget; 22ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola 2316c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikovclass ARMFrameLowering : public TargetFrameLowering { 2433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikovprotected: 2533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov const ARMSubtarget &STI; 2633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov 27ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindolapublic: 2816c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov explicit ARMFrameLowering(const ARMSubtarget &sti) 2916c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov : TargetFrameLowering(StackGrowsDown, sti.getStackAlignment(), 0, 4), 3016c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov STI(sti) { 31ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola } 3233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov 3333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov /// emitProlog/emitEpilog - These methods insert prolog and epilog code into 3433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov /// the function. 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void emitPrologue(MachineFunction &MF) const override; 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override; 37d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov 38cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, 39cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov MachineBasicBlock::iterator MI, 40cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov const std::vector<CalleeSavedInfo> &CSI, 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const TargetRegisterInfo *TRI) const override; 42cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov 43cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineBasicBlock::iterator MI, 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const std::vector<CalleeSavedInfo> &CSI, 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const TargetRegisterInfo *TRI) const override; 47cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool hasFP(const MachineFunction &MF) const override; 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool hasReservedCallFrame(const MachineFunction &MF) const override; 5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool canSimplifyCallFramePseudos(const MachineFunction &MF) const override; 5182f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov int getFrameIndexReference(const MachineFunction &MF, int FI, 5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned &FrameReg) const override; 5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int ResolveFrameIndexReference(const MachineFunction &MF, int FI, 5482f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov unsigned &FrameReg, int SPAdj) const; 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int getFrameIndexOffset(const MachineFunction &MF, int FI) const override; 5682f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov 5794c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov void processFunctionBeforeCalleeSavedScan(MachineFunction &MF, 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegScavenger *RS) const override; 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void adjustForSegmentedStacks(MachineFunction &MF) const override; 6194c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov 62cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov private: 63cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov void emitPushInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, 64c6f9261711ac6666db5d99715531a41c1b1d98edJim Grosbach const std::vector<CalleeSavedInfo> &CSI, unsigned StmOpc, 65c6f9261711ac6666db5d99715531a41c1b1d98edJim Grosbach unsigned StrOpc, bool NoGap, 66f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen bool(*Func)(unsigned, bool), unsigned NumAlignedDPRCS2Regs, 6757caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov unsigned MIFlags = 0) const; 6806d65f515638dc996a4ecaf2a9692475aa4b46e3Evan Cheng void emitPopInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, 69c6f9261711ac6666db5d99715531a41c1b1d98edJim Grosbach const std::vector<CalleeSavedInfo> &CSI, unsigned LdmOpc, 70c6f9261711ac6666db5d99715531a41c1b1d98edJim Grosbach unsigned LdrOpc, bool isVarArg, bool NoGap, 71f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen bool(*Func)(unsigned, bool), 72f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen unsigned NumAlignedDPRCS2Regs) const; 73700ed80d3da5e98e05ceb90e9bfb66058581a6dbEli Bendersky 7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void 7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines eliminateCallFramePseudoInstr(MachineFunction &MF, 7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineBasicBlock &MBB, 7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineBasicBlock::iterator MI) const override; 78ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola}; 79ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola 80ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola} // End llvm namespace 81ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola 82ec46ea34dcc615558294e9e0dbd0dd0f2894f574Rafael Espindola#endif 83