LLVM 20.0.0git
RISCVFrameLowering.h
Go to the documentation of this file.
1//===-- RISCVFrameLowering.h - Define frame lowering for RISC-V -*- 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// This class implements RISC-V specific bits of TargetFrameLowering class.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_RISCV_RISCVFRAMELOWERING_H
14#define LLVM_LIB_TARGET_RISCV_RISCVFRAMELOWERING_H
15
18
19namespace llvm {
20class RISCVSubtarget;
21
23public:
24 explicit RISCVFrameLowering(const RISCVSubtarget &STI);
25
26 void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
27 void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
28
30
32 Register &FrameReg) const override;
33
35 RegScavenger *RS) const override;
36
38 RegScavenger *RS) const override;
39
40 bool hasFP(const MachineFunction &MF) const override;
41
42 bool hasBP(const MachineFunction &MF) const;
43
44 bool hasReservedCallFrame(const MachineFunction &MF) const override;
47 MachineBasicBlock::iterator MI) const override;
48
51 std::vector<CalleeSavedInfo> &CSI,
52 unsigned &MinCSFrameIndex,
53 unsigned &MaxCSFrameIndex) const override;
57 const TargetRegisterInfo *TRI) const override;
58 bool
62 const TargetRegisterInfo *TRI) const override;
63
64 // Get the first stack adjustment amount for SplitSPAdjust.
65 // Return 0 if we don't want to split the SP adjustment in prologue and
66 // epilogue.
68
69 bool canUseAsPrologue(const MachineBasicBlock &MBB) const override;
70 bool canUseAsEpilogue(const MachineBasicBlock &MBB) const override;
71
72 bool enableShrinkWrapping(const MachineFunction &MF) const override;
73
74 bool isSupportedStackID(TargetStackID::Value ID) const override;
76
77 bool isStackIdSafeForLocalArea(unsigned StackId) const override {
78 // We don't support putting RISC-V Vector objects into the pre-allocated
79 // local frame block at the moment.
80 return StackId != TargetStackID::ScalableVector;
81 }
82
83protected:
85
86private:
87 void determineFrameLayout(MachineFunction &MF) const;
88 void adjustStackForRVV(MachineFunction &MF, MachineBasicBlock &MBB,
90 int64_t Amount, MachineInstr::MIFlag Flag) const;
91 void emitCalleeSavedRVVPrologCFI(MachineBasicBlock &MBB,
93 bool HasFP) const;
94 std::pair<int64_t, Align>
95 assignRVVStackObjectOffsets(MachineFunction &MF) const;
96};
97} // namespace llvm
98#endif
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
IRTranslator LLVM IR MI
unsigned const TargetRegisterInfo * TRI
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
A debug info location.
Definition: DebugLoc.h:33
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition: ArrayRef.h:307
void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override
emitProlog/emitEpilog - These methods insert prolog and epilog code into the function.
uint64_t getFirstSPAdjustAmount(const MachineFunction &MF) const
bool enableShrinkWrapping(const MachineFunction &MF) const override
Returns true if the target will correctly handle shrink wrapping.
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 hasBP(const MachineFunction &MF) const
bool canUseAsEpilogue(const MachineBasicBlock &MBB) const override
Check whether or not the given MBB can be used as a epilogue for the target.
bool assignCalleeSavedSpillSlots(MachineFunction &MF, const TargetRegisterInfo *TRI, std::vector< CalleeSavedInfo > &CSI, unsigned &MinCSFrameIndex, unsigned &MaxCSFrameIndex) const override
assignCalleeSavedSpillSlots - Allows target to override spill slot assignment logic.
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...
bool hasReservedCallFrame(const MachineFunction &MF) const override
hasReservedCallFrame - Under normal circumstances, when a frame pointer is not required,...
bool hasFP(const MachineFunction &MF) const override
hasFP - Return true if the specified function should have a dedicated frame pointer register.
const RISCVSubtarget & STI
StackOffset getFrameIndexReference(const MachineFunction &MF, int FI, Register &FrameReg) const override
getFrameIndexReference - This method should return the base register and offset used to reference a f...
bool isSupportedStackID(TargetStackID::Value ID) const override
void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, RegScavenger *RS) const override
This method determines which of the registers reported by TargetRegisterInfo::getCalleeSavedRegs() sh...
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override
TargetStackID::Value getStackIDForScalableVectors() const override
Returns the StackID that scalable vectors should be associated with.
void processFunctionBeforeFrameFinalized(MachineFunction &MF, RegScavenger *RS) const override
processFunctionBeforeFrameFinalized - This method is called immediately before the specified function...
MachineBasicBlock::iterator eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const override
This method is called during prolog/epilog code insertion to eliminate call frame setup and destroy p...
bool isStackIdSafeForLocalArea(unsigned StackId) const override
This method returns whether or not it is safe for an object with the given stack id to be bundled int...
bool canUseAsPrologue(const MachineBasicBlock &MBB) const override
Check whether or not the given MBB can be used as a prologue for the target.
uint64_t getStackSizeWithRVVPadding(const MachineFunction &MF) const
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
StackOffset holds a fixed and a scalable offset in bytes.
Definition: TypeSize.h:33
Information about stack frame layout on the target.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18