|  | //===-- ARMMachineFunctionInfo.cpp - ARM machine function info ------------===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "ARMMachineFunctionInfo.h" | 
|  | #include "ARMSubtarget.h" | 
|  |  | 
|  | using namespace llvm; | 
|  |  | 
|  | void ARMFunctionInfo::anchor() {} | 
|  |  | 
|  | yaml::ARMFunctionInfo::ARMFunctionInfo(const llvm::ARMFunctionInfo &MFI) | 
|  | : LRSpilled(MFI.isLRSpilled()) {} | 
|  |  | 
|  | void yaml::ARMFunctionInfo::mappingImpl(yaml::IO &YamlIO) { | 
|  | MappingTraits<ARMFunctionInfo>::mapping(YamlIO, *this); | 
|  | } | 
|  |  | 
|  | void ARMFunctionInfo::initializeBaseYamlFields( | 
|  | const yaml::ARMFunctionInfo &YamlMFI) { | 
|  | LRSpilled = YamlMFI.LRSpilled; | 
|  | } | 
|  |  | 
|  | static bool GetBranchTargetEnforcement(const Function &F, | 
|  | const ARMSubtarget *Subtarget) { | 
|  | if (!Subtarget->isMClass() || !Subtarget->hasV7Ops()) | 
|  | return false; | 
|  |  | 
|  | return F.hasFnAttribute("branch-target-enforcement"); | 
|  | } | 
|  |  | 
|  | // The pair returns values for the ARMFunctionInfo members | 
|  | // SignReturnAddress and SignReturnAddressAll respectively. | 
|  | static std::pair<bool, bool> GetSignReturnAddress(const Function &F) { | 
|  | if (!F.hasFnAttribute("sign-return-address")) { | 
|  | return {false, false}; | 
|  | } | 
|  |  | 
|  | StringRef Scope = F.getFnAttribute("sign-return-address").getValueAsString(); | 
|  | if (Scope == "none") | 
|  | return {false, false}; | 
|  |  | 
|  | if (Scope == "all") | 
|  | return {true, true}; | 
|  |  | 
|  | assert(Scope == "non-leaf"); | 
|  | return {true, false}; | 
|  | } | 
|  |  | 
|  | ARMFunctionInfo::ARMFunctionInfo(const Function &F, | 
|  | const ARMSubtarget *Subtarget) | 
|  | : isThumb(Subtarget->isThumb()), hasThumb2(Subtarget->hasThumb2()), | 
|  | IsCmseNSEntry(F.hasFnAttribute("cmse_nonsecure_entry")), | 
|  | IsCmseNSCall(F.hasFnAttribute("cmse_nonsecure_call")), | 
|  | BranchTargetEnforcement(GetBranchTargetEnforcement(F, Subtarget)) { | 
|  | if (Subtarget->isMClass() && Subtarget->hasV7Ops()) | 
|  | std::tie(SignReturnAddress, SignReturnAddressAll) = GetSignReturnAddress(F); | 
|  | } | 
|  |  | 
|  | MachineFunctionInfo * | 
|  | ARMFunctionInfo::clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF, | 
|  | const DenseMap<MachineBasicBlock *, MachineBasicBlock *> | 
|  | &Src2DstMBB) const { | 
|  | return DestMF.cloneInfo<ARMFunctionInfo>(*this); | 
|  | } |