summaryrefslogtreecommitdiffstats
path: root/libcxxabi/src/cxa_handlers.cpp
diff options
context:
space:
mode:
authorNick Kledzik <kledzik@apple.com>2012-03-15 01:52:12 +0000
committerNick Kledzik <kledzik@apple.com>2012-03-15 01:52:12 +0000
commit778324abe434adeef05b7d9af8f4d38bead14502 (patch)
tree833ac4194dd6050e991a08d2ab658c597e2dc354 /libcxxabi/src/cxa_handlers.cpp
parentbe2ccf01b7020499890f7ee4f74370983517b7d5 (diff)
downloadbcm5719-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.cpp84
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
OpenPOWER on IntegriCloud