28 : HasRedZone(MFI.hasRedZone()) {}
41 if (
F.hasFnAttribute(
"ptrauth-returns"))
46 if (!
F.hasFnAttribute(
"sign-return-address"))
47 return {
false,
false};
49 StringRef Scope =
F.getFnAttribute(
"sign-return-address").getValueAsString();
51 return {
false,
false};
56 assert(Scope ==
"non-leaf");
61 if (
F.hasFnAttribute(
"ptrauth-returns"))
63 if (!
F.hasFnAttribute(
"sign-return-address-key")) {
70 F.getFnAttribute(
"sign-return-address-key").getValueAsString();
71 assert(Key ==
"a_key" || Key ==
"b_key");
72 return Key ==
"b_key";
79 const Module *M =
F.getParent();
80 const auto *Flag = mdconst::extract_or_null<ConstantInt>(
81 M->getModuleFlag(
"ptrauth-elf-got"));
82 if (Flag && Flag->getZExtValue() == 1)
91 if (
F.hasFnAttribute(Attribute::NoRedZone))
97 IsMTETagged =
F.hasFnAttribute(Attribute::SanitizeMemTag);
100 BranchTargetEnforcement =
F.hasFnAttribute(
"branch-target-enforcement");
101 BranchProtectionPAuthLR =
F.hasFnAttribute(
"branch-protection-pauth-lr");
107 if (
F.hasFnAttribute(
"stack-probe-size"))
108 ProbeSize =
F.getFnAttributeAsParsedInteger(
"stack-probe-size");
109 else if (
const auto *PS = mdconst::extract_or_null<ConstantInt>(
110 F.getParent()->getModuleFlag(
"stack-probe-size")))
111 ProbeSize = PS->getZExtValue();
112 assert(int64_t(ProbeSize) > 0 &&
"Invalid stack probe size");
115 if (!
F.hasFnAttribute(
"no-stack-arg-probe"))
116 StackProbeSize = ProbeSize;
121 ProbeSize = std::max(StackAlign, ProbeSize & ~(StackAlign - 1U));
123 if (
F.hasFnAttribute(
"probe-stack"))
124 ProbeKind =
F.getFnAttribute(
"probe-stack").getValueAsString();
125 else if (
const auto *PS = dyn_cast_or_null<MDString>(
126 F.getParent()->getModuleFlag(
"probe-stack")))
127 ProbeKind = PS->getString();
128 if (ProbeKind.
size()) {
129 if (ProbeKind !=
"inline-asm")
131 StackProbeSize = ProbeSize;
144 if (!SignReturnAddress)
146 if (SignReturnAddressAll)
154 [](
const auto &
Info) { return Info.getReg() == AArch64::LR; });
176 if (!NeedsDwarfUnwindInfo)
180 return *NeedsDwarfUnwindInfo;
185 if (!NeedsAsyncDwarfUnwindInfo) {
191 NeedsAsyncDwarfUnwindInfo =
192 needsDwarfUnwindInfo(MF) &&
196 return *NeedsAsyncDwarfUnwindInfo;
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.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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.
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.
Triple - Helper class for working with autoconf configuration names.
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)
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
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
AArch64FunctionInfo()=default
void mappingImpl(yaml::IO &YamlIO) override