diff options
author | Victor Do Nascimento <victor.donascimento@arm.com> | 2024-01-18 19:27:25 +0000 |
---|---|---|
committer | Victor Do Nascimento <victor.donascimento@arm.com> | 2024-01-28 19:52:42 +0000 |
commit | a899a1f2f38724cb35db0f76b67b1c3cc102ea7a (patch) | |
tree | 1748f40d0e2b018b5399e11e11afcc663599b29d /libatomic | |
parent | e64602c025d86a315e9e8a32f08e1bfea6488871 (diff) | |
download | gcc-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')
-rw-r--r-- | libatomic/config/linux/aarch64/host-config.h | 15 | ||||
-rw-r--r-- | libatomic/configure.tgt | 2 |
2 files changed, 14 insertions, 3 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; diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt index b760913..67a5f2d 100644 --- a/libatomic/configure.tgt +++ b/libatomic/configure.tgt @@ -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" |