This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
PATCH to libstdc++ to use __cxa_thread_atexit_impl if available
- From: Jason Merrill <jason at redhat dot com>
- To: gcc-patches List <gcc-patches at gcc dot gnu dot org>, libstdc++ <libstdc++ at gcc dot gnu dot org>
- Cc: Siddhesh Poyarekar <siddhesh at redhat dot com>, Jakub Jelinek <jakub at redhat dot com>
- Date: Sat, 19 Jan 2013 12:22:23 -0500
- Subject: PATCH to libstdc++ to use __cxa_thread_atexit_impl if available
Siddhesh has a patch to implement the thread atexit functionality in
glibc in order to integrate better with the dynamic loader and run the
cleanups in the correct order. Once it's available there, this patch
will make the copy in libsupc++ use it. The main __cxa_thread_atexit
function will always live in libsupc++, however, in order to maintain
ABI compatibility between releases of libstdc++.
Does this configure change look right, or should it go in linkage.m4
somewhere?
I think I'll hold off checking this in until Siddhesh's patch goes into
glibc.
commit cba5e8c2535f5950d1c78a6c35a2f83d549f37dc
Author: Jason Merrill <jason@redhat.com>
Date: Sat Jan 19 12:08:25 2013 -0500
* configure.ac: Check for __cxa_thread_atexit_impl.
* libsupc++/atexit_thread.cc (__cxa_thread_atexit): Just forward
to it if available.
* config.h.in, configure: Regenerate.
diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in
index dd14b91..c14862d 100644
--- a/libstdc++-v3/config.h.in
+++ b/libstdc++-v3/config.h.in
@@ -652,6 +652,9 @@
/* Define to 1 if you have the `_tanl' function. */
#undef HAVE__TANL
+/* Define to 1 if you have the `__cxa_thread_atexit_impl' function. */
+#undef HAVE___CXA_THREAD_ATEXIT_IMPL
+
/* Define as const if the declaration of iconv() needs const. */
#undef ICONV_CONST
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index a4cf5c9..f53b9cf 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -26584,6 +26584,18 @@ $as_echo "#define HAVE_TLS 1" >>confdefs.h
fi
+ for ac_func in __cxa_thread_atexit_impl
+do :
+ ac_fn_c_check_func "$LINENO" "__cxa_thread_atexit_impl" "ac_cv_func___cxa_thread_atexit_impl"
+if test "x$ac_cv_func___cxa_thread_atexit_impl" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE___CXA_THREAD_ATEXIT_IMPL 1
+_ACEOF
+
+fi
+done
+
+
# For iconv support.
if test "X$prefix" = "XNONE"; then
diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac
index 66164a2..a64fee2 100644
--- a/libstdc++-v3/configure.ac
+++ b/libstdc++-v3/configure.ac
@@ -235,6 +235,8 @@ if $GLIBCXX_IS_NATIVE; then
# For TLS support.
GCC_CHECK_TLS
+ AC_CHECK_FUNCS(__cxa_thread_atexit_impl)
+
# For iconv support.
AM_ICONV
diff --git a/libstdc++-v3/libsupc++/atexit_thread.cc b/libstdc++-v3/libsupc++/atexit_thread.cc
index 95bdcf0..ce26717 100644
--- a/libstdc++-v3/libsupc++/atexit_thread.cc
+++ b/libstdc++-v3/libsupc++/atexit_thread.cc
@@ -26,6 +26,20 @@
#include <new>
#include "bits/gthr.h"
+#if HAVE___CXA_THREAD_ATEXIT_IMPL
+
+extern "C" int __cxa_thread_atexit_impl (void (*func) (void *),
+ void *arg, void *d);
+extern "C" int
+__cxxabiv1::__cxa_thread_atexit (void (*dtor)(void *),
+ void *obj, void *dso_handle)
+ _GLIBCXX_NOTHROW
+{
+ return __cxa_thread_atexit_impl (dtor, obj, dso_handle);
+}
+
+#else /* HAVE___CXA_THREAD_ATEXIT_IMPL */
+
namespace {
// One element in a singly-linked stack of cleanups.
struct elt
@@ -116,3 +130,5 @@ __cxxabiv1::__cxa_thread_atexit (void (*dtor)(void *), void *obj, void */*dso_ha
return 0;
}
+
+#endif /* HAVE___CXA_THREAD_ATEXIT_IMPL */