]> granicus.if.org Git - esp-idf/commitdiff
cxx: don’t define stubs for __throw_* functions
authorAlexey Gerenkov <alexey@espressif.com>
Tue, 28 Aug 2018 04:22:12 +0000 (12:22 +0800)
committerAnton Maklakov <anton@espressif.com>
Thu, 20 Sep 2018 10:53:15 +0000 (18:53 +0800)
If exception support is disabled in IDF, and libstdc++ tries to throw
an exception, it will call __cxa_allocate_exception which is replaced
with abort in IDF.

We have a dramatically size reduction of the RO-section in binary when using '__throw_'-stubs in GCC5
In the case of using GCC8, we are faced with 'multiple definition' errors when using '__throw_'-stubs.
Good that we don't have the size problem due to gcc8

components/cxx/cxx_exception_stubs.cpp

index b67bc2ad34ffb87339b4471e1f0916071deda71c..f09f946ddc25e4f876764ae34b0012c78813c78f 100644 (file)
@@ -36,42 +36,26 @@ extern "C" void __cxx_fatal_exception_int(int i)
     abort();
 }
 
+#if !GCC_NOT_5_2_0
 void std::__throw_bad_exception(void) __attribute__((alias("__cxx_fatal_exception")));
-
 void std::__throw_bad_alloc(void) __attribute__((alias("__cxx_fatal_exception")));
-
 void std::__throw_bad_cast(void) __attribute__((alias("__cxx_fatal_exception")));
-
 void std::__throw_bad_typeid(void) __attribute__((alias("__cxx_fatal_exception")));
-
 void std::__throw_logic_error(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
-
 void std::__throw_domain_error(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
-
 void std::__throw_invalid_argument(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
-
 void std::__throw_length_error(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
-
 void std::__throw_out_of_range(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
-
 void std::__throw_out_of_range_fmt(const char*, ...) __attribute__((alias("__cxx_fatal_exception_message_va")));
-
 void std::__throw_runtime_error(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
-
 void std::__throw_range_error(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
-
 void std::__throw_overflow_error(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
-
 void std::__throw_underflow_error(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
-
 void std::__throw_ios_failure(const char*) __attribute__((alias("__cxx_fatal_exception_message")));
-
 void std::__throw_system_error(int) __attribute__((alias("__cxx_fatal_exception_int")));
-
 void std::__throw_bad_function_call(void) __attribute__((alias("__cxx_fatal_exception")));
-
 void std::__throw_future_error(int) __attribute__((alias("__cxx_fatal_exception_int")));
-
+#endif
 
 /* The following definitions are needed because libstdc++ is also compiled with
    __throw_exception_again defined to throw, and some other exception code in a few places.