================ @@ -5278,6 +5278,106 @@ void llvm::UpgradeFunctionAttributes(Function &F) { } } +// Check if the module attribute is present and set to one. +static bool isModuleAttributeOne(Module &M, const StringRef &ModAttr) { + const auto *Attr = + mdconst::extract_or_null<ConstantInt>(M.getModuleFlag(ModAttr)); + return Attr && Attr->isOne(); +} + +// Check if the module attribute is present and set to two. +static bool isModuleAttributeTwo(Module &M, const StringRef &ModAttr) { + const auto *Attr = + mdconst::extract_or_null<ConstantInt>(M.getModuleFlag(ModAttr)); + return Attr && Attr->getZExtValue() == 2; +} + +// Check if the function attribute is not present and set it. +static void SetFunctionAttrIfNotSet(Function &F, StringRef FnAttrName, + StringRef Value) { + if (!F.hasFnAttribute(FnAttrName)) + F.addFnAttr(FnAttrName, Value); +} + +// Check if the function attribute is not present and set it if needed. +// If the attribute is "false" then removes it. +// If the attribute is "true" resets it to a valueless attribute. +static void ConvertFunctionAttr(Function &F, bool Set, StringRef FnAttrName) { + if (!F.hasFnAttribute(FnAttrName)) { + if (Set) + F.addFnAttr(FnAttrName); + } else { + auto A = F.getFnAttribute(FnAttrName); + if ("false" == A.getValueAsString()) + F.removeFnAttr(FnAttrName); + else if ("true" == A.getValueAsString()) { + F.removeFnAttr(FnAttrName); + F.addFnAttr(FnAttrName); + } + } +} + +void llvm::CopyModuleAttrToFunctions(Module &M) { + Triple T(M.getTargetTriple()); + if (!T.isThumb() && !T.isARM() && !T.isAArch64()) + return; + + if (isModuleAttributeTwo(M, "branch-target-enforcement")) + return; + if (isModuleAttributeTwo(M, "branch-protection-pauth-lr")) + return; + if (isModuleAttributeTwo(M, "guarded-control-stack")) + return; + if (isModuleAttributeTwo(M, "sign-return-address")) + return; + + bool BTE = isModuleAttributeOne(M, "branch-target-enforcement"); + bool BPPLR = isModuleAttributeOne(M, "branch-protection-pauth-lr"); + bool GCS = isModuleAttributeOne(M, "guarded-control-stack"); + bool SRA = isModuleAttributeOne(M, "sign-return-address"); + + StringRef SignTypeValue = "non-leaf"; ---------------- kovdan01 wrote:
Is there a test case for "non-leaf" value of "sign-return-address" function attribute? https://github.com/llvm/llvm-project/pull/86212 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits