Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime
On Dec 6, 2023, Jonathan Wakely wrote: >> -void *obj, void *dso_handle) >> +void *obj, [[maybe_unused]] void >> *dso_handle) > The patch is OK with that change. Thanks, here's what I'm going to install. Regstrapped on x86_64-linux-gnu, with and without ac_cv_func___cxa_thread_atexit_impl=no, on a machine that has __cxa_thread_atexit_impl (but not __cxa_thread_atexit) in libc. 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. for libstdc++-v3/ChangeLog PR libstdc++/112858 * 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..28423344a0f34 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, [[maybe_unused]] 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 ()) { -- Alexandre Oliva, happy hackerhttps://FSFLA.org/blogs/lxo/ Free Software Activist GNU Toolchain Engineer More tolerance and less prejudice are key for inclusion and diversity Excluding neuro-others for not behaving ""normal"" is *not* inclusive
Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime
On Wed, 6 Dec 2023 at 13:53, Jonathan Wakely wrote: > > On Wed, 6 Dec 2023 at 12:30, Thomas Schwinge wrote: > > > > Hi Alexandre! > > > > On 2023-12-06T02:28:42-0300, Alexandre Oliva 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__ The patch is OK with that change. > > > > > > > > ... 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*/)
Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime
On Wed, 6 Dec 2023 at 12:30, Thomas Schwinge wrote: > > Hi Alexandre! > > On 2023-12-06T02:28:42-0300, Alexandre Oliva 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
Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime
Hi Alexandre! On 2023-12-06T02:28:42-0300, Alexandre Oliva 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;
Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime
On Dec 5, 2023, Alexandre Oliva wrote: > Maybe we should narrow it down to targets in which weak undefined > symbols are available with the expected semantics, and where the symbol > is known to have ever been defined in libc. On it... This patch reintroduces the weak symbol reference only on GNU systems, where they're most likely to be useful. If other systems could benefit, we can always add them later. > Or maybe a weak definition (or weak alias to a definition) in that file > would enable us to test whether the weak definition was preempted Uhh... 'cept libc wouldn't preempt from libstdc++; the opposite would occur, but that doesn't help. Regstrapped on x86_64-linux-gnu, also tested with ac_cv_func___cxa_thread_atexit_impl=no. Ok to (re)install? 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. 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 ()) { -- Alexandre Oliva, happy hackerhttps://FSFLA.org/blogs/lxo/ Free Software Activist GNU Toolchain Engineer More tolerance and less prejudice are key for inclusion and diversity Excluding neuro-others for not behaving ""normal"" is *not* inclusive
Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime
On Dec 5, 2023, David Edelsohn wrote: > The error is: > ld: 0711-317 ERROR: Undefined symbol: __cxa_thread_atexit_impl > from the new, weak reference. Thanks. > Also, earlier in atexit_thread.cc, there is another definition protected by > _GLIBCXX_HAVE___CXA_THREAD_ATEXIT_IMPL > not utilized by the new reference. *nod*, the one I recently added covers a different situation, in which the _impl symbol is not found in libc at build time. -- Alexandre Oliva, happy hackerhttps://FSFLA.org/blogs/lxo/ Free Software Activist GNU Toolchain Engineer More tolerance and less prejudice are key for inclusion and diversity Excluding neuro-others for not behaving ""normal"" is *not* inclusive
Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime
Hello, David, On Dec 5, 2023, David Edelsohn wrote: > This patch broke bootstrap on AIX. The stage1 compiler is not able to > build a program and stage2 configure fails. Thanks for the report. sorry about the breakage. If the patch makes any difference, this suggests that __GXX_WEAK__ is defined on AIX, but that we can't rely on a weak undefined symbol for this purpose. Back to the drawing board... I'm reverting this for now. Maybe we should narrow it down to targets in which weak undefined symbols are available with the expected semantics, and where the symbol is known to have ever been defined in libc. On it... Or maybe a weak definition (or weak alias to a definition) in that file would enable us to test whether the weak definition was preempted, and use it if so. Or even move the fallback definition into the weak symbol. Thanks again, -- Alexandre Oliva, happy hackerhttps://FSFLA.org/blogs/lxo/ Free Software Activist GNU Toolchain Engineer More tolerance and less prejudice are key for inclusion and diversity Excluding neuro-others for not behaving ""normal"" is *not* inclusive
Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime
On Tue, Dec 5, 2023 at 3:15 PM David Edelsohn wrote: > > The error is: > > ld: 0711-317 ERROR: Undefined symbol: __cxa_thread_atexit_impl > > > from the new, weak reference. By the way this seems like the same issue on nvptx too. See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112858 which has a similar analysis as below too. Thanks, Andrew > > > Also, earlier in atexit_thread.cc, there is another definition protected by > > > _GLIBCXX_HAVE___CXA_THREAD_ATEXIT_IMPL > > > not utilized by the new reference. > > > Thanks, David > > > On Tue, Dec 5, 2023 at 11:10 AM David Edelsohn wrote: >> >> Alex, >> >> This patch broke bootstrap on AIX. The stage1 compiler is not able to build >> a program and stage2 configure fails. >> >> Thanks, David >>
Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime
The error is: ld: 0711-317 ERROR: Undefined symbol: __cxa_thread_atexit_impl from the new, weak reference. Also, earlier in atexit_thread.cc, there is another definition protected by _GLIBCXX_HAVE___CXA_THREAD_ATEXIT_IMPL not utilized by the new reference. Thanks, David On Tue, Dec 5, 2023 at 11:10 AM David Edelsohn wrote: > Alex, > > This patch broke bootstrap on AIX. The stage1 compiler is not able to > build a program and stage2 configure fails. > > Thanks, David > >
Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime
Alex, This patch broke bootstrap on AIX. The stage1 compiler is not able to build a program and stage2 configure fails. Thanks, David
Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime
On 12/1/23 15:40, Alexandre Oliva wrote: On Nov 9, 2023, Jonathan Wakely wrote: On Thu, 9 Nov 2023 at 01:56, Alexandre Oliva wrote: 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 platforms that support weak symbols. Regstrapped on x86_64-linux-gnu, also tested with gcc-13 on i686- and x86_64-, and with ac_cv_func___cxa_thread_atexit_impl=no, that, on a distro that lacks __cxa_thread_atexit in libc, forces the newly-added code to be exercised, and that enabled thread_local-order2.C to pass where the runtime libc has __cxa_thread_atexit_impl. Ok to install? Seems fine to me. Any objections, Jason? Jason, ping? https://gcc.gnu.org/pipermail/gcc-patches/2023-November/635750.html OK by me. Jason
Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime
On Nov 9, 2023, Jonathan Wakely wrote: > On Thu, 9 Nov 2023 at 01:56, Alexandre Oliva wrote: >> 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 >> platforms that support weak symbols. >> >> Regstrapped on x86_64-linux-gnu, also tested with gcc-13 on i686- and >> x86_64-, and with ac_cv_func___cxa_thread_atexit_impl=no, that, on a >> distro that lacks __cxa_thread_atexit in libc, forces the newly-added >> code to be exercised, and that enabled thread_local-order2.C to pass >> where the runtime libc has __cxa_thread_atexit_impl. Ok to install? > Seems fine to me. Any objections, Jason? Jason, ping? https://gcc.gnu.org/pipermail/gcc-patches/2023-November/635750.html -- Alexandre Oliva, happy hackerhttps://FSFLA.org/blogs/lxo/ Free Software Activist GNU Toolchain Engineer More tolerance and less prejudice are key for inclusion and diversity Excluding neuro-others for not behaving ""normal"" is *not* inclusive
Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime
On Thu, 9 Nov 2023 at 01:56, Alexandre Oliva wrote: > > > 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 > platforms that support weak symbols. > > Regstrapped on x86_64-linux-gnu, also tested with gcc-13 on i686- and > x86_64-, and with ac_cv_func___cxa_thread_atexit_impl=no, that, on a > distro that lacks __cxa_thread_atexit in libc, forces the newly-added > code to be exercised, and that enabled thread_local-order2.C to pass > where the runtime libc has __cxa_thread_atexit_impl. Ok to install? Seems fine to me. Any objections, Jason? > > > for libstdc++-v3/ChangeLog > > * libsupc++/atexit_thread.cc [__GXX_WEAK__]: Add dynamic > detection of __cxa_thread_atexit_impl. > --- > libstdc++-v3/libsupc++/atexit_thread.cc | 15 ++- > 1 file changed, 14 insertions(+), 1 deletion(-) > > diff --git a/libstdc++-v3/libsupc++/atexit_thread.cc > b/libstdc++-v3/libsupc++/atexit_thread.cc > index 9346d50f5dafe..cabd7c0a4a057 100644 > --- a/libstdc++-v3/libsupc++/atexit_thread.cc > +++ b/libstdc++-v3/libsupc++/atexit_thread.cc > @@ -138,11 +138,24 @@ namespace { >} > } > > +#if __GXX_WEAK__ > +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__ > + if (__cxa_thread_atexit_impl) > +return __cxa_thread_atexit_impl (dtor, obj, dso_handle); > +#endif > + >// Do this initialization once. >if (__gthread_active_p ()) > { > > -- > Alexandre Oliva, happy hackerhttps://FSFLA.org/blogs/lxo/ >Free Software Activist GNU Toolchain Engineer > More tolerance and less prejudice are key for inclusion and diversity > Excluding neuro-others for not behaving ""normal"" is *not* inclusive >
[PATCH] 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 platforms that support weak symbols. Regstrapped on x86_64-linux-gnu, also tested with gcc-13 on i686- and x86_64-, and with ac_cv_func___cxa_thread_atexit_impl=no, that, on a distro that lacks __cxa_thread_atexit in libc, forces the newly-added code to be exercised, and that enabled thread_local-order2.C to pass where the runtime libc has __cxa_thread_atexit_impl. Ok to install? for libstdc++-v3/ChangeLog * libsupc++/atexit_thread.cc [__GXX_WEAK__]: Add dynamic detection of __cxa_thread_atexit_impl. --- libstdc++-v3/libsupc++/atexit_thread.cc | 15 ++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/libstdc++-v3/libsupc++/atexit_thread.cc b/libstdc++-v3/libsupc++/atexit_thread.cc index 9346d50f5dafe..cabd7c0a4a057 100644 --- a/libstdc++-v3/libsupc++/atexit_thread.cc +++ b/libstdc++-v3/libsupc++/atexit_thread.cc @@ -138,11 +138,24 @@ namespace { } } +#if __GXX_WEAK__ +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__ + if (__cxa_thread_atexit_impl) +return __cxa_thread_atexit_impl (dtor, obj, dso_handle); +#endif + // Do this initialization once. if (__gthread_active_p ()) { -- Alexandre Oliva, happy hackerhttps://FSFLA.org/blogs/lxo/ Free Software Activist GNU Toolchain Engineer More tolerance and less prejudice are key for inclusion and diversity Excluding neuro-others for not behaving ""normal"" is *not* inclusive