diff options
author | Nick Kledzik <kledzik@apple.com> | 2012-03-15 01:52:12 +0000 |
---|---|---|
committer | Nick Kledzik <kledzik@apple.com> | 2012-03-15 01:52:12 +0000 |
commit | 778324abe434adeef05b7d9af8f4d38bead14502 (patch) | |
tree | 833ac4194dd6050e991a08d2ab658c597e2dc354 /libcxxabi/src/cxa_handlers.cpp | |
parent | be2ccf01b7020499890f7ee4f74370983517b7d5 (diff) | |
download | bcm5719-llvm-778324abe434adeef05b7d9af8f4d38bead14502.tar.gz bcm5719-llvm-778324abe434adeef05b7d9af8f4d38bead14502.zip |
move default handlers to their own file so they can be overridden at build time (dyld)
llvm-svn: 152770
Diffstat (limited to 'libcxxabi/src/cxa_handlers.cpp')
-rw-r--r-- | libcxxabi/src/cxa_handlers.cpp | 84 |
1 files changed, 7 insertions, 77 deletions
diff --git a/libcxxabi/src/cxa_handlers.cpp b/libcxxabi/src/cxa_handlers.cpp index bd3f6f44760..3fae66bc079 100644 --- a/libcxxabi/src/cxa_handlers.cpp +++ b/libcxxabi/src/cxa_handlers.cpp @@ -17,95 +17,25 @@ #include "cxxabi.h" #include "cxa_handlers.hpp" #include "cxa_exception.hpp" +#include "cxa_default_handlers.hpp" #include "private_typeinfo.h" namespace std { -static const char* cause = "uncaught"; - -static void default_terminate_handler() -{ - // If there might be an uncaught exception - using namespace __cxxabiv1; - __cxa_eh_globals* globals = __cxa_get_globals_fast(); - if (globals) - { - __cxa_exception* exception_header = globals->caughtExceptions; - // If there is an uncaught exception - if (exception_header) - { - _Unwind_Exception* unwind_exception = - reinterpret_cast<_Unwind_Exception*>(exception_header + 1) - 1; - bool native_exception = - (unwind_exception->exception_class & get_vendor_and_language) == - (kOurExceptionClass & get_vendor_and_language); - if (native_exception) - { - void* thrown_object = - unwind_exception->exception_class == kOurDependentExceptionClass ? - ((__cxa_dependent_exception*)exception_header)->primaryException : - exception_header + 1; - const __shim_type_info* thrown_type = - static_cast<const __shim_type_info*>(exception_header->exceptionType); - // Try to get demangled name of thrown_type - int status; - char buf[1024]; - size_t len = sizeof(buf); - const char* name = __cxa_demangle(thrown_type->name(), buf, &len, &status); - if (status != 0) - name = thrown_type->name(); - // If the uncaught exception can be caught with std::exception& - const __shim_type_info* catch_type = - static_cast<const __shim_type_info*>(&typeid(exception)); - if (catch_type->can_catch(thrown_type, thrown_object)) - { - // Include the what() message from the exception - const exception* e = static_cast<const exception*>(thrown_object); - abort_message("terminating with %s exception of type %s: %s", - cause, name, e->what()); - } - else - // Else just note that we're terminating with an exception - abort_message("terminating with %s exception of type %s", - cause, name); - } - else - // Else we're terminating with a foreign exception - abort_message("terminating with %s foreign exception", cause); - } - } - // Else just note that we're terminating - abort_message("terminating"); -} - -static void default_unexpected_handler() -{ - cause = "unexpected"; - terminate(); -} - -extern "C" -{ - -terminate_handler __cxa_terminate_handler = default_terminate_handler; -unexpected_handler __cxa_unexpected_handler = default_unexpected_handler; -new_handler __cxa_new_handler = 0; - -} // extern "C" unexpected_handler set_unexpected(unexpected_handler func) _NOEXCEPT { if (func == 0) func = default_unexpected_handler; - return __sync_lock_test_and_set(&__cxa_unexpected_handler, func); + return __sync_lock_test_and_set(&__cxxabiapple::__cxa_unexpected_handler, func); } unexpected_handler get_unexpected() _NOEXCEPT { - return __sync_fetch_and_add(&__cxa_unexpected_handler, (unexpected_handler)0); + return __sync_fetch_and_add(&__cxxabiapple::__cxa_unexpected_handler, (unexpected_handler)0); } __attribute__((visibility("hidden"), noreturn)) @@ -129,13 +59,13 @@ set_terminate(terminate_handler func) _NOEXCEPT { if (func == 0) func = default_terminate_handler; - return __sync_lock_test_and_set(&__cxa_terminate_handler, func); + return __sync_lock_test_and_set(&__cxxabiapple::__cxa_terminate_handler, func); } terminate_handler get_terminate() _NOEXCEPT { - return __sync_fetch_and_add(&__cxa_terminate_handler, (terminate_handler)0); + return __sync_fetch_and_add(&__cxxabiapple::__cxa_terminate_handler, (terminate_handler)0); } __attribute__((visibility("hidden"), noreturn)) @@ -186,13 +116,13 @@ terminate() _NOEXCEPT new_handler set_new_handler(new_handler handler) _NOEXCEPT { - return __sync_lock_test_and_set(&__cxa_new_handler, handler); + return __sync_lock_test_and_set(&__cxxabiapple::__cxa_new_handler, handler); } new_handler get_new_handler() _NOEXCEPT { - return __sync_fetch_and_add(&__cxa_new_handler, (new_handler)0); + return __sync_fetch_and_add(&__cxxabiapple::__cxa_new_handler, (new_handler)0); } } // std |