Hi Alexandre!
On 2023-12-06T02:28:42-0300, Alexandre Oliva <[email protected]> wrote:
> libsupc++: try cxa_thread_atexit_impl at runtime
>
> g++.dg/tls/thread_local-order2.C fails when the toolchain is built for
> a platform that lacks __cxa_thread_atexit_impl, even if the program is
> built and run using that toolchain on a (later) platform that offers
> __cxa_thread_atexit_impl.
>
> This patch adds runtime testing for __cxa_thread_atexit_impl on select
> platforms (GNU variants, for starters) that support weak symbols.
Need something like:
--- libstdc++-v3/libsupc++/atexit_thread.cc
+++ libstdc++-v3/libsupc++/atexit_thread.cc
@@ -164,2 +164,4 @@ __cxxabiv1::__cxa_thread_atexit (void
(_GLIBCXX_CDTOR_CALLABI *dtor)(void *),
return __cxa_thread_atexit_impl (dtor, obj, dso_handle);
+#else
+ (void) dso_handle;
#endif
... to avoid:
[...]/source-gcc/libstdc++-v3/libsupc++/atexit_thread.cc: In function ‘int
__cxxabiv1::__cxa_thread_atexit(void (*)(void*), void*, void*)’:
[...]/source-gcc/libstdc++-v3/libsupc++/atexit_thread.cc:151:51: error:
unused parameter ‘dso_handle’ [-Werror=unused-parameter]
151 | void *obj, void *dso_handle)
| ~~~~~~^~~~~~~~~~
cc1plus: all warnings being treated as errors
make[4]: *** [atexit_thread.lo] Error 1
With that, GCC/nvptx then is back to:
UNSUPPORTED: g++.dg/tls/thread_local6.C -std=c++98
PASS: g++.dg/tls/thread_local6.C -std=c++14 (test for excess errors)
PASS: g++.dg/tls/thread_local6.C -std=c++14 execution test
PASS: g++.dg/tls/thread_local6.C -std=c++17 (test for excess errors)
PASS: g++.dg/tls/thread_local6.C -std=c++17 execution test
PASS: g++.dg/tls/thread_local6.C -std=c++20 (test for excess errors)
PASS: g++.dg/tls/thread_local6.C -std=c++20 execution test
Grüße
Thomas
> for libstdc++-v3/ChangeLog
>
> * config/os/gnu-linux/os_defines.h
> (_GLIBCXX_MAY_HAVE___CXA_THREAD_ATEXIT_IMPL): Define.
> * libsupc++/atexit_thread.cc [__GXX_WEAK__ &&
> _GLIBCXX_MAY_HAVE___CXA_THREAD_ATEXIT_IMPL]
> (__cxa_thread_atexit): Add dynamic detection of
> __cxa_thread_atexit_impl.
> ---
> libstdc++-v3/config/os/gnu-linux/os_defines.h | 5 +++++
> libstdc++-v3/libsupc++/atexit_thread.cc | 23 ++++++++++++++++++++++-
> 2 files changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/libstdc++-v3/config/os/gnu-linux/os_defines.h
> b/libstdc++-v3/config/os/gnu-linux/os_defines.h
> index 87317031fcd71..a2e4baec069d5 100644
> --- a/libstdc++-v3/config/os/gnu-linux/os_defines.h
> +++ b/libstdc++-v3/config/os/gnu-linux/os_defines.h
> @@ -60,6 +60,11 @@
> # define _GLIBCXX_HAVE_FLOAT128_MATH 1
> #endif
>
> +// Enable __cxa_thread_atexit to rely on a (presumably libc-provided)
> +// __cxa_thread_atexit_impl, if it happens to be defined, even if
> +// configure couldn't find it during the build.
> +#define _GLIBCXX_MAY_HAVE___CXA_THREAD_ATEXIT_IMPL 1
> +
> #ifdef __linux__
> // The following libpthread properties only apply to Linux, not GNU/Hurd.
>
> diff --git a/libstdc++-v3/libsupc++/atexit_thread.cc
> b/libstdc++-v3/libsupc++/atexit_thread.cc
> index 9346d50f5dafe..aa4ed5312bfe3 100644
> --- a/libstdc++-v3/libsupc++/atexit_thread.cc
> +++ b/libstdc++-v3/libsupc++/atexit_thread.cc
> @@ -138,11 +138,32 @@ namespace {
> }
> }
>
> +#if __GXX_WEAK__ && _GLIBCXX_MAY_HAVE___CXA_THREAD_ATEXIT_IMPL
> +extern "C"
> +int __attribute__ ((__weak__))
> +__cxa_thread_atexit_impl (void (_GLIBCXX_CDTOR_CALLABI *func) (void *),
> + void *arg, void *d);
> +#endif
> +
> +// ??? We can't make it an ifunc, can we?
> extern "C" int
> __cxxabiv1::__cxa_thread_atexit (void (_GLIBCXX_CDTOR_CALLABI *dtor)(void *),
> - void *obj, void */*dso_handle*/)
> + void *obj, void *dso_handle)
> _GLIBCXX_NOTHROW
> {
> +#if __GXX_WEAK__ && _GLIBCXX_MAY_HAVE___CXA_THREAD_ATEXIT_IMPL
> + if (__cxa_thread_atexit_impl)
> + // Rely on a (presumably libc-provided) __cxa_thread_atexit_impl,
> + // if it happens to be defined, even if configure couldn't find it
> + // during the build. _GLIBCXX_MAY_HAVE___CXA_THREAD_ATEXIT_IMPL
> + // may be defined e.g. in os_defines.h on platforms where some
> + // versions of libc have a __cxa_thread_atexit_impl definition,
> + // but whose earlier versions didn't. This enables programs build
> + // by toolchains compatible with earlier libc versions to still
> + // benefit from a libc-provided __cxa_thread_atexit_impl.
> + return __cxa_thread_atexit_impl (dtor, obj, dso_handle);
> +#endif
> +
> // Do this initialization once.
> if (__gthread_active_p ())
> {
-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634
München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas
Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht
München, HRB 106955