From cc259638cb41bb4c80e98a00e61387a5ff5ca490 Mon Sep 17 00:00:00 2001 From: Shoaib Meenai Date: Thu, 23 Apr 2020 21:19:11 -0700 Subject: [PATCH] [libcxx][libcxxabi][libunwind] Use libgcc on Android Android doesn't have a libgcc_s and uses libgcc instead, so adjust the build accordingly. This matches compiler-rt's build setup. libc++abi and libunwind were already checking for libgcc but in a different context. This change makes them search only for libgcc on Android now, but the code to link against libgcc if it were present was already there. Reviewed By: #libc, #libc_abi, #libunwind, rprichard, srhines Differential Revision: https://reviews.llvm.org/D78787 --- libcxx/CMakeLists.txt | 2 ++ libcxx/cmake/config-ix.cmake | 8 +++++++- libcxxabi/cmake/config-ix.cmake | 8 ++++++-- libunwind/cmake/config-ix.cmake | 8 ++++++-- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt index e808e243e735..bdb2d56da853 100644 --- a/libcxx/CMakeLists.txt +++ b/libcxx/CMakeLists.txt @@ -757,6 +757,8 @@ function(cxx_link_system_libraries target) if (LIBCXX_BUILTINS_LIBRARY) target_link_libraries(${target} PRIVATE "${LIBCXX_BUILTINS_LIBRARY}") endif() + elseif (LIBCXX_HAS_GCC_LIB) + target_link_libraries(${target} PRIVATE gcc) elseif (LIBCXX_HAS_GCC_S_LIB) target_link_libraries(${target} PRIVATE gcc_s) endif() diff --git a/libcxx/cmake/config-ix.cmake b/libcxx/cmake/config-ix.cmake index 89e5d17c60f2..cbb4dfd16dac 100644 --- a/libcxx/cmake/config-ix.cmake +++ b/libcxx/cmake/config-ix.cmake @@ -16,7 +16,11 @@ if (NOT LIBCXX_USE_COMPILER_RT) if(WIN32 AND NOT MINGW) set(LIBCXX_HAS_GCC_S_LIB NO) else() - check_library_exists(gcc_s __gcc_personality_v0 "" LIBCXX_HAS_GCC_S_LIB) + if(ANDROID) + check_library_exists(gcc __gcc_personality_v0 "" LIBCXX_HAS_GCC_LIB) + else() + check_library_exists(gcc_s __gcc_personality_v0 "" LIBCXX_HAS_GCC_S_LIB) + endif() endif() endif() @@ -37,6 +41,8 @@ if (LIBCXX_SUPPORTS_NODEFAULTLIBS_FLAG) list(APPEND CMAKE_REQUIRED_FLAGS -rtlib=compiler-rt) find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY) list(APPEND CMAKE_REQUIRED_LIBRARIES "${LIBCXX_BUILTINS_LIBRARY}") + elseif (LIBCXX_HAS_GCC_LIB) + list(APPEND CMAKE_REQUIRED_LIBRARIES gcc) elseif (LIBCXX_HAS_GCC_S_LIB) list(APPEND CMAKE_REQUIRED_LIBRARIES gcc_s) endif () diff --git a/libcxxabi/cmake/config-ix.cmake b/libcxxabi/cmake/config-ix.cmake index 8892964ad376..15b52083fee2 100644 --- a/libcxxabi/cmake/config-ix.cmake +++ b/libcxxabi/cmake/config-ix.cmake @@ -6,8 +6,12 @@ include(CheckCSourceCompiles) check_library_exists(c fopen "" LIBCXXABI_HAS_C_LIB) if (NOT LIBCXXABI_USE_COMPILER_RT) - check_library_exists(gcc_s __gcc_personality_v0 "" LIBCXXABI_HAS_GCC_S_LIB) - check_library_exists(gcc __aeabi_uldivmod "" LIBCXXABI_HAS_GCC_LIB) + if (ANDROID) + check_library_exists(gcc __gcc_personality_v0 "" LIBCXXABI_HAS_GCC_LIB) + else () + check_library_exists(gcc_s __gcc_personality_v0 "" LIBCXXABI_HAS_GCC_S_LIB) + check_library_exists(gcc __aeabi_uldivmod "" LIBCXXABI_HAS_GCC_LIB) + endif () endif () # libc++abi is built with -nodefaultlibs, so we want all our checks to also diff --git a/libunwind/cmake/config-ix.cmake b/libunwind/cmake/config-ix.cmake index 9c8089cfe215..3e42818882b3 100644 --- a/libunwind/cmake/config-ix.cmake +++ b/libunwind/cmake/config-ix.cmake @@ -8,8 +8,12 @@ include(CheckCSourceCompiles) check_library_exists(c fopen "" LIBUNWIND_HAS_C_LIB) if (NOT LIBUNWIND_USE_COMPILER_RT) - check_library_exists(gcc_s __gcc_personality_v0 "" LIBUNWIND_HAS_GCC_S_LIB) - check_library_exists(gcc __absvdi2 "" LIBUNWIND_HAS_GCC_LIB) + if (ANDROID) + check_library_exists(gcc __gcc_personality_v0 "" LIBUNWIND_HAS_GCC_LIB) + else () + check_library_exists(gcc_s __gcc_personality_v0 "" LIBUNWIND_HAS_GCC_S_LIB) + check_library_exists(gcc __absvdi2 "" LIBUNWIND_HAS_GCC_LIB) + endif () endif() # libunwind is built with -nodefaultlibs, so we want all our checks to also