mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-20 03:18:30 +00:00
Release Cosmopolitan v3.6.0
This release is an atomic upgrade to GCC 14.1.0 with C23 and C++23
This commit is contained in:
parent
62ace3623a
commit
5660ec4741
1585 changed files with 117353 additions and 271644 deletions
62
third_party/libcxxabi/cxa_exception.cc
vendored
62
third_party/libcxxabi/cxa_exception.cc
vendored
|
@ -11,13 +11,14 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "third_party/libcxxabi/include/cxxabi.h"
|
||||
#include "third_party/libcxx/__thread/support.h"
|
||||
|
||||
#include "third_party/libcxx/exception" // for std::terminate
|
||||
#include "libc/isystem/string.h" // for memset
|
||||
#include "third_party/libcxxabi/cxa_exception.h"
|
||||
#include "third_party/libcxxabi/cxa_handlers.h"
|
||||
#include "third_party/libcxxabi/fallback_malloc.h"
|
||||
#include "third_party/libcxx/src/include/atomic_support.h" // from libc++
|
||||
#include <exception> // for std::terminate
|
||||
#include <string.h> // for memset
|
||||
#include "cxa_exception.h"
|
||||
#include "cxa_handlers.h"
|
||||
#include "fallback_malloc.h"
|
||||
#include "third_party/libcxx/atomic_support.h" // from libc++
|
||||
|
||||
#if __has_feature(address_sanitizer)
|
||||
#include <sanitizer/asan_interface.h>
|
||||
|
@ -206,6 +207,24 @@ void __cxa_free_exception(void *thrown_object) throw() {
|
|||
__aligned_free_with_fallback((void *)raw_buffer);
|
||||
}
|
||||
|
||||
__cxa_exception* __cxa_init_primary_exception(void* object, std::type_info* tinfo,
|
||||
#ifdef __wasm__
|
||||
// In Wasm, a destructor returns its argument
|
||||
void *(_LIBCXXABI_DTOR_FUNC* dest)(void*)) throw() {
|
||||
#else
|
||||
void(_LIBCXXABI_DTOR_FUNC* dest)(void*)) throw() {
|
||||
#endif
|
||||
__cxa_exception* exception_header = cxa_exception_from_thrown_object(object);
|
||||
exception_header->referenceCount = 0;
|
||||
exception_header->unexpectedHandler = std::get_unexpected();
|
||||
exception_header->terminateHandler = std::get_terminate();
|
||||
exception_header->exceptionType = tinfo;
|
||||
exception_header->exceptionDestructor = dest;
|
||||
setOurExceptionClass(&exception_header->unwindHeader);
|
||||
exception_header->unwindHeader.exception_cleanup = exception_cleanup_func;
|
||||
|
||||
return exception_header;
|
||||
}
|
||||
|
||||
// This function shall allocate a __cxa_dependent_exception and
|
||||
// return a pointer to it. (Really to the object, not past its' end).
|
||||
|
@ -254,23 +273,21 @@ will call terminate, assuming that there was no handler for the
|
|||
exception.
|
||||
*/
|
||||
void
|
||||
#ifdef __wasm__
|
||||
// In Wasm, a destructor returns its argument
|
||||
__cxa_throw(void *thrown_object, std::type_info *tinfo, void *(_LIBCXXABI_DTOR_FUNC *dest)(void *)) {
|
||||
#else
|
||||
__cxa_throw(void *thrown_object, std::type_info *tinfo, void (_LIBCXXABI_DTOR_FUNC *dest)(void *)) {
|
||||
__cxa_eh_globals *globals = __cxa_get_globals();
|
||||
__cxa_exception* exception_header = cxa_exception_from_thrown_object(thrown_object);
|
||||
#endif
|
||||
__cxa_eh_globals* globals = __cxa_get_globals();
|
||||
globals->uncaughtExceptions += 1; // Not atomically, since globals are thread-local
|
||||
|
||||
exception_header->unexpectedHandler = std::get_unexpected();
|
||||
exception_header->terminateHandler = std::get_terminate();
|
||||
exception_header->exceptionType = tinfo;
|
||||
exception_header->exceptionDestructor = dest;
|
||||
setOurExceptionClass(&exception_header->unwindHeader);
|
||||
exception_header->referenceCount = 1; // This is a newly allocated exception, no need for thread safety.
|
||||
globals->uncaughtExceptions += 1; // Not atomically, since globals are thread-local
|
||||
|
||||
exception_header->unwindHeader.exception_cleanup = exception_cleanup_func;
|
||||
__cxa_exception* exception_header = __cxa_init_primary_exception(thrown_object, tinfo, dest);
|
||||
exception_header->referenceCount = 1; // This is a newly allocated exception, no need for thread safety.
|
||||
|
||||
#if __has_feature(address_sanitizer)
|
||||
// Inform the ASan runtime that now might be a good time to clean stuff up.
|
||||
__asan_handle_no_return();
|
||||
// Inform the ASan runtime that now might be a good time to clean stuff up.
|
||||
__asan_handle_no_return();
|
||||
#endif
|
||||
|
||||
#ifdef __USING_SJLJ_EXCEPTIONS__
|
||||
|
@ -573,6 +590,11 @@ void __cxa_end_catch() {
|
|||
}
|
||||
}
|
||||
|
||||
void __cxa_call_terminate(void* unwind_arg) throw() {
|
||||
__cxa_begin_catch(unwind_arg);
|
||||
std::terminate();
|
||||
}
|
||||
|
||||
// Note: exception_header may be masquerading as a __cxa_dependent_exception
|
||||
// and that's ok. exceptionType is there too.
|
||||
// However watch out for foreign exceptions. Return null for them.
|
||||
|
@ -771,6 +793,6 @@ __cxa_uncaught_exceptions() throw()
|
|||
return globals->uncaughtExceptions;
|
||||
}
|
||||
|
||||
} // extern "C"
|
||||
} // extern "C"
|
||||
|
||||
} // abi
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue