diff options
Diffstat (limited to 'llvm/lib/IR/Function.cpp')
-rw-r--r-- | llvm/lib/IR/Function.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp index 5fb348a8..2087198 100644 --- a/llvm/lib/IR/Function.cpp +++ b/llvm/lib/IR/Function.cpp @@ -407,6 +407,35 @@ Function *Function::createWithDefaultAttr(FunctionType *Ty, StringRef DefaultFeatures = F->getContext().getDefaultTargetFeatures(); if (!DefaultFeatures.empty()) B.addAttribute("target-features", DefaultFeatures); + + // Check if the module attribute is present and not zero. + auto isModuleAttributeSet = [&](const StringRef &ModAttr) -> bool { + const auto *Attr = + mdconst::extract_or_null<ConstantInt>(M->getModuleFlag(ModAttr)); + return Attr && !Attr->isZero(); + }; + + auto AddAttributeIfSet = [&](const StringRef &ModAttr) { + if (isModuleAttributeSet(ModAttr)) + B.addAttribute(ModAttr); + }; + + StringRef SignType = "none"; + if (isModuleAttributeSet("sign-return-address")) + SignType = "non-leaf"; + if (isModuleAttributeSet("sign-return-address-all")) + SignType = "all"; + if (SignType != "none") { + B.addAttribute("sign-return-address", SignType); + B.addAttribute("sign-return-address-key", + isModuleAttributeSet("sign-return-address-with-bkey") + ? "b_key" + : "a_key"); + } + AddAttributeIfSet("branch-target-enforcement"); + AddAttributeIfSet("branch-protection-pauth-lr"); + AddAttributeIfSet("guarded-control-stack"); + F->addFnAttrs(B); return F; } |