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
>

Reply via email to