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

Reply via email to