1 //===- ARMTargetFrameLowering.h - Define frame lowering for ARM -*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_LIB_TARGET_ARM_ARMFRAMELOWERING_H
11 #define LLVM_LIB_TARGET_ARM_ARMFRAMELOWERING_H
13 #include "llvm/CodeGen/MachineBasicBlock.h"
14 #include "llvm/CodeGen/TargetFrameLowering.h"
20 class CalleeSavedInfo;
21 class MachineFunction;
23 class ARMFrameLowering : public TargetFrameLowering {
25 const ARMSubtarget &STI;
28 explicit ARMFrameLowering(const ARMSubtarget &sti);
30 /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
32 void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
33 void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
35 bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
36 MachineBasicBlock::iterator MI,
37 const std::vector<CalleeSavedInfo> &CSI,
38 const TargetRegisterInfo *TRI) const override;
40 bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
41 MachineBasicBlock::iterator MI,
42 std::vector<CalleeSavedInfo> &CSI,
43 const TargetRegisterInfo *TRI) const override;
45 bool noFramePointerElim(const MachineFunction &MF) const override;
47 bool hasFP(const MachineFunction &MF) const override;
48 bool hasReservedCallFrame(const MachineFunction &MF) const override;
49 bool canSimplifyCallFramePseudos(const MachineFunction &MF) const override;
50 int getFrameIndexReference(const MachineFunction &MF, int FI,
51 unsigned &FrameReg) const override;
52 int ResolveFrameIndexReference(const MachineFunction &MF, int FI,
53 unsigned &FrameReg, int SPAdj) const;
55 void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
56 RegScavenger *RS) const override;
58 void adjustForSegmentedStacks(MachineFunction &MF,
59 MachineBasicBlock &MBB) const override;
61 /// Returns true if the target will correctly handle shrink wrapping.
62 bool enableShrinkWrapping(const MachineFunction &MF) const override {
67 void emitPushInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
68 const std::vector<CalleeSavedInfo> &CSI, unsigned StmOpc,
69 unsigned StrOpc, bool NoGap,
70 bool(*Func)(unsigned, bool), unsigned NumAlignedDPRCS2Regs,
71 unsigned MIFlags = 0) const;
72 void emitPopInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
73 std::vector<CalleeSavedInfo> &CSI, unsigned LdmOpc,
74 unsigned LdrOpc, bool isVarArg, bool NoGap,
75 bool(*Func)(unsigned, bool),
76 unsigned NumAlignedDPRCS2Regs) const;
78 MachineBasicBlock::iterator
79 eliminateCallFramePseudoInstr(MachineFunction &MF,
80 MachineBasicBlock &MBB,
81 MachineBasicBlock::iterator MI) const override;
84 } // end namespace llvm
86 #endif // LLVM_LIB_TARGET_ARM_ARMFRAMELOWERING_H