diff options
author | shadchin <shadchin@yandex-team.ru> | 2022-02-10 16:44:39 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:44:39 +0300 |
commit | e9656aae26e0358d5378e5b63dcac5c8dbe0e4d0 (patch) | |
tree | 64175d5cadab313b3e7039ebaa06c5bc3295e274 /contrib/libs/llvm12/lib/Target/AArch64/AArch64MachineFunctionInfo.cpp | |
parent | 2598ef1d0aee359b4b6d5fdd1758916d5907d04f (diff) | |
download | ydb-e9656aae26e0358d5378e5b63dcac5c8dbe0e4d0.tar.gz |
Restoring authorship annotation for <shadchin@yandex-team.ru>. Commit 2 of 2.
Diffstat (limited to 'contrib/libs/llvm12/lib/Target/AArch64/AArch64MachineFunctionInfo.cpp')
-rw-r--r-- | contrib/libs/llvm12/lib/Target/AArch64/AArch64MachineFunctionInfo.cpp | 164 |
1 files changed, 82 insertions, 82 deletions
diff --git a/contrib/libs/llvm12/lib/Target/AArch64/AArch64MachineFunctionInfo.cpp b/contrib/libs/llvm12/lib/Target/AArch64/AArch64MachineFunctionInfo.cpp index ebb501b779..41343ba970 100644 --- a/contrib/libs/llvm12/lib/Target/AArch64/AArch64MachineFunctionInfo.cpp +++ b/contrib/libs/llvm12/lib/Target/AArch64/AArch64MachineFunctionInfo.cpp @@ -14,9 +14,9 @@ //===----------------------------------------------------------------------===// #include "AArch64MachineFunctionInfo.h" -#include "AArch64InstrInfo.h" -#include <llvm/IR/Metadata.h> -#include <llvm/IR/Module.h> +#include "AArch64InstrInfo.h" +#include <llvm/IR/Metadata.h> +#include <llvm/IR/Module.h> using namespace llvm; @@ -33,82 +33,82 @@ void AArch64FunctionInfo::initializeBaseYamlFields( if (YamlMFI.HasRedZone.hasValue()) HasRedZone = YamlMFI.HasRedZone; } - -static std::pair<bool, bool> GetSignReturnAddress(const Function &F) { - // The function should be signed in the following situations: - // - sign-return-address=all - // - sign-return-address=non-leaf and the functions spills the LR - if (!F.hasFnAttribute("sign-return-address")) { - const Module &M = *F.getParent(); - if (const auto *Sign = mdconst::extract_or_null<ConstantInt>( - M.getModuleFlag("sign-return-address"))) { - if (Sign->getZExtValue()) { - if (const auto *All = mdconst::extract_or_null<ConstantInt>( - M.getModuleFlag("sign-return-address-all"))) - return {true, All->getZExtValue()}; - return {true, false}; - } - } - return {false, false}; - } - - StringRef Scope = F.getFnAttribute("sign-return-address").getValueAsString(); - if (Scope.equals("none")) - return {false, false}; - - if (Scope.equals("all")) - return {true, true}; - - assert(Scope.equals("non-leaf")); - return {true, false}; -} - -static bool ShouldSignWithBKey(const Function &F) { - if (!F.hasFnAttribute("sign-return-address-key")) { - if (const auto *BKey = mdconst::extract_or_null<ConstantInt>( - F.getParent()->getModuleFlag("sign-return-address-with-bkey"))) - return BKey->getZExtValue(); - return false; - } - - const StringRef Key = - F.getFnAttribute("sign-return-address-key").getValueAsString(); - assert(Key.equals_lower("a_key") || Key.equals_lower("b_key")); - return Key.equals_lower("b_key"); -} - -AArch64FunctionInfo::AArch64FunctionInfo(MachineFunction &MF) : MF(MF) { - // If we already know that the function doesn't have a redzone, set - // HasRedZone here. - if (MF.getFunction().hasFnAttribute(Attribute::NoRedZone)) - HasRedZone = false; - - const Function &F = MF.getFunction(); - std::tie(SignReturnAddress, SignReturnAddressAll) = GetSignReturnAddress(F); - SignWithBKey = ShouldSignWithBKey(F); - - if (!F.hasFnAttribute("branch-target-enforcement")) { - if (const auto *BTE = mdconst::extract_or_null<ConstantInt>( - F.getParent()->getModuleFlag("branch-target-enforcement"))) - BranchTargetEnforcement = BTE->getZExtValue(); - return; - } - - const StringRef BTIEnable = F.getFnAttribute("branch-target-enforcement").getValueAsString(); - assert(BTIEnable.equals_lower("true") || BTIEnable.equals_lower("false")); - BranchTargetEnforcement = BTIEnable.equals_lower("true"); -} - -bool AArch64FunctionInfo::shouldSignReturnAddress(bool SpillsLR) const { - if (!SignReturnAddress) - return false; - if (SignReturnAddressAll) - return true; - return SpillsLR; -} - -bool AArch64FunctionInfo::shouldSignReturnAddress() const { - return shouldSignReturnAddress(llvm::any_of( - MF.getFrameInfo().getCalleeSavedInfo(), - [](const auto &Info) { return Info.getReg() == AArch64::LR; })); -} + +static std::pair<bool, bool> GetSignReturnAddress(const Function &F) { + // The function should be signed in the following situations: + // - sign-return-address=all + // - sign-return-address=non-leaf and the functions spills the LR + if (!F.hasFnAttribute("sign-return-address")) { + const Module &M = *F.getParent(); + if (const auto *Sign = mdconst::extract_or_null<ConstantInt>( + M.getModuleFlag("sign-return-address"))) { + if (Sign->getZExtValue()) { + if (const auto *All = mdconst::extract_or_null<ConstantInt>( + M.getModuleFlag("sign-return-address-all"))) + return {true, All->getZExtValue()}; + return {true, false}; + } + } + return {false, false}; + } + + StringRef Scope = F.getFnAttribute("sign-return-address").getValueAsString(); + if (Scope.equals("none")) + return {false, false}; + + if (Scope.equals("all")) + return {true, true}; + + assert(Scope.equals("non-leaf")); + return {true, false}; +} + +static bool ShouldSignWithBKey(const Function &F) { + if (!F.hasFnAttribute("sign-return-address-key")) { + if (const auto *BKey = mdconst::extract_or_null<ConstantInt>( + F.getParent()->getModuleFlag("sign-return-address-with-bkey"))) + return BKey->getZExtValue(); + return false; + } + + const StringRef Key = + F.getFnAttribute("sign-return-address-key").getValueAsString(); + assert(Key.equals_lower("a_key") || Key.equals_lower("b_key")); + return Key.equals_lower("b_key"); +} + +AArch64FunctionInfo::AArch64FunctionInfo(MachineFunction &MF) : MF(MF) { + // If we already know that the function doesn't have a redzone, set + // HasRedZone here. + if (MF.getFunction().hasFnAttribute(Attribute::NoRedZone)) + HasRedZone = false; + + const Function &F = MF.getFunction(); + std::tie(SignReturnAddress, SignReturnAddressAll) = GetSignReturnAddress(F); + SignWithBKey = ShouldSignWithBKey(F); + + if (!F.hasFnAttribute("branch-target-enforcement")) { + if (const auto *BTE = mdconst::extract_or_null<ConstantInt>( + F.getParent()->getModuleFlag("branch-target-enforcement"))) + BranchTargetEnforcement = BTE->getZExtValue(); + return; + } + + const StringRef BTIEnable = F.getFnAttribute("branch-target-enforcement").getValueAsString(); + assert(BTIEnable.equals_lower("true") || BTIEnable.equals_lower("false")); + BranchTargetEnforcement = BTIEnable.equals_lower("true"); +} + +bool AArch64FunctionInfo::shouldSignReturnAddress(bool SpillsLR) const { + if (!SignReturnAddress) + return false; + if (SignReturnAddressAll) + return true; + return SpillsLR; +} + +bool AArch64FunctionInfo::shouldSignReturnAddress() const { + return shouldSignReturnAddress(llvm::any_of( + MF.getFrameInfo().getCalleeSavedInfo(), + [](const auto &Info) { return Info.getReg() == AArch64::LR; })); +} |