This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch][aarch64] Use IFUNCs to enable LSE instructions in libatomic on aarch64
- From: Steve Ellcey <sellcey at cavium dot com>
- To: gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 07 Aug 2017 13:44:26 -0700
- Subject: [Patch][aarch64] Use IFUNCs to enable LSE instructions in libatomic on aarch64
- Authentication-results: sourceware.org; auth=none
- Authentication-results: spf=none (sender IP is ) smtp.mailfrom=Steve dot Ellcey at cavium dot com;
- Reply-to: sellcey at cavium dot com
- Spamdiagnosticmetadata: NSPM
- Spamdiagnosticoutput: 1:99
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
sellcey@cavium.com
2017-08-07 Steve Ellcey <sellcey@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.