Skip to content

Commit

Permalink
Merge libcxxrt master f96846efbfd508f66d91fcbbef5dd808947c7f6d.
Browse files Browse the repository at this point in the history
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


git-svn-id: svn+ssh://svn.freebsd.org/base/head@350360 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f
  • Loading branch information
dim committed Jul 26, 2019
1 parent c9fc4fa commit 13c0658
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 2 deletions.
25 changes: 24 additions & 1 deletion contrib/libcxxrt/exception.cc
Original file line number Diff line number Diff line change
Expand Up @@ -879,6 +879,13 @@ extern "C" void __cxa_rethrow()

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
// catch block

Expand Down Expand Up @@ -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.
__cxa_thread_info *ti = thread_info();
__cxa_eh_globals *globals = &ti->globals;
globals->uncaughtExceptions--;
_Unwind_Exception *exceptionObject = static_cast<_Unwind_Exception*>(e);

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);

if (ex->handlerCount == 0)
Expand Down Expand Up @@ -1364,6 +1373,14 @@ extern "C" std::type_info *__cxa_current_exception_type()
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.
*
Expand All @@ -1372,6 +1389,12 @@ extern "C" std::type_info *__cxa_current_exception_type()
extern "C" void __cxa_call_unexpected(void*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)
{
__cxa_exception *ex = exceptionFromPointer(exceptionObject);
Expand Down
17 changes: 17 additions & 0 deletions contrib/libcxxrt/memory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -151,4 +151,21 @@ void operator delete[](void * ptr) NOEXCEPT
::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
2 changes: 1 addition & 1 deletion lib/libcxxrt/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ SRCS+= libelftc_dem_gnu3.c\

WARNS= 0
CFLAGS+= -isystem ${SRCDIR} -nostdinc++
CXXSTD?= c++11
CXXSTD?= c++14
VERSION_MAP= ${.CURDIR}/Version.map

.include <bsd.lib.mk>
4 changes: 4 additions & 0 deletions lib/libcxxrt/Version.map
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,10 @@ CXXABI_1.3.9 {
"typeinfo name for unsigned __int128 const*";
"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;

Expand Down

0 comments on commit 13c0658

Please sign in to comment.