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.


for  libstdc++-v3/ChangeLog

	* libsupc++/atexit_thread.cc [__GXX_WEAK__]: Add dynamic
	detection of __cxa_thread_atexit_impl.
This commit is contained in:
Alexandre Oliva 2023-12-02 14:14:02 -03:00 committed by Alexandre Oliva
parent 27ce74fa23
commit f4dd941684

View file

@ -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 ())
{