check_symbol_exists(getauxval sys/auxv.h HAVE_GETAUXVAL)
tuklib_add_definition_if(liblzma HAVE_GETAUXVAL)
+ # With getauxval() we also need HWCAP_CRC32 which was
+ # added in glibc 2.24.
+ if(HAVE_GETAUXVAL)
+ check_symbol_exists(HWCAP_CRC32 sys/auxv.h HAVE_HWCAP_CRC32)
+ tuklib_add_definition_if(liblzma HAVE_HWCAP_CRC32)
+ endif()
+
# elf_aux_info() is supported on FreeBSD and OpenBSD >= 7.6.
check_symbol_exists(elf_aux_info sys/auxv.h HAVE_ELF_AUX_INFO)
tuklib_add_definition_if(liblzma HAVE_ELF_AUX_INFO)
# Check for ARM64 CRC32 instruction runtime detection.
#
-# - getauxval() is supported on Linux.
+# - getauxval() is supported on Linux. We also need HWCAP_CRC32 which was
+# added in glibc 2.24.
#
# - elf_aux_info() is supported on FreeBSD and OpenBSD >= 7.6.
#
#
AS_IF([test "x$enable_arm64_crc32" = xyes], [
AC_CHECK_FUNCS([getauxval elf_aux_info sysctlbyname], [break])
+ AC_CHECK_DECL([HWCAP_CRC32], [AC_DEFINE([HAVE_HWCAP_CRC32], [1],
+ [Define to 1 if 'HWCAP_CRC32' is declared in <sys/auxv.h>.])],
+ [], [[#include <sys/auxv.h>]])
])
// If both versions are going to be built, we need runtime detection
// to check if the instructions are supported.
#if defined(CRC32_GENERIC) && defined(CRC32_ARCH_OPTIMIZED)
-# if defined(HAVE_GETAUXVAL) || defined(HAVE_ELF_AUX_INFO)
+# if (defined(HAVE_GETAUXVAL) && defined(HAVE_HWCAP_CRC32)) \
+ || defined(HAVE_ELF_AUX_INFO)
# include <sys/auxv.h>
# elif defined(_WIN32)
# include <processthreadsapi.h>
static inline bool
is_arch_extension_supported(void)
{
-#if defined(HAVE_GETAUXVAL)
+#if defined(HAVE_GETAUXVAL) && defined(HAVE_HWCAP_CRC32)
return (getauxval(AT_HWCAP) & HWCAP_CRC32) != 0;
#elif defined(HAVE_ELF_AUX_INFO)
// ARM64
//
// Keep this in sync with changes to crc32_arm64.h
-#if defined(_WIN32) || defined(HAVE_GETAUXVAL) \
+#if defined(_WIN32) \
+ || (defined(HAVE_GETAUXVAL) && defined(HAVE_HWCAP_CRC32)) \
|| defined(HAVE_ELF_AUX_INFO) \
|| (defined(__APPLE__) && defined(HAVE_SYSCTLBYNAME))
# define CRC_ARM64_RUNTIME_DETECTION 1