This patch uses the libatomic IFUNC infrastructure so that aarch64 machines that support the LSE instructions can use them. Note that aarch64 still isn't enabling IFUNC support by default though I have submitted a patch to do that. You can enable IFUNC support by configuring with --enable-gnu-indirect-function.
Glibc has an environment variable, LD_HWCAP_MASK, that can be used to mask out some or all of the bits returned by getauxval(AT_HWCAP) and ignore certain hardware capabilities. I enabled this functionality for libatomic by looking at the LD_HWCAP_MASK variable in the IFUNC resolver function. That way, if I had a system that supported LSE but did not want to use it for some reason, I could set LD_HWCAP_MASK to zero and then the IFUNC selector function would not enable the LSE routines. I could remove this functionality if we thought it was not appropriate but I think it is useful, both for testing and for end users. Tested on aarch64, OK for checkin? Steve Ellcey sell...@cavium.com 2017-08-07 Steve Ellcey <sell...@cavium.com> * Makefile.am (ARCH_AARCH64_LINUX_LSE): Add IFUNC_OPTIONS and libatomic_la_LIBADD. * config/linux/aarch64/host-config.h: New file. * config/linux/aarch64/init.c: New file. * configure.ac (AC_CHECK_HEADERS): Check for sys/auxv.h. (AC_CHECK_FUNCS): Check for getauxval. (ARCH_AARCH64_LINUX_LSE): New conditional for IFUNC builds. * configure.tgt (aarch64): Set AARCH and try_ifunc. (aarch64*-*-linux*) Update config_path. * Makefile.in: Regenerate. * auto-config.h.in: Regenerate. * configure: Regenerate.