On Wed, 6 Dec 2023 at 12:30, Thomas Schwinge <tho...@codesourcery.com> wrote: > > 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
I would prefer: --- a/libstdc++-v3/libsupc++/atexit_thread.cc +++ b/libstdc++-v3/libsupc++/atexit_thread.cc @@ -148,7 +148,7 @@ __cxa_thread_atexit_impl (void (_GLIBCXX_CDTOR_CALLABI *func) (void *), // ??? 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, [[maybe_unused]] void *dso_handle) _GLIBCXX_NOTHROW { #if __GXX_WEAK__ > > ... 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 >