Import libcxxrt master 516a65c109eb0a01e5e95fbef455eb3215135cef.

Interesting fixes:
3adaa2e Fix _Unwind_Exception cleanup functions
286776c Check exception cleanup function ptr before calling
edda626 Correct exception specifications on new and delete operators
This commit is contained in:
Dimitry Andric 2016-05-05 22:40:07 +00:00
commit 076e75ebe4
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=299144
2 changed files with 26 additions and 20 deletions

View File

@ -304,13 +304,17 @@ static pthread_key_t eh_key;
static void exception_cleanup(_Unwind_Reason_Code reason,
struct _Unwind_Exception *ex)
{
__cxa_free_exception(static_cast<void*>(ex));
// Exception layout:
// [__cxa_exception [_Unwind_Exception]] [exception object]
//
// __cxa_free_exception expects a pointer to the exception object
__cxa_free_exception(static_cast<void*>(ex + 1));
}
static void dependent_exception_cleanup(_Unwind_Reason_Code reason,
struct _Unwind_Exception *ex)
{
__cxa_free_dependent_exception(static_cast<void*>(ex));
__cxa_free_dependent_exception(static_cast<void*>(ex + 1));
}
/**
@ -340,7 +344,8 @@ static void thread_cleanup(void* thread_info)
if (info->foreign_exception_state != __cxa_thread_info::none)
{
_Unwind_Exception *e = reinterpret_cast<_Unwind_Exception*>(info->globals.caughtExceptions);
e->exception_cleanup(_URC_FOREIGN_EXCEPTION_CAUGHT, e);
if (e->exception_cleanup)
e->exception_cleanup(_URC_FOREIGN_EXCEPTION_CAUGHT, e);
}
else
{
@ -1282,12 +1287,13 @@ extern "C" void __cxa_end_catch()
if (ti->foreign_exception_state != __cxa_thread_info::none)
{
globals->caughtExceptions = 0;
if (ti->foreign_exception_state != __cxa_thread_info::rethrown)
{
_Unwind_Exception *e = reinterpret_cast<_Unwind_Exception*>(ti->globals.caughtExceptions);
e->exception_cleanup(_URC_FOREIGN_EXCEPTION_CAUGHT, e);
if (e->exception_cleanup)
e->exception_cleanup(_URC_FOREIGN_EXCEPTION_CAUGHT, e);
}
globals->caughtExceptions = 0;
ti->foreign_exception_state = __cxa_thread_info::none;
return;
}

View File

@ -71,8 +71,17 @@ namespace std
}
#if __cplusplus < 201103L
#define NOEXCEPT throw()
#define BADALLOC throw(std::bad_alloc)
#else
#define NOEXCEPT noexcept
#define BADALLOC
#endif
__attribute__((weak))
void* operator new(size_t size)
void* operator new(size_t size) BADALLOC
{
if (0 == size)
{
@ -97,7 +106,7 @@ void* operator new(size_t size)
}
__attribute__((weak))
void* operator new(size_t size, const std::nothrow_t &) throw()
void* operator new(size_t size, const std::nothrow_t &) NOEXCEPT
{
try {
return :: operator new(size);
@ -110,27 +119,21 @@ void* operator new(size_t size, const std::nothrow_t &) throw()
__attribute__((weak))
void operator delete(void * ptr)
#if __cplusplus < 201000L
throw()
#endif
void operator delete(void * ptr) NOEXCEPT
{
free(ptr);
}
__attribute__((weak))
void * operator new[](size_t size)
#if __cplusplus < 201000L
throw(std::bad_alloc)
#endif
void * operator new[](size_t size) BADALLOC
{
return ::operator new(size);
}
__attribute__((weak))
void * operator new[](size_t size, const std::nothrow_t &) throw()
void * operator new[](size_t size, const std::nothrow_t &) NOEXCEPT
{
try {
return ::operator new[](size);
@ -143,10 +146,7 @@ void * operator new[](size_t size, const std::nothrow_t &) throw()
__attribute__((weak))
void operator delete[](void * ptr)
#if __cplusplus < 201000L
throw()
#endif
void operator delete[](void * ptr) NOEXCEPT
{
::operator delete(ptr);
}