[clang] [llvm] [ARM][AArch64] BTI, GCS, PAC Module flag update. (PR #86212)
Daniil Kovalev via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 22 03:31:34 PDT 2024
================
@@ -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";
+ if (SRA && isModuleAttributeOne(M, "sign-return-address-all"))
+ SignTypeValue = "all";
+
+ StringRef SignKeyValue = "a_key";
----------------
kovdan01 wrote:
Is there a test case for "a_key" value of "sign-return-address-key" function attribute?
https://github.com/llvm/llvm-project/pull/86212
More information about the llvm-commits
mailing list