From fa4b5096f9a13224f1d5ce610739b7d206f97d67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= Date: Mon, 30 Jun 2025 23:24:39 +0200 Subject: [PATCH] [LLVM][Cygwin] Enable dynamic linking of libLLVM These changes allow to link everything* to shared LLVM library with MSYS2 "Cygwin" toolchain. * `c-index-test` fails with ld.bfd with this error: ``` /usr/lib/gcc/x86_64-pc-cygwin/15.1.0/../../../../x86_64-pc-cygwin/bin/ld: lib/libclangSerialization.a(PCHContainerOperations.cpp.o):PCHContainerOperations.cpp:(.text+0xc0): multiple definition of `clang::PCHContainerOperations::PCHContainerOperations()'; lib/libclang.dll.a(msys_clang_21_0git_dll_d008967.o):(.text+0x0): first defined here collect2: error: ld returned 1 exit status ``` Haven't tried with LLD. --- llvm/cmake/modules/AddLLVM.cmake | 6 +++--- llvm/cmake/modules/HandleLLVMOptions.cmake | 2 +- llvm/include/llvm/Support/Compiler.h | 2 +- llvm/lib/Target/CMakeLists.txt | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake index 8d8a94d1cddc4..83772ed8d2b13 100644 --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -137,7 +137,7 @@ function(add_llvm_symbol_exports target_name export_file) set_property(TARGET ${target_name} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,--version-script,\"${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}\"") endif() - elseif(WIN32) + elseif(WIN32 OR CYGWIN) set(native_export_file "${target_name}.def") add_custom_command(OUTPUT ${native_export_file} @@ -153,7 +153,7 @@ function(add_llvm_symbol_exports target_name export_file) elseif(CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC") # clang in msvc mode, calling a link.exe/lld-link style linker set(export_file_linker_flag "-Wl,/DEF:${export_file_linker_flag}") - elseif(MINGW) + elseif(MINGW OR CYGWIN) # ${export_file_linker_flag}, which is the plain file name, works as is # when passed to the compiler driver, which then passes it on to the # linker as an input file. @@ -666,7 +666,7 @@ function(llvm_add_library name) # When building shared objects for each target there are some internal APIs # that are used across shared objects which we can't hide. if (LLVM_BUILD_LLVM_DYLIB_VIS AND NOT BUILD_SHARED_LIBS AND NOT APPLE AND - (NOT (WIN32 OR CYGWIN) OR (MINGW AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")) AND + (NOT (WIN32 OR CYGWIN) OR ((MINGW OR CYGWIN) AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")) AND NOT (${CMAKE_SYSTEM_NAME} MATCHES "AIX") AND NOT DEFINED CMAKE_CXX_VISIBILITY_PRESET) diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake index 5aa047a33ba6a..c126b0d073322 100644 --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -465,7 +465,7 @@ if( LLVM_ENABLE_PIC ) endif() if((NOT (${CMAKE_SYSTEM_NAME} MATCHES "AIX")) AND - (NOT (WIN32 OR CYGWIN) OR (MINGW AND CMAKE_CXX_COMPILER_ID MATCHES "Clang"))) + (NOT (WIN32 OR CYGWIN) OR ((MINGW OR CYGWIN) AND CMAKE_CXX_COMPILER_ID MATCHES "Clang"))) # GCC for MinGW does nothing about -fvisibility-inlines-hidden, but warns # about use of the attributes. As long as we don't use the attributes (to # override the default) we shouldn't set the command line options either. diff --git a/llvm/include/llvm/Support/Compiler.h b/llvm/include/llvm/Support/Compiler.h index f46a7aeccd0aa..f6d0d3591c33b 100644 --- a/llvm/include/llvm/Support/Compiler.h +++ b/llvm/include/llvm/Support/Compiler.h @@ -133,7 +133,7 @@ #endif #if (!(defined(_WIN32) || defined(__CYGWIN__)) || \ - (defined(__MINGW32__) && defined(__clang__))) + ((defined(__MINGW32__) || defined(__CYGWIN__)) && defined(__clang__))) #define LLVM_LIBRARY_VISIBILITY LLVM_ATTRIBUTE_VISIBILITY_HIDDEN // Clang compilers older then 15 do not support gnu style attributes on // namespaces. diff --git a/llvm/lib/Target/CMakeLists.txt b/llvm/lib/Target/CMakeLists.txt index 9472288229cac..f5f6f5386f899 100644 --- a/llvm/lib/Target/CMakeLists.txt +++ b/llvm/lib/Target/CMakeLists.txt @@ -22,7 +22,7 @@ add_llvm_component_library(LLVMTarget # When building shared objects for each target there are some internal APIs # that are used across shared objects which we can't hide. if (NOT BUILD_SHARED_LIBS AND NOT APPLE AND - (NOT (WIN32 OR CYGWIN) OR (MINGW AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")) AND + (NOT (WIN32 OR CYGWIN) OR ((MINGW OR CYGWIN) AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")) AND NOT (${CMAKE_SYSTEM_NAME} MATCHES "AIX") AND NOT DEFINED CMAKE_CXX_VISIBILITY_PRESET) # Set default visibility to hidden, so we don't export all the Target classes