]> granicus.if.org Git - esp-idf/blob - components/cxx/cxx_exception_stubs.cpp
Merge branch 'bugfix/httpd_chunked_content_len' into 'master'
[esp-idf] / components / cxx / cxx_exception_stubs.cpp
1 #include <cstdlib>
2 #include <cstdio>
3 #include <exception>
4 #include <bits/functexcept.h>
5 #include <sdkconfig.h>
6
7 #ifndef CONFIG_CXX_EXCEPTIONS
8
9 const char *FATAL_EXCEPTION = "Fatal C++ exception: ";
10
11 extern "C" void __cxx_fatal_exception(void)
12 {
13     abort();
14 }
15
16 extern "C" bool __cxx_fatal_exception_bool(void)
17 {
18     __cxx_fatal_exception();
19     return false;
20 }
21
22 extern "C" void __cxx_fatal_exception_message(const char *msg)
23 {
24     printf("%s%s\n", FATAL_EXCEPTION, msg);
25     abort();
26 }
27
28 extern "C" void __cxx_fatal_exception_message_va(const char *msg, ...)
29 {
30     __cxx_fatal_exception_message(msg);
31 }
32
33 extern "C" void __cxx_fatal_exception_int(int i)
34 {
35     printf("%s (%d)\n", FATAL_EXCEPTION, i);
36     abort();
37 }
38
39 #if !GCC_NOT_5_2_0
40 void std::__throw_bad_exception(void) __attribute__((alias("__cxx_fatal_exception")));
41 void std::__throw_bad_alloc(void) __attribute__((alias("__cxx_fatal_exception")));
42 void std::__throw_bad_cast(void) __attribute__((alias("__cxx_fatal_exception")));
43 void std::__throw_bad_typeid(void) __attribute__((alias("__cxx_fatal_exception")));
44 void std::__throw_logic_error(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
45 void std::__throw_domain_error(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
46 void std::__throw_invalid_argument(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
47 void std::__throw_length_error(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
48 void std::__throw_out_of_range(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
49 void std::__throw_out_of_range_fmt(const char*, ...) __attribute__((alias("__cxx_fatal_exception_message_va")));
50 void std::__throw_runtime_error(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
51 void std::__throw_range_error(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
52 void std::__throw_overflow_error(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
53 void std::__throw_underflow_error(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
54 void std::__throw_ios_failure(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
55 void std::__throw_system_error(int) __attribute__((alias("__cxx_fatal_exception_int")));
56 void std::__throw_bad_function_call(void) __attribute__((alias("__cxx_fatal_exception")));
57 void std::__throw_future_error(int) __attribute__((alias("__cxx_fatal_exception_int")));
58 #endif
59
60 /* The following definitions are needed because libstdc++ is also compiled with
61    __throw_exception_again defined to throw, and some other exception code in a few places.
62
63    This cause exception handler code to be emitted in the library even though it's mostly
64    unreachable (as any libstdc++ "throw" will first call one of the above stubs, which will abort).
65
66    If these are left out, a bunch of unwanted exception handler code is linked.
67
68    Note: these function prototypes are not correct.
69 */
70
71 extern "C" void __cxa_allocate_exception(void) __attribute__((alias("__cxx_fatal_exception")));
72 extern "C" void __cxa_allocate_dependent_exception(void) __attribute__((alias("__cxx_fatal_exception")));
73 extern "C" void __cxa_begin_catch(void) __attribute__((alias("__cxx_fatal_exception")));
74 extern "C" void __cxa_end_catch(void) __attribute__((alias("__cxx_fatal_exception")));
75 extern "C" void __cxa_get_exception_ptr(void) __attribute__((alias("__cxx_fatal_exception")));
76 extern "C" void __cxa_free_exception(void) __attribute__((alias("__cxx_fatal_exception")));
77 extern "C" void __cxa_free_dependent_exception(void) __attribute__((alias("__cxx_fatal_exception")));
78 extern "C" void __cxa_rethrow(void) __attribute__((alias("__cxx_fatal_exception")));
79 extern "C" void __cxa_throw(void) __attribute__((alias("__cxx_fatal_exception")));
80 extern "C" void __cxa_call_terminate(void) __attribute__((alias("__cxx_fatal_exception")));
81
82 bool std::uncaught_exception() __attribute__((alias("__cxx_fatal_exception_bool")));
83
84 #endif // CONFIG_CXX_EXCEPTIONS