[libcxx-commits] [PATCH] D112126: [libunwind] Try to add -unwindlib=none while configuring and building libunwind

Martin Storsjö via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Sun Oct 24 04:32:56 PDT 2021


mstorsjo updated this revision to Diff 381775.
mstorsjo added a comment.

Further small adjustments:

- Prefer `--unwindlib` instead of `-unwindlib`. The latter gets silently accepted by GCC (but meaning something entirely different, although harmless), while `--unwindlib` gets rejected by GCC (as intended by the tests).
- Set `CMAKE_TRY_COMPILE_TARGET_TYPE= STATIC_LIBRARY` temporarily during the initial compiler sanity checks. This makes sure the checks succeed and lets CMake do the initial ABI detections (for things like `CMAKE_SIZEOF_VOID_P` etc), and avoids having to set `CMAKE_*_COMPILER_WORKS`. (The same can be done later for libcxxabi/libcxx too.)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112126/new/

https://reviews.llvm.org/D112126

Files:
  libunwind/CMakeLists.txt
  libunwind/cmake/config-ix.cmake
  libunwind/src/CMakeLists.txt


Index: libunwind/src/CMakeLists.txt
===================================================================
--- libunwind/src/CMakeLists.txt
+++ libunwind/src/CMakeLists.txt
@@ -83,6 +83,7 @@
 endif()
 
 # Setup flags.
+add_link_flags_if(LIBUNWIND_SUPPORTS_UNWINDLIB_NONE_FLAG --unwindlib=none)
 if (LIBUNWIND_SUPPORTS_NOSTDLIBXX_FLAG)
   add_link_flags_if_supported(-nostdlib++)
 else()
Index: libunwind/cmake/config-ix.cmake
===================================================================
--- libunwind/cmake/config-ix.cmake
+++ libunwind/cmake/config-ix.cmake
@@ -5,6 +5,25 @@
 include(CheckSymbolExists)
 include(CheckCSourceCompiles)
 
+# 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.
+#
+# However, a plain check_c_compiler_flag(--unwindlib=none) would also fail, as
+# the tested flag is only added to the compilation command (letting the
+# compiler error out if it is unsupported), but not included in the linking
+# command (which still fails due to implicitly trying to link against the
+# possibly missing libunwind). Therefore, we must add it directly to
+# CMAKE_REQUIRED_FLAGS (which is included both when compiling and linking),
+# then do a dummy test with check_c_compiler_flag, and revert the change to
+# CMAKE_REQUIRED_FLAGS if it didn't work out.
+set(CMAKE_REQUIRED_FLAGS_ORIG "${CMAKE_REQUIRED_FLAGS}")
+set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} --unwindlib=none")
+check_c_compiler_flag("" LIBUNWIND_SUPPORTS_UNWINDLIB_NONE_FLAG)
+if (NOT LIBUNWIND_SUPPORTS_UNWINDLIB_NONE_FLAG)
+  set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS_ORIG}")
+endif()
+
 check_library_exists(c fopen "" LIBUNWIND_HAS_C_LIB)
 
 if (NOT LIBUNWIND_USE_COMPILER_RT)
Index: libunwind/CMakeLists.txt
===================================================================
--- libunwind/CMakeLists.txt
+++ libunwind/CMakeLists.txt
@@ -21,7 +21,12 @@
         "Specify path to libc++ source.")
 
 if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR LIBUNWIND_STANDALONE_BUILD)
+  # We may have an incomplete toolchain - skip linking testing when doing
+  # compiler sanity checks and ABI inspections.
+  set(CMAKE_TRY_COMPILE_TARGET_TYPE_ORIG ${CMAKE_TRY_COMPILE_TARGET_TYPE})
+  set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
   project(libunwind LANGUAGES C CXX ASM)
+  set(CMAKE_TRY_COMPILE_TARGET_TYPE ${CMAKE_TRY_COMPILE_TARGET_TYPE_ORIG})
 
   set(PACKAGE_NAME libunwind)
   set(PACKAGE_VERSION 14.0.0git)
@@ -171,6 +176,14 @@
 # Get required flags.
 add_target_flags_if(LIBUNWIND_BUILD_32_BITS "-m32")
 
+# Compiler tests may be failing if the compiler implicitly links in libunwind,
+# which doesn't exist yet. This gets waived by --unwindlib=none
+# later in config-ix below, but the tests for --target etc before that may
+# be failing due to it. Only test compilation, not linking, for these
+# tests here now.
+set(CMAKE_TRY_COMPILE_TARGET_TYPE_ORIG ${CMAKE_TRY_COMPILE_TARGET_TYPE})
+set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
+
 if(LIBUNWIND_TARGET_TRIPLE)
   add_target_flags_if_supported("--target=${LIBUNWIND_TARGET_TRIPLE}")
 endif()
@@ -180,6 +193,7 @@
 if(LIBUNWIND_SYSROOT)
   add_target_flags_if_supported("--sysroot=${LIBUNWIND_SYSROOT}")
 endif()
+set(CMAKE_TRY_COMPILE_TARGET_TYPE ${CMAKE_TRY_COMPILE_TARGET_TYPE_ORIG})
 
 # Configure compiler.
 include(config-ix)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D112126.381775.patch
Type: text/x-patch
Size: 3465 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20211024/de446924/attachment-0001.bin>


More information about the libcxx-commits mailing list