[cfe-commits] [libcxxabi] r152770 - in /libcxxabi/trunk/src: cxa_default_handlers.cpp cxa_default_handlers.hpp cxa_handlers.cpp
Nick Kledzik
kledzik at apple.com
Wed Mar 14 18:52:12 PDT 2012
Author: kledzik
Date: Wed Mar 14 20:52:12 2012
New Revision: 152770
URL: http://llvm.org/viewvc/llvm-project?rev=152770&view=rev
Log:
move default handlers to their own file so they can be overridden at build time (dyld)
Added:
libcxxabi/trunk/src/cxa_default_handlers.cpp
libcxxabi/trunk/src/cxa_default_handlers.hpp
Modified:
libcxxabi/trunk/src/cxa_handlers.cpp
Added: libcxxabi/trunk/src/cxa_default_handlers.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_default_handlers.cpp?rev=152770&view=auto
==============================================================================
--- libcxxabi/trunk/src/cxa_default_handlers.cpp (added)
+++ libcxxabi/trunk/src/cxa_default_handlers.cpp Wed Mar 14 20:52:12 2012
@@ -0,0 +1,98 @@
+//===------------------------- cxa_default_handlers.cpp -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//
+// This file implements the default terminate_handler and unexpected_handler.
+//===----------------------------------------------------------------------===//
+
+#include <stdexcept>
+#include <new>
+#include <exception>
+#include "abort_message.h"
+#include "cxxabi.h"
+#include "cxa_handlers.hpp"
+#include "cxa_exception.hpp"
+#include "private_typeinfo.h"
+#include "cxa_default_handlers.hpp"
+
+__attribute__((noreturn))
+static void default_handler(const char* cause)
+{
+ // 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(std::exception));
+ if (catch_type->can_catch(thrown_type, thrown_object))
+ {
+ // Include the what() message from the exception
+ const std::exception* e = static_cast<const std::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");
+}
+
+
+__attribute__((visibility("hidden"), noreturn))
+void default_terminate_handler()
+{
+ default_handler("terminate");
+}
+
+__attribute__((visibility("hidden"), noreturn))
+void default_unexpected_handler()
+{
+ default_handler("unexpected");
+}
+
+
+//
+// Global variables that hold the pointers to the current handler
+//
+std::terminate_handler __cxa_terminate_handler = default_terminate_handler;
+std::unexpected_handler __cxa_unexpected_handler = default_unexpected_handler;
+std::new_handler __cxa_new_handler = 0;
+
Added: libcxxabi/trunk/src/cxa_default_handlers.hpp
URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_default_handlers.hpp?rev=152770&view=auto
==============================================================================
--- libcxxabi/trunk/src/cxa_default_handlers.hpp (added)
+++ libcxxabi/trunk/src/cxa_default_handlers.hpp Wed Mar 14 20:52:12 2012
@@ -0,0 +1,19 @@
+//===------------------------- cxa_default_handlers.cpp -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//
+// This file declares the default terminate_handler and unexpected_handler.
+//===----------------------------------------------------------------------===//
+
+
+__attribute__((visibility("hidden"), noreturn))
+void
+default_terminate_handler();
+
+__attribute__((visibility("hidden"), noreturn))
+void
+default_unexpected_handler();
Modified: libcxxabi/trunk/src/cxa_handlers.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_handlers.cpp?rev=152770&r1=152769&r2=152770&view=diff
==============================================================================
--- libcxxabi/trunk/src/cxa_handlers.cpp (original)
+++ libcxxabi/trunk/src/cxa_handlers.cpp Wed Mar 14 20:52:12 2012
@@ -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 @@
{
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 @@
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
More information about the cfe-commits
mailing list