mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-26 21:33:59 +08:00
re PR libstdc++/56841 (ld: Unsatisfied symbol "__atomic_exchange_8" in file /test/gnu/gcc/objdir/prev-hppa64-hp-hpux11.11/libstdc++-v3/src/.libs/libstdc++.a[eh_terminate.o])
PR libstdc++/56841 * libsupc++/eh_ptr.cc (rethrow_exception): Use get_unexpected() and get_terminate() accessors. * libsupc++/eh_throw.cc (__cxa_throw): Likewise. * libsupc++/eh_terminate.cc: Use mutex when atomic builtins not available. * libsupc++/new_handler.cc: Likewise. From-SVN: r197512
This commit is contained in:
parent
526c230f1e
commit
7e20f4b022
@ -1,3 +1,13 @@
|
||||
2013-04-05 Jonathan Wakely <jwakely.gcc@gmail.com>
|
||||
|
||||
PR libstdc++/56841
|
||||
* libsupc++/eh_ptr.cc (rethrow_exception): Use get_unexpected() and
|
||||
get_terminate() accessors.
|
||||
* libsupc++/eh_throw.cc (__cxa_throw): Likewise.
|
||||
* libsupc++/eh_terminate.cc: Use mutex when atomic builtins not
|
||||
available.
|
||||
* libsupc++/new_handler.cc: Likewise.
|
||||
|
||||
2013-04-04 Jonathan Wakely <jwakely.gcc@gmail.com>
|
||||
|
||||
* testsuite/util/testsuite_abi.cc: Add GLIBCXX_3.4.19 version.
|
||||
|
@ -212,8 +212,8 @@ std::rethrow_exception(std::exception_ptr ep)
|
||||
dep->primaryException = obj;
|
||||
__atomic_add_fetch (&eh->referenceCount, 1, __ATOMIC_ACQ_REL);
|
||||
|
||||
dep->unexpectedHandler = __unexpected_handler;
|
||||
dep->terminateHandler = __terminate_handler;
|
||||
dep->unexpectedHandler = get_unexpected ();
|
||||
dep->terminateHandler = get_terminate ();
|
||||
__GXX_INIT_DEPENDENT_EXCEPTION_CLASS(dep->unwindHeader.exception_class);
|
||||
dep->unwindHeader.exception_cleanup = __gxx_dependent_exception_cleanup;
|
||||
|
||||
|
@ -27,6 +27,15 @@
|
||||
#include <cstdlib>
|
||||
#include "unwind-cxx.h"
|
||||
#include <bits/exception_defines.h>
|
||||
#include <bits/atomic_lockfree_defines.h>
|
||||
|
||||
#if ATOMIC_POINTER_LOCK_FREE < 2
|
||||
#include <ext/concurrence.h>
|
||||
namespace
|
||||
{
|
||||
__gnu_cxx::__mutex mx;
|
||||
}
|
||||
#endif
|
||||
|
||||
using namespace __cxxabiv1;
|
||||
|
||||
@ -65,7 +74,13 @@ std::terminate_handler
|
||||
std::set_terminate (std::terminate_handler func) throw()
|
||||
{
|
||||
std::terminate_handler old;
|
||||
#if ATOMIC_POINTER_LOCK_FREE > 1
|
||||
__atomic_exchange (&__terminate_handler, &func, &old, __ATOMIC_ACQ_REL);
|
||||
#else
|
||||
__gnu_cxx::__scoped_lock l(mx);
|
||||
old = __terminate_handler;
|
||||
__terminate_handler = func;
|
||||
#endif
|
||||
return old;
|
||||
}
|
||||
|
||||
@ -73,7 +88,12 @@ std::terminate_handler
|
||||
std::get_terminate () noexcept
|
||||
{
|
||||
std::terminate_handler func;
|
||||
#if ATOMIC_POINTER_LOCK_FREE > 1
|
||||
__atomic_load (&__terminate_handler, &func, __ATOMIC_ACQUIRE);
|
||||
#else
|
||||
__gnu_cxx::__scoped_lock l(mx);
|
||||
func = __terminate_handler;
|
||||
#endif
|
||||
return func;
|
||||
}
|
||||
|
||||
@ -81,7 +101,13 @@ std::unexpected_handler
|
||||
std::set_unexpected (std::unexpected_handler func) throw()
|
||||
{
|
||||
std::unexpected_handler old;
|
||||
#if ATOMIC_POINTER_LOCK_FREE > 1
|
||||
__atomic_exchange (&__unexpected_handler, &func, &old, __ATOMIC_ACQ_REL);
|
||||
#else
|
||||
__gnu_cxx::__scoped_lock l(mx);
|
||||
old = __unexpected_handler;
|
||||
__unexpected_handler = func;
|
||||
#endif
|
||||
return old;
|
||||
}
|
||||
|
||||
@ -89,6 +115,11 @@ std::unexpected_handler
|
||||
std::get_unexpected () noexcept
|
||||
{
|
||||
std::unexpected_handler func;
|
||||
#if ATOMIC_POINTER_LOCK_FREE > 1
|
||||
__atomic_load (&__unexpected_handler, &func, __ATOMIC_ACQUIRE);
|
||||
#else
|
||||
__gnu_cxx::__scoped_lock l(mx);
|
||||
func = __unexpected_handler;
|
||||
#endif
|
||||
return func;
|
||||
}
|
||||
|
@ -68,8 +68,8 @@ __cxxabiv1::__cxa_throw (void *obj, std::type_info *tinfo,
|
||||
header->referenceCount = 1;
|
||||
header->exc.exceptionType = tinfo;
|
||||
header->exc.exceptionDestructor = dest;
|
||||
header->exc.unexpectedHandler = __unexpected_handler;
|
||||
header->exc.terminateHandler = __terminate_handler;
|
||||
header->exc.unexpectedHandler = std::get_unexpected ();
|
||||
header->exc.terminateHandler = std::get_terminate ();
|
||||
__GXX_INIT_PRIMARY_EXCEPTION_CLASS(header->exc.unwindHeader.exception_class);
|
||||
header->exc.unwindHeader.exception_cleanup = __gxx_exception_cleanup;
|
||||
|
||||
|
@ -24,6 +24,15 @@
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "new"
|
||||
#include <bits/atomic_lockfree_defines.h>
|
||||
|
||||
#if ATOMIC_POINTER_LOCK_FREE < 2
|
||||
#include <ext/concurrence.h>
|
||||
namespace
|
||||
{
|
||||
__gnu_cxx::__mutex mx;
|
||||
}
|
||||
#endif
|
||||
|
||||
const std::nothrow_t std::nothrow = { };
|
||||
|
||||
@ -37,8 +46,14 @@ new_handler
|
||||
std::set_new_handler (new_handler handler) throw()
|
||||
{
|
||||
new_handler prev_handler;
|
||||
#if ATOMIC_POINTER_LOCK_FREE > 1
|
||||
__atomic_exchange (&__new_handler, &handler, &prev_handler,
|
||||
__ATOMIC_ACQ_REL);
|
||||
#else
|
||||
__gnu_cxx::__scoped_lock l(mx);
|
||||
prev_handler = __new_handler;
|
||||
__new_handler = handler;
|
||||
#endif
|
||||
return prev_handler;
|
||||
}
|
||||
|
||||
@ -46,6 +61,11 @@ new_handler
|
||||
std::get_new_handler () noexcept
|
||||
{
|
||||
new_handler handler;
|
||||
#if ATOMIC_POINTER_LOCK_FREE > 1
|
||||
__atomic_load (&__new_handler, &handler, __ATOMIC_ACQUIRE);
|
||||
#else
|
||||
__gnu_cxx::__scoped_lock l(mx);
|
||||
handler = __new_handler;
|
||||
#endif
|
||||
return handler;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user