Merge libcxxrt master f96846efbfd508f66d91fcbbef5dd808947c7f6d.
Interesting fixes: f96846e Fix std::size_t -> size_t to unbreak build against libc++ 6.0.0 6f4cfa2 Fix the uncaught exception count with rethrowing (PR 239265) db54f53 Added C++14-specific operator delete (#47) PR: 239265 MFC after: 3 days
This commit is contained in:
parent
bdfb9f2d6b
commit
cce260d7ae
@ -879,6 +879,13 @@ extern "C" void __cxa_rethrow()
|
|||||||
|
|
||||||
assert(ex->handlerCount > 0 && "Rethrowing uncaught exception!");
|
assert(ex->handlerCount > 0 && "Rethrowing uncaught exception!");
|
||||||
|
|
||||||
|
// `globals->uncaughtExceptions` was decremented by `__cxa_begin_catch`.
|
||||||
|
// It's normally incremented by `throw_exception`, but this path invokes
|
||||||
|
// `_Unwind_Resume_or_Rethrow` directly to rethrow the exception.
|
||||||
|
// This path is only reachable if we're rethrowing a C++ exception -
|
||||||
|
// foreign exceptions don't adjust any of this state.
|
||||||
|
globals->uncaughtExceptions++;
|
||||||
|
|
||||||
// ex->handlerCount will be decremented in __cxa_end_catch in enclosing
|
// ex->handlerCount will be decremented in __cxa_end_catch in enclosing
|
||||||
// catch block
|
// catch block
|
||||||
|
|
||||||
@ -1224,11 +1231,13 @@ extern "C" void *__cxa_begin_catch(void *e)
|
|||||||
// we see is a foreign exception then we won't have called it yet.
|
// we see is a foreign exception then we won't have called it yet.
|
||||||
__cxa_thread_info *ti = thread_info();
|
__cxa_thread_info *ti = thread_info();
|
||||||
__cxa_eh_globals *globals = &ti->globals;
|
__cxa_eh_globals *globals = &ti->globals;
|
||||||
globals->uncaughtExceptions--;
|
|
||||||
_Unwind_Exception *exceptionObject = static_cast<_Unwind_Exception*>(e);
|
_Unwind_Exception *exceptionObject = static_cast<_Unwind_Exception*>(e);
|
||||||
|
|
||||||
if (isCXXException(exceptionObject->exception_class))
|
if (isCXXException(exceptionObject->exception_class))
|
||||||
{
|
{
|
||||||
|
// Only exceptions thrown with a C++ exception throwing function will
|
||||||
|
// increment this, so don't decrement it here.
|
||||||
|
globals->uncaughtExceptions--;
|
||||||
__cxa_exception *ex = exceptionFromPointer(exceptionObject);
|
__cxa_exception *ex = exceptionFromPointer(exceptionObject);
|
||||||
|
|
||||||
if (ex->handlerCount == 0)
|
if (ex->handlerCount == 0)
|
||||||
@ -1364,6 +1373,14 @@ extern "C" std::type_info *__cxa_current_exception_type()
|
|||||||
return ex ? ex->exceptionType : 0;
|
return ex ? ex->exceptionType : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cleanup, ensures that `__cxa_end_catch` is called to balance an explicit
|
||||||
|
* `__cxa_begin_catch` call.
|
||||||
|
*/
|
||||||
|
static void end_catch(char *)
|
||||||
|
{
|
||||||
|
__cxa_end_catch();
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* ABI function, called when an exception specification is violated.
|
* ABI function, called when an exception specification is violated.
|
||||||
*
|
*
|
||||||
@ -1372,6 +1389,12 @@ extern "C" std::type_info *__cxa_current_exception_type()
|
|||||||
extern "C" void __cxa_call_unexpected(void*exception)
|
extern "C" void __cxa_call_unexpected(void*exception)
|
||||||
{
|
{
|
||||||
_Unwind_Exception *exceptionObject = static_cast<_Unwind_Exception*>(exception);
|
_Unwind_Exception *exceptionObject = static_cast<_Unwind_Exception*>(exception);
|
||||||
|
// Wrap the call to the unexpected handler in calls to `__cxa_begin_catch`
|
||||||
|
// and `__cxa_end_catch` so that we correctly update exception counts if
|
||||||
|
// the unexpected handler throws an exception.
|
||||||
|
__cxa_begin_catch(exceptionObject);
|
||||||
|
__attribute__((cleanup(end_catch)))
|
||||||
|
char unused;
|
||||||
if (exceptionObject->exception_class == exception_class)
|
if (exceptionObject->exception_class == exception_class)
|
||||||
{
|
{
|
||||||
__cxa_exception *ex = exceptionFromPointer(exceptionObject);
|
__cxa_exception *ex = exceptionFromPointer(exceptionObject);
|
||||||
|
@ -151,4 +151,21 @@ void operator delete[](void * ptr) NOEXCEPT
|
|||||||
::operator delete(ptr);
|
::operator delete(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// C++14 additional delete operators
|
||||||
|
|
||||||
|
#if __cplusplus >= 201402L
|
||||||
|
|
||||||
|
__attribute__((weak))
|
||||||
|
void operator delete(void * ptr, size_t) NOEXCEPT
|
||||||
|
{
|
||||||
|
::operator delete(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
__attribute__((weak))
|
||||||
|
void operator delete[](void * ptr, size_t) NOEXCEPT
|
||||||
|
{
|
||||||
|
::operator delete(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@ -22,7 +22,7 @@ SRCS+= libelftc_dem_gnu3.c\
|
|||||||
|
|
||||||
WARNS= 0
|
WARNS= 0
|
||||||
CFLAGS+= -isystem ${SRCDIR} -nostdinc++
|
CFLAGS+= -isystem ${SRCDIR} -nostdinc++
|
||||||
CXXSTD?= c++11
|
CXXSTD?= c++14
|
||||||
VERSION_MAP= ${.CURDIR}/Version.map
|
VERSION_MAP= ${.CURDIR}/Version.map
|
||||||
|
|
||||||
.include <bsd.lib.mk>
|
.include <bsd.lib.mk>
|
||||||
|
@ -277,6 +277,10 @@ CXXABI_1.3.9 {
|
|||||||
"typeinfo name for unsigned __int128 const*";
|
"typeinfo name for unsigned __int128 const*";
|
||||||
"typeinfo name for unsigned __int128";
|
"typeinfo name for unsigned __int128";
|
||||||
"typeinfo name for unsigned __int128*";
|
"typeinfo name for unsigned __int128*";
|
||||||
|
"operator delete[](void*, unsigned int)";
|
||||||
|
"operator delete(void*, unsigned int)";
|
||||||
|
"operator delete[](void*, unsigned long)";
|
||||||
|
"operator delete(void*, unsigned long)";
|
||||||
};
|
};
|
||||||
} CXXABI_1.3.6;
|
} CXXABI_1.3.6;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user