]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libatomic: Add support for __ifunc_arg_t arg in ifunc resolver
authorVictor Do Nascimento <victor.donascimento@arm.com>
Thu, 18 Jan 2024 19:27:25 +0000 (19:27 +0000)
committerVictor Do Nascimento <victor.donascimento@arm.com>
Sun, 28 Jan 2024 19:52:42 +0000 (19:52 +0000)
With support for new atomic features in Armv9.4-a being indicated by
HWCAP2 bits, Libatomic's ifunc resolver must now query its second
argument, of type __ifunc_arg_t*.

We therefore make this argument known to libatomic, allowing us to
query hwcap2 bits in the following manner:

  bool
  resolver (unsigned long hwcap, const __ifunc_arg_t *features);
  {
    return (features->hwcap2 & HWCAP2_<FEAT_NAME>);
  }

libatomic/ChangeLog:

* config/linux/aarch64/host-config.h (__ifunc_arg_t):
Conditionally-defined if `sys/ifunc.h' not found.
(_IFUNC_ARG_HWCAP): Likewise.
(IFUNC_COND_1): Pass __ifunc_arg_t argument to ifunc.
(ifunc1): Modify function signature to accept __ifunc_arg_t
argument.
* configure.tgt: Add second `const __ifunc_arg_t *features'
argument to IFUNC_RESOLVER_ARGS.

libatomic/config/linux/aarch64/host-config.h
libatomic/configure.tgt

index 4200293c4e3eca114d687f6e52b2aa7c7a8b055b..8fd4fe3321ad0ca2ca03decb1792de3c30149bbb 100644 (file)
 #if HAVE_IFUNC
 #include <sys/auxv.h>
 
+#if __has_include(<sys/ifunc.h>)
+# include <sys/ifunc.h>
+#else
+typedef struct __ifunc_arg_t {
+  unsigned long _size;
+  unsigned long _hwcap;
+  unsigned long _hwcap2;
+} __ifunc_arg_t;
+# define _IFUNC_ARG_HWCAP (1ULL << 62)
+#endif
+
 #ifdef HWCAP_USCAT
 # if N == 16
-#  define IFUNC_COND_1 ifunc1 (hwcap)
+#  define IFUNC_COND_1 ifunc1 (hwcap, features)
 # else
 #  define IFUNC_COND_1 (hwcap & HWCAP_ATOMICS)
 # endif
@@ -48,7 +59,7 @@
 #define MIDR_PARTNUM(midr)     (((midr) >> 4) & 0xfff)
 
 static inline bool
-ifunc1 (unsigned long hwcap)
+ifunc1 (unsigned long hwcap, const __ifunc_arg_t *features)
 {
   if (hwcap & HWCAP_USCAT)
     return true;
index b7609132c58c87d4bd8dd2f20e07169df7988710..67a5f2dff80f2640c377c70e2f5f9a2d4d408bf9 100644 (file)
@@ -194,7 +194,7 @@ esac
 # The type may be different on different architectures.
 case "${target}" in
   aarch64*-*-*)
-       IFUNC_RESOLVER_ARGS="uint64_t hwcap"
+       IFUNC_RESOLVER_ARGS="uint64_t hwcap, const __ifunc_arg_t *features"
        ;;
   *)
        IFUNC_RESOLVER_ARGS="void"