1540d2a8bSDimitry Andric// -*- C++ -*- 2540d2a8bSDimitry Andric//===----------------------------------------------------------------------===// 3540d2a8bSDimitry Andric// 4540d2a8bSDimitry Andric// The LLVM Compiler Infrastructure 5540d2a8bSDimitry Andric// 6540d2a8bSDimitry Andric// This file is dual licensed under the MIT and the University of Illinois Open 7540d2a8bSDimitry Andric// Source Licenses. See LICENSE.TXT for details. 8540d2a8bSDimitry Andric// 9540d2a8bSDimitry Andric//===----------------------------------------------------------------------===// 10540d2a8bSDimitry Andric 11540d2a8bSDimitry Andric#include <cstdio> 12540d2a8bSDimitry Andric 13540d2a8bSDimitry Andricnamespace std { 14540d2a8bSDimitry Andric 15540d2a8bSDimitry Andric_LIBCPP_SAFE_STATIC static std::terminate_handler __terminate_handler; 16540d2a8bSDimitry Andric_LIBCPP_SAFE_STATIC static std::unexpected_handler __unexpected_handler; 17540d2a8bSDimitry Andric 18540d2a8bSDimitry Andric 19540d2a8bSDimitry Andric// libcxxrt provides implementations of these functions itself. 20540d2a8bSDimitry Andricunexpected_handler 21540d2a8bSDimitry Andricset_unexpected(unexpected_handler func) _NOEXCEPT 22540d2a8bSDimitry Andric{ 23b2c7081bSDimitry Andric return __libcpp_atomic_exchange(&__unexpected_handler, func); 24540d2a8bSDimitry Andric} 25540d2a8bSDimitry Andric 26540d2a8bSDimitry Andricunexpected_handler 27540d2a8bSDimitry Andricget_unexpected() _NOEXCEPT 28540d2a8bSDimitry Andric{ 29b2c7081bSDimitry Andric return __libcpp_atomic_load(&__unexpected_handler); 30540d2a8bSDimitry Andric 31540d2a8bSDimitry Andric} 32540d2a8bSDimitry Andric 33540d2a8bSDimitry Andric_LIBCPP_NORETURN 34540d2a8bSDimitry Andricvoid unexpected() 35540d2a8bSDimitry Andric{ 36540d2a8bSDimitry Andric (*get_unexpected())(); 37540d2a8bSDimitry Andric // unexpected handler should not return 38540d2a8bSDimitry Andric terminate(); 39540d2a8bSDimitry Andric} 40540d2a8bSDimitry Andric 41540d2a8bSDimitry Andricterminate_handler 42540d2a8bSDimitry Andricset_terminate(terminate_handler func) _NOEXCEPT 43540d2a8bSDimitry Andric{ 44b2c7081bSDimitry Andric return __libcpp_atomic_exchange(&__terminate_handler, func); 45540d2a8bSDimitry Andric} 46540d2a8bSDimitry Andric 47540d2a8bSDimitry Andricterminate_handler 48540d2a8bSDimitry Andricget_terminate() _NOEXCEPT 49540d2a8bSDimitry Andric{ 50b2c7081bSDimitry Andric return __libcpp_atomic_load(&__terminate_handler); 51540d2a8bSDimitry Andric} 52540d2a8bSDimitry Andric 53540d2a8bSDimitry Andric#ifndef __EMSCRIPTEN__ // We provide this in JS 54540d2a8bSDimitry Andric_LIBCPP_NORETURN 55540d2a8bSDimitry Andricvoid 56540d2a8bSDimitry Andricterminate() _NOEXCEPT 57540d2a8bSDimitry Andric{ 58540d2a8bSDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 59540d2a8bSDimitry Andric try 60540d2a8bSDimitry Andric { 61540d2a8bSDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 62540d2a8bSDimitry Andric (*get_terminate())(); 63540d2a8bSDimitry Andric // handler should not return 64540d2a8bSDimitry Andric fprintf(stderr, "terminate_handler unexpectedly returned\n"); 65540d2a8bSDimitry Andric ::abort(); 66540d2a8bSDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 67540d2a8bSDimitry Andric } 68540d2a8bSDimitry Andric catch (...) 69540d2a8bSDimitry Andric { 70540d2a8bSDimitry Andric // handler should not throw exception 71540d2a8bSDimitry Andric fprintf(stderr, "terminate_handler unexpectedly threw an exception\n"); 72540d2a8bSDimitry Andric ::abort(); 73540d2a8bSDimitry Andric } 74540d2a8bSDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 75540d2a8bSDimitry Andric} 76540d2a8bSDimitry Andric#endif // !__EMSCRIPTEN__ 77540d2a8bSDimitry Andric 78540d2a8bSDimitry Andric#if !defined(__EMSCRIPTEN__) 79540d2a8bSDimitry Andricbool uncaught_exception() _NOEXCEPT { return uncaught_exceptions() > 0; } 80540d2a8bSDimitry Andric 81540d2a8bSDimitry Andricint uncaught_exceptions() _NOEXCEPT 82540d2a8bSDimitry Andric{ 83540d2a8bSDimitry Andric#warning uncaught_exception not yet implemented 84540d2a8bSDimitry Andric fprintf(stderr, "uncaught_exceptions not yet implemented\n"); 85540d2a8bSDimitry Andric ::abort(); 86540d2a8bSDimitry Andric} 87540d2a8bSDimitry Andric#endif // !__EMSCRIPTEN__ 88540d2a8bSDimitry Andric 89540d2a8bSDimitry Andric 90540d2a8bSDimitry Andricexception::~exception() _NOEXCEPT 91540d2a8bSDimitry Andric{ 92540d2a8bSDimitry Andric} 93540d2a8bSDimitry Andric 94540d2a8bSDimitry Andricconst char* exception::what() const _NOEXCEPT 95540d2a8bSDimitry Andric{ 96540d2a8bSDimitry Andric return "std::exception"; 97540d2a8bSDimitry Andric} 98540d2a8bSDimitry Andric 99540d2a8bSDimitry Andricbad_exception::~bad_exception() _NOEXCEPT 100540d2a8bSDimitry Andric{ 101540d2a8bSDimitry Andric} 102540d2a8bSDimitry Andric 103540d2a8bSDimitry Andricconst char* bad_exception::what() const _NOEXCEPT 104540d2a8bSDimitry Andric{ 105540d2a8bSDimitry Andric return "std::bad_exception"; 106540d2a8bSDimitry Andric} 107540d2a8bSDimitry Andric 108540d2a8bSDimitry Andric 109540d2a8bSDimitry Andricbad_alloc::bad_alloc() _NOEXCEPT 110540d2a8bSDimitry Andric{ 111540d2a8bSDimitry Andric} 112540d2a8bSDimitry Andric 113540d2a8bSDimitry Andricbad_alloc::~bad_alloc() _NOEXCEPT 114540d2a8bSDimitry Andric{ 115540d2a8bSDimitry Andric} 116540d2a8bSDimitry Andric 117540d2a8bSDimitry Andricconst char* 118540d2a8bSDimitry Andricbad_alloc::what() const _NOEXCEPT 119540d2a8bSDimitry Andric{ 120540d2a8bSDimitry Andric return "std::bad_alloc"; 121540d2a8bSDimitry Andric} 122540d2a8bSDimitry Andric 123540d2a8bSDimitry Andricbad_array_new_length::bad_array_new_length() _NOEXCEPT 124540d2a8bSDimitry Andric{ 125540d2a8bSDimitry Andric} 126540d2a8bSDimitry Andric 127540d2a8bSDimitry Andricbad_array_new_length::~bad_array_new_length() _NOEXCEPT 128540d2a8bSDimitry Andric{ 129540d2a8bSDimitry Andric} 130540d2a8bSDimitry Andric 131540d2a8bSDimitry Andricconst char* 132540d2a8bSDimitry Andricbad_array_new_length::what() const _NOEXCEPT 133540d2a8bSDimitry Andric{ 134540d2a8bSDimitry Andric return "bad_array_new_length"; 135540d2a8bSDimitry Andric} 136540d2a8bSDimitry Andric 137540d2a8bSDimitry Andricbad_cast::bad_cast() _NOEXCEPT 138540d2a8bSDimitry Andric{ 139540d2a8bSDimitry Andric} 140540d2a8bSDimitry Andric 141540d2a8bSDimitry Andricbad_typeid::bad_typeid() _NOEXCEPT 142540d2a8bSDimitry Andric{ 143540d2a8bSDimitry Andric} 144540d2a8bSDimitry Andric 145540d2a8bSDimitry Andricbad_cast::~bad_cast() _NOEXCEPT 146540d2a8bSDimitry Andric{ 147540d2a8bSDimitry Andric} 148540d2a8bSDimitry Andric 149540d2a8bSDimitry Andricconst char* 150540d2a8bSDimitry Andricbad_cast::what() const _NOEXCEPT 151540d2a8bSDimitry Andric{ 152540d2a8bSDimitry Andric return "std::bad_cast"; 153540d2a8bSDimitry Andric} 154540d2a8bSDimitry Andric 155540d2a8bSDimitry Andricbad_typeid::~bad_typeid() _NOEXCEPT 156540d2a8bSDimitry Andric{ 157540d2a8bSDimitry Andric} 158540d2a8bSDimitry Andric 159540d2a8bSDimitry Andricconst char* 160540d2a8bSDimitry Andricbad_typeid::what() const _NOEXCEPT 161540d2a8bSDimitry Andric{ 162540d2a8bSDimitry Andric return "std::bad_typeid"; 163540d2a8bSDimitry Andric} 164540d2a8bSDimitry Andric 165540d2a8bSDimitry Andric} // namespace std 166