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