aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2024-01-25 17:41:44 +0000
committerDimitry Andric <dim@FreeBSD.org>2024-01-25 17:43:23 +0000
commitecf4106237505fa9459ae871793b754334989c17 (patch)
tree4cc7bd9c386e4e6c540009a23cd2651616330a8e /contrib
parente95025ed93886dc854c2c92a2d2812cb51abf4ed (diff)
parent156745f575946b366c430fc2bc7b9a90d5925b29 (diff)
downloadsrc-ecf4106237505fa9459ae871793b754334989c17.tar.gz
src-ecf4106237505fa9459ae871793b754334989c17.zip
Diffstat (limited to 'contrib')
-rw-r--r--contrib/libcxxrt/cxxabi.h8
-rw-r--r--contrib/libcxxrt/exception.cc44
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);
}