diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2024-01-25 17:41:44 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2024-01-25 17:43:23 +0000 |
commit | ecf4106237505fa9459ae871793b754334989c17 (patch) | |
tree | 4cc7bd9c386e4e6c540009a23cd2651616330a8e /contrib/libcxxrt | |
parent | e95025ed93886dc854c2c92a2d2812cb51abf4ed (diff) | |
parent | 156745f575946b366c430fc2bc7b9a90d5925b29 (diff) | |
download | src-ecf4106237505fa9459ae871793b754334989c17.tar.gz src-ecf4106237505fa9459ae871793b754334989c17.zip |
Diffstat (limited to 'contrib/libcxxrt')
-rw-r--r-- | contrib/libcxxrt/cxxabi.h | 8 | ||||
-rw-r--r-- | contrib/libcxxrt/exception.cc | 44 |
2 files changed, 44 insertions, 8 deletions
diff --git a/contrib/libcxxrt/cxxabi.h b/contrib/libcxxrt/cxxabi.h index e843599c66da..e021f85c905a 100644 --- a/contrib/libcxxrt/cxxabi.h +++ b/contrib/libcxxrt/cxxabi.h @@ -203,6 +203,14 @@ __cxa_eh_globals *__cxa_get_globals_fast(void); std::type_info * __cxa_current_exception_type(); + +void *__cxa_allocate_exception(size_t thrown_size); + +void __cxa_free_exception(void* thrown_exception); + +__cxa_exception *__cxa_init_primary_exception( + void *object, std::type_info* tinfo, void (*dest)(void *)); + /** * Throws an exception returned by __cxa_current_primary_exception(). This * exception may have been caught in another thread. diff --git a/contrib/libcxxrt/exception.cc b/contrib/libcxxrt/exception.cc index 6c5196876b10..b1659c902f56 100644 --- a/contrib/libcxxrt/exception.cc +++ b/contrib/libcxxrt/exception.cc @@ -162,6 +162,7 @@ struct __cxa_thread_info terminate_handler terminateHandler; /** The unexpected exception handler for this thread. */ unexpected_handler unexpectedHandler; +#ifndef LIBCXXRT_NO_EMERGENCY_MALLOC /** * The number of emergency buffers held by this thread. This is 0 in * normal operation - the emergency buffers are only used when malloc() @@ -170,6 +171,7 @@ struct __cxa_thread_info * in ABI spec [3.3.1]). */ int emergencyBuffersHeld; +#endif /** * The exception currently running in a cleanup. */ @@ -445,6 +447,23 @@ extern "C" __cxa_eh_globals *ABI_NAMESPACE::__cxa_get_globals_fast(void) return &(thread_info_fast()->globals); } +#ifdef LIBCXXRT_NO_EMERGENCY_MALLOC +static char *alloc_or_die(size_t size) +{ + char *buffer = static_cast<char*>(calloc(1, size)); + + if (buffer == nullptr) + { + fputs("Out of memory attempting to allocate exception\n", stderr); + std::terminate(); + } + return buffer; +} +static void free_exception(char *e) +{ + free(e); +} +#else /** * An emergency allocation reserved for when malloc fails. This is treated as * 16 buffers of 1KB each. @@ -584,6 +603,7 @@ static void free_exception(char *e) free(e); } } +#endif /** * Allocates an exception structure. Returns a pointer to the space that can @@ -773,6 +793,21 @@ static void throw_exception(__cxa_exception *ex) report_failure(err, ex); } +extern "C" __cxa_exception *__cxa_init_primary_exception( + void *object, std::type_info* tinfo, void (*dest)(void *)) { + __cxa_exception *ex = reinterpret_cast<__cxa_exception*>(object) - 1; + + ex->referenceCount = 0; + ex->exceptionType = tinfo; + + ex->exceptionDestructor = dest; + + ex->unwindHeader.exception_class = exception_class; + ex->unwindHeader.exception_cleanup = exception_cleanup; + + return ex; +} + /** * ABI function for throwing an exception. Takes the object to be thrown (the @@ -783,15 +818,8 @@ extern "C" void __cxa_throw(void *thrown_exception, std::type_info *tinfo, void(*dest)(void*)) { - __cxa_exception *ex = reinterpret_cast<__cxa_exception*>(thrown_exception) - 1; - + __cxa_exception *ex = __cxa_init_primary_exception(thrown_exception, tinfo, dest); ex->referenceCount = 1; - ex->exceptionType = tinfo; - - ex->exceptionDestructor = dest; - - ex->unwindHeader.exception_class = exception_class; - ex->unwindHeader.exception_cleanup = exception_cleanup; throw_exception(ex); } |