Victor Do Nascimento <victor.donascime...@arm.com> writes: > 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.
OK, thanks. Richard > --- > libatomic/config/linux/aarch64/host-config.h | 15 +++++++++++++-- > 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 4200293c4e3..8fd4fe3321a 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 b7609132c58..67a5f2dff80 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"