diff options
author | Martin Storsjö <martin@martin.st> | 2021-10-24 01:11:20 +0300 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2021-12-08 00:32:40 +0200 |
commit | 317dc31e53b83c1d2a468d7a541925f0cc7d9dce (patch) | |
tree | 7d9c304cf712bf9b09b5f7813731e3cd3bd9b25e /runtimes | |
parent | fa517555420b8d86268b733d371413d607db3358 (diff) | |
download | llvm-317dc31e53b83c1d2a468d7a541925f0cc7d9dce.zip llvm-317dc31e53b83c1d2a468d7a541925f0cc7d9dce.tar.gz llvm-317dc31e53b83c1d2a468d7a541925f0cc7d9dce.tar.bz2 |
Reapply [runtimes] Fix building initial libunwind+libcxxabi+libcxx with compiler implied -lunwind
This does mostly the same as D112126, but for the runtimes cmake files.
Most of that is straightforward, but the interdependency between
libcxx and libunwind is tricky:
Libunwind is built at the same time as libcxx, but libunwind is not
installed yet. LIBCXXABI_USE_LLVM_UNWINDER makes libcxx link directly
against the just-built libunwind, but the compiler implicit -lunwind
isn't found. This patch avoids that by adding --unwindlib=none if
supported, if we are going to link explicitly against a newly built
unwinder anyway.
Reapplying this after
db32c4f45625dddc2c5cb683adf3d9cab7a9732f, which should fix the issues
that were reported last time this was applied.
Differential Revision: https://reviews.llvm.org/D113253
Diffstat (limited to 'runtimes')
-rw-r--r-- | runtimes/CMakeLists.txt | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt index 9beb4ac..c17d7f2 100644 --- a/runtimes/CMakeLists.txt +++ b/runtimes/CMakeLists.txt @@ -1,6 +1,21 @@ # This file handles building LLVM runtime sub-projects. cmake_minimum_required(VERSION 3.13.4) -project(Runtimes C CXX ASM) + +# Add path for custom and the LLVM build's modules to the CMake module path. +list(INSERT CMAKE_MODULE_PATH 0 + "${CMAKE_CURRENT_SOURCE_DIR}/cmake" + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" + "${CMAKE_CURRENT_SOURCE_DIR}/../cmake" + "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/Modules" + "${CMAKE_CURRENT_SOURCE_DIR}/../llvm/cmake" + "${CMAKE_CURRENT_SOURCE_DIR}/../llvm/cmake/modules" +) + +# We may have an incomplete toolchain - do language support tests without +# linking. +include(EnableLanguageNolink) +project(Runtimes LANGUAGES NONE) +llvm_enable_language_nolink(C CXX ASM) set(LLVM_ALL_RUNTIMES "compiler-rt;libc;libcxx;libcxxabi;libunwind;openmp") set(LLVM_ENABLE_RUNTIMES "" CACHE STRING @@ -28,14 +43,6 @@ endfunction() find_package(LLVM PATHS "${LLVM_BINARY_DIR}" NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) find_package(Clang PATHS "${LLVM_BINARY_DIR}" NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) -# Add path for custom and the LLVM build's modules to the CMake module path. -list(INSERT CMAKE_MODULE_PATH 0 - "${CMAKE_CURRENT_SOURCE_DIR}/cmake" - "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" - "${CMAKE_CURRENT_SOURCE_DIR}/../llvm/cmake" - "${CMAKE_CURRENT_SOURCE_DIR}/../llvm/cmake/modules" -) - function(get_compiler_rt_path path) foreach(entry ${runtimes}) get_filename_component(projName ${entry} NAME) @@ -82,14 +89,29 @@ set(LLVM_CMAKE_DIR ${LLVM_MAIN_SRC_DIR}/cmake/modules) set(LLVM_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../llvm) include(CheckLibraryExists) +include(CheckLinkerFlag) include(CheckCCompilerFlag) include(CheckCXXCompilerFlag) + +check_c_compiler_flag("" LLVM_RUNTIMES_LINKING_WORKS) +if (NOT LLVM_RUNTIMES_LINKING_WORKS) + # The compiler driver may be implicitly trying to link against libunwind, which + # might not work if libunwind doesn't exist yet. Try to check if + # --unwindlib=none is supported, and use that if possible. + # Don't add this if not necessary to fix linking, as it can break using + # e.g. ASAN/TSAN. + llvm_check_linker_flag("--unwindlib=none" LLVM_RUNTIMES_SUPPORT_UNWINDLIB_NONE_FLAG) + if (LLVM_RUNTIMES_SUPPORT_UNWINDLIB_NONE_FLAG) + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} --unwindlib=none") + endif() +endif() + # Disable use of the installed C++ standard library when building runtimes. # Check for -nostdlib++ first; if there's no C++ standard library yet, # all check_cxx_compiler_flag commands will fail until we add -nostdlib++ # (or -nodefaultlibs). -check_c_compiler_flag(-nostdlib++ LLVM_RUNTIMES_SUPPORT_NOSTDLIBXX_FLAG) +llvm_check_linker_flag(-nostdlib++ LLVM_RUNTIMES_SUPPORT_NOSTDLIBXX_FLAG) if (LLVM_RUNTIMES_SUPPORT_NOSTDLIBXX_FLAG) set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nostdlib++") endif() |