28 : HasRedZone(MFI.hasRedZone()),
29 StackSizeSVE(MFI.hasCalculatedStackSizeSVE()
46 if (
F.hasFnAttribute(
"ptrauth-returns"))
51 if (!
F.hasFnAttribute(
"sign-return-address"))
52 return {
false,
false};
54 StringRef Scope =
F.getFnAttribute(
"sign-return-address").getValueAsString();
56 return {
false,
false};
61 assert(Scope ==
"non-leaf");
66 if (
F.hasFnAttribute(
"ptrauth-returns"))
68 if (!
F.hasFnAttribute(
"sign-return-address-key")) {
75 F.getFnAttribute(
"sign-return-address-key").getValueAsString();
76 assert(Key ==
"a_key" || Key ==
"b_key");
77 return Key ==
"b_key";
84 const Module *M =
F.getParent();
85 const auto *Flag = mdconst::extract_or_null<ConstantInt>(
86 M->getModuleFlag(
"ptrauth-elf-got"));
87 if (Flag && Flag->getZExtValue() == 1)
96 if (
F.hasFnAttribute(Attribute::NoRedZone))
102 IsMTETagged =
F.hasFnAttribute(Attribute::SanitizeMemTag);
105 BranchTargetEnforcement =
F.hasFnAttribute(
"branch-target-enforcement");
106 BranchProtectionPAuthLR =
F.hasFnAttribute(
"branch-protection-pauth-lr");
115 if (
F.hasFnAttribute(
"stack-probe-size"))
116 ProbeSize =
F.getFnAttributeAsParsedInteger(
"stack-probe-size");
117 else if (
const auto *PS = mdconst::extract_or_null<ConstantInt>(
118 F.getParent()->getModuleFlag(
"stack-probe-size")))
119 ProbeSize = PS->getZExtValue();
120 assert(int64_t(ProbeSize) > 0 &&
"Invalid stack probe size");
123 if (!
F.hasFnAttribute(
"no-stack-arg-probe"))
124 StackProbeSize = ProbeSize;
129 ProbeSize = std::max(StackAlign, ProbeSize & ~(StackAlign - 1U));
131 if (
F.hasFnAttribute(
"probe-stack"))
132 ProbeKind =
F.getFnAttribute(
"probe-stack").getValueAsString();
133 else if (
const auto *PS = dyn_cast_or_null<MDString>(
134 F.getParent()->getModuleFlag(
"probe-stack")))
135 ProbeKind = PS->getString();
136 if (ProbeKind.
size()) {
137 if (ProbeKind !=
"inline-asm")
139 StackProbeSize = ProbeSize;
152 if (!SignReturnAddress)
154 if (SignReturnAddressAll)
162 [](
const auto &
Info) { return Info.getReg() == AArch64::LR; });
184 if (!NeedsDwarfUnwindInfo)
188 return *NeedsDwarfUnwindInfo;
193 if (!NeedsAsyncDwarfUnwindInfo) {
199 NeedsAsyncDwarfUnwindInfo =
200 needsDwarfUnwindInfo(MF) &&
204 return *NeedsAsyncDwarfUnwindInfo;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static std::pair< bool, bool > GetSignReturnAddress(const Function &F)
static bool ShouldSignWithBKey(const Function &F, const AArch64Subtarget &STI)
static bool hasELFSignedGOTHelper(const Function &F, const AArch64Subtarget *STI)
static bool isLRSpilled(const MachineFunction &MF)
Analysis containing CSE Info
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Module.h This file contains the declarations for the Module class.
AArch64FunctionInfo - This class is derived from MachineFunctionInfo and contains private AArch64-spe...
bool needsShadowCallStackPrologueEpilogue(MachineFunction &MF) const
bool hasStreamingModeChanges() const
bool shouldSignReturnAddress(const MachineFunction &MF) const
bool needsDwarfUnwindInfo(const MachineFunction &MF) const
void initializeBaseYamlFields(const yaml::AArch64FunctionInfo &YamlMFI)
bool needsAsyncDwarfUnwindInfo(const MachineFunction &MF) const
MachineFunctionInfo * clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF, const DenseMap< MachineBasicBlock *, MachineBasicBlock * > &Src2DstMBB) const override
Make a functionally equivalent copy of this MachineFunctionInfo in MF.
bool isTargetWindows() const
const Triple & getTargetTriple() const
bool isXRegisterReserved(size_t i) const
const AArch64FrameLowering * getFrameLowering() const override
Allocate memory in an ever growing pool, as if by bump-pointer.
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
bool usesWindowsCFI() const
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
bool needsFrameMoves() const
True if this function needs frame moves for debug or exceptions.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
Function & getFunction()
Return the LLVM function that this machine code represents.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
Ty * cloneInfo(const Ty &Old)
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
A Module instance is used to store all the information related to an LLVM module.
SMEAttrs is a utility class to parse the SME ACLE attributes on functions.
StringRef - Represent a constant reference to a string, i.e.
constexpr size_t size() const
size - Get the string size.
Align getTransientStackAlign() const
getTransientStackAlignment - This method returns the number of bytes to which the stack pointer must ...
const MCAsmInfo * getMCAsmInfo() const
Return target specific asm information.
bool isOSWindows() const
Tests whether the OS is Windows.
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
This is an optimization pass for GlobalISel generic memory operations.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
@ Async
"Asynchronous" unwind tables (instr precise)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Implement std::hash so that hash_code can be used in STL containers.
uint64_t value() const
This is a hole in the type system and should not be abused.
MachineFunctionInfo - This class can be derived from and used by targets to hold private target-speci...
std::optional< bool > HasRedZone
std::optional< uint64_t > StackSizeSVE
AArch64FunctionInfo()=default
void mappingImpl(yaml::IO &YamlIO) override