LLVM 23.0.0git
ARMFrameLowering.h
Go to the documentation of this file.
1//===- ARMTargetFrameLowering.h - Define frame lowering for ARM -*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_LIB_TARGET_ARM_ARMFRAMELOWERING_H
10#define LLVM_LIB_TARGET_ARM_ARMFRAMELOWERING_H
11
14
15namespace llvm {
16
17class ARMSubtarget;
18class CalleeSavedInfo;
19class MachineFunction;
20
22protected:
24
25public:
26 explicit ARMFrameLowering(const ARMSubtarget &sti);
27
28 /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
29 /// the function.
30 void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
31 void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
32
36 const TargetRegisterInfo *TRI) const override;
37
38 bool
42 const TargetRegisterInfo *TRI) const override;
43
44 bool keepFramePointer(const MachineFunction &MF) const;
45
46 bool enableCalleeSaveSkip(const MachineFunction &MF) const override;
47
48 bool isFPReserved(const MachineFunction &MF) const;
49 bool requiresAAPCSFrameRecord(const MachineFunction &MF) const;
50 bool hasReservedCallFrame(const MachineFunction &MF) const override;
51 bool canSimplifyCallFramePseudos(const MachineFunction &MF) const override;
53 Register &FrameReg) const override;
55 int FI) const override;
56 int ResolveFrameIndexReference(const MachineFunction &MF, int FI,
57 Register &FrameReg, int SPAdj) const;
58
59 void getCalleeSaves(const MachineFunction &MF,
60 BitVector &SavedRegs) const override;
62 RegScavenger *RS) const override;
63
64 /// Update the IsRestored flag on LR if it is spilled, based on the return
65 /// instructions.
66 static void updateLRRestored(MachineFunction &MF);
67
69 MachineFunction &MF, RegScavenger *RS = nullptr) const override;
70
72 MachineBasicBlock &MBB) const override;
73
74 /// Returns true if the target will correctly handle shrink wrapping.
75 bool enableShrinkWrapping(const MachineFunction &MF) const override;
76
77 bool isProfitableForNoCSROpt(const Function &F) const override {
78 // The no-CSR optimisation is bad for code size on ARM, because we can save
79 // many registers with a single PUSH/POP pair.
80 return false;
81 }
82
83 bool
86 std::vector<CalleeSavedInfo> &CSI) const override;
87
88 const SpillSlot *
89 getCalleeSavedSpillSlots(unsigned &NumEntries) const override;
90
91protected:
92 bool hasFPImpl(const MachineFunction &MF) const override;
93
94private:
96 ArrayRef<CalleeSavedInfo> CSI, unsigned StmOpc,
97 unsigned StrOpc, bool NoGap,
98 function_ref<bool(unsigned)> Func) const;
100 MutableArrayRef<CalleeSavedInfo> CSI, unsigned LdmOpc,
101 unsigned LdrOpc, bool isVarArg, bool NoGap,
102 function_ref<bool(unsigned)> Func) const;
103
104 void emitFPStatusSaves(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
106 unsigned PushOneOpc) const;
107
108 void emitFPStatusRestores(MachineBasicBlock &MBB,
111 unsigned LdrOpc) const;
112
114 eliminateCallFramePseudoInstr(MachineFunction &MF,
116 MachineBasicBlock::iterator MI) const override;
117};
118
119} // end namespace llvm
120
121#endif // LLVM_LIB_TARGET_ARM_ARMFRAMELOWERING_H
MachineBasicBlock & MBB
IRTranslator LLVM IR MI
#define F(x, y, z)
Definition MD5.cpp:54
Register const TargetRegisterInfo * TRI
bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, MutableArrayRef< CalleeSavedInfo > CSI, const TargetRegisterInfo *TRI) const override
restoreCalleeSavedRegisters - Issues instruction(s) to restore all callee saved registers and returns...
StackOffset getNonLocalFrameIndexReference(const MachineFunction &MF, int FI) const override
getNonLocalFrameIndexReference - This method returns the offset used to reference a frame index locat...
StackOffset getFrameIndexReference(const MachineFunction &MF, int FI, Register &FrameReg) const override
getFrameIndexReference - Provide a base+offset reference to an FI slot for debug info.
bool keepFramePointer(const MachineFunction &MF) const
static void updateLRRestored(MachineFunction &MF)
Update the IsRestored flag on LR if it is spilled, based on the return instructions.
void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override
emitProlog/emitEpilog - These methods insert prolog and epilog code into the function.
ARMFrameLowering(const ARMSubtarget &sti)
bool enableShrinkWrapping(const MachineFunction &MF) const override
Returns true if the target will correctly handle shrink wrapping.
bool isProfitableForNoCSROpt(const Function &F) const override
Check if the no-CSR optimisation is profitable for the given function.
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override
bool requiresAAPCSFrameRecord(const MachineFunction &MF) const
bool isFPReserved(const MachineFunction &MF) const
isFPReserved - Return true if the frame pointer register should be considered a reserved register on ...
bool canSimplifyCallFramePseudos(const MachineFunction &MF) const override
canSimplifyCallFramePseudos - If there is a reserved call frame, the call frame pseudos can be simpli...
void adjustForSegmentedStacks(MachineFunction &MF, MachineBasicBlock &MBB) const override
Adjust the prologue to have the function use segmented stacks.
bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, ArrayRef< CalleeSavedInfo > CSI, const TargetRegisterInfo *TRI) const override
spillCalleeSavedRegisters - Issues instruction(s) to spill all callee saved registers and returns tru...
bool hasReservedCallFrame(const MachineFunction &MF) const override
hasReservedCallFrame - Under normal circumstances, when a frame pointer is not required,...
const SpillSlot * getCalleeSavedSpillSlots(unsigned &NumEntries) const override
getCalleeSavedSpillSlots - This method returns a pointer to an array of pairs, that contains an entry...
void processFunctionBeforeFrameFinalized(MachineFunction &MF, RegScavenger *RS=nullptr) const override
processFunctionBeforeFrameFinalized - This method is called immediately before the specified function...
bool hasFPImpl(const MachineFunction &MF) const override
hasFPImpl - Return true if the specified function should have a dedicated frame pointer register.
int ResolveFrameIndexReference(const MachineFunction &MF, int FI, Register &FrameReg, int SPAdj) const
void getCalleeSaves(const MachineFunction &MF, BitVector &SavedRegs) const override
Returns the callee-saved registers as computed by determineCalleeSaves in the BitVector SavedRegs.
const ARMSubtarget & STI
void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, RegScavenger *RS) const override
This method determines which of the registers reported by TargetRegisterInfo::getCalleeSavedRegs() sh...
bool enableCalleeSaveSkip(const MachineFunction &MF) const override
Returns true if the target can safely skip saving callee-saved registers for noreturn nounwind functi...
bool assignCalleeSavedSpillSlots(MachineFunction &MF, const TargetRegisterInfo *TRI, std::vector< CalleeSavedInfo > &CSI) const override
assignCalleeSavedSpillSlots - Allows target to override spill slot assignment logic.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
The CalleeSavedInfo class tracks the information need to locate where a callee saved register is in t...
MachineInstrBundleIterator< MachineInstr > iterator
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
Wrapper class representing virtual and physical registers.
Definition Register.h:20
StackOffset holds a fixed and a scalable offset in bytes.
Definition TypeSize.h:30
TargetFrameLowering(StackDirection D, Align StackAl, int LAO, Align TransAl=Align(1), bool StackReal=true)
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
An efficient, type-erasing, non-owning reference to a callable.
This is an optimization pass for GlobalISel generic memory operations.