Movatterモバイル変換


[0]ホーム

URL:


LLVM 20.0.0git
RISCVMachineFunctionInfo.h
Go to the documentation of this file.
1//=- RISCVMachineFunctionInfo.h - RISC-V machine function info ----*- 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 file declares RISCV-specific per-machine-function information.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_RISCV_RISCVMACHINEFUNCTIONINFO_H
14#define LLVM_LIB_TARGET_RISCV_RISCVMACHINEFUNCTIONINFO_H
15
16#include "RISCVSubtarget.h"
17#include "llvm/CodeGen/MIRYamlMapping.h"
18#include "llvm/CodeGen/MachineFrameInfo.h"
19#include "llvm/CodeGen/MachineFunction.h"
20
21namespacellvm {
22
23classRISCVMachineFunctionInfo;
24
25namespaceyaml {
26structRISCVMachineFunctionInfo final :publicyaml::MachineFunctionInfo {
27intVarArgsFrameIndex;
28intVarArgsSaveSize;
29
30RISCVMachineFunctionInfo() =default;
31RISCVMachineFunctionInfo(constllvm::RISCVMachineFunctionInfo &MFI);
32
33voidmappingImpl(yaml::IO &YamlIO)override;
34~RISCVMachineFunctionInfo() =default;
35};
36
37template <>structMappingTraits<RISCVMachineFunctionInfo> {
38staticvoidmapping(IO &YamlIO,RISCVMachineFunctionInfo &MFI) {
39YamlIO.mapOptional("varArgsFrameIndex", MFI.VarArgsFrameIndex);
40YamlIO.mapOptional("varArgsSaveSize", MFI.VarArgsSaveSize);
41 }
42};
43}// end namespace yaml
44
45/// RISCVMachineFunctionInfo - This class is derived from MachineFunctionInfo
46/// and contains private RISCV-specific information for each MachineFunction.
47classRISCVMachineFunctionInfo :publicMachineFunctionInfo {
48private:
49 /// FrameIndex for start of varargs area
50int VarArgsFrameIndex = 0;
51 /// Size of the save area used for varargs
52int VarArgsSaveSize = 0;
53 /// FrameIndex used for transferring values between 64-bit FPRs and a pair
54 /// of 32-bit GPRs via the stack.
55int MoveF64FrameIndex = -1;
56 /// FrameIndex of the spill slot for the scratch register in BranchRelaxation.
57int BranchRelaxationScratchFrameIndex = -1;
58 /// Size of any opaque stack adjustment due to save/restore libcalls.
59unsigned LibCallStackSize = 0;
60 /// Size of RVV stack.
61uint64_t RVVStackSize = 0;
62 /// Alignment of RVV stack.
63Align RVVStackAlign;
64 /// Padding required to keep RVV stack aligned within the main stack.
65uint64_t RVVPadding = 0;
66 /// Size of stack frame to save callee saved registers
67unsigned CalleeSavedStackSize = 0;
68 /// Is there any vector argument or return?
69bool IsVectorCall =false;
70
71 /// Registers that have been sign extended from i32.
72SmallVector<Register, 8> SExt32Registers;
73
74 /// Size of stack frame for Zcmp PUSH/POP
75unsigned RVPushStackSize = 0;
76unsigned RVPushRegs = 0;
77int RVPushRlist =llvm::RISCVZC::RLISTENCODE::INVALID_RLIST;
78
79 int64_t StackProbeSize = 0;
80
81 /// Does it probe the stack for a dynamic allocation?
82bool HasDynamicAllocation =false;
83
84public:
85RISCVMachineFunctionInfo(constFunction &F,constRISCVSubtarget *STI);
86
87MachineFunctionInfo *
88clone(BumpPtrAllocator &Allocator,MachineFunction &DestMF,
89constDenseMap<MachineBasicBlock *, MachineBasicBlock *> &Src2DstMBB)
90const override;
91
92intgetVarArgsFrameIndex() const{return VarArgsFrameIndex; }
93voidsetVarArgsFrameIndex(intIndex) { VarArgsFrameIndex =Index; }
94
95unsignedgetVarArgsSaveSize() const{return VarArgsSaveSize; }
96voidsetVarArgsSaveSize(intSize) { VarArgsSaveSize =Size; }
97
98intgetMoveF64FrameIndex(MachineFunction &MF) {
99if (MoveF64FrameIndex == -1)
100 MoveF64FrameIndex =
101 MF.getFrameInfo().CreateStackObject(8,Align(8),false);
102return MoveF64FrameIndex;
103 }
104
105intgetBranchRelaxationScratchFrameIndex() const{
106return BranchRelaxationScratchFrameIndex;
107 }
108voidsetBranchRelaxationScratchFrameIndex(intIndex) {
109 BranchRelaxationScratchFrameIndex =Index;
110 }
111
112unsignedgetReservedSpillsSize() const{
113return LibCallStackSize + RVPushStackSize;
114 }
115
116unsignedgetLibCallStackSize() const{return LibCallStackSize; }
117voidsetLibCallStackSize(unsignedSize) { LibCallStackSize =Size; }
118
119booluseSaveRestoreLibCalls(constMachineFunction &MF) const{
120// We cannot use fixed locations for the callee saved spill slots if the
121// function uses a varargs save area, or is an interrupt handler.
122return !isPushable(MF) &&
123 MF.getSubtarget<RISCVSubtarget>().enableSaveRestore() &&
124 VarArgsSaveSize == 0 && !MF.getFrameInfo().hasTailCall() &&
125 !MF.getFunction().hasFnAttribute("interrupt");
126 }
127
128uint64_tgetRVVStackSize() const{return RVVStackSize; }
129voidsetRVVStackSize(uint64_tSize) { RVVStackSize =Size; }
130
131AligngetRVVStackAlign() const{return RVVStackAlign; }
132voidsetRVVStackAlign(Align StackAlign) { RVVStackAlign = StackAlign; }
133
134uint64_tgetRVVPadding() const{return RVVPadding; }
135voidsetRVVPadding(uint64_t Padding) { RVVPadding = Padding; }
136
137unsignedgetCalleeSavedStackSize() const{return CalleeSavedStackSize; }
138voidsetCalleeSavedStackSize(unsignedSize) { CalleeSavedStackSize =Size; }
139
140boolisPushable(constMachineFunction &MF) const{
141// We cannot use fixed locations for the callee saved spill slots if the
142// function uses a varargs save area.
143// TODO: Use a separate placement for vararg registers to enable Zcmp.
144return MF.getSubtarget<RISCVSubtarget>().hasStdExtZcmp() &&
145 !MF.getTarget().Options.DisableFramePointerElim(MF) &&
146 VarArgsSaveSize == 0;
147 }
148
149intgetRVPushRlist() const{return RVPushRlist; }
150voidsetRVPushRlist(int Rlist) { RVPushRlist = Rlist; }
151
152unsignedgetRVPushRegs() const{return RVPushRegs; }
153voidsetRVPushRegs(unsigned Regs) { RVPushRegs = Regs; }
154
155unsignedgetRVPushStackSize() const{return RVPushStackSize; }
156voidsetRVPushStackSize(unsignedSize) { RVPushStackSize =Size; }
157
158voidinitializeBaseYamlFields(constyaml::RISCVMachineFunctionInfo &YamlMFI);
159
160voidaddSExt32Register(RegisterReg);
161boolisSExt32Register(RegisterReg)const;
162
163boolisVectorCall() const{return IsVectorCall; }
164voidsetIsVectorCall() { IsVectorCall =true; }
165
166boolhasDynamicAllocation() const{return HasDynamicAllocation; }
167voidsetDynamicAllocation() { HasDynamicAllocation =true; }
168};
169
170}// end namespace llvm
171
172#endif// LLVM_LIB_TARGET_RISCV_RISCVMACHINEFUNCTIONINFO_H
Index
uint32_t Index
Definition:ELFObjHandler.cpp:83
Size
uint64_t Size
Definition:ELFObjHandler.cpp:81
YamlIO
IO & YamlIO
Definition:ELFYAML.cpp:1314
F
#define F(x, y, z)
Definition:MD5.cpp:55
MIRYamlMapping.h
MachineFrameInfo.h
MachineFunction.h
Reg
unsigned Reg
Definition:MachineSink.cpp:2028
RISCVSubtarget.h
Allocator
Basic Register Allocator
Definition:RegAllocBasic.cpp:146
llvm::BumpPtrAllocatorImpl
Allocate memory in an ever growing pool, as if by bump-pointer.
Definition:Allocator.h:66
llvm::DenseMap
Definition:DenseMap.h:727
llvm::Function
Definition:Function.h:63
llvm::Function::hasFnAttribute
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition:Function.cpp:731
llvm::MachineFrameInfo::CreateStackObject
int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
Definition:MachineFrameInfo.cpp:51
llvm::MachineFrameInfo::hasTailCall
bool hasTailCall() const
Returns true if the function contains a tail call.
Definition:MachineFrameInfo.h:646
llvm::MachineFunction
Definition:MachineFunction.h:267
llvm::MachineFunction::getSubtarget
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Definition:MachineFunction.h:733
llvm::MachineFunction::getFrameInfo
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
Definition:MachineFunction.h:749
llvm::MachineFunction::getFunction
Function & getFunction()
Return the LLVM function that this machine code represents.
Definition:MachineFunction.h:704
llvm::MachineFunction::getTarget
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Definition:MachineFunction.h:729
llvm::RISCVMachineFunctionInfo
RISCVMachineFunctionInfo - This class is derived from MachineFunctionInfo and contains private RISCV-...
Definition:RISCVMachineFunctionInfo.h:47
llvm::RISCVMachineFunctionInfo::setLibCallStackSize
void setLibCallStackSize(unsigned Size)
Definition:RISCVMachineFunctionInfo.h:117
llvm::RISCVMachineFunctionInfo::isPushable
bool isPushable(const MachineFunction &MF) const
Definition:RISCVMachineFunctionInfo.h:140
llvm::RISCVMachineFunctionInfo::setIsVectorCall
void setIsVectorCall()
Definition:RISCVMachineFunctionInfo.h:164
llvm::RISCVMachineFunctionInfo::initializeBaseYamlFields
void initializeBaseYamlFields(const yaml::RISCVMachineFunctionInfo &YamlMFI)
Definition:RISCVMachineFunctionInfo.cpp:63
llvm::RISCVMachineFunctionInfo::hasDynamicAllocation
bool hasDynamicAllocation() const
Definition:RISCVMachineFunctionInfo.h:166
llvm::RISCVMachineFunctionInfo::setRVPushStackSize
void setRVPushStackSize(unsigned Size)
Definition:RISCVMachineFunctionInfo.h:156
llvm::RISCVMachineFunctionInfo::isSExt32Register
bool isSExt32Register(Register Reg) const
Definition:RISCVMachineFunctionInfo.cpp:73
llvm::RISCVMachineFunctionInfo::getRVPushRlist
int getRVPushRlist() const
Definition:RISCVMachineFunctionInfo.h:149
llvm::RISCVMachineFunctionInfo::clone
MachineFunctionInfo * clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF, const DenseMap< MachineBasicBlock *, MachineBasicBlock * > &Src2DstMBB) const override
Make a functionally equivalent copy of this MachineFunctionInfo in MF.
Definition:RISCVMachineFunctionInfo.cpp:23
llvm::RISCVMachineFunctionInfo::setCalleeSavedStackSize
void setCalleeSavedStackSize(unsigned Size)
Definition:RISCVMachineFunctionInfo.h:138
llvm::RISCVMachineFunctionInfo::setRVVPadding
void setRVVPadding(uint64_t Padding)
Definition:RISCVMachineFunctionInfo.h:135
llvm::RISCVMachineFunctionInfo::getLibCallStackSize
unsigned getLibCallStackSize() const
Definition:RISCVMachineFunctionInfo.h:116
llvm::RISCVMachineFunctionInfo::getRVVPadding
uint64_t getRVVPadding() const
Definition:RISCVMachineFunctionInfo.h:134
llvm::RISCVMachineFunctionInfo::setVarArgsFrameIndex
void setVarArgsFrameIndex(int Index)
Definition:RISCVMachineFunctionInfo.h:93
llvm::RISCVMachineFunctionInfo::getRVPushStackSize
unsigned getRVPushStackSize() const
Definition:RISCVMachineFunctionInfo.h:155
llvm::RISCVMachineFunctionInfo::getVarArgsFrameIndex
int getVarArgsFrameIndex() const
Definition:RISCVMachineFunctionInfo.h:92
llvm::RISCVMachineFunctionInfo::getReservedSpillsSize
unsigned getReservedSpillsSize() const
Definition:RISCVMachineFunctionInfo.h:112
llvm::RISCVMachineFunctionInfo::setBranchRelaxationScratchFrameIndex
void setBranchRelaxationScratchFrameIndex(int Index)
Definition:RISCVMachineFunctionInfo.h:108
llvm::RISCVMachineFunctionInfo::getRVPushRegs
unsigned getRVPushRegs() const
Definition:RISCVMachineFunctionInfo.h:152
llvm::RISCVMachineFunctionInfo::isVectorCall
bool isVectorCall() const
Definition:RISCVMachineFunctionInfo.h:163
llvm::RISCVMachineFunctionInfo::useSaveRestoreLibCalls
bool useSaveRestoreLibCalls(const MachineFunction &MF) const
Definition:RISCVMachineFunctionInfo.h:119
llvm::RISCVMachineFunctionInfo::setRVVStackSize
void setRVVStackSize(uint64_t Size)
Definition:RISCVMachineFunctionInfo.h:129
llvm::RISCVMachineFunctionInfo::getRVVStackSize
uint64_t getRVVStackSize() const
Definition:RISCVMachineFunctionInfo.h:128
llvm::RISCVMachineFunctionInfo::setVarArgsSaveSize
void setVarArgsSaveSize(int Size)
Definition:RISCVMachineFunctionInfo.h:96
llvm::RISCVMachineFunctionInfo::getRVVStackAlign
Align getRVVStackAlign() const
Definition:RISCVMachineFunctionInfo.h:131
llvm::RISCVMachineFunctionInfo::getBranchRelaxationScratchFrameIndex
int getBranchRelaxationScratchFrameIndex() const
Definition:RISCVMachineFunctionInfo.h:105
llvm::RISCVMachineFunctionInfo::getVarArgsSaveSize
unsigned getVarArgsSaveSize() const
Definition:RISCVMachineFunctionInfo.h:95
llvm::RISCVMachineFunctionInfo::setRVPushRlist
void setRVPushRlist(int Rlist)
Definition:RISCVMachineFunctionInfo.h:150
llvm::RISCVMachineFunctionInfo::setDynamicAllocation
void setDynamicAllocation()
Definition:RISCVMachineFunctionInfo.h:167
llvm::RISCVMachineFunctionInfo::getMoveF64FrameIndex
int getMoveF64FrameIndex(MachineFunction &MF)
Definition:RISCVMachineFunctionInfo.h:98
llvm::RISCVMachineFunctionInfo::setRVVStackAlign
void setRVVStackAlign(Align StackAlign)
Definition:RISCVMachineFunctionInfo.h:132
llvm::RISCVMachineFunctionInfo::getCalleeSavedStackSize
unsigned getCalleeSavedStackSize() const
Definition:RISCVMachineFunctionInfo.h:137
llvm::RISCVMachineFunctionInfo::addSExt32Register
void addSExt32Register(Register Reg)
Definition:RISCVMachineFunctionInfo.cpp:69
llvm::RISCVMachineFunctionInfo::setRVPushRegs
void setRVPushRegs(unsigned Regs)
Definition:RISCVMachineFunctionInfo.h:153
llvm::RISCVSubtarget
Definition:RISCVSubtarget.h:78
llvm::Register
Wrapper class representing virtual and physical registers.
Definition:Register.h:19
llvm::SmallVector
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition:SmallVector.h:1196
llvm::TargetMachine::Options
TargetOptions Options
Definition:TargetMachine.h:118
llvm::TargetOptions::DisableFramePointerElim
bool DisableFramePointerElim(const MachineFunction &MF) const
DisableFramePointerElim - This returns true if frame pointer elimination optimization should be disab...
Definition:TargetOptionsImpl.cpp:24
uint64_t
llvm::RISCVZC::INVALID_RLIST
@ INVALID_RLIST
Definition:RISCVBaseInfo.h:561
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition:AddressRanges.h:18
llvm::Align
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition:Alignment.h:39
llvm::MachineFunctionInfo
MachineFunctionInfo - This class can be derived from and used by targets to hold private target-speci...
Definition:MachineFunction.h:104
llvm::yaml::MachineFunctionInfo
Targets should override this in a way that mirrors the implementation of llvm::MachineFunctionInfo.
Definition:MIRYamlMapping.h:732
llvm::yaml::MappingTraits< RISCVMachineFunctionInfo >::mapping
static void mapping(IO &YamlIO, RISCVMachineFunctionInfo &MFI)
Definition:RISCVMachineFunctionInfo.h:38
llvm::yaml::MappingTraits
Definition:ModuleSummaryIndex.h:54
llvm::yaml::RISCVMachineFunctionInfo
Definition:RISCVMachineFunctionInfo.h:26
llvm::yaml::RISCVMachineFunctionInfo::VarArgsSaveSize
int VarArgsSaveSize
Definition:RISCVMachineFunctionInfo.h:28
llvm::yaml::RISCVMachineFunctionInfo::VarArgsFrameIndex
int VarArgsFrameIndex
Definition:RISCVMachineFunctionInfo.h:27
llvm::yaml::RISCVMachineFunctionInfo::mappingImpl
void mappingImpl(yaml::IO &YamlIO) override
Definition:RISCVMachineFunctionInfo.cpp:59
llvm::yaml::RISCVMachineFunctionInfo::RISCVMachineFunctionInfo
RISCVMachineFunctionInfo()=default
llvm::yaml::RISCVMachineFunctionInfo::~RISCVMachineFunctionInfo
~RISCVMachineFunctionInfo()=default

Generated on Thu Jul 17 2025 15:27:51 for LLVM by doxygen 1.9.6
[8]ページ先頭

©2009-2025 Movatter.jp