Index: libcxxabi/CMakeLists.txt =================================================================== --- libcxxabi/CMakeLists.txt +++ libcxxabi/CMakeLists.txt @@ -451,9 +451,7 @@ include_directories(include) if (LIBCXXABI_USE_LLVM_UNWINDER OR LLVM_NATIVE_ARCH MATCHES ARM) - find_path( - LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL - libunwind.h + find_path(LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL libunwind.h PATHS ${LIBCXXABI_LIBUNWIND_INCLUDES} ${LIBCXXABI_LIBUNWIND_PATH}/include ${CMAKE_BINARY_DIR}/${LIBCXXABI_LIBUNWIND_INCLUDES} Index: libcxxabi/src/CMakeLists.txt =================================================================== --- libcxxabi/src/CMakeLists.txt +++ libcxxabi/src/CMakeLists.txt @@ -25,17 +25,23 @@ endif() if (LIBCXXABI_ENABLE_EXCEPTIONS) - list(APPEND LIBCXXABI_SOURCES cxa_exception.cpp) - list(APPEND LIBCXXABI_SOURCES cxa_personality.cpp) + list(APPEND LIBCXXABI_SOURCES + cxa_exception.cpp + cxa_personality.cpp + ) else() - list(APPEND LIBCXXABI_SOURCES cxa_noexception.cpp) + list(APPEND LIBCXXABI_SOURCES + cxa_noexception.cpp + ) endif() if (LIBCXXABI_ENABLE_THREADS AND (UNIX OR FUCHSIA) AND NOT (APPLE OR CYGWIN)) list(APPEND LIBCXXABI_SOURCES cxa_thread_atexit.cpp) endif() -set(LIBCXXABI_HEADERS ../include/cxxabi.h) +set(LIBCXXABI_HEADERS + ../include/cxxabi.h +) # Add all the headers to the project for IDEs. if (MSVC_IDE OR XCODE) Index: llvm/utils/gn/secondary/BUILD.gn =================================================================== --- llvm/utils/gn/secondary/BUILD.gn +++ llvm/utils/gn/secondary/BUILD.gn @@ -12,6 +12,7 @@ if (current_os == "linux") { deps += [ "//compiler-rt", + "//libcxxabi", "//libunwind", ] } Index: llvm/utils/gn/secondary/libcxxabi/BUILD.gn =================================================================== --- /dev/null +++ llvm/utils/gn/secondary/libcxxabi/BUILD.gn @@ -0,0 +1,5 @@ +group("libcxxabi") { + deps = [ + "//libcxxabi/src(//llvm/utils/gn/build/toolchain:stage2_unix)", + ] +} Index: llvm/utils/gn/secondary/libcxxabi/src/BUILD.gn =================================================================== --- /dev/null +++ llvm/utils/gn/secondary/libcxxabi/src/BUILD.gn @@ -0,0 +1,147 @@ +import("//clang/runtimes.gni") + +declare_args() { + # Use exceptions. + libcxxabi_enable_exceptions = true + + # Build libc++abi with definitions for operator new/delete. + libcxxabi_enable_new_delete_definitions = true + + # Build libcxxabi as a shared library. + libcxxabi_enable_shared = true + + # Build libcxxabi as a static library. + libcxxabi_enable_static = true + + # Do not export any symbols from the static library. + libcxxabi_hermetic_static_library = false +} + +# TODO: sync_source_lists_from_cmake.py doesn't handle these. +#cxxabi_headers = [ +# "../include/__cxxabi_config.h", +# "../include/cxxabi.h", +#] + +cxxabi_sources = [ + # C++ABI files + "cxa_aux_runtime.cpp", + "cxa_default_handlers.cpp", + "cxa_demangle.cpp", + "cxa_exception_storage.cpp", + "cxa_guard.cpp", + "cxa_handlers.cpp", + "cxa_unexpected.cpp", + "cxa_vector.cpp", + "cxa_virtual.cpp", + + # C++ STL files" + "stdlib_exception.cpp", + "stdlib_stdexcept.cpp", + "stdlib_typeinfo.cpp", + + # Internal files + "abort_message.cpp", + "fallback_malloc.cpp", + "private_typeinfo.cpp", +] +if (libcxxabi_enable_new_delete_definitions) { + cxxabi_sources += [ "stdlib_new_delete.cpp" ] +} +if (libcxxabi_enable_exceptions) { + cxxabi_sources += [ + "cxa_exception.cpp", + "cxa_personality.cpp", + ] +} else { + cxxabi_sources += [ + # This comment prevents `gn format` from putting the file on the same line + # as `sources +=`, for sync_source_lists_from_cmake.py. + "cxa_noexception.cpp", + ] +} +if (target_os == "linux" || target_os == "fuchsia") { + cxxabi_sources += [ + # This comment prevents `gn format` from putting the file on the same line + # as `sources +=`, for sync_source_lists_from_cmake.py. + "cxa_thread_atexit.cpp" + ] +} + +config("cxxabi_config") { + include_dirs = [ + "//libcxxabi/include", + "//libcxx/include", + ] + cflags_cc = [ "-nostdinc++" ] + defines = [ "_LIBCXXABI_BUILDING_LIBRARY" ] + if (target_os == "win") { + defines += [ "_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS" ] + } +} + +if (libcxxabi_enable_shared) { + shared_library("cxxabi_shared") { + output_dir = runtimes_dir + output_name = "c++abi" + if (target_os == "linux" || target_os == "mac") { + cflags = [ "-fPIC" ] + ldflags = [ "-nostdlib++" ] + libs = [ + "dl", + "pthread", + ] + } + sources = cxxabi_sources + # TODO: sync_source_lists_from_cmake.py doesn't handle these. + #public = cxxabi_headers + deps = [ + "//compiler-rt/lib/builtins", + "//libunwind/src:unwind_shared", + ] + configs += [ ":cxxabi_config" ] + configs -= [ + "//llvm/utils/gn/build:no_exceptions", + "//llvm/utils/gn/build:no_rtti", + ] + } +} + +if (libcxxabi_enable_static) { + static_library("cxxabi_static") { + output_dir = runtimes_dir + output_name = "c++abi" + complete_static_lib = true + sources = cxxabi_sources + # TODO: sync_source_lists_from_cmake.py doesn't handle these. + #public = cxxabi_headers + if (libcxxabi_hermetic_static_library) { + cflags = [ "-fvisibility=hidden" ] + cflags_cc = [ "-fvisibility-global-new-delete-hidden" ] + defines = [ + "_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS", + "_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS", + ] + } + deps = [ + "//compiler-rt/lib/builtins", + "//libunwind/src:unwind_static", + ] + configs += [ ":cxxabi_config" ] + configs -= [ + "//llvm/utils/gn/build:no_exceptions", + "//llvm/utils/gn/build:no_rtti", + "//llvm/utils/gn/build:thin_archive", + ] + } +} + +group("src") { + deps = [] + if (libcxxabi_enable_shared) { + deps += [ ":cxxabi_shared" ] + } + if (libcxxabi_enable_static) { + deps += [ ":cxxabi_static" ] + } +}