Go to the documentation of this file.
13 #ifndef LLVM_LIB_TARGET_AARCH64_AARCH64MACHINEFUNCTIONINFO_H
14 #define LLVM_LIB_TARGET_AARCH64_AARCH64MACHINEFUNCTIONINFO_H
31 struct AArch64FunctionInfo;
34 class AArch64Subtarget;
49 unsigned BytesInStackArgArea = 0;
54 unsigned ArgumentStackToRestore = 0;
60 unsigned TailCallReservedStack = 0;
64 bool HasStackFrame =
false;
70 int MinSVECSFrameIndex = 0;
71 int MaxSVECSFrameIndex = 0;
74 unsigned CalleeSavedStackSize = 0;
75 unsigned SVECalleeSavedStackSize = 0;
76 bool HasCalleeSavedStackSize =
false;
80 unsigned NumLocalDynamicTLSAccesses = 0;
84 int VarArgsStackIndex = 0;
87 unsigned VarArgsStackOffset = 0;
91 int VarArgsGPRIndex = 0;
95 unsigned VarArgsGPRSize = 0;
99 int VarArgsFPRIndex = 0;
103 unsigned VarArgsFPRSize = 0;
107 bool IsSplitCSR =
false;
111 bool StackRealigned =
false;
115 bool CalleeSaveStackHasFreeSpace =
false;
128 bool HasCalculatedStackSizeSVE =
false;
134 std::optional<bool> HasRedZone;
141 std::optional<int> TaggedBasePointerIndex;
146 unsigned TaggedBasePointerOffset;
150 std::optional<std::string> OutliningStyle;
154 int CalleeSaveBaseToFrameRecordOffset = 0;
158 bool SignReturnAddress =
false;
162 bool SignReturnAddressAll =
false;
165 bool SignWithBKey =
false;
169 bool BranchTargetEnforcement =
false;
174 bool HasSwiftAsyncContext =
false;
179 bool IsMTETagged =
false;
183 bool IsSVECC =
false;
190 mutable std::optional<bool> NeedsDwarfUnwindInfo;
193 mutable std::optional<bool> NeedsAsyncDwarfUnwindInfo;
216 ArgumentStackToRestore = bytes;
221 TailCallReservedStack = bytes;
227 HasCalculatedStackSizeSVE =
true;
240 return CalleeSaveStackHasFreeSpace;
243 CalleeSaveStackHasFreeSpace =
s;
253 return OutliningStyle;
257 CalleeSavedStackSize = Size;
258 HasCalleeSavedStackSize =
true;
267 bool ValidateCalleeSavedStackSize =
false;
273 ValidateCalleeSavedStackSize = HasCalleeSavedStackSize;
276 if (!HasCalleeSavedStackSize || ValidateCalleeSavedStackSize) {
284 int FrameIdx =
Info.getFrameIdx();
289 MinOffset = std::min<int64_t>(
Offset, MinOffset);
290 MaxOffset = std::max<int64_t>(
Offset + ObjSize, MaxOffset);
296 MinOffset = std::min<int64_t>(
Offset, MinOffset);
297 MaxOffset = std::max<int64_t>(
Offset + ObjSize, MaxOffset);
300 unsigned Size =
alignTo(MaxOffset - MinOffset, 16);
302 "Invalid size calculated for callee saves");
310 assert(HasCalleeSavedStackSize &&
311 "CalleeSavedStackSize has not been calculated");
312 return CalleeSavedStackSize;
317 SVECalleeSavedStackSize = Size;
320 return SVECalleeSavedStackSize;
324 MinSVECSFrameIndex = Min;
325 MaxSVECSFrameIndex = Max;
333 return NumLocalDynamicTLSAccesses;
336 std::optional<bool>
hasRedZone()
const {
return HasRedZone; }
361 return JumpTableEntryInfo[Idx].first;
364 return JumpTableEntryInfo[Idx].second;
367 if ((
unsigned)Idx >= JumpTableEntryInfo.size())
368 JumpTableEntryInfo.resize(Idx+1);
369 JumpTableEntryInfo[Idx] = std::make_pair(Size, PCRelSym);
387 : Kind(Kind), Args(Args.
begin(), Args.
end()) {
407 return ForwardedMustTailRegParms;
411 return TaggedBasePointerIndex;
416 return TaggedBasePointerOffset;
419 TaggedBasePointerOffset =
Offset;
423 return CalleeSaveBaseToFrameRecordOffset;
426 CalleeSaveBaseToFrameRecordOffset =
Offset;
438 HasSwiftAsyncContext = HasContext;
443 SwiftAsyncContextFrameIdx = FI;
479 #endif // LLVM_LIB_TARGET_AARCH64_AARCH64MACHINEFUNCTIONINFO_H
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
void setArgumentStackToRestore(unsigned bytes)
~AArch64FunctionInfo()=default
This is an optimization pass for GlobalISel generic memory operations.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
int getVarArgsFPRIndex() const
MCSymbol * getJumpTableEntryPCRelSymbol(int Idx) const
AArch64FunctionInfo(const Function &F, const AArch64Subtarget *STI)
void mappingImpl(yaml::IO &YamlIO) override
std::optional< bool > hasRedZone() const
bool needsDwarfUnwindInfo(const MachineFunction &MF) const
MCLOHType
Linker Optimization Hint Type.
Targets should override this in a way that mirrors the implementation of llvm::MachineFunctionInfo.
int getMaxSVECSFrameIndex() const
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Reg
All possible values of the reg field in the ModR/M byte.
void setSwiftAsyncContextFrameIdx(int FI)
const_iterator end(StringRef path)
Get end iterator over path.
const_iterator begin(StringRef path, Style style=Style::native)
Get begin iterator over path.
void setTaggedBasePointerIndex(int Index)
Expected< ExpressionValue > max(const ExpressionValue &Lhs, const ExpressionValue &Rhs)
void setVarArgsStackIndex(int Index)
void setTaggedBasePointerOffset(unsigned Offset)
const SetOfInstructions & getLOHRelated() const
unsigned getJumpTableEntrySize(int Idx) const
std::optional< std::string > getOutliningStyle() const
void setHasSwiftAsyncContext(bool HasContext)
static void mapping(IO &YamlIO, AArch64FunctionInfo &MFI)
MachineFunctionInfo * clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF, const DenseMap< MachineBasicBlock *, MachineBasicBlock * > &Src2DstMBB) const override
Make a functionally equivalent copy of this MachineFunctionInfo in MF.
SmallVector< MILOHDirective, 32 > MILOHContainer
unsigned getBytesInStackArgArea() const
bool isStackRealigned() const
void setVarArgsFPRSize(unsigned Size)
void setHasRedZone(bool s)
void setBytesInStackArgArea(unsigned bytes)
unsigned getNumLocalDynamicTLSAccesses() const
static bool isValidMCLOHType(unsigned Kind)
uint8_t getStackID(int ObjectIdx) const
void incNumLocalDynamicTLSAccesses()
void setSRetReturnReg(unsigned Reg)
int getVarArgsStackIndex() const
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
Analysis containing CSE Info
bool hasStackFrame() const
bool isCalleeSavedInfoValid() const
Has the callee saved info been calculated yet?
bool shouldSignWithBKey() const
void setOutliningStyle(std::string Style)
void setVarArgsFPRIndex(int Index)
void setLazySaveTPIDR2Obj(unsigned Reg)
int getCalleeSaveBaseToFrameRecordOffset() const
SmallPtrSet< const MachineInstr *, 16 > SetOfInstructions
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
unsigned getTaggedBasePointerOffset() const
multiplies can be turned into SHL s
Allocate memory in an ever growing pool, as if by bump-pointer.
AArch64FunctionInfo()=default
MCLOHType getKind() const
void setCalleeSaveBaseToFrameRecordOffset(int Offset)
int getVarArgsGPRIndex() const
AArch64FunctionInfo - This class is derived from MachineFunctionInfo and contains private AArch64-spe...
void setVarArgsStackOffset(unsigned Offset)
ArrayRef< const MachineInstr * > LOHArgs
void setCalleeSaveStackHasFreeSpace(bool s)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
uint64_t getLocalStackSize() const
void setStackRealigned(bool s)
bool branchTargetEnforcement() const
void setSVECalleeSavedStackSize(unsigned Size)
unsigned getVarArgsGPRSize() const
unsigned getVarArgsStackOffset() const
unsigned getVarArgsFPRSize() const
const std::vector< CalleeSavedInfo > & getCalleeSavedInfo() const
Returns a reference to call saved info vector for the current function.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Expected< ExpressionValue > min(const ExpressionValue &Lhs, const ExpressionValue &Rhs)
int getSwiftAsyncContextFrameIdx() const
bool hasCalculatedStackSizeSVE() const
const MILOHContainer & getLOHContainer() const
void setVarArgsGPRIndex(int Index)
SmallVectorImpl< ForwardedRegister > & getForwardedMustTailRegParms()
add sub stmia L5 ldr r0 bl L_printf $stub Instead of a and a wouldn t it be better to do three moves *Return an aggregate type is even return S
unsigned getTailCallReservedStack() const
void setMinMaxSVECSFrameIndex(int Min, int Max)
Wrapper class representing virtual and physical registers.
bool needsAsyncDwarfUnwindInfo(const MachineFunction &MF) const
bool shouldSignReturnAddress(const MachineFunction &MF) const
bool hasCalleeSaveStackFreeSpace() const
MILOHDirective(MCLOHType Kind, LOHArgs Args)
uint64_t getStackSizeSVE() const
void initializeBaseYamlFields(const yaml::AArch64FunctionInfo &YamlMFI)
unsigned getCalleeSavedStackSize() const
int getMinSVECSFrameIndex() const
void setLocalStackSize(uint64_t Size)
void setJumpTableEntryInfo(int Idx, unsigned Size, MCSymbol *PCRelSym)
unsigned getSVECalleeSavedStackSize() const
unsigned getLazySaveTPIDR2Obj() const
unsigned getArgumentStackToRestore() const
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
unsigned getSRetReturnReg() const
bool hasSwiftAsyncContext() const
void setHasStackFrame(bool s)
unsigned getCalleeSavedStackSize(const MachineFrameInfo &MFI) const
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void setCalleeSavedStackSize(unsigned Size)
void setIsSplitCSR(bool s)
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
std::optional< bool > HasRedZone
MachineFunctionInfo - This class can be derived from and used by targets to hold private target-speci...
void addLOHDirective(MCLOHType Kind, MILOHArgs Args)
Add a LOH directive of this Kind and this Args.
void setTailCallReservedStack(unsigned bytes)
void setStackSizeSVE(uint64_t S)
void setVarArgsGPRSize(unsigned Size)
std::optional< int > getTaggedBasePointerIndex() const
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.