https://github.com/wenju-he updated https://github.com/llvm/llvm-project/pull/186726
>From 6be7c8cc3793c459d2a2f41e0797333b723db096 Mon Sep 17 00:00:00 2001 From: Wenju He <[email protected]> Date: Mon, 16 Mar 2026 03:47:46 +0100 Subject: [PATCH 1/7] [libclc][CMake] Use clang/llvm-ar on Windows When LLVM_TARGETS_TO_BUILD contains host target, runtime build sets CMAKE_C_COMPILER to clang-cl on Windows. We should switch to clang and llvm-ar/llvm-ranlib for libclc because: - libclc struggles to pass specific flags to clang-cl MSVC-like interface. - compile flag handling will be consistent across all host systems. - libclc build is cross-compilation for offloading targets. --- .../cmake/modules/CMakeCLCInformation.cmake | 24 ++++++++++++++++--- .../modules/CMakeDetermineCLCCompiler.cmake | 17 ++++++++++++- llvm/runtimes/CMakeLists.txt | 2 +- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/libclc/cmake/modules/CMakeCLCInformation.cmake b/libclc/cmake/modules/CMakeCLCInformation.cmake index f92592221f034..3fb67d91dd1e6 100644 --- a/libclc/cmake/modules/CMakeCLCInformation.cmake +++ b/libclc/cmake/modules/CMakeCLCInformation.cmake @@ -11,14 +11,32 @@ if(NOT CMAKE_CLC_COMPILE_OBJECT) "<CMAKE_CLC_COMPILER> -x cl <DEFINES> <INCLUDES> <FLAGS> -c -o <OBJECT> <SOURCE>") endif() +# Finds a required LLVM tool by searching the CLC compiler directory first. +function(find_llvm_tool name out_var) + cmake_path(GET CMAKE_CLC_COMPILER PARENT_PATH llvm_bin_dir) + find_program(${out_var} + NAMES ${name} + HINTS "${llvm_bin_dir}" + DOC "libclc: path to the ${name} tool" + ) + if(NOT ${out_var}) + message(FATAL_ERROR "${name} not found for libclc build.") + endif() +endfunction() + +find_llvm_tool(llvm-ar CLC_AR) +find_llvm_tool(llvm-ranlib CLC_RANLIB) + if(NOT DEFINED CMAKE_CLC_ARCHIVE_CREATE) - set(CMAKE_CLC_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>") + set(CMAKE_CLC_ARCHIVE_CREATE "${CLC_AR} qc <TARGET> <OBJECTS>") endif() + if(NOT DEFINED CMAKE_CLC_ARCHIVE_APPEND) - set(CMAKE_CLC_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>") + set(CMAKE_CLC_ARCHIVE_APPEND "${CLC_AR} q <TARGET> <OBJECTS>") endif() + if(NOT DEFINED CMAKE_CLC_ARCHIVE_FINISH) - set(CMAKE_CLC_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>") + set(CMAKE_CLC_ARCHIVE_FINISH "${CLC_RANLIB} <TARGET>") endif() set(CMAKE_CLC_USE_LINKER_INFORMATION FALSE) diff --git a/libclc/cmake/modules/CMakeDetermineCLCCompiler.cmake b/libclc/cmake/modules/CMakeDetermineCLCCompiler.cmake index 2138ad85d0059..0ff60eb1b1144 100644 --- a/libclc/cmake/modules/CMakeDetermineCLCCompiler.cmake +++ b/libclc/cmake/modules/CMakeDetermineCLCCompiler.cmake @@ -4,7 +4,22 @@ if(NOT CMAKE_CLC_COMPILER) "The CLC language requires the C compiler (CMAKE_C_COMPILER) to be " "Clang, but CMAKE_C_COMPILER_ID is '${CMAKE_C_COMPILER_ID}'.") endif() - set(CMAKE_CLC_COMPILER "${CMAKE_C_COMPILER}" CACHE FILEPATH "CLC compiler") + + # Use the regular clang driver if the C compiler is clang-cl. + if(CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_C_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") + cmake_path(GET CMAKE_C_COMPILER PARENT_PATH llvm_bin_dir) + find_program(clang_exe clang + HINTS "${llvm_bin_dir}" + NO_DEFAULT_PATH + ) + if(NOT clang_exe) + message(FATAL_ERROR "clang-cl detected, but clang not found in ${llvm_bin_dir}") + endif() + set(clc_compiler "${clang_exe}") + else() + set(clc_compiler "${CMAKE_C_COMPILER}") + endif() + set(CMAKE_CLC_COMPILER "${clc_compiler}" CACHE FILEPATH "libclc: CLC compiler") endif() mark_as_advanced(CMAKE_CLC_COMPILER) diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt index fba0c7a01f972..21c7b05b3443a 100644 --- a/llvm/runtimes/CMakeLists.txt +++ b/llvm/runtimes/CMakeLists.txt @@ -554,7 +554,7 @@ if(build_runtimes) # TODO: We need to consider passing it as '-DRUNTIMES_x86_64_LLVM_ENABLE_RUNTIMES'. if("libclc" IN_LIST LLVM_ENABLE_RUNTIMES) - foreach(dep clang llvm-as llvm-link opt) + foreach(dep clang llvm-as llvm-link opt llvm-ar) if(TARGET ${dep}) list(APPEND extra_deps ${dep}) endif() >From bbe31e97e8052ceaade5482c023a4692411af210 Mon Sep 17 00:00:00 2001 From: Wenju He <[email protected]> Date: Mon, 16 Mar 2026 05:38:52 +0100 Subject: [PATCH 2/7] Revert "[libclc][CMake] Use clang/llvm-ar on Windows" This reverts commit 6be7c8cc3793c459d2a2f41e0797333b723db096. --- .../cmake/modules/CMakeCLCInformation.cmake | 24 +++---------------- .../modules/CMakeDetermineCLCCompiler.cmake | 17 +------------ llvm/runtimes/CMakeLists.txt | 2 +- 3 files changed, 5 insertions(+), 38 deletions(-) diff --git a/libclc/cmake/modules/CMakeCLCInformation.cmake b/libclc/cmake/modules/CMakeCLCInformation.cmake index 3fb67d91dd1e6..f92592221f034 100644 --- a/libclc/cmake/modules/CMakeCLCInformation.cmake +++ b/libclc/cmake/modules/CMakeCLCInformation.cmake @@ -11,32 +11,14 @@ if(NOT CMAKE_CLC_COMPILE_OBJECT) "<CMAKE_CLC_COMPILER> -x cl <DEFINES> <INCLUDES> <FLAGS> -c -o <OBJECT> <SOURCE>") endif() -# Finds a required LLVM tool by searching the CLC compiler directory first. -function(find_llvm_tool name out_var) - cmake_path(GET CMAKE_CLC_COMPILER PARENT_PATH llvm_bin_dir) - find_program(${out_var} - NAMES ${name} - HINTS "${llvm_bin_dir}" - DOC "libclc: path to the ${name} tool" - ) - if(NOT ${out_var}) - message(FATAL_ERROR "${name} not found for libclc build.") - endif() -endfunction() - -find_llvm_tool(llvm-ar CLC_AR) -find_llvm_tool(llvm-ranlib CLC_RANLIB) - if(NOT DEFINED CMAKE_CLC_ARCHIVE_CREATE) - set(CMAKE_CLC_ARCHIVE_CREATE "${CLC_AR} qc <TARGET> <OBJECTS>") + set(CMAKE_CLC_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>") endif() - if(NOT DEFINED CMAKE_CLC_ARCHIVE_APPEND) - set(CMAKE_CLC_ARCHIVE_APPEND "${CLC_AR} q <TARGET> <OBJECTS>") + set(CMAKE_CLC_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>") endif() - if(NOT DEFINED CMAKE_CLC_ARCHIVE_FINISH) - set(CMAKE_CLC_ARCHIVE_FINISH "${CLC_RANLIB} <TARGET>") + set(CMAKE_CLC_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>") endif() set(CMAKE_CLC_USE_LINKER_INFORMATION FALSE) diff --git a/libclc/cmake/modules/CMakeDetermineCLCCompiler.cmake b/libclc/cmake/modules/CMakeDetermineCLCCompiler.cmake index 0ff60eb1b1144..2138ad85d0059 100644 --- a/libclc/cmake/modules/CMakeDetermineCLCCompiler.cmake +++ b/libclc/cmake/modules/CMakeDetermineCLCCompiler.cmake @@ -4,22 +4,7 @@ if(NOT CMAKE_CLC_COMPILER) "The CLC language requires the C compiler (CMAKE_C_COMPILER) to be " "Clang, but CMAKE_C_COMPILER_ID is '${CMAKE_C_COMPILER_ID}'.") endif() - - # Use the regular clang driver if the C compiler is clang-cl. - if(CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_C_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") - cmake_path(GET CMAKE_C_COMPILER PARENT_PATH llvm_bin_dir) - find_program(clang_exe clang - HINTS "${llvm_bin_dir}" - NO_DEFAULT_PATH - ) - if(NOT clang_exe) - message(FATAL_ERROR "clang-cl detected, but clang not found in ${llvm_bin_dir}") - endif() - set(clc_compiler "${clang_exe}") - else() - set(clc_compiler "${CMAKE_C_COMPILER}") - endif() - set(CMAKE_CLC_COMPILER "${clc_compiler}" CACHE FILEPATH "libclc: CLC compiler") + set(CMAKE_CLC_COMPILER "${CMAKE_C_COMPILER}" CACHE FILEPATH "CLC compiler") endif() mark_as_advanced(CMAKE_CLC_COMPILER) diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt index 21c7b05b3443a..fba0c7a01f972 100644 --- a/llvm/runtimes/CMakeLists.txt +++ b/llvm/runtimes/CMakeLists.txt @@ -554,7 +554,7 @@ if(build_runtimes) # TODO: We need to consider passing it as '-DRUNTIMES_x86_64_LLVM_ENABLE_RUNTIMES'. if("libclc" IN_LIST LLVM_ENABLE_RUNTIMES) - foreach(dep clang llvm-as llvm-link opt llvm-ar) + foreach(dep clang llvm-as llvm-link opt) if(TARGET ${dep}) list(APPEND extra_deps ${dep}) endif() >From 54585cb5871291faffb006872caca7c5bb33ad27 Mon Sep 17 00:00:00 2001 From: Wenju He <[email protected]> Date: Mon, 16 Mar 2026 06:12:06 +0100 Subject: [PATCH 3/7] [libclc][CMake] Configure PREFER_CLANG_DRIVER and TOOLCHAIN_TOOLS Add PREFER_CLANG_DRIVER to llvm_ExternalProject_Add to bypass clang-cl on MSVC targets. Add TOOLCHAIN_TOOLS support to allow setting CMAKE_AR and CMAKE_RANLIB to LLVM's internal tools. --- llvm/cmake/modules/LLVMExternalProjectUtils.cmake | 2 +- llvm/runtimes/CMakeLists.txt | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/llvm/cmake/modules/LLVMExternalProjectUtils.cmake b/llvm/cmake/modules/LLVMExternalProjectUtils.cmake index 975798a8c2636..11ca5bb882285 100644 --- a/llvm/cmake/modules/LLVMExternalProjectUtils.cmake +++ b/llvm/cmake/modules/LLVMExternalProjectUtils.cmake @@ -224,7 +224,7 @@ function(llvm_ExternalProject_Add name source_dir) if(ARG_USE_TOOLCHAIN AND NOT CMAKE_CROSSCOMPILING) if(CLANG_IN_TOOLCHAIN) - if(is_msvc_target) + if(is_msvc_target AND NOT ARG_PREFER_CLANG_DRIVER) set(compiler_args -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX} -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX} -DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX}) diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt index fba0c7a01f972..81842f6ee4f47 100644 --- a/llvm/runtimes/CMakeLists.txt +++ b/llvm/runtimes/CMakeLists.txt @@ -554,11 +554,14 @@ if(build_runtimes) # TODO: We need to consider passing it as '-DRUNTIMES_x86_64_LLVM_ENABLE_RUNTIMES'. if("libclc" IN_LIST LLVM_ENABLE_RUNTIMES) - foreach(dep clang llvm-as llvm-link opt) + set(toolchain_tools clang llvm-ar llvm-ranlib) + foreach(dep llvm-as llvm-link opt ${toolchain_tools}) if(TARGET ${dep}) list(APPEND extra_deps ${dep}) endif() endforeach() + list(APPEND extra_args TOOLCHAIN_TOOLS="${toolchain_tools}") + list(APPEND extra_args PREFER_CLANG_DRIVER) endif() # Tools needed by build_symbolizer.sh. if("compiler-rt" IN_LIST LLVM_ENABLE_RUNTIMES AND COMPILER_RT_ENABLE_INTERNAL_SYMBOLIZER) >From 7a22a98aefa0b27aeb6ae29d9611f02e5cdf79b7 Mon Sep 17 00:00:00 2001 From: Wenju He <[email protected]> Date: Mon, 16 Mar 2026 07:32:31 +0100 Subject: [PATCH 4/7] FORCE_POSIX_TOOLCHAIN --- llvm/cmake/modules/LLVMExternalProjectUtils.cmake | 10 +++++++--- llvm/runtimes/CMakeLists.txt | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/llvm/cmake/modules/LLVMExternalProjectUtils.cmake b/llvm/cmake/modules/LLVMExternalProjectUtils.cmake index 11ca5bb882285..5088e66cb407d 100644 --- a/llvm/cmake/modules/LLVMExternalProjectUtils.cmake +++ b/llvm/cmake/modules/LLVMExternalProjectUtils.cmake @@ -48,6 +48,8 @@ endfunction() # Don't generate install targets for this project # ALWAYS_CLEAN # Always clean the sub-project before building +# FORCE_POSIX_TOOLCHAIN +# Use the clang driver and POSIX binutils (ar, ranlib) on MSVC targets. # CMAKE_ARGS arguments... # Optional cmake arguments to pass when configuring the project # TOOLCHAIN_TOOLS targets... @@ -67,7 +69,7 @@ endfunction() # ) function(llvm_ExternalProject_Add name source_dir) cmake_parse_arguments(ARG - "ENABLE_FORTRAN;USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN" + "ENABLE_FORTRAN;USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN;FORCE_POSIX_TOOLCHAIN" "SOURCE_DIR;FOLDER" "CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES;STRIP_TOOL;TARGET_TRIPLE" ${ARGN}) @@ -91,7 +93,9 @@ function(llvm_ExternalProject_Add name source_dir) set(target_triple ${ARG_TARGET_TRIPLE}) endif() - is_msvc_triple(is_msvc_target "${target_triple}") + if(NOT ARG_FORCE_POSIX_TOOLCHAIN) + is_msvc_triple(is_msvc_target "${target_triple}") + endif() if(NOT ARG_TOOLCHAIN_TOOLS) set(ARG_TOOLCHAIN_TOOLS clang) @@ -224,7 +228,7 @@ function(llvm_ExternalProject_Add name source_dir) if(ARG_USE_TOOLCHAIN AND NOT CMAKE_CROSSCOMPILING) if(CLANG_IN_TOOLCHAIN) - if(is_msvc_target AND NOT ARG_PREFER_CLANG_DRIVER) + if(is_msvc_target) set(compiler_args -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX} -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX} -DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX}) diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt index 81842f6ee4f47..ef12615ba3cc8 100644 --- a/llvm/runtimes/CMakeLists.txt +++ b/llvm/runtimes/CMakeLists.txt @@ -561,7 +561,7 @@ if(build_runtimes) endif() endforeach() list(APPEND extra_args TOOLCHAIN_TOOLS="${toolchain_tools}") - list(APPEND extra_args PREFER_CLANG_DRIVER) + list(APPEND extra_args FORCE_POSIX_TOOLCHAIN) endif() # Tools needed by build_symbolizer.sh. if("compiler-rt" IN_LIST LLVM_ENABLE_RUNTIMES AND COMPILER_RT_ENABLE_INTERNAL_SYMBOLIZER) >From 3d681b8596762e7349cbe53c0d29fc1b0aef159c Mon Sep 17 00:00:00 2001 From: Wenju He <[email protected]> Date: Mon, 16 Mar 2026 11:12:58 +0100 Subject: [PATCH 5/7] revert "[libclc][CMake] Configure PREFER_CLANG_DRIVER and TOOLCHAIN_TOOLS" --- llvm/cmake/modules/LLVMExternalProjectUtils.cmake | 8 ++------ llvm/runtimes/CMakeLists.txt | 5 +---- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/llvm/cmake/modules/LLVMExternalProjectUtils.cmake b/llvm/cmake/modules/LLVMExternalProjectUtils.cmake index 5088e66cb407d..975798a8c2636 100644 --- a/llvm/cmake/modules/LLVMExternalProjectUtils.cmake +++ b/llvm/cmake/modules/LLVMExternalProjectUtils.cmake @@ -48,8 +48,6 @@ endfunction() # Don't generate install targets for this project # ALWAYS_CLEAN # Always clean the sub-project before building -# FORCE_POSIX_TOOLCHAIN -# Use the clang driver and POSIX binutils (ar, ranlib) on MSVC targets. # CMAKE_ARGS arguments... # Optional cmake arguments to pass when configuring the project # TOOLCHAIN_TOOLS targets... @@ -69,7 +67,7 @@ endfunction() # ) function(llvm_ExternalProject_Add name source_dir) cmake_parse_arguments(ARG - "ENABLE_FORTRAN;USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN;FORCE_POSIX_TOOLCHAIN" + "ENABLE_FORTRAN;USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN" "SOURCE_DIR;FOLDER" "CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES;STRIP_TOOL;TARGET_TRIPLE" ${ARGN}) @@ -93,9 +91,7 @@ function(llvm_ExternalProject_Add name source_dir) set(target_triple ${ARG_TARGET_TRIPLE}) endif() - if(NOT ARG_FORCE_POSIX_TOOLCHAIN) - is_msvc_triple(is_msvc_target "${target_triple}") - endif() + is_msvc_triple(is_msvc_target "${target_triple}") if(NOT ARG_TOOLCHAIN_TOOLS) set(ARG_TOOLCHAIN_TOOLS clang) diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt index ef12615ba3cc8..fba0c7a01f972 100644 --- a/llvm/runtimes/CMakeLists.txt +++ b/llvm/runtimes/CMakeLists.txt @@ -554,14 +554,11 @@ if(build_runtimes) # TODO: We need to consider passing it as '-DRUNTIMES_x86_64_LLVM_ENABLE_RUNTIMES'. if("libclc" IN_LIST LLVM_ENABLE_RUNTIMES) - set(toolchain_tools clang llvm-ar llvm-ranlib) - foreach(dep llvm-as llvm-link opt ${toolchain_tools}) + foreach(dep clang llvm-as llvm-link opt) if(TARGET ${dep}) list(APPEND extra_deps ${dep}) endif() endforeach() - list(APPEND extra_args TOOLCHAIN_TOOLS="${toolchain_tools}") - list(APPEND extra_args FORCE_POSIX_TOOLCHAIN) endif() # Tools needed by build_symbolizer.sh. if("compiler-rt" IN_LIST LLVM_ENABLE_RUNTIMES AND COMPILER_RT_ENABLE_INTERNAL_SYMBOLIZER) >From 3f2ae1a967e937334b102a522dfeb98ae424ff7d Mon Sep 17 00:00:00 2001 From: Wenju He <[email protected]> Date: Mon, 16 Mar 2026 11:13:56 +0100 Subject: [PATCH 6/7] [libclc][CMake] Use llvm-ar/llvm-ranlib on Windows, Fix flag prefix for clang-cl When LLVM_TARGETS_TO_BUILD contains host target, runtime build sets CMAKE_C_COMPILER to clang-cl on Windows. This commit add following changes to fix build on Windows: - add flag prefix `/clang:` to ensure Clang-specific options are correctly passed. - use llvm-ar/llvm-ranlib since MSVC-like tool llvm-lib is COFF-specific. - the dependency file format to 'msvc' and use /showIncludes. --- libclc/CMakeLists.txt | 38 +++++++++++-------- libclc/clc/lib/amdgpu/CMakeLists.txt | 2 +- libclc/clc/lib/generic/CMakeLists.txt | 4 +- .../cmake/modules/CMakeCLCInformation.cmake | 33 +++++++++++++--- libclc/opencl/lib/generic/CMakeLists.txt | 2 +- llvm/runtimes/CMakeLists.txt | 2 +- 6 files changed, 55 insertions(+), 26 deletions(-) diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt index 1103711298ce3..137a07f26f7eb 100644 --- a/libclc/CMakeLists.txt +++ b/libclc/CMakeLists.txt @@ -122,6 +122,13 @@ foreach( tool IN ITEMS opt llvm-link ) endif() endforeach() +# Determine prefix based on compiler type +if (CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_C_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") + set(flag_prefix "/clang:") +else() + set(flag_prefix "") +endif() + add_subdirectory(clc/lib/generic) add_subdirectory(clc/lib/amdgpu) add_subdirectory(clc/lib/ptx-nvidiacl) @@ -186,11 +193,11 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} ) set(opt_flags -O3) if(ARCH STREQUAL spirv OR ARCH STREQUAL spirv64) - list(APPEND target_compile_flags -O0 -finline-hint-functions) + list(APPEND target_compile_flags "${flag_prefix}-O0" "${flag_prefix}-finline-hint-functions") list(APPEND target_extra_defines CLC_SPIRV) set(opt_flags) elseif(ARCH STREQUAL clspv OR ARCH STREQUAL clspv64) - list(APPEND target_compile_flags -Wno-unknown-assumption) + list(APPEND target_compile_flags "${flag_prefix}-Wno-unknown-assumption") list(APPEND target_extra_defines CLC_CLSPV) elseif(ARCH STREQUAL amdgcn) list(APPEND target_compile_flags "SHELL:-Xclang -mcode-object-version=none") @@ -224,21 +231,20 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} ) ${OPENCL_GENERIC_SOURCES} ${_opencl_overrides}) endif() - # Common compile options shared by CLC and OpenCL libraries. set(compile_flags - -flto - --target=${clang_triple} - -nostdlib - -nostdlibinc - -cl-no-stdinc - -cl-std=CL3.0 - -include opencl-c-base.h - -Werror=undef - -Wall - -Wextra - -fdiscard-value-names - -ffp-contract=fast-honor-pragmas - -fdenormal-fp-math=dynamic + "${flag_prefix}-flto" + "${flag_prefix}--target=${clang_triple}" + "${flag_prefix}-nostdlib" + "${flag_prefix}-nostdlibinc" + "${flag_prefix}-cl-no-stdinc" + "${flag_prefix}-cl-std=CL3.0" + "${flag_prefix}-include" "${flag_prefix}opencl-c-base.h" + "${flag_prefix}-Werror=undef" + "${flag_prefix}-Wall" + "${flag_prefix}-Wextra" + "${flag_prefix}-fdiscard-value-names" + "${flag_prefix}-ffp-contract=fast-honor-pragmas" + "${flag_prefix}-fdenormal-fp-math=dynamic" ${target_compile_flags} ) diff --git a/libclc/clc/lib/amdgpu/CMakeLists.txt b/libclc/clc/lib/amdgpu/CMakeLists.txt index 9b6c9a231ade0..a5e2349df9fc9 100644 --- a/libclc/clc/lib/amdgpu/CMakeLists.txt +++ b/libclc/clc/lib/amdgpu/CMakeLists.txt @@ -37,7 +37,7 @@ libclc_configure_source_list(CLC_AMDGPU_SOURCES workitem/clc_get_sub_group_size.cl workitem/clc_get_work_dim.cl) -libclc_configure_source_options(${CMAKE_CURRENT_SOURCE_DIR} -fapprox-func +libclc_configure_source_options(${CMAKE_CURRENT_SOURCE_DIR} "${flag_prefix}-fapprox-func" math/clc_native_exp.cl math/clc_native_exp2.cl math/clc_native_log10.cl diff --git a/libclc/clc/lib/generic/CMakeLists.txt b/libclc/clc/lib/generic/CMakeLists.txt index 07200536328f3..9afa014b6b41f 100644 --- a/libclc/clc/lib/generic/CMakeLists.txt +++ b/libclc/clc/lib/generic/CMakeLists.txt @@ -199,7 +199,7 @@ libclc_configure_source_list(CLC_GENERIC_SOURCES workitem/clc_get_sub_group_size.cl ) -libclc_configure_source_options(${CMAKE_CURRENT_SOURCE_DIR} -fapprox-func +libclc_configure_source_options(${CMAKE_CURRENT_SOURCE_DIR} "${flag_prefix}-fapprox-func" math/clc_native_cos.cl math/clc_native_divide.cl math/clc_native_exp.cl @@ -218,6 +218,6 @@ libclc_configure_source_options(${CMAKE_CURRENT_SOURCE_DIR} -fapprox-func math/clc_recip_fast.cl math/clc_sqrt_fast.cl) -libclc_configure_source_options(${CMAKE_CURRENT_SOURCE_DIR} -cl-fp32-correctly-rounded-divide-sqrt +libclc_configure_source_options(${CMAKE_CURRENT_SOURCE_DIR} "${flag_prefix}-cl-fp32-correctly-rounded-divide-sqrt" math/clc_div_cr.cl math/clc_sqrt_cr.cl) diff --git a/libclc/cmake/modules/CMakeCLCInformation.cmake b/libclc/cmake/modules/CMakeCLCInformation.cmake index f92592221f034..7dd62b29e086d 100644 --- a/libclc/cmake/modules/CMakeCLCInformation.cmake +++ b/libclc/cmake/modules/CMakeCLCInformation.cmake @@ -1,8 +1,13 @@ set(CMAKE_CLC_OUTPUT_EXTENSION .o) set(CMAKE_INCLUDE_FLAG_CLC "-I") -set(CMAKE_CLC_DEPFILE_FORMAT gcc) -set(CMAKE_DEPFILE_FLAGS_CLC "-MD -MT <DEP_TARGET> -MF <DEP_FILE>") +if (CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_C_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") + set(CMAKE_CLC_DEPFILE_FORMAT msvc) + set(CMAKE_DEPFILE_FLAGS_CLC "/showIncludes") +else() + set(CMAKE_CLC_DEPFILE_FORMAT gcc) + set(CMAKE_DEPFILE_FLAGS_CLC "-MD -MT <DEP_TARGET> -MF <DEP_FILE>") +endif() cmake_initialize_per_config_variable(CMAKE_CLC_FLAGS "Flags used by the CLC compiler") @@ -11,14 +16,32 @@ if(NOT CMAKE_CLC_COMPILE_OBJECT) "<CMAKE_CLC_COMPILER> -x cl <DEFINES> <INCLUDES> <FLAGS> -c -o <OBJECT> <SOURCE>") endif() +# Finds a required LLVM tool by searching the CLC compiler directory first. +function(find_llvm_tool name out_var) + cmake_path(GET CMAKE_CLC_COMPILER PARENT_PATH llvm_bin_dir) + find_program(${out_var} + NAMES ${name} + HINTS "${llvm_bin_dir}" + DOC "libclc: path to the ${name} tool" + ) + if(NOT ${out_var}) + message(FATAL_ERROR "${name} not found for libclc build.") + endif() +endfunction() + +find_llvm_tool(llvm-ar CLC_AR) +find_llvm_tool(llvm-ranlib CLC_RANLIB) + if(NOT DEFINED CMAKE_CLC_ARCHIVE_CREATE) - set(CMAKE_CLC_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>") + set(CMAKE_CLC_ARCHIVE_CREATE "${CLC_AR} qc <TARGET> <OBJECTS>") endif() + if(NOT DEFINED CMAKE_CLC_ARCHIVE_APPEND) - set(CMAKE_CLC_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>") + set(CMAKE_CLC_ARCHIVE_APPEND "${CLC_AR} q <TARGET> <OBJECTS>") endif() + if(NOT DEFINED CMAKE_CLC_ARCHIVE_FINISH) - set(CMAKE_CLC_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>") + set(CMAKE_CLC_ARCHIVE_FINISH "${CLC_RANLIB} <TARGET>") endif() set(CMAKE_CLC_USE_LINKER_INFORMATION FALSE) diff --git a/libclc/opencl/lib/generic/CMakeLists.txt b/libclc/opencl/lib/generic/CMakeLists.txt index ca95e6d5cfe23..1fcaa8c10c316 100644 --- a/libclc/opencl/lib/generic/CMakeLists.txt +++ b/libclc/opencl/lib/generic/CMakeLists.txt @@ -224,7 +224,7 @@ libclc_configure_source_list(OPENCL_GENERIC_SOURCES workitem/get_work_dim.cl ) -libclc_configure_source_options(${CMAKE_CURRENT_SOURCE_DIR} -fapprox-func +libclc_configure_source_options(${CMAKE_CURRENT_SOURCE_DIR} "${flag_prefix}-fapprox-func" math/native_cos.cl math/native_divide.cl math/native_exp.cl diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt index fba0c7a01f972..a2ca2aba1f1eb 100644 --- a/llvm/runtimes/CMakeLists.txt +++ b/llvm/runtimes/CMakeLists.txt @@ -554,7 +554,7 @@ if(build_runtimes) # TODO: We need to consider passing it as '-DRUNTIMES_x86_64_LLVM_ENABLE_RUNTIMES'. if("libclc" IN_LIST LLVM_ENABLE_RUNTIMES) - foreach(dep clang llvm-as llvm-link opt) + foreach(dep clang llvm-as llvm-link opt llvm-ar llvm-ranlib) if(TARGET ${dep}) list(APPEND extra_deps ${dep}) endif() >From cf42abfe36306bff14298a564044b21b0ce25c97 Mon Sep 17 00:00:00 2001 From: Wenju He <[email protected]> Date: Mon, 16 Mar 2026 11:57:38 +0100 Subject: [PATCH 7/7] /sourceDependencies --- libclc/cmake/modules/CMakeCLCInformation.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libclc/cmake/modules/CMakeCLCInformation.cmake b/libclc/cmake/modules/CMakeCLCInformation.cmake index 7dd62b29e086d..41946ab23ccc8 100644 --- a/libclc/cmake/modules/CMakeCLCInformation.cmake +++ b/libclc/cmake/modules/CMakeCLCInformation.cmake @@ -3,7 +3,7 @@ set(CMAKE_INCLUDE_FLAG_CLC "-I") if (CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_C_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") set(CMAKE_CLC_DEPFILE_FORMAT msvc) - set(CMAKE_DEPFILE_FLAGS_CLC "/showIncludes") + set(CMAKE_DEPFILE_FLAGS_CLC "/sourceDependencies <DEP_FILE>") else() set(CMAKE_CLC_DEPFILE_FORMAT gcc) set(CMAKE_DEPFILE_FLAGS_CLC "-MD -MT <DEP_TARGET> -MF <DEP_FILE>") _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
