Author: Nico Weber Date: 2021-11-02T13:35:21-04:00 New Revision: 2d3953499c8ca73c12e9417f5c4516c8a930a689
URL: https://github.com/llvm/llvm-project/commit/2d3953499c8ca73c12e9417f5c4516c8a930a689 DIFF: https://github.com/llvm/llvm-project/commit/2d3953499c8ca73c12e9417f5c4516c8a930a689.diff LOG: [cmake] Make LLVM_ENABLE_LLD=ON work better on macOS LLVM_LINKER_IS_LLD is now set with LLVM_ENABLE_LLD=ON (or LLVM_USER_LINKER=lld) even on APPLE, and we pass -Wl,-order_file when LLVM_LINKER_IS_LLD on APPLE too. To make this straightforward, change the linker detection logic to go through the compiler driver on APPLE like on the other platforms. No intended behavior change if LLVM_ENABLE_LLD isn't set. Differential Revision: https://reviews.llvm.org/D113021 Added: Modified: clang/tools/driver/CMakeLists.txt llvm/cmake/modules/AddLLVM.cmake Removed: ################################################################################ diff --git a/clang/tools/driver/CMakeLists.txt b/clang/tools/driver/CMakeLists.txt index 1bea470ed3010..3d2996b0b9ece 100644 --- a/clang/tools/driver/CMakeLists.txt +++ b/clang/tools/driver/CMakeLists.txt @@ -95,7 +95,7 @@ if(CLANG_ORDER_FILE AND (LLVM_LINKER_IS_LD64 OR LLVM_LINKER_IS_GOLD OR LLVM_LINKER_IS_LLD)) include(LLVMCheckLinkerFlag) - if (LLVM_LINKER_IS_LD64) + if (LLVM_LINKER_IS_LD64 OR (LLVM_LINKER_IS_LLD and APPLE)) set(LINKER_ORDER_FILE_OPTION "-Wl,-order_file,${CLANG_ORDER_FILE}") elseif (LLVM_LINKER_IS_GOLD) set(LINKER_ORDER_FILE_OPTION "-Wl,--section-ordering-file,${CLANG_ORDER_FILE}") diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake index 3c4e9f69538c3..7c2b801a423df 100644 --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -166,33 +166,43 @@ function(add_llvm_symbol_exports target_name export_file) set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} PARENT_SCOPE) endfunction(add_llvm_symbol_exports) -if (NOT DEFINED LLVM_LINKER_DETECTED) +if (NOT DEFINED LLVM_LINKER_DETECTED AND NOT WIN32) + # Detect what linker we have here. + if(APPLE) + # Linkers with ld64-compatible flags. + set(version_flag "-Wl,-v") + else() + # Linkers with BFD ld-compatible flags. + set(version_flag "-Wl,--version") + endif() + + if(LLVM_USE_LINKER) + set(command ${CMAKE_C_COMPILER} -fuse-ld=${LLVM_USE_LINKER} ${version_flag}) + else() + separate_arguments(flags UNIX_COMMAND "${CMAKE_EXE_LINKER_FLAGS}") + set(command ${CMAKE_C_COMPILER} ${flags} ${version_flag}) + endif() + execute_process( + COMMAND ${command} + OUTPUT_VARIABLE stdout + ERROR_VARIABLE stderr + ) + if(APPLE) - execute_process( - COMMAND "${CMAKE_LINKER}" -v - ERROR_VARIABLE stderr - ) if("${stderr}" MATCHES "PROJECT:ld64") set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "") set(LLVM_LINKER_IS_LD64 YES CACHE INTERNAL "") message(STATUS "Linker detection: ld64") + elseif("${stderr}" MATCHES "^LLD" OR + "${stdout}" MATCHES "^LLD") + set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "") + set(LLVM_LINKER_IS_LLD YES CACHE INTERNAL "") + message(STATUS "Linker detection: lld") else() set(LLVM_LINKER_DETECTED NO CACHE INTERNAL "") message(STATUS "Linker detection: unknown") endif() - elseif(NOT WIN32) - # Detect what linker we have here - if( LLVM_USE_LINKER ) - set(command ${CMAKE_C_COMPILER} -fuse-ld=${LLVM_USE_LINKER} -Wl,--version) - else() - separate_arguments(flags UNIX_COMMAND "${CMAKE_EXE_LINKER_FLAGS}") - set(command ${CMAKE_C_COMPILER} ${flags} -Wl,--version) - endif() - execute_process( - COMMAND ${command} - OUTPUT_VARIABLE stdout - ERROR_VARIABLE stderr - ) + else() if("${stdout}" MATCHES "^mold") set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "") message(STATUS "Linker detection: mold") _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits