https://gcc.gnu.org/g:c93a9bba743ac236f6045ba7aafbc12a83726c48

commit r13-8873-gc93a9bba743ac236f6045ba7aafbc12a83726c48
Author: Andrew Carlotti <andrew.carlo...@arm.com>
Date:   Fri Nov 24 17:06:07 2023 +0000

    aarch64: Fix +nocrypto handling
    
    Additionally, replace all checks for the AARCH64_FL_CRYPTO bit with
    checks for (AARCH64_FL_AES | AARCH64_FL_SHA2) instead.  The value of the
    AARCH64_FL_CRYPTO bit within isa_flags is now ignored, but it is
    retained because removing it would make processing the data in
    option-extensions.def significantly more complex.
    
    This bug should have been picked up by an existing test, but a missing
    newline meant that the pattern incorrectly allowed "+crypto+nocrypto".
    
    gcc/ChangeLog:
    
            PR target/115618
            * common/config/aarch64/aarch64-common.cc
            (aarch64_get_extension_string_for_isa_flags): Fix generation of
            the "+nocrypto" extension.
            * config/aarch64/aarch64.h (AARCH64_ISA_CRYPTO): Remove.
            (TARGET_CRYPTO): Remove.
            * config/aarch64/aarch64-c.cc (aarch64_update_cpp_builtins):
            Don't use TARGET_CRYPTO.
    
    gcc/testsuite/ChangeLog:
    
            PR target/115618
            * gcc.target/aarch64/options_set_4.c: Add terminating newline.
            * gcc.target/aarch64/options_set_27.c: New test.
    
    (cherry picked from commit 8d30107455f2309854ced3d65fb07dc1f2c357c0)

Diff:
---
 gcc/common/config/aarch64/aarch64-common.cc       | 35 +++++++++++++++++------
 gcc/config/aarch64/aarch64-c.cc                   |  2 +-
 gcc/config/aarch64/aarch64.h                      | 10 +++----
 gcc/testsuite/gcc.target/aarch64/options_set_27.c |  9 ++++++
 gcc/testsuite/gcc.target/aarch64/options_set_4.c  |  2 +-
 5 files changed, 43 insertions(+), 15 deletions(-)

diff --git a/gcc/common/config/aarch64/aarch64-common.cc 
b/gcc/common/config/aarch64/aarch64-common.cc
index 20bc4e1291b..673407ca9a8 100644
--- a/gcc/common/config/aarch64/aarch64-common.cc
+++ b/gcc/common/config/aarch64/aarch64-common.cc
@@ -310,6 +310,7 @@ aarch64_get_extension_string_for_isa_flags
      But in order to make the output more readable, it seems better
      to add the strings in definition order.  */
   aarch64_feature_flags added = 0;
+  auto flags_crypto = AARCH64_FL_AES | AARCH64_FL_SHA2;
   for (unsigned int i = ARRAY_SIZE (all_extensions); i-- > 0; )
     {
       auto &opt = all_extensions[i];
@@ -319,7 +320,7 @@ aarch64_get_extension_string_for_isa_flags
         per-feature crypto flags.  */
       auto flags = opt.flag_canonical;
       if (flags == AARCH64_FL_CRYPTO)
-       flags = AARCH64_FL_AES | AARCH64_FL_SHA2;
+       flags = flags_crypto;
 
       if ((flags & isa_flags & (explicit_flags | ~current_flags)) == flags)
        {
@@ -338,14 +339,32 @@ aarch64_get_extension_string_for_isa_flags
      not have an HWCAPs then it shouldn't be taken into account for feature
      detection because one way or another we can't tell if it's available
      or not.  */
+
   for (auto &opt : all_extensions)
-    if (opt.native_detect_p
-       && (opt.flag_canonical & current_flags & ~isa_flags))
-      {
-       current_flags &= ~opt.flags_off;
-       outstr += "+no";
-       outstr += opt.name;
-      }
+    {
+      auto flags = opt.flag_canonical;
+      /* As a special case, don't emit "+noaes" or "+nosha2" when we could emit
+        "+nocrypto" instead, in order to support assemblers that predate the
+        separate per-feature crypto flags.  Only allow "+nocrypto" when "sm4"
+        is not already enabled (to avoid dependending on whether "+nocrypto"
+        also disables "sm4").  */
+      if (flags & flags_crypto
+         && (flags_crypto & current_flags & ~isa_flags) == flags_crypto
+         && !(current_flags & AARCH64_FL_SM4))
+         continue;
+
+      if (flags == AARCH64_FL_CRYPTO)
+       /* If either crypto flag needs removing here, then both do.  */
+       flags = flags_crypto;
+
+      if (opt.native_detect_p
+         && (flags & current_flags & ~isa_flags))
+       {
+         current_flags &= ~opt.flags_off;
+         outstr += "+no";
+         outstr += opt.name;
+       }
+    }
 
   return outstr;
 }
diff --git a/gcc/config/aarch64/aarch64-c.cc b/gcc/config/aarch64/aarch64-c.cc
index 578ec6f45b0..6c5331a7625 100644
--- a/gcc/config/aarch64/aarch64-c.cc
+++ b/gcc/config/aarch64/aarch64-c.cc
@@ -139,7 +139,7 @@ aarch64_update_cpp_builtins (cpp_reader *pfile)
   aarch64_def_or_undef (TARGET_ILP32, "_ILP32", pfile);
   aarch64_def_or_undef (TARGET_ILP32, "__ILP32__", pfile);
 
-  aarch64_def_or_undef (TARGET_CRYPTO, "__ARM_FEATURE_CRYPTO", pfile);
+  aarch64_def_or_undef (TARGET_AES && TARGET_SHA2, "__ARM_FEATURE_CRYPTO", 
pfile);
   aarch64_def_or_undef (TARGET_SIMD_RDMA, "__ARM_FEATURE_QRDMX", pfile);
   aarch64_def_or_undef (TARGET_SVE, "__ARM_FEATURE_SVE", pfile);
   cpp_undef (pfile, "__ARM_FEATURE_SVE_BITS");
diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
index cfeaf4657ab..996a261334a 100644
--- a/gcc/config/aarch64/aarch64.h
+++ b/gcc/config/aarch64/aarch64.h
@@ -177,10 +177,13 @@ enum class aarch64_feature : unsigned char {
 
 #endif
 
-/* Macros to test ISA flags.  */
+/* Macros to test ISA flags.
+
+   There is intentionally no macro for AARCH64_FL_CRYPTO, since this flag bit
+   is not always set when its constituent features are present.
+   Check (TARGET_AES && TARGET_SHA2) instead.  */
 
 #define AARCH64_ISA_CRC            (aarch64_isa_flags & AARCH64_FL_CRC)
-#define AARCH64_ISA_CRYPTO         (aarch64_isa_flags & AARCH64_FL_CRYPTO)
 #define AARCH64_ISA_FP             (aarch64_isa_flags & AARCH64_FL_FP)
 #define AARCH64_ISA_SIMD           (aarch64_isa_flags & AARCH64_FL_SIMD)
 #define AARCH64_ISA_LSE                   (aarch64_isa_flags & AARCH64_FL_LSE)
@@ -224,9 +227,6 @@ enum class aarch64_feature : unsigned char {
 #define AARCH64_ISA_CSSC          (aarch64_isa_flags & AARCH64_FL_CSSC)
 #define AARCH64_ISA_RCPC           (aarch64_isa_flags & AARCH64_FL_RCPC)
 
-/* Crypto is an optional extension to AdvSIMD.  */
-#define TARGET_CRYPTO (AARCH64_ISA_CRYPTO)
-
 /* SHA2 is an optional extension to AdvSIMD.  */
 #define TARGET_SHA2 (AARCH64_ISA_SHA2)
 
diff --git a/gcc/testsuite/gcc.target/aarch64/options_set_27.c 
b/gcc/testsuite/gcc.target/aarch64/options_set_27.c
new file mode 100644
index 00000000000..e3574464013
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/options_set_27.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-march=armv8.2-a+aes+sha3" } */
+
+int main ()
+{
+  return 0;
+}
+
+/* { dg-final { scan-assembler-times {\.arch armv8\.2\-a\+crc\+aes\+sha3\n} 1 
} } */
diff --git a/gcc/testsuite/gcc.target/aarch64/options_set_4.c 
b/gcc/testsuite/gcc.target/aarch64/options_set_4.c
index 5370e02e153..7b00d09a47f 100644
--- a/gcc/testsuite/gcc.target/aarch64/options_set_4.c
+++ b/gcc/testsuite/gcc.target/aarch64/options_set_4.c
@@ -6,7 +6,7 @@ int main ()
   return 0;
 }
 
-/* { dg-final { scan-assembler-times {\.arch armv8\.2\-a\+crc\+crypto} 1 } } */
+/* { dg-final { scan-assembler-times {\.arch armv8\.2\-a\+crc\+crypto\n} 1 } } 
*/
 
 /* Check if individual bits that make up a grouping is specified that only the
    grouping is kept. */

Reply via email to