diff options
author | Reid Kleckner <reid@kleckner.net> | 2014-10-03 20:03:47 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2014-10-03 20:03:47 +0000 |
commit | cf6b0c64b96cecaf961ef59f2b1db87f08f30881 (patch) | |
tree | a76732b016aace85f40ee07d0f1b355b918f880a | |
parent | 3c51fa6aae263ee92a1340ca315da604264be9bc (diff) | |
download | bcm5719-llvm-cf6b0c64b96cecaf961ef59f2b1db87f08f30881.tar.gz bcm5719-llvm-cf6b0c64b96cecaf961ef59f2b1db87f08f30881.zip |
Use __atomic_exchange_n instead of Clang's __sync_swap
Also remove an extra extern "C" from a global variable redeclaration.
This allows building libcxxabi with GCC on my system.
Reviewers: majnemer
Differential Revision: http://reviews.llvm.org/D5604
llvm-svn: 219012
-rw-r--r-- | libcxxabi/src/cxa_default_handlers.cpp | 14 | ||||
-rw-r--r-- | libcxxabi/src/cxa_handlers.cpp | 4 |
2 files changed, 10 insertions, 8 deletions
diff --git a/libcxxabi/src/cxa_default_handlers.cpp b/libcxxabi/src/cxa_default_handlers.cpp index a26ea2a05b6..d34341aa328 100644 --- a/libcxxabi/src/cxa_default_handlers.cpp +++ b/libcxxabi/src/cxa_default_handlers.cpp @@ -101,9 +101,10 @@ namespace std unexpected_handler set_unexpected(unexpected_handler func) _NOEXCEPT { - if (func == 0) - func = default_unexpected_handler; - return __sync_swap(&__cxa_unexpected_handler, func); + if (func == 0) + func = default_unexpected_handler; + return __atomic_exchange_n(&__cxa_unexpected_handler, func, + __ATOMIC_ACQ_REL); // Using of C++11 atomics this should be rewritten // return __cxa_unexpected_handler.exchange(func, memory_order_acq_rel); } @@ -111,9 +112,10 @@ set_unexpected(unexpected_handler func) _NOEXCEPT terminate_handler set_terminate(terminate_handler func) _NOEXCEPT { - if (func == 0) - func = default_terminate_handler; - return __sync_swap(&__cxa_terminate_handler, func); + if (func == 0) + func = default_terminate_handler; + return __atomic_exchange_n(&__cxa_terminate_handler, func, + __ATOMIC_ACQ_REL); // Using of C++11 atomics this should be rewritten // return __cxa_terminate_handler.exchange(func, memory_order_acq_rel); } diff --git a/libcxxabi/src/cxa_handlers.cpp b/libcxxabi/src/cxa_handlers.cpp index 674933bfefb..01207ff8de1 100644 --- a/libcxxabi/src/cxa_handlers.cpp +++ b/libcxxabi/src/cxa_handlers.cpp @@ -102,14 +102,14 @@ terminate() _NOEXCEPT __terminate(get_terminate()); } -extern "C" new_handler __cxa_new_handler = 0; +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); + return __atomic_exchange_n(&__cxa_new_handler, handler, __ATOMIC_ACQ_REL); // Using of C++11 atomics this should be rewritten // return __cxa_new_handler.exchange(handler, memory_order_acq_rel); } |