* [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime @ 2023-11-09 1:55 Alexandre Oliva 2023-11-09 8:20 ` Jonathan Wakely [not found] ` <CAGWvny=8391BCUZF8eyYgP-NMoWM+qa6Yra6OGVVXuQNuAi9kw@mail.gmail.com> 0 siblings, 2 replies; 8+ messages in thread From: Alexandre Oliva @ 2023-11-09 1:55 UTC (permalink / raw) To: gcc-patches, libstdc++ 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 hacker https://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 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime 2023-11-09 1:55 [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime Alexandre Oliva @ 2023-11-09 8:20 ` Jonathan Wakely 2023-12-01 20:40 ` Alexandre Oliva [not found] ` <CAGWvny=8391BCUZF8eyYgP-NMoWM+qa6Yra6OGVVXuQNuAi9kw@mail.gmail.com> 1 sibling, 1 reply; 8+ messages in thread From: Jonathan Wakely @ 2023-11-09 8:20 UTC (permalink / raw) To: Alexandre Oliva; +Cc: gcc-patches, libstdc++, Jason Merrill On Thu, 9 Nov 2023 at 01:56, Alexandre Oliva <oliva@adacore.com> 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 hacker https://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 > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime 2023-11-09 8:20 ` Jonathan Wakely @ 2023-12-01 20:40 ` Alexandre Oliva 2023-12-01 20:41 ` Jason Merrill 0 siblings, 1 reply; 8+ messages in thread From: Alexandre Oliva @ 2023-12-01 20:40 UTC (permalink / raw) To: Jonathan Wakely, Jason Merrill; +Cc: gcc-patches, libstdc++ On Nov 9, 2023, Jonathan Wakely <jwakely@redhat.com> wrote: > On Thu, 9 Nov 2023 at 01:56, Alexandre Oliva <oliva@adacore.com> 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 hacker https://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 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime 2023-12-01 20:40 ` Alexandre Oliva @ 2023-12-01 20:41 ` Jason Merrill 0 siblings, 0 replies; 8+ messages in thread From: Jason Merrill @ 2023-12-01 20:41 UTC (permalink / raw) To: Alexandre Oliva, Jonathan Wakely; +Cc: gcc-patches, libstdc++ On 12/1/23 15:40, Alexandre Oliva wrote: > On Nov 9, 2023, Jonathan Wakely <jwakely@redhat.com> wrote: > >> On Thu, 9 Nov 2023 at 01:56, Alexandre Oliva <oliva@adacore.com> 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 ^ permalink raw reply [flat|nested] 8+ messages in thread
[parent not found: <CAGWvny=8391BCUZF8eyYgP-NMoWM+qa6Yra6OGVVXuQNuAi9kw@mail.gmail.com>]
[parent not found: <orr0k0rw0g.fsf@lxoliva.fsfla.org>]
[parent not found: <or1qbzsxv9.fsf@lxoliva.fsfla.org>]
* Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime [not found] ` <or1qbzsxv9.fsf@lxoliva.fsfla.org> @ 2023-12-06 12:30 ` Thomas Schwinge 2023-12-06 13:52 ` Jonathan Wakely 0 siblings, 1 reply; 8+ messages in thread From: Thomas Schwinge @ 2023-12-06 12:30 UTC (permalink / raw) To: Alexandre Oliva; +Cc: gcc-patches, libstdc++, David Edelsohn Hi Alexandre! On 2023-12-06T02:28:42-0300, Alexandre Oliva <oliva@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 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime 2023-12-06 12:30 ` Thomas Schwinge @ 2023-12-06 13:52 ` Jonathan Wakely 2023-12-06 14:40 ` Jonathan Wakely 0 siblings, 1 reply; 8+ messages in thread From: Jonathan Wakely @ 2023-12-06 13:52 UTC (permalink / raw) To: Thomas Schwinge; +Cc: Alexandre Oliva, gcc-patches, libstdc++, David Edelsohn On Wed, 6 Dec 2023 at 12:30, Thomas Schwinge <thomas@codesourcery.com> wrote: > > Hi Alexandre! > > On 2023-12-06T02:28:42-0300, Alexandre Oliva <oliva@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 > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime 2023-12-06 13:52 ` Jonathan Wakely @ 2023-12-06 14:40 ` Jonathan Wakely 2023-12-06 22:46 ` Alexandre Oliva 0 siblings, 1 reply; 8+ messages in thread From: Jonathan Wakely @ 2023-12-06 14:40 UTC (permalink / raw) To: Jonathan Wakely Cc: Thomas Schwinge, Alexandre Oliva, gcc-patches, libstdc++, David Edelsohn On Wed, 6 Dec 2023 at 13:53, Jonathan Wakely <jwakely@redhat.com> wrote: > > On Wed, 6 Dec 2023 at 12:30, Thomas Schwinge <thomas@codesourcery.com> wrote: > > > > Hi Alexandre! > > > > On 2023-12-06T02:28:42-0300, Alexandre Oliva <oliva@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__ 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*/) > > > + 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 > > > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime 2023-12-06 14:40 ` Jonathan Wakely @ 2023-12-06 22:46 ` Alexandre Oliva 0 siblings, 0 replies; 8+ messages in thread From: Alexandre Oliva @ 2023-12-06 22:46 UTC (permalink / raw) To: Jonathan Wakely Cc: Jonathan Wakely, Thomas Schwinge, gcc-patches, libstdc++, David Edelsohn On Dec 6, 2023, Jonathan Wakely <jwakely.gcc@gmail.com> 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 hacker https://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 ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2023-12-06 22:46 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-11-09 1:55 [PATCH] libsupc++: try cxa_thread_atexit_impl at runtime Alexandre Oliva 2023-11-09 8:20 ` Jonathan Wakely 2023-12-01 20:40 ` Alexandre Oliva 2023-12-01 20:41 ` Jason Merrill [not found] ` <CAGWvny=8391BCUZF8eyYgP-NMoWM+qa6Yra6OGVVXuQNuAi9kw@mail.gmail.com> [not found] ` <orr0k0rw0g.fsf@lxoliva.fsfla.org> [not found] ` <or1qbzsxv9.fsf@lxoliva.fsfla.org> 2023-12-06 12:30 ` Thomas Schwinge 2023-12-06 13:52 ` Jonathan Wakely 2023-12-06 14:40 ` Jonathan Wakely 2023-12-06 22:46 ` Alexandre Oliva
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).