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.
This commit is contained in:
parent
e64602c025
commit
a899a1f2f3
2 changed files with 14 additions and 3 deletions
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Add table
Reference in a new issue