summaryrefslogtreecommitdiff
path: root/runtimes/CMakeLists.txt
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2021-10-24 01:11:20 +0300
committerMartin Storsjö <martin@martin.st>2021-12-08 00:32:40 +0200
commit317dc31e53b83c1d2a468d7a541925f0cc7d9dce (patch)
tree7d9c304cf712bf9b09b5f7813731e3cd3bd9b25e /runtimes/CMakeLists.txt
parentfa517555420b8d86268b733d371413d607db3358 (diff)
downloadllvm-317dc31e53b83c1d2a468d7a541925f0cc7d9dce.tar.gz
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/CMakeLists.txt')
-rw-r--r--runtimes/CMakeLists.txt42
1 files changed, 32 insertions, 10 deletions
diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt
index 9beb4ac93103..c17d7f2fc90d 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()