[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
This commit is contained in:
parent
6d75a9e873
commit
2e398f1895
|
@ -43,7 +43,9 @@ include(CMakeDependentOption)
|
||||||
include(HandleCompilerRT)
|
include(HandleCompilerRT)
|
||||||
|
|
||||||
# Define options.
|
# 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_ASSERTIONS "Enable assertions independent of build mode." ON)
|
||||||
option(LIBCXXABI_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
|
option(LIBCXXABI_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
|
||||||
option(LIBCXXABI_ENABLE_PIC "Build Position-Independent Code, even in static library" ON)
|
option(LIBCXXABI_ENABLE_PIC "Build Position-Independent Code, even in static library" ON)
|
||||||
|
|
|
@ -25,6 +25,7 @@ static const char* cause = "uncaught";
|
||||||
__attribute__((noreturn))
|
__attribute__((noreturn))
|
||||||
static void demangling_terminate_handler()
|
static void demangling_terminate_handler()
|
||||||
{
|
{
|
||||||
|
#ifndef _LIBCXXABI_NO_EXCEPTIONS
|
||||||
// If there might be an uncaught exception
|
// If there might be an uncaught exception
|
||||||
using namespace __cxxabiv1;
|
using namespace __cxxabiv1;
|
||||||
__cxa_eh_globals* globals = __cxa_get_globals_fast();
|
__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);
|
abort_message("terminating with %s foreign exception", cause);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
// Else just note that we're terminating
|
// Else just note that we're terminating
|
||||||
abort_message("terminating");
|
abort_message("terminating");
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,6 +73,7 @@ __attribute__((noreturn))
|
||||||
void
|
void
|
||||||
terminate() _NOEXCEPT
|
terminate() _NOEXCEPT
|
||||||
{
|
{
|
||||||
|
#ifndef _LIBCXXABI_NO_EXCEPTIONS
|
||||||
// If there might be an uncaught exception
|
// If there might be an uncaught exception
|
||||||
using namespace __cxxabiv1;
|
using namespace __cxxabiv1;
|
||||||
__cxa_eh_globals* globals = __cxa_get_globals_fast();
|
__cxa_eh_globals* globals = __cxa_get_globals_fast();
|
||||||
|
@ -87,6 +88,7 @@ terminate() _NOEXCEPT
|
||||||
__terminate(exception_header->terminateHandler);
|
__terminate(exception_header->terminateHandler);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
__terminate(get_terminate());
|
__terminate(get_terminate());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue