public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-9796] libatomic: Fix build for --disable-gnu-indirect-function [PR113986]
@ 2024-04-04 21:29 Wilco Dijkstra
  0 siblings, 0 replies; only message in thread
From: Wilco Dijkstra @ 2024-04-04 21:29 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:27b6d081f68528435066be2234c7329e31e0e84f

commit r14-9796-g27b6d081f68528435066be2234c7329e31e0e84f
Author: Wilco Dijkstra <wilco.dijkstra@arm.com>
Date:   Tue Mar 26 15:08:02 2024 +0000

    libatomic: Fix build for --disable-gnu-indirect-function [PR113986]
    
    Fix libatomic build to support --disable-gnu-indirect-function on AArch64.
    Always build atomic_16.S, add aliases to the __atomic_ functions if !HAVE_IFUNC.
    Include auto-config.h in atomic_16.S to avoid having to pass defines via
    makefiles.  Fix build if HWCAP_ATOMICS/CPUID are not defined.
    
    libatomic:
            PR target/113986
            * Makefile.in: Regenerated.
            * Makefile.am: Make atomic_16.S not depend on HAVE_IFUNC.
            Remove predefine of HAVE_FEAT_LSE128.
            * acinclude.m4: Remove ARCH_AARCH64_HAVE_LSE128.
            * configure: Regenerated.
            * config/linux/aarch64/atomic_16.S: Add __atomic_ alias if !HAVE_IFUNC.
            * config/linux/aarch64/host-config.h: Correctly handle !HAVE_IFUNC.
            Add defines for HWCAP_ATOMICS and HWCAP_CPUID.

Diff:
---
 libatomic/Makefile.am                        |  8 ++---
 libatomic/Makefile.in                        | 18 +++++-----
 libatomic/acinclude.m4                       |  1 -
 libatomic/config/linux/aarch64/atomic_16.S   | 47 ++++++++++++++++++++++---
 libatomic/config/linux/aarch64/host-config.h | 52 +++++++++++++++-------------
 libatomic/configure                          | 16 ---------
 6 files changed, 82 insertions(+), 60 deletions(-)

diff --git a/libatomic/Makefile.am b/libatomic/Makefile.am
index d49c44c7d5f..980677f3533 100644
--- a/libatomic/Makefile.am
+++ b/libatomic/Makefile.am
@@ -130,12 +130,8 @@ libatomic_la_LIBADD = $(foreach s,$(SIZES),$(addsuffix _$(s)_.lo,$(SIZEOBJS)))
 ## On a target-specific basis, include alternates to be selected by IFUNC.
 if HAVE_IFUNC
 if ARCH_AARCH64_LINUX
-if ARCH_AARCH64_HAVE_LSE128
-AM_CPPFLAGS	     = -DHAVE_FEAT_LSE128
-endif
 IFUNC_OPTIONS	     = -march=armv8-a+lse
 libatomic_la_LIBADD += $(foreach s,$(SIZES),$(addsuffix _$(s)_1_.lo,$(SIZEOBJS)))
-libatomic_la_SOURCES += atomic_16.S
 
 endif
 if ARCH_ARM_LINUX
@@ -155,6 +151,10 @@ libatomic_la_LIBADD += $(addsuffix _16_1_.lo,$(SIZEOBJS)) \
 endif
 endif
 
+if ARCH_AARCH64_LINUX
+libatomic_la_SOURCES += atomic_16.S
+endif
+
 libatomic_convenience_la_SOURCES = $(libatomic_la_SOURCES)
 libatomic_convenience_la_LIBADD = $(libatomic_la_LIBADD)
 
diff --git a/libatomic/Makefile.in b/libatomic/Makefile.in
index 11c8ec7ba15..d9d529bc502 100644
--- a/libatomic/Makefile.in
+++ b/libatomic/Makefile.in
@@ -90,17 +90,17 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 @ARCH_AARCH64_LINUX_TRUE@@HAVE_IFUNC_TRUE@am__append_1 = $(foreach s,$(SIZES),$(addsuffix _$(s)_1_.lo,$(SIZEOBJS)))
-@ARCH_AARCH64_LINUX_TRUE@@HAVE_IFUNC_TRUE@am__append_2 = atomic_16.S
-@ARCH_ARM_LINUX_TRUE@@HAVE_IFUNC_TRUE@am__append_3 = $(foreach \
+@ARCH_ARM_LINUX_TRUE@@HAVE_IFUNC_TRUE@am__append_2 = $(foreach \
 @ARCH_ARM_LINUX_TRUE@@HAVE_IFUNC_TRUE@	s,$(SIZES),$(addsuffix \
 @ARCH_ARM_LINUX_TRUE@@HAVE_IFUNC_TRUE@	_$(s)_1_.lo,$(SIZEOBJS))) \
 @ARCH_ARM_LINUX_TRUE@@HAVE_IFUNC_TRUE@	$(addsuffix \
 @ARCH_ARM_LINUX_TRUE@@HAVE_IFUNC_TRUE@	_8_2_.lo,$(SIZEOBJS)) \
 @ARCH_ARM_LINUX_TRUE@@HAVE_IFUNC_TRUE@	tas_1_2_.lo
-@ARCH_I386_TRUE@@HAVE_IFUNC_TRUE@am__append_4 = $(addsuffix _8_1_.lo,$(SIZEOBJS))
-@ARCH_X86_64_TRUE@@HAVE_IFUNC_TRUE@am__append_5 = $(addsuffix _16_1_.lo,$(SIZEOBJS)) \
+@ARCH_I386_TRUE@@HAVE_IFUNC_TRUE@am__append_3 = $(addsuffix _8_1_.lo,$(SIZEOBJS))
+@ARCH_X86_64_TRUE@@HAVE_IFUNC_TRUE@am__append_4 = $(addsuffix _16_1_.lo,$(SIZEOBJS)) \
 @ARCH_X86_64_TRUE@@HAVE_IFUNC_TRUE@		       $(addsuffix _16_2_.lo,$(SIZEOBJS))
 
+@ARCH_AARCH64_LINUX_TRUE@am__append_5 = atomic_16.S
 subdir = .
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
@@ -156,8 +156,7 @@ am__uninstall_files_from_dir = { \
   }
 am__installdirs = "$(DESTDIR)$(toolexeclibdir)"
 LTLIBRARIES = $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES)
-@ARCH_AARCH64_LINUX_TRUE@@HAVE_IFUNC_TRUE@am__objects_1 =  \
-@ARCH_AARCH64_LINUX_TRUE@@HAVE_IFUNC_TRUE@	atomic_16.lo
+@ARCH_AARCH64_LINUX_TRUE@am__objects_1 = atomic_16.lo
 am_libatomic_la_OBJECTS = gload.lo gstore.lo gcas.lo gexch.lo \
 	glfree.lo lock.lo init.lo fenv.lo fence.lo flag.lo \
 	$(am__objects_1)
@@ -425,7 +424,7 @@ libatomic_la_LDFLAGS = $(libatomic_version_info) $(libatomic_version_script) \
 	$(lt_host_flags) $(libatomic_darwin_rpath)
 
 libatomic_la_SOURCES = gload.c gstore.c gcas.c gexch.c glfree.c lock.c \
-	init.c fenv.c fence.c flag.c $(am__append_2)
+	init.c fenv.c fence.c flag.c $(am__append_5)
 SIZEOBJS = load store cas exch fadd fsub fand fior fxor fnand tas
 EXTRA_libatomic_la_SOURCES = $(addsuffix _n.c,$(SIZEOBJS))
 libatomic_la_DEPENDENCIES = $(libatomic_la_LIBADD) $(libatomic_version_dep)
@@ -451,9 +450,8 @@ all_c_files := $(foreach dir,$(search_path),$(wildcard $(dir)/*.c))
 # Then sort through them to find the one we want, and select the first.
 M_SRC = $(firstword $(filter %/$(M_FILE), $(all_c_files)))
 libatomic_la_LIBADD = $(foreach s,$(SIZES),$(addsuffix \
-	_$(s)_.lo,$(SIZEOBJS))) $(am__append_1) $(am__append_3) \
-	$(am__append_4) $(am__append_5)
-@ARCH_AARCH64_HAVE_LSE128_TRUE@@ARCH_AARCH64_LINUX_TRUE@@HAVE_IFUNC_TRUE@AM_CPPFLAGS = -DHAVE_FEAT_LSE128
+	_$(s)_.lo,$(SIZEOBJS))) $(am__append_1) $(am__append_2) \
+	$(am__append_3) $(am__append_4)
 @ARCH_AARCH64_LINUX_TRUE@@HAVE_IFUNC_TRUE@IFUNC_OPTIONS = -march=armv8-a+lse
 @ARCH_ARM_LINUX_TRUE@@HAVE_IFUNC_TRUE@IFUNC_OPTIONS = -march=armv7-a+fp -DHAVE_KERNEL64
 @ARCH_I386_TRUE@@HAVE_IFUNC_TRUE@IFUNC_OPTIONS = -march=i586
diff --git a/libatomic/acinclude.m4 b/libatomic/acinclude.m4
index d4f13174e2c..6d2e0b1c355 100644
--- a/libatomic/acinclude.m4
+++ b/libatomic/acinclude.m4
@@ -99,7 +99,6 @@ AC_DEFUN([LIBAT_TEST_FEAT_AARCH64_LSE128],[
   ])
   LIBAT_DEFINE_YESNO([HAVE_FEAT_LSE128], [$libat_cv_have_feat_lse128],
 	[Have LSE128 support for 16 byte integers.])
-  AM_CONDITIONAL([ARCH_AARCH64_HAVE_LSE128], [test x$libat_cv_have_feat_lse128 = xyes])
 ])
 
 dnl
diff --git a/libatomic/config/linux/aarch64/atomic_16.S b/libatomic/config/linux/aarch64/atomic_16.S
index d4a360a6f78..4e3fa870b03 100644
--- a/libatomic/config/linux/aarch64/atomic_16.S
+++ b/libatomic/config/linux/aarch64/atomic_16.S
@@ -38,6 +38,15 @@
    The libat_<op>_16_i1 entry points are used when LSE128 is available.
    The libat_<op>_16_i2 entry points are used when LSE2 is available.  */
 
+#include "auto-config.h"
+
+#if !HAVE_IFUNC
+# undef HAVE_FEAT_LSE128
+# define HAVE_FEAT_LSE128 0
+#endif
+
+#define HAVE_FEAT_LSE2  HAVE_IFUNC
+
 #if HAVE_FEAT_LSE128
 	.arch	armv9-a+lse128
 #else
@@ -67,8 +76,8 @@ NAME:				\
 	.cfi_endproc;		\
 	.size NAME, .-NAME;
 
-#define ALIAS(NAME, FROM, TO)	\
-	ALIAS1 (FROM (NAME),TO (NAME))
+#define ALIAS(NAME, FROM, TO)	ALIAS1 (FROM (NAME),TO (NAME))
+#define ALIAS2(NAME)		ALIAS1 (__atomic_##NAME, libat_##NAME)
 
 #define ALIAS1(ALIAS, NAME)	\
 	.global ALIAS;		\
@@ -125,6 +134,7 @@ ENTRY (libat_load_16)
 END (libat_load_16)
 
 
+#if HAVE_FEAT_LSE2
 ENTRY_FEAT (libat_load_16, LSE2)
 	cbnz	w1, 1f
 
@@ -146,6 +156,7 @@ ENTRY_FEAT (libat_load_16, LSE2)
 	dmb	ishld
 	ret
 END_FEAT (libat_load_16, LSE2)
+#endif
 
 
 ENTRY (libat_store_16)
@@ -165,6 +176,7 @@ ENTRY (libat_store_16)
 END (libat_store_16)
 
 
+#if HAVE_FEAT_LSE2
 ENTRY_FEAT (libat_store_16, LSE2)
 	cbnz	w4, 1f
 
@@ -178,6 +190,7 @@ ENTRY_FEAT (libat_store_16, LSE2)
 	cbnz	w4, 1b
 	ret
 END_FEAT (libat_store_16, LSE2)
+#endif
 
 
 ENTRY (libat_exchange_16)
@@ -279,6 +292,7 @@ ENTRY (libat_compare_exchange_16)
 END (libat_compare_exchange_16)
 
 
+#if HAVE_FEAT_LSE2
 ENTRY_FEAT (libat_compare_exchange_16, LSE2)
 	ldp	exp0, exp1, [x1]
 	mov	tmp0, exp0
@@ -313,6 +327,7 @@ ENTRY_FEAT (libat_compare_exchange_16, LSE2)
 4:	caspal	exp0, exp1, in0, in1, [x0]
 	b	0b
 END_FEAT (libat_compare_exchange_16, LSE2)
+#endif
 
 
 ENTRY (libat_fetch_add_16)
@@ -710,13 +725,14 @@ END (libat_test_and_set_16)
 
 /* Alias entry points which are the same in LSE2 and LSE128.  */
 
-#if !HAVE_FEAT_LSE128
+#if HAVE_IFUNC
+# if !HAVE_FEAT_LSE128
 ALIAS (libat_exchange_16, LSE128, LSE2)
 ALIAS (libat_fetch_or_16, LSE128, LSE2)
 ALIAS (libat_fetch_and_16, LSE128, LSE2)
 ALIAS (libat_or_fetch_16, LSE128, LSE2)
 ALIAS (libat_and_fetch_16, LSE128, LSE2)
-#endif
+# endif
 ALIAS (libat_load_16, LSE128, LSE2)
 ALIAS (libat_store_16, LSE128, LSE2)
 ALIAS (libat_compare_exchange_16, LSE128, LSE2)
@@ -747,6 +763,29 @@ ALIAS (libat_fetch_nand_16, LSE2, CORE)
 ALIAS (libat_nand_fetch_16, LSE2, CORE)
 ALIAS (libat_test_and_set_16, LSE2, CORE)
 
+#else
+
+/* Emit __atomic_* entrypoints if no ifuncs.  */
+
+ALIAS2 (load_16)
+ALIAS2 (store_16)
+ALIAS2 (compare_exchange_16)
+ALIAS2 (exchange_16)
+ALIAS2 (fetch_add_16)
+ALIAS2 (add_fetch_16)
+ALIAS2 (fetch_sub_16)
+ALIAS2 (sub_fetch_16)
+ALIAS2 (fetch_or_16)
+ALIAS2 (or_fetch_16)
+ALIAS2 (fetch_and_16)
+ALIAS2 (and_fetch_16)
+ALIAS2 (fetch_xor_16)
+ALIAS2 (xor_fetch_16)
+ALIAS2 (fetch_nand_16)
+ALIAS2 (nand_fetch_16)
+ALIAS2 (test_and_set_16)
+#endif
+
 /* GNU_PROPERTY_AARCH64_* macros from elf.h for use in asm code.  */
 #define FEATURE_1_AND 0xc0000000
 #define FEATURE_1_BTI 1
diff --git a/libatomic/config/linux/aarch64/host-config.h b/libatomic/config/linux/aarch64/host-config.h
index 4e354124063..e1a699948f4 100644
--- a/libatomic/config/linux/aarch64/host-config.h
+++ b/libatomic/config/linux/aarch64/host-config.h
@@ -24,6 +24,19 @@
 #if HAVE_IFUNC
 #include <sys/auxv.h>
 
+#ifndef HWCAP_ATOMICS
+# define HWCAP_ATOMICS	(1 << 8)
+#endif
+#ifndef HWCAP_CPUID
+# define HWCAP_CPUID	(1 << 11)
+#endif
+#ifndef HWCAP_USCAT
+# define HWCAP_USCAT	(1 << 25)
+#endif
+#ifndef HWCAP2_LSE128
+# define HWCAP2_LSE128	(1UL << 47)
+#endif
+
 #if __has_include(<sys/ifunc.h>)
 # include <sys/ifunc.h>
 #else
@@ -35,29 +48,15 @@ typedef struct __ifunc_arg_t {
 # define _IFUNC_ARG_HWCAP (1ULL << 62)
 #endif
 
-#ifdef HWCAP_USCAT
-# if N == 16
-#  define IFUNC_COND_1		(has_lse128 (hwcap, features))
-#  define IFUNC_COND_2		(has_lse2 (hwcap, features))
-#  define IFUNC_NCOND(N)	2
-# else
-#  define IFUNC_COND_1		(hwcap & HWCAP_ATOMICS)
-#  define IFUNC_NCOND(N)	1
-# endif
-#else
-#  define IFUNC_COND_1	(false)
-#  define IFUNC_NCOND(N)	1
-#endif
-
-#endif /* HAVE_IFUNC */
-
-/* All 128-bit atomic functions are defined in aarch64/atomic_16.S.  */
 #if N == 16
-# define DONE 1
+# define IFUNC_COND_1		(has_lse128 (hwcap, features))
+# define IFUNC_COND_2		(has_lse2 (hwcap, features))
+# define IFUNC_NCOND(N)	2
+#else
+# define IFUNC_COND_1		(hwcap & HWCAP_ATOMICS)
+# define IFUNC_NCOND(N)	1
 #endif
 
-#ifdef HWCAP_USCAT
-
 #define MIDR_IMPLEMENTOR(midr)	(((midr) >> 24) & 255)
 #define MIDR_PARTNUM(midr)	(((midr) >> 4) & 0xfff)
 
@@ -89,11 +88,6 @@ has_lse2 (unsigned long hwcap, const __ifunc_arg_t *features)
 
 #define AT_FEAT_FIELD(isar0)	(((isar0) >> 20) & 15)
 
-/* Ensure backwards compatibility with glibc <= 2.38.  */
-#ifndef HWCAP2_LSE128
-#define HWCAP2_LSE128		(1UL << 47)
-#endif
-
 static inline bool
 has_lse128 (unsigned long hwcap, const __ifunc_arg_t *features)
 {
@@ -116,6 +110,14 @@ has_lse128 (unsigned long hwcap, const __ifunc_arg_t *features)
   return false;
 }
 
+#endif /* HAVE_IFUNC */
+
+/* All 128-bit atomic functions are defined in aarch64/atomic_16.S.  */
+#if N == 16
+# define DONE 1
+# if !HAVE_IFUNC
+#  define IFUNC_ALT 1
+# endif
 #endif
 
 #include_next <host-config.h>
diff --git a/libatomic/configure b/libatomic/configure
index 8ab730d8082..8ca72f08dfd 100755
--- a/libatomic/configure
+++ b/libatomic/configure
@@ -656,8 +656,6 @@ LIBAT_BUILD_VERSIONED_SHLIB_FALSE
 LIBAT_BUILD_VERSIONED_SHLIB_TRUE
 OPT_LDFLAGS
 SECTION_LDFLAGS
-ARCH_AARCH64_HAVE_LSE128_FALSE
-ARCH_AARCH64_HAVE_LSE128_TRUE
 SYSROOT_CFLAGS_FOR_TARGET
 enable_aarch64_lse
 libtool_VERSION
@@ -14740,15 +14738,6 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
-   if test x$libat_cv_have_feat_lse128 = xyes; then
-  ARCH_AARCH64_HAVE_LSE128_TRUE=
-  ARCH_AARCH64_HAVE_LSE128_FALSE='#'
-else
-  ARCH_AARCH64_HAVE_LSE128_TRUE='#'
-  ARCH_AARCH64_HAVE_LSE128_FALSE=
-fi
-
-
 
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
 $as_echo_n "checking whether byte ordering is bigendian... " >&6; }
@@ -16042,11 +16031,6 @@ if test -z "${ENABLE_DARWIN_AT_RPATH_TRUE}" && test -z "${ENABLE_DARWIN_AT_RPATH
   as_fn_error $? "conditional \"ENABLE_DARWIN_AT_RPATH\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${ARCH_AARCH64_HAVE_LSE128_TRUE}" && test -z "${ARCH_AARCH64_HAVE_LSE128_FALSE}"; then
-  as_fn_error $? "conditional \"ARCH_AARCH64_HAVE_LSE128\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-
 if test -z "${LIBAT_BUILD_VERSIONED_SHLIB_TRUE}" && test -z "${LIBAT_BUILD_VERSIONED_SHLIB_FALSE}"; then
   as_fn_error $? "conditional \"LIBAT_BUILD_VERSIONED_SHLIB\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-04-04 21:29 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-04 21:29 [gcc r14-9796] libatomic: Fix build for --disable-gnu-indirect-function [PR113986] Wilco Dijkstra

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).