diff --git a/libcxxabi/CMakeLists.txt b/libcxxabi/CMakeLists.txt --- a/libcxxabi/CMakeLists.txt +++ b/libcxxabi/CMakeLists.txt @@ -130,6 +130,14 @@ option(LIBCXXABI_NON_DEMANGLING_TERMINATE "Set this to make the terminate handler avoid demangling" OFF) +# Omit __cxa_demangle to reduce the size of libc++[abi].so. Package it into a +# separate static library for when it is actually needed. +option(LIBCXXABI_STATIC_DEMANGLE_LIBRARY "Put __cxa_demangle into a separate static library" OFF) + +if (LIBCXXABI_STATIC_DEMANGLE_LIBRARY AND NOT LIBCXXABI_NON_DEMANGLING_TERMINATE) + message(FATAL_ERROR "libc++demangle is only supported when libc++abi doesn't use demangling") +endif() + if (NOT LIBCXXABI_ENABLE_SHARED AND NOT LIBCXXABI_ENABLE_STATIC) message(FATAL_ERROR "libc++abi must be built as either a shared or static library.") endif() diff --git a/libcxxabi/src/CMakeLists.txt b/libcxxabi/src/CMakeLists.txt --- a/libcxxabi/src/CMakeLists.txt +++ b/libcxxabi/src/CMakeLists.txt @@ -3,7 +3,6 @@ # C++ABI files cxa_aux_runtime.cpp cxa_default_handlers.cpp - cxa_demangle.cpp cxa_exception_storage.cpp cxa_guard.cpp cxa_handlers.cpp @@ -19,6 +18,12 @@ private_typeinfo.cpp ) +if (NOT LIBCXXABI_STATIC_DEMANGLE_LIBRARY) + list(APPEND LIBCXXABI_SOURCES + cxa_demangle.cpp + ) +endif() + if (LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS) list(APPEND LIBCXXABI_SOURCES stdlib_new_delete.cpp @@ -158,6 +163,24 @@ message(STATUS "Could not find ParallelSTL, libc++abi will not attempt to use it but the build may fail if the libc++ in use needs it to be available.") endif() +if (LIBCXXABI_STATIC_DEMANGLE_LIBRARY) + add_library(cxxabi_demangle_static STATIC cxa_demangle.cpp ${LIBCXXABI_HEADERS}) + target_link_libraries(cxxabi_demangle_static PRIVATE cxx-headers cxxabi-headers) + set_target_properties(cxxabi_demangle_static + PROPERTIES + CXX_EXTENSIONS OFF + CXX_STANDARD 20 + CXX_STANDARD_REQUIRED OFF + COMPILE_FLAGS "${LIBCXXABI_COMPILE_FLAGS}" + LINK_FLAGS "${LIBCXXABI_LINK_FLAGS}" + OUTPUT_NAME "c++demangle" + ) + list(APPEND LIBCXXABI_BUILD_TARGETS "cxxabi_demangle_static") + if (LIBCXXABI_INSTALL_STATIC_LIBRARY) + list(APPEND LIBCXXABI_INSTALL_TARGETS "cxxabi_demangle_static") + endif() +endif() + # Build the shared library. add_library(cxxabi_shared_objects OBJECT EXCLUDE_FROM_ALL ${LIBCXXABI_SOURCES} ${LIBCXXABI_HEADERS}) if (LIBCXXABI_USE_LLVM_UNWINDER)