[lld] [libc++] Use -nostdlib++ on GCC unconditionally (PR #68832)
Louis Dionne via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 12 20:45:27 PDT 2023
https://github.com/ldionne updated https://github.com/llvm/llvm-project/pull/68832
>From 9ca88d1a30ec1bcaa9c3c943c32649c36ad136d0 Mon Sep 17 00:00:00 2001
From: Louis Dionne <ldionne.2 at gmail.com>
Date: Wed, 11 Oct 2023 12:21:39 -0700
Subject: [PATCH 1/3] [libc++] Use -nostdlib++ on GCC unconditionally
We support GCC 13, which supports the flag. This allows simplifying
the CMake logic around the use of -nostdlib++. Note that there are
other places where we don't assume -nostdlib++ yet in the build, but
this patch is intentionally trying to be small because this part of
our CMake is pretty tricky.
---
libcxx/CMakeLists.txt | 33 ++++-----------------------------
libcxx/cmake/config-ix.cmake | 15 ---------------
2 files changed, 4 insertions(+), 44 deletions(-)
diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt
index 16540caf68eaf04..55ad0f49cbdb6fd 100644
--- a/libcxx/CMakeLists.txt
+++ b/libcxx/CMakeLists.txt
@@ -642,18 +642,11 @@ get_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER}")
# Link system libraries =======================================================
function(cxx_link_system_libraries target)
-
-# In order to remove just libc++ from the link step
-# we need to use -nostdlib++ whenever it is supported.
-# Unfortunately this cannot be used universally because for example g++ supports
-# only -nodefaultlibs in which case all libraries will be removed and
-# all libraries but c++ have to be added in manually.
- if (CXX_SUPPORTS_NOSTDLIBXX_FLAG)
- target_add_link_flags_if_supported(${target} PRIVATE "-nostdlib++")
+ if (MSVC)
+ target_add_compile_flags(${target} PRIVATE "/Zl")
+ target_link_libraries(${target} PRIVATE "/nodefaultlib")
else()
- target_add_link_flags_if_supported(${target} PRIVATE "-nodefaultlibs")
- target_add_compile_flags_if_supported(${target} PRIVATE "/Zl")
- target_add_link_flags_if_supported(${target} PRIVATE "/nodefaultlib")
+ target_link_libraries(${target} PRIVATE "-nostdlib++")
endif()
if (CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG AND LIBCXXABI_USE_LLVM_UNWINDER)
@@ -663,24 +656,6 @@ function(cxx_link_system_libraries target)
target_add_link_flags_if_supported(${target} PRIVATE "--unwindlib=none")
endif()
- if (NOT APPLE) # On Apple platforms, we always use -nostdlib++ so we don't need to re-add other libraries
- if (LIBCXX_HAS_PTHREAD_LIB)
- target_link_libraries(${target} PRIVATE pthread)
- endif()
-
- if (LIBCXX_HAS_C_LIB)
- target_link_libraries(${target} PRIVATE c)
- endif()
-
- if (LIBCXX_HAS_M_LIB)
- target_link_libraries(${target} PRIVATE m)
- endif()
-
- if (LIBCXX_HAS_RT_LIB)
- target_link_libraries(${target} PRIVATE rt)
- endif()
- endif()
-
if (LIBCXX_USE_COMPILER_RT)
find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY)
if (LIBCXX_BUILTINS_LIBRARY)
diff --git a/libcxx/cmake/config-ix.cmake b/libcxx/cmake/config-ix.cmake
index 9962d848d85e846..9fed861a4e193c5 100644
--- a/libcxx/cmake/config-ix.cmake
+++ b/libcxx/cmake/config-ix.cmake
@@ -14,14 +14,6 @@ include(CheckCSourceCompiles)
# link with --uwnindlib=none. Check if that option works.
llvm_check_compiler_linker_flag(C "--unwindlib=none" CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG)
-if(WIN32 AND NOT MINGW)
- # NOTE(compnerd) this is technically a lie, there is msvcrt, but for now, lets
- # let the default linking take care of that.
- set(LIBCXX_HAS_C_LIB NO)
-else()
- check_library_exists(c fopen "" LIBCXX_HAS_C_LIB)
-endif()
-
if (NOT LIBCXX_USE_COMPILER_RT)
if(WIN32 AND NOT MINGW)
set(LIBCXX_HAS_GCC_S_LIB NO)
@@ -54,9 +46,6 @@ else()
endif()
if (CXX_SUPPORTS_NOSTDLIBXX_FLAG OR C_SUPPORTS_NODEFAULTLIBS_FLAG)
- if (LIBCXX_HAS_C_LIB)
- list(APPEND CMAKE_REQUIRED_LIBRARIES c)
- endif ()
if (LIBCXX_USE_COMPILER_RT)
include(HandleCompilerRT)
find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY
@@ -108,22 +97,18 @@ if(WIN32 AND NOT MINGW)
# TODO(compnerd) do we want to support an emulation layer that allows for the
# use of pthread-win32 or similar libraries to emulate pthreads on Windows?
set(LIBCXX_HAS_PTHREAD_LIB NO)
- set(LIBCXX_HAS_M_LIB NO)
set(LIBCXX_HAS_RT_LIB NO)
set(LIBCXX_HAS_ATOMIC_LIB NO)
elseif(APPLE)
set(LIBCXX_HAS_PTHREAD_LIB NO)
- set(LIBCXX_HAS_M_LIB NO)
set(LIBCXX_HAS_RT_LIB NO)
set(LIBCXX_HAS_ATOMIC_LIB NO)
elseif(FUCHSIA)
- set(LIBCXX_HAS_M_LIB NO)
set(LIBCXX_HAS_PTHREAD_LIB NO)
set(LIBCXX_HAS_RT_LIB NO)
check_library_exists(atomic __atomic_fetch_add_8 "" LIBCXX_HAS_ATOMIC_LIB)
else()
check_library_exists(pthread pthread_create "" LIBCXX_HAS_PTHREAD_LIB)
- check_library_exists(m ccos "" LIBCXX_HAS_M_LIB)
check_library_exists(rt clock_gettime "" LIBCXX_HAS_RT_LIB)
check_library_exists(atomic __atomic_fetch_add_8 "" LIBCXX_HAS_ATOMIC_LIB)
endif()
>From db65842e8ef437152a59cb72c9b690dd85bc10df Mon Sep 17 00:00:00 2001
From: Louis Dionne <ldionne.2 at gmail.com>
Date: Thu, 12 Oct 2023 16:20:32 -0700
Subject: [PATCH 2/3] Fix typo on Windows and use -nostdlib++ in the benchmarks
---
libcxx/CMakeLists.txt | 2 +-
libcxx/benchmarks/CMakeLists.txt | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt
index 55ad0f49cbdb6fd..fda590e4170ab21 100644
--- a/libcxx/CMakeLists.txt
+++ b/libcxx/CMakeLists.txt
@@ -643,7 +643,7 @@ get_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER}")
# Link system libraries =======================================================
function(cxx_link_system_libraries target)
if (MSVC)
- target_add_compile_flags(${target} PRIVATE "/Zl")
+ target_compile_options(${target} PRIVATE "/Zl")
target_link_libraries(${target} PRIVATE "/nodefaultlib")
else()
target_link_libraries(${target} PRIVATE "-nostdlib++")
diff --git a/libcxx/benchmarks/CMakeLists.txt b/libcxx/benchmarks/CMakeLists.txt
index 1a4d634500180ea..80b2663fd80868e 100644
--- a/libcxx/benchmarks/CMakeLists.txt
+++ b/libcxx/benchmarks/CMakeLists.txt
@@ -122,7 +122,7 @@ endif()
add_library( cxx-benchmarks-flags-libcxx INTERFACE)
target_link_libraries( cxx-benchmarks-flags-libcxx INTERFACE cxx-benchmarks-flags)
target_compile_options(cxx-benchmarks-flags-libcxx INTERFACE ${SANITIZER_FLAGS} -Wno-user-defined-literals -Wno-suggest-override)
-target_link_options( cxx-benchmarks-flags-libcxx INTERFACE -nodefaultlibs "-L${BENCHMARK_LIBCXX_INSTALL}/lib" "-L${BENCHMARK_LIBCXX_INSTALL}/lib64" ${SANITIZER_FLAGS})
+target_link_options( cxx-benchmarks-flags-libcxx INTERFACE -nostdlib++ "-L${BENCHMARK_LIBCXX_INSTALL}/lib" "-L${BENCHMARK_LIBCXX_INSTALL}/lib64" ${SANITIZER_FLAGS})
set(libcxx_benchmark_targets)
>From be714f79fa5410e5fa45c0ba40b400cfceb48a55 Mon Sep 17 00:00:00 2001
From: Louis Dionne <ldionne.2 at gmail.com>
Date: Thu, 12 Oct 2023 20:44:53 -0700
Subject: [PATCH 3/3] Remove broken options on MSVC.
---
libcxx/CMakeLists.txt | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt
index fda590e4170ab21..d03421afde1e755 100644
--- a/libcxx/CMakeLists.txt
+++ b/libcxx/CMakeLists.txt
@@ -642,10 +642,7 @@ get_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER}")
# Link system libraries =======================================================
function(cxx_link_system_libraries target)
- if (MSVC)
- target_compile_options(${target} PRIVATE "/Zl")
- target_link_libraries(${target} PRIVATE "/nodefaultlib")
- else()
+ if (NOT MSVC)
target_link_libraries(${target} PRIVATE "-nostdlib++")
endif()
More information about the llvm-commits
mailing list