[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