If the target does not support the atomic_flag_test_and_set() operation in
hardware, the compiler emits a call to __atomic_test_and_set().  However,
libatomic provided only __atomic_test_and_set_1().  Provide
__atomic_test_and_set() as an alias.

libatomic/ChangeLog:

        * libatomic_i.h (EXPORT_ALIAS): Use EXPORT_ALIAS_2().
        (EXPORT_ALIAS_2): New.
        * tas_n.c (EXPORT_ALIAS_2): Provide __atomic_test_and_set() as an alias
        to __atomic_test_and_set_1().
---
 libatomic/libatomic_i.h | 21 +++++++++++++--------
 libatomic/tas_n.c       |  3 +++
 2 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/libatomic/libatomic_i.h b/libatomic/libatomic_i.h
index e59dd412e17..877a897f32b 100644
--- a/libatomic/libatomic_i.h
+++ b/libatomic/libatomic_i.h
@@ -237,7 +237,8 @@ bool libat_is_lock_free (size_t, void *) MAN(is_lock_free);
 #endif
 
 #if IFUNC_ALT
-# define EXPORT_ALIAS(X)       /* exported symbol in non-alternate file */
+# define EXPORT_ALIAS_2(X, Y)  /* exported symbol in non-alternate file */
+# define EXPORT_ALIAS(X)
 #elif defined(N) && IFUNC_NCOND(N)
 # if IFUNC_NCOND(N) == 1
 #  define GEN_SELECTOR(X)                                      \
@@ -278,18 +279,22 @@ bool libat_is_lock_free (size_t, void *) 
MAN(is_lock_free);
 # else
 #  error "Unsupported number of ifunc alternatives."
 # endif
+# define EXPORT_ALIAS_2(X, Y)                                  \
+       typeof(C2(libat_,X)) C2(ifunc_,Y)                       \
+         ASMNAME(C2(__atomic_,Y))                              \
+         __attribute__((ifunc(S(C2(select_,X)))))
 # define EXPORT_ALIAS(X)                                       \
        GEN_SELECTOR(X)                                         \
-       typeof(C2(libat_,X)) C2(ifunc_,X)                       \
-         ASMNAME(C2(__atomic_,X))                              \
-         __attribute__((ifunc(S(C2(select_,X)))))
+       EXPORT_ALIAS_2(X, X)
 #elif defined(HAVE_ATTRIBUTE_ALIAS)
-# define EXPORT_ALIAS(X)                                       \
-       extern typeof(C2(libat_,X)) C2(export_,X)               \
-         ASMNAME(C2(__atomic_,X))                              \
+# define EXPORT_ALIAS_2(X, Y)                                  \
+       extern typeof(C2(libat_,X)) C2(export_,Y)               \
+         ASMNAME(C2(__atomic_,Y))                              \
          __attribute__((alias(S(C2(libat_,X)))))
+# define EXPORT_ALIAS(X) EXPORT_ALIAS_2(X, X)
 #else
-# define EXPORT_ALIAS(X)       /* original symbol is exported */
+# define EXPORT_ALIAS_2(X, Y)  /* original symbol is exported */
+# define EXPORT_ALIAS(X)
 #endif
 
 #endif /* LIBATOMIC_H */
diff --git a/libatomic/tas_n.c b/libatomic/tas_n.c
index 036a3d23307..fad9d00b280 100644
--- a/libatomic/tas_n.c
+++ b/libatomic/tas_n.c
@@ -114,4 +114,7 @@ SIZE(libat_test_and_set) (UTYPE *mptr, int smodel UNUSED)
 #endif
 
 EXPORT_ALIAS (SIZE(test_and_set));
+#if N == 1
+EXPORT_ALIAS_2 (SIZE(test_and_set), test_and_set);
+#endif
 #undef LAT_TAS_N
-- 
2.43.0

Reply via email to