commit cba5e8c2535f5950d1c78a6c35a2f83d549f37dc Author: Jason Merrill 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 #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 */