Hi Alexandre! On 2023-12-06T02:28:42-0300, Alexandre Oliva <ol...@adacore.com> 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