From 2e398f1895b9ec154718fa03655f625e7848fff6 Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Fri, 12 Jul 2019 19:10:59 +0000 Subject: [PATCH] [libcxxabi] Don't process exceptions in cxa_handlers when they're disabled When exceptions are disabled, avoid their processing altogether. This avoids pulling in the depenency on demangler significantly reducing binary size when statically linking against libc++abi built without exception support. Differential Revision: https://reviews.llvm.org/D64191 llvm-svn: 365944 --- libcxxabi/CMakeLists.txt | 4 +++- libcxxabi/src/cxa_default_handlers.cpp | 2 ++ libcxxabi/src/cxa_handlers.cpp | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libcxxabi/CMakeLists.txt b/libcxxabi/CMakeLists.txt index e197727..8ca1690 100644 --- a/libcxxabi/CMakeLists.txt +++ b/libcxxabi/CMakeLists.txt @@ -43,7 +43,9 @@ include(CMakeDependentOption) include(HandleCompilerRT) # Define options. -option(LIBCXXABI_ENABLE_EXCEPTIONS "Use exceptions." ON) +option(LIBCXXABI_ENABLE_EXCEPTIONS + "Provide support for exceptions in the runtime. + When disabled, libc++abi does not support stack unwinding and other exceptions-related features." ON) option(LIBCXXABI_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON) option(LIBCXXABI_ENABLE_PEDANTIC "Compile with pedantic enabled." ON) option(LIBCXXABI_ENABLE_PIC "Build Position-Independent Code, even in static library" ON) diff --git a/libcxxabi/src/cxa_default_handlers.cpp b/libcxxabi/src/cxa_default_handlers.cpp index 8110f6c..8cacb35 100644 --- a/libcxxabi/src/cxa_default_handlers.cpp +++ b/libcxxabi/src/cxa_default_handlers.cpp @@ -25,6 +25,7 @@ static const char* cause = "uncaught"; __attribute__((noreturn)) static void demangling_terminate_handler() { +#ifndef _LIBCXXABI_NO_EXCEPTIONS // If there might be an uncaught exception using namespace __cxxabiv1; __cxa_eh_globals* globals = __cxa_get_globals_fast(); @@ -71,6 +72,7 @@ static void demangling_terminate_handler() abort_message("terminating with %s foreign exception", cause); } } +#endif // Else just note that we're terminating abort_message("terminating"); } diff --git a/libcxxabi/src/cxa_handlers.cpp b/libcxxabi/src/cxa_handlers.cpp index 390bc656..4fdc190 100644 --- a/libcxxabi/src/cxa_handlers.cpp +++ b/libcxxabi/src/cxa_handlers.cpp @@ -73,6 +73,7 @@ __attribute__((noreturn)) void terminate() _NOEXCEPT { +#ifndef _LIBCXXABI_NO_EXCEPTIONS // If there might be an uncaught exception using namespace __cxxabiv1; __cxa_eh_globals* globals = __cxa_get_globals_fast(); @@ -87,6 +88,7 @@ terminate() _NOEXCEPT __terminate(exception_header->terminateHandler); } } +#endif __terminate(get_terminate()); } -- 2.7.4