[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
Sat Oct 23 15:16:46 PDT 2021


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

Moved the tests so that the test for fopen/libc succeeds, and temporarily setting `CMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY` so that the initial test for `--target=<triple>` also can succeed.


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,27 @@
 include(CheckSymbolExists)
 include(CheckCSourceCompiles)
 
+# The compiler driver may be implicitly trying to link against libunwind,
+# which obviously might not work when building libunwind itself. Try to
+# check if -unwindlib=none is supported, and use that if possible.
+# (Note, this does succeed for GCC too, where it's treated as the linker
+# flag "-u windlib=none", which should be harmless in practice.)
+#
+# 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
@@ -171,6 +171,13 @@
 # Get required flags.
 add_target_flags_if(LIBUNWIND_BUILD_32_BITS "-m32")
 
+# Compiler tests may be failing if the compiler tries to link in the libunwind
+# that we're about to build. This gets waived by -unwindlib=none later in
+# config-ix below, but the tests for --target etc below 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 +187,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.381762.patch
Type: text/x-patch
Size: 3014 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20211023/a3d060fc/attachment.bin>


More information about the libcxx-commits mailing list