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:
Victor Do Nascimento 2024-01-18 19:27:25 +00:00
parent e64602c025
commit a899a1f2f3
2 changed files with 14 additions and 3 deletions

View file

@ -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;

View 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"