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 keepFramePointer(const MachineFunction &MF) const override;
47 bool enableCalleeSaveSkip(const MachineFunction &MF) const override;
49 bool hasFP(const MachineFunction &MF) const override;
50 bool hasReservedCallFrame(const MachineFunction &MF) const override;
51 bool canSimplifyCallFramePseudos(const MachineFunction &MF) const override;
52 int getFrameIndexReference(const MachineFunction &MF, int FI,
53 unsigned &FrameReg) const override;
54 int ResolveFrameIndexReference(const MachineFunction &MF, int FI,
55 unsigned &FrameReg, int SPAdj) const;
57 void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
58 RegScavenger *RS) const override;
60 void adjustForSegmentedStacks(MachineFunction &MF,
61 MachineBasicBlock &MBB) const override;
63 /// Returns true if the target will correctly handle shrink wrapping.
64 bool enableShrinkWrapping(const MachineFunction &MF) const override {
69 void emitPushInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
70 const std::vector<CalleeSavedInfo> &CSI, unsigned StmOpc,
71 unsigned StrOpc, bool NoGap,
72 bool(*Func)(unsigned, bool), unsigned NumAlignedDPRCS2Regs,
73 unsigned MIFlags = 0) const;
74 void emitPopInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
75 std::vector<CalleeSavedInfo> &CSI, unsigned LdmOpc,
76 unsigned LdrOpc, bool isVarArg, bool NoGap,
77 bool(*Func)(unsigned, bool),
78 unsigned NumAlignedDPRCS2Regs) const;
80 MachineBasicBlock::iterator
81 eliminateCallFramePseudoInstr(MachineFunction &MF,
82 MachineBasicBlock &MBB,
83 MachineBasicBlock::iterator MI) const override;
86 } // end namespace llvm
88 #endif // LLVM_LIB_TARGET_ARM_ARMFRAMELOWERING_H