llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Oliver Hunt (ojhunt)

<details>
<summary>Changes</summary>

This PR makes sure that when targeting arm64e on darwin platforms the correct 
flags are set for the userspace platform ABI.

---
Full diff: https://github.com/llvm/llvm-project/pull/153722.diff


4 Files Affected:

- (modified) clang/include/clang/Basic/Features.def (+1-1) 
- (modified) clang/lib/Driver/ToolChains/Darwin.cpp (+36) 
- (added) clang/test/Driver/ptrauth-platform-defaults.c (+71) 
- (added) clang/test/Sema/ptrauth-platform-defaults.c (+45) 


``````````diff
diff --git a/clang/include/clang/Basic/Features.def 
b/clang/include/clang/Basic/Features.def
index b9efc6a6a2e9d..e59c33a695a4d 100644
--- a/clang/include/clang/Basic/Features.def
+++ b/clang/include/clang/Basic/Features.def
@@ -164,7 +164,7 @@ FEATURE(ptrauth_elf_got, LangOpts.PointerAuthELFGOT)
 
 FEATURE(ptrauth_objc_isa, LangOpts.PointerAuthObjcIsa)
 FEATURE(ptrauth_objc_interface_sel, LangOpts.PointerAuthObjcInterfaceSel)
-FEATURE(ptrauth_objc_signable_class, true)
+FEATURE(ptrauth_objc_signable_class, LangOpts.PointerAuthCalls || 
LangOpts.PointerAuthIntrinsics)
 FEATURE(ptrauth_objc_method_list_pointer, LangOpts.PointerAuthCalls)
 
 EXTENSION(swiftcc,
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp 
b/clang/lib/Driver/ToolChains/Darwin.cpp
index e5075cbcaf660..4a512f83eac36 100644
--- a/clang/lib/Driver/ToolChains/Darwin.cpp
+++ b/clang/lib/Driver/ToolChains/Darwin.cpp
@@ -3291,6 +3291,42 @@ void Darwin::addClangTargetOptions(
     if (!RequiresSubdirectorySearch)
       CC1Args.push_back("-fno-modulemap-allow-subdirectory-search");
   }
+
+  if (getTriple().isArm64e()) {
+    auto EnsureDefaultPtrauthFlag = [&](OptSpecifier Pos, OptSpecifier Neg) {
+      assert(Pos != Neg);
+      if (const Arg *Opt = DriverArgs.getLastArg(Pos, Neg);
+          Opt && Opt->getOption().matches(Neg)) {
+        Option NegOpt = getDriverOptTable().getOption(Neg);
+        CC1Args.push_back(NegOpt.getPrefixedName().data());
+        return;
+      }
+      Option PosOpt = getDriverOptTable().getOption(Pos);
+      CC1Args.push_back(PosOpt.getPrefixedName().data());
+    };
+    EnsureDefaultPtrauthFlag(options::OPT_fptrauth_calls,
+                             options::OPT_fno_ptrauth_calls);
+    EnsureDefaultPtrauthFlag(options::OPT_fptrauth_returns,
+                             options::OPT_fno_ptrauth_returns);
+    EnsureDefaultPtrauthFlag(options::OPT_fptrauth_intrinsics,
+                             options::OPT_fno_ptrauth_intrinsics);
+    EnsureDefaultPtrauthFlag(options::OPT_fptrauth_indirect_gotos,
+                             options::OPT_fno_ptrauth_indirect_gotos);
+    EnsureDefaultPtrauthFlag(options::OPT_fptrauth_auth_traps,
+                             options::OPT_fno_ptrauth_auth_traps);
+    EnsureDefaultPtrauthFlag(
+        options::OPT_fptrauth_vtable_pointer_address_discrimination,
+        options::OPT_fno_ptrauth_vtable_pointer_address_discrimination);
+    EnsureDefaultPtrauthFlag(
+        options::OPT_fptrauth_vtable_pointer_type_discrimination,
+        options::OPT_fno_ptrauth_vtable_pointer_type_discrimination);
+    EnsureDefaultPtrauthFlag(options::OPT_fptrauth_objc_isa,
+                             options::OPT_fno_ptrauth_objc_isa);
+    EnsureDefaultPtrauthFlag(options::OPT_fptrauth_objc_class_ro,
+                             options::OPT_fno_ptrauth_objc_class_ro);
+    EnsureDefaultPtrauthFlag(options::OPT_fptrauth_objc_interface_sel,
+                             options::OPT_fno_ptrauth_objc_interface_sel);
+  }
 }
 
 void Darwin::addClangCC1ASTargetOptions(
diff --git a/clang/test/Driver/ptrauth-platform-defaults.c 
b/clang/test/Driver/ptrauth-platform-defaults.c
new file mode 100644
index 0000000000000..6b0e81b77a7c3
--- /dev/null
+++ b/clang/test/Driver/ptrauth-platform-defaults.c
@@ -0,0 +1,71 @@
+// RUN: %clang -target arm64                   -DNO_DEFAULT_PTRAUTH     %s 
-fsyntax-only -Xclang -verify=no_default_ptrauth
+// RUN: %clang -target arm64-apple-macosx      -DNO_DEFAULT_PTRAUTH     %s 
-fsyntax-only -Xclang -verify=no_default_ptrauth
+// RUN: %clang -target arm64-darwin            -DNO_DEFAULT_PTRAUTH     %s 
-fsyntax-only -Xclang -verify=no_default_ptrauth
+// RUN: %clang -target arm64-apple-darwin      -DNO_DEFAULT_PTRAUTH     %s 
-fsyntax-only -Xclang -verify=no_default_ptrauth
+// RUN: %clang -target arm64-apple-ios-macabi  -DNO_DEFAULT_PTRAUTH     %s 
-fsyntax-only -Xclang -verify=no_default_ptrauth
+// RUN: %clang -target arm64-linux-gnu         -DNO_DEFAULT_PTRAUTH     %s 
-fsyntax-only -Xclang -verify=no_default_ptrauth
+// RUN: %clang -target arm64e-linux-gnu        -DNO_DEFAULT_PTRAUTH     %s 
-fsyntax-only -Xclang -verify=no_default_ptrauth
+// RUN: %clang -target aarch64-linux-gnu       -DNO_DEFAULT_PTRAUTH     %s 
-fsyntax-only -Xclang -verify=no_default_ptrauth
+// RUN: %clang -target arm64e-apple-macosx     -DDARWIN_DEFAULT_PTRAUTH %s 
-fsyntax-only -Xclang -verify=darwin_ptrauth_defaults
+// RUN: %clang -target arm64e-apple-ios        -DDARWIN_DEFAULT_PTRAUTH %s 
-fsyntax-only -Xclang -verify=darwin_ptrauth_defaults
+// RUN: %clang -target arm64e-darwin           -DDARWIN_DEFAULT_PTRAUTH %s 
-fsyntax-only -Xclang -verify=darwin_ptrauth_defaults
+// RUN: %clang -target arm64e-apple-darwin     -DDARWIN_DEFAULT_PTRAUTH %s 
-fsyntax-only -Xclang -verify=darwin_ptrauth_defaults
+// RUN: %clang -target arm64e-apple-ios-macabi -DDARWIN_DEFAULT_PTRAUTH %s 
-fsyntax-only -Xclang -verify=darwin_ptrauth_defaults
+
+#define ASSERT_MODE_AND_KIND(feature, enabled, kind)                           
\
+  _Static_assert(enabled == __has_##kind(feature),                             
\
+                "Expected to have the " #feature " " #kind " enabled");
+
+#define ASSERT_FEATURE_ENABLED(feature_name)                                   
\
+  ASSERT_MODE_AND_KIND(feature_name, 1, feature)
+#define ASSERT_FEATURE_DISABLED(feature_name)                                  
\
+  ASSERT_MODE_AND_KIND(feature_name, 0, feature)
+#define ASSERT_EXTENSION_ENABLED(extension_name)                               
\
+  ASSERT_MODE_AND_KIND(extension_name, 1, extension)
+#define ASSERT_EXTENSION_DISABLED(extension_name)                              
\
+  ASSERT_MODE_AND_KIND(extension_name, 0, extension)
+
+#ifdef DARWIN_DEFAULT_PTRAUTH
+ASSERT_FEATURE_ENABLED(ptrauth_intrinsics)
+ASSERT_EXTENSION_ENABLED(ptrauth_qualifier)
+ASSERT_FEATURE_ENABLED(ptrauth_calls)
+ASSERT_FEATURE_ENABLED(ptrauth_returns)
+ASSERT_FEATURE_ENABLED(ptrauth_vtable_pointer_address_discrimination)
+ASSERT_FEATURE_ENABLED(ptrauth_vtable_pointer_type_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_type_info_vtable_pointer_discrimination)
+ASSERT_FEATURE_ENABLED(ptrauth_member_function_pointer_type_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_signed_block_descriptors)
+ASSERT_FEATURE_DISABLED(ptrauth_function_pointer_type_discrimination)
+ASSERT_FEATURE_ENABLED(ptrauth_indirect_gotos)
+ASSERT_FEATURE_DISABLED(ptrauth_init_fini)
+ASSERT_FEATURE_DISABLED(ptrauth_init_fini_address_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_elf_got)
+ASSERT_FEATURE_ENABLED(ptrauth_objc_isa)
+ASSERT_FEATURE_ENABLED(ptrauth_objc_interface_sel)
+ASSERT_FEATURE_ENABLED(ptrauth_objc_signable_class)
+ASSERT_FEATURE_ENABLED(ptrauth_objc_method_list_pointer)
+#endif
+
+#ifdef NO_DEFAULT_PTRAUTH
+ASSERT_FEATURE_DISABLED(ptrauth_intrinsics)
+ASSERT_EXTENSION_DISABLED(ptrauth_qualifier)
+ASSERT_FEATURE_DISABLED(ptrauth_calls)
+ASSERT_FEATURE_DISABLED(ptrauth_returns)
+ASSERT_FEATURE_DISABLED(ptrauth_vtable_pointer_address_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_vtable_pointer_type_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_type_info_vtable_pointer_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_member_function_pointer_type_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_signed_block_descriptors)
+ASSERT_FEATURE_DISABLED(ptrauth_function_pointer_type_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_indirect_gotos)
+ASSERT_FEATURE_DISABLED(ptrauth_init_fini)
+ASSERT_FEATURE_DISABLED(ptrauth_init_fini_address_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_elf_got)
+ASSERT_FEATURE_DISABLED(ptrauth_objc_isa)
+ASSERT_FEATURE_DISABLED(ptrauth_objc_interface_sel)
+ASSERT_FEATURE_DISABLED(ptrauth_objc_signable_class)
+ASSERT_FEATURE_DISABLED(ptrauth_objc_method_list_pointer)
+#endif
+
+// darwin_ptrauth_defaults-no-diagnostics
+// no_default_ptrauth-no-diagnostics
diff --git a/clang/test/Sema/ptrauth-platform-defaults.c 
b/clang/test/Sema/ptrauth-platform-defaults.c
new file mode 100644
index 0000000000000..0dcddbfa22f76
--- /dev/null
+++ b/clang/test/Sema/ptrauth-platform-defaults.c
@@ -0,0 +1,45 @@
+// RUN: %clang_cc1 -triple arm64                   %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64-apple-macosx      %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64-darwin            %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64-apple-darwin      %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64-apple-ios-macabi  %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64-linux-gnu         %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64e-linux-gnu        %s -fsyntax-only
+// RUN: %clang_cc1 -triple aarch64-linux-gnu       %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64e-apple-macosx     %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64e-apple-ios        %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64e-darwin           %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64e-apple-darwin     %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64e-apple-ios-macabi %s -fsyntax-only
+
+// The -cc1 mode should not insert default ptrauth flags
+
+#define ASSERT_MODE_AND_KIND(feature, enabled, kind)                           
\
+  _Static_assert(enabled == __has_##kind(feature),                             
\
+                "Expected to have the " #feature " " #kind " enabled");
+
+#define ASSERT_FEATURE_DISABLED(feature_name)                                  
\
+  ASSERT_MODE_AND_KIND(feature_name, 0, feature)
+#define ASSERT_EXTENSION_DISABLED(extension_name)                              
\
+  ASSERT_MODE_AND_KIND(extension_name, 0, extension)
+
+ASSERT_FEATURE_DISABLED(ptrauth_intrinsics)
+ASSERT_EXTENSION_DISABLED(ptrauth_qualifier)
+ASSERT_FEATURE_DISABLED(ptrauth_calls)
+ASSERT_FEATURE_DISABLED(ptrauth_returns)
+ASSERT_FEATURE_DISABLED(ptrauth_vtable_pointer_address_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_vtable_pointer_type_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_type_info_vtable_pointer_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_member_function_pointer_type_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_signed_block_descriptors)
+ASSERT_FEATURE_DISABLED(ptrauth_function_pointer_type_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_indirect_gotos)
+ASSERT_FEATURE_DISABLED(ptrauth_init_fini)
+ASSERT_FEATURE_DISABLED(ptrauth_init_fini_address_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_elf_got)
+ASSERT_FEATURE_DISABLED(ptrauth_objc_isa)
+ASSERT_FEATURE_DISABLED(ptrauth_objc_interface_sel)
+ASSERT_FEATURE_DISABLED(ptrauth_objc_signable_class)
+ASSERT_FEATURE_DISABLED(ptrauth_objc_method_list_pointer)
+
+// expected-no-diagnostics

``````````

</details>


https://github.com/llvm/llvm-project/pull/153722
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to