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