Index: third_party/libc++abi/src/cxa_handlers.cpp |
=================================================================== |
--- third_party/libc++abi/src/cxa_handlers.cpp (revision 0) |
+++ third_party/libc++abi/src/cxa_handlers.cpp (revision 0) |
@@ -0,0 +1,125 @@ |
+//===------------------------- cxa_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 functionality associated with the terminate_handler, |
+// unexpected_handler, and new_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" |
+ |
+namespace std |
+{ |
+ |
+unexpected_handler |
+get_unexpected() _NOEXCEPT |
+{ |
+ return __sync_fetch_and_add(&__cxa_unexpected_handler, (unexpected_handler)0); |
+// The above is safe but overkill on x86 |
+// Using of C++11 atomics this should be rewritten |
+// return __cxa_unexpected_handler.load(memory_order_acq); |
+} |
+ |
+__attribute__((visibility("hidden"), noreturn)) |
+void |
+__unexpected(unexpected_handler func) |
+{ |
+ func(); |
+ // unexpected handler should not return |
+ abort_message("unexpected_handler unexpectedly returned"); |
+} |
+ |
+__attribute__((noreturn)) |
+void |
+unexpected() |
+{ |
+ __unexpected(get_unexpected()); |
+} |
+ |
+terminate_handler |
+get_terminate() _NOEXCEPT |
+{ |
+ return __sync_fetch_and_add(&__cxa_terminate_handler, (terminate_handler)0); |
+// The above is safe but overkill on x86 |
+// Using of C++11 atomics this should be rewritten |
+// return __cxa_terminate_handler.load(memory_order_acq); |
+} |
+ |
+__attribute__((visibility("hidden"), noreturn)) |
+void |
+__terminate(terminate_handler func) _NOEXCEPT |
+{ |
+#if __has_feature(cxx_exceptions) |
+ try |
+ { |
+#endif // __has_feature(cxx_exceptions) |
+ func(); |
+ // handler should not return |
+ abort_message("terminate_handler unexpectedly returned"); |
+#if __has_feature(cxx_exceptions) |
+ } |
+ catch (...) |
+ { |
+ // handler should not throw exception |
+ abort_message("terminate_handler unexpectedly threw an exception"); |
+ } |
+#endif // #if __has_feature(cxx_exceptions) |
+} |
+ |
+__attribute__((noreturn)) |
+void |
+terminate() _NOEXCEPT |
+{ |
+ // 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 (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) |
+ __terminate(exception_header->terminateHandler); |
+ } |
+ } |
+ __terminate(get_terminate()); |
+} |
+ |
+extern "C" new_handler __cxa_new_handler = 0; |
+// In the future these will become: |
+// std::atomic<std::new_handler> __cxa_new_handler(0); |
+ |
+new_handler |
+set_new_handler(new_handler handler) _NOEXCEPT |
+{ |
+ return __sync_swap(&__cxa_new_handler, handler); |
+// Using of C++11 atomics this should be rewritten |
+// return __cxa_new_handler.exchange(handler, memory_order_acq_rel); |
+} |
+ |
+new_handler |
+get_new_handler() _NOEXCEPT |
+{ |
+ return __sync_fetch_and_add(&__cxa_new_handler, (new_handler)0); |
+// The above is safe but overkill on x86 |
+// Using of C++11 atomics this should be rewritten |
+// return __cxa_new_handler.load(memory_order_acq); |
+} |
+ |
+} // std |
Property changes on: third_party/libc++abi/src/cxa_handlers.cpp |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |