Skip to content

Commit ba0c2ee

Browse files
MaetveisNoumanAmir657
authored andcommitted
[LLVM][CMake][MSVC] Wrap linker flags for ICX on Windows (llvm#112680)
The Intel C++ Compiler (ICX) passes linker flags through the driver unlike MSVC and clang-cl, and therefore needs them to be prefixed with `/Qoption,link` (the equivalent of `-Wl,` for gcc on *nix). Use `LINKER:` prefix wherever supported by cmake, when that's not possible fall-back to `${CMAKE_CXX_LINKER_WRAPPER_FLAG}`. CMake replaces these with `/Qoption,link` for ICX and with the empty string for MSVC and clang-cl. For `target_link_libraries` neither `LINKER:` (not supported prior to CMake 3.32) nor `${CMAKE_CXX_LINKER_WRAPPER_FLAG}` (does not begin with `-` would be taken as a library name) works, use `-Qoption,link` directly within a conditional generator expression that we're linking with ICX. For MSVC and clang-cl no functional change is intended. Tested by compiling with ICX and setting `CMAKE_(EXE|SHARED|STATIC|MODULE)_LINKER_FLAGS_INIT` to `-Werror=unknown-argument`. RFC: https://discourse.llvm.org/t/rfc-cmake-linker-flags-need-wl-equivalent-for-intel-c-icx-on-windows/82446
1 parent 6c759c0 commit ba0c2ee

File tree

5 files changed

+23
-11
lines changed

5 files changed

+23
-11
lines changed

llvm/cmake/modules/AddLLVM.cmake

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,20 +149,20 @@ function(add_llvm_symbol_exports target_name export_file)
149149
set(export_file_linker_flag "${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}")
150150
if(MSVC)
151151
# cl.exe or clang-cl, i.e. MSVC style command line interface
152-
set(export_file_linker_flag "/DEF:\"${export_file_linker_flag}\"")
152+
set(export_file_linker_flag "LINKER:/DEF:${export_file_linker_flag}")
153153
elseif(CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")
154154
# clang in msvc mode, calling a link.exe/lld-link style linker
155-
set(export_file_linker_flag "-Wl,/DEF:\"${export_file_linker_flag}\"")
155+
set(export_file_linker_flag "-Wl,/DEF:${export_file_linker_flag}")
156156
elseif(MINGW)
157157
# ${export_file_linker_flag}, which is the plain file name, works as is
158158
# when passed to the compiler driver, which then passes it on to the
159159
# linker as an input file.
160-
set(export_file_linker_flag "\"${export_file_linker_flag}\"")
160+
set(export_file_linker_flag "${export_file_linker_flag}")
161161
else()
162162
message(FATAL_ERROR "Unsupported Windows toolchain")
163163
endif()
164-
set_property(TARGET ${target_name} APPEND_STRING PROPERTY
165-
LINK_FLAGS " ${export_file_linker_flag}")
164+
set_property(TARGET ${target_name} APPEND PROPERTY
165+
LINK_OPTIONS "${export_file_linker_flag}")
166166
endif()
167167

168168
add_custom_target(${target_name}_exports DEPENDS ${native_export_file})

llvm/cmake/modules/HandleLLVMOptions.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ if(MSVC)
542542
# behavior was changed in CMake 2.8.11 (Issue 12437) to use the MSVC default
543543
# value (1 MB) which is not enough for us in tasks such as parsing recursive
544544
# C++ templates in Clang.
545-
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:10000000")
545+
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_CXX_LINKER_WRAPPER_FLAG}/STACK:10000000")
546546
elseif(MINGW OR CYGWIN)
547547
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--stack,16777216")
548548

llvm/cmake/platforms/WinMsvc.cmake

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,10 @@ if(case_sensitive_filesystem)
324324
-libpath:"${msvc_lib_symlinks_dir}")
325325
endif()
326326

327+
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.25")
328+
list(TRANSFORM LINK_FLAGS PREPEND "${CMAKE_CXX_LINKER_WRAPPER_FLAG}")
329+
endif()
330+
327331
string(REPLACE ";" " " LINK_FLAGS "${LINK_FLAGS}")
328332
string(APPEND CMAKE_EXE_LINKER_FLAGS_INIT " ${LINK_FLAGS}")
329333
string(APPEND CMAKE_MODULE_LINKER_FLAGS_INIT " ${LINK_FLAGS}")

llvm/lib/Support/CMakeLists.txt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,22 @@ elseif( CMAKE_HOST_UNIX )
7474
endif()
7575
endif( WIN32 )
7676

77+
set(WL "")
78+
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.25"
79+
AND MSVC
80+
AND NOT CMAKE_GENERATOR MATCHES "Visual Studio")
81+
#IntelLLVM requires to pass linker flags with a wrapper
82+
set(WL "$<$<OR:$<LINK_LANG_AND_ID:C,IntelLLVM>,$<LINK_LANG_AND_ID:CXX,IntelLLVM>,$<LINK_LANG_AND_ID:Fortran,IntelLLVM>>:-Qoption,link,>")
83+
endif()
84+
7785
# Delay load shell32.dll if possible to speed up process startup.
7886
set (delayload_flags)
7987
if (MSVC)
8088
# When linking with Swift, `swiftc.exe` is used as the linker drive rather
8189
# than invoking `link.exe` directly. In such a case, the flags should be
8290
# marked as `-Xlinker` to pass them directly to the linker. As a temporary
8391
# workaround simply elide the delay loading.
84-
set (delayload_flags $<$<NOT:$<LINK_LANGUAGE:Swift>>:delayimp -delayload:shell32.dll -delayload:ole32.dll>)
92+
set (delayload_flags $<$<NOT:$<LINK_LANGUAGE:Swift>>:delayimp ${WL}-delayload:shell32.dll ${WL}-delayload:ole32.dll>)
8593
endif()
8694

8795
# Link Z3 if the user wants to build it.
@@ -104,16 +112,16 @@ if(LLVM_INTEGRATED_CRT_ALLOC)
104112
if((LLVM_INTEGRATED_CRT_ALLOC MATCHES "rpmalloc$") OR LLVM_ENABLE_RPMALLOC)
105113
add_compile_definitions(ENABLE_OVERRIDE ENABLE_PRELOAD)
106114
set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/rpmalloc/rpmalloc.c")
107-
set(delayload_flags "${delayload_flags} -INCLUDE:malloc")
115+
set(delayload_flags "${delayload_flags} ${WL}-INCLUDE:malloc")
108116
elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$")
109117
set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/src/snmalloc/override/new.cc")
110-
set(system_libs ${system_libs} "mincore.lib" "-INCLUDE:malloc")
118+
set(system_libs ${system_libs} "mincore.lib" "${WL}-INCLUDE:malloc")
111119
elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "mimalloc$")
112120
set(MIMALLOC_LIB "${LLVM_INTEGRATED_CRT_ALLOC}/out/msvc-x64/Release/mimalloc-static.lib")
113121
if(NOT EXISTS "${MIMALLOC_LIB}")
114122
message(FATAL_ERROR "Cannot find the mimalloc static library. To build it, first apply the patch from https://github.com/microsoft/mimalloc/issues/268 then build the Release x64 target through ${LLVM_INTEGRATED_CRT_ALLOC}\\ide\\vs2019\\mimalloc.sln")
115123
endif()
116-
set(system_libs ${system_libs} "${MIMALLOC_LIB}" "-INCLUDE:malloc")
124+
set(system_libs ${system_libs} "${MIMALLOC_LIB}" "${WL}-INCLUDE:malloc")
117125
endif()
118126
endif()
119127

llvm/tools/llvm-shlib/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ if(LLVM_BUILD_LLVM_C_DYLIB AND MSVC)
188188

189189
if (LLVM_INTEGRATED_CRT_ALLOC AND MSVC)
190190
# Make sure we search LLVMSupport first, before the CRT libs
191-
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -INCLUDE:malloc")
191+
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_CXX_LINKER_WRAPPER_FLAG}-INCLUDE:malloc")
192192
endif()
193193

194194
endif()

0 commit comments

Comments
 (0)