aboutsummaryrefslogtreecommitdiff
path: root/libatomic/config
diff options
context:
space:
mode:
authorVictor Do Nascimento <victor.donascimento@arm.com>2024-01-18 19:27:25 +0000
committerVictor Do Nascimento <victor.donascimento@arm.com>2024-01-28 19:52:42 +0000
commita899a1f2f38724cb35db0f76b67b1c3cc102ea7a (patch)
tree1748f40d0e2b018b5399e11e11afcc663599b29d /libatomic/config
parente64602c025d86a315e9e8a32f08e1bfea6488871 (diff)
downloadgcc-a899a1f2f38724cb35db0f76b67b1c3cc102ea7a.zip
gcc-a899a1f2f38724cb35db0f76b67b1c3cc102ea7a.tar.gz
gcc-a899a1f2f38724cb35db0f76b67b1c3cc102ea7a.tar.bz2
libatomic: Add support for __ifunc_arg_t arg in ifunc resolver
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.
Diffstat (limited to 'libatomic/config')
-rw-r--r--libatomic/config/linux/aarch64/host-config.h15
1 files changed, 13 insertions, 2 deletions
diff --git a/libatomic/config/linux/aarch64/host-config.h b/libatomic/config/linux/aarch64/host-config.h
index 4200293..8fd4fe3 100644
--- a/libatomic/config/linux/aarch64/host-config.h
+++ b/libatomic/config/linux/aarch64/host-config.h
@@ -24,9 +24,20 @@
#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;