https://github.com/wenju-he updated https://github.com/llvm/llvm-project/pull/185376
>From 2bafccb1d76eaf76699e385f9e96a54c810a7543 Mon Sep 17 00:00:00 2001 From: Wenju He <[email protected]> Date: Mon, 9 Mar 2026 09:49:29 +0100 Subject: [PATCH 1/4] [libclc][CMake] Add spir64 target to clang compiler test This fixes `error : unknown target triple 'unknown'` on Windows when clang is built with LLVM_TARGETS_TO_BUILD empty. --- libclc/cmake/modules/CMakeTestCLCCompiler.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libclc/cmake/modules/CMakeTestCLCCompiler.cmake b/libclc/cmake/modules/CMakeTestCLCCompiler.cmake index d18a818f93bfb..c4501c41a8ce8 100644 --- a/libclc/cmake/modules/CMakeTestCLCCompiler.cmake +++ b/libclc/cmake/modules/CMakeTestCLCCompiler.cmake @@ -15,7 +15,7 @@ file(MAKE_DIRECTORY "${_test_dir}") message(STATUS "Check for working CLC compiler: ${CMAKE_CLC_COMPILER}") execute_process( - COMMAND "${CMAKE_CLC_COMPILER}" -x cl -c -flto + COMMAND "${CMAKE_CLC_COMPILER}" -target spir64-unknown-unknown -x cl -c -flto -o "${_test_out}" "${_test_file}" RESULT_VARIABLE _clc_result ERROR_VARIABLE _clc_error >From 55ee855f8a62d84ab1c1916205e9cf4b22819651 Mon Sep 17 00:00:00 2001 From: Wenju He <[email protected]> Date: Mon, 9 Mar 2026 13:30:42 +0100 Subject: [PATCH 2/4] Test that the compiler works for all targets in LIBCLC_TARGETS_TO_BUILD --- libclc/CMakeLists.txt | 21 ++++------ libclc/cmake/modules/AddLibclc.cmake | 17 ++++++++ .../cmake/modules/CMakeTestCLCCompiler.cmake | 42 ++++++++++++------- 3 files changed, 52 insertions(+), 28 deletions(-) diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt index f55f02f0e2fc0..265ccdbf94c51 100644 --- a/libclc/CMakeLists.txt +++ b/libclc/CMakeLists.txt @@ -10,8 +10,6 @@ set(CMAKE_CXX_STANDARD 17) # Add path for custom modules list( INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" ) -enable_language( CLC ) - include( AddLibclc ) include( GNUInstallDirs ) @@ -114,6 +112,14 @@ else() endforeach() endif() +if( NOT LIBCLC_TARGETS_TO_BUILD ) + message( FATAL_ERROR + "LIBCLC_TARGETS_TO_BUILD is empty. Specify at least one target or use 'all'.\n" + "Valid targets are: ${LIBCLC_TARGETS_ALL}\n") +endif() + +enable_language( CLC ) + list( SORT LIBCLC_TARGETS_TO_BUILD ) foreach( tool IN ITEMS opt llvm-link ) @@ -153,16 +159,7 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} ) list( GET TRIPLE 2 OS ) # Determine the clang target triple. - set(clang_triple ${t}) - if(ARCH STREQUAL spirv AND LIBCLC_USE_SPIRV_BACKEND) - set(clang_triple spirv32--) - elseif(ARCH STREQUAL spirv64 AND LIBCLC_USE_SPIRV_BACKEND) - set(clang_triple spirv64--) - elseif(ARCH STREQUAL spirv OR ARCH STREQUAL clspv) - set(clang_triple spir--) - elseif(ARCH STREQUAL spirv64 OR ARCH STREQUAL clspv64) - set(clang_triple spir64--) - endif() + libclc_target_to_clang_triple(${t} clang_triple) # Determine the preprocessor identifier for this target. set(MACRO_ARCH ${ARCH}) diff --git a/libclc/cmake/modules/AddLibclc.cmake b/libclc/cmake/modules/AddLibclc.cmake index db99f53c8b421..981bdaaa67c68 100644 --- a/libclc/cmake/modules/AddLibclc.cmake +++ b/libclc/cmake/modules/AddLibclc.cmake @@ -1,3 +1,20 @@ +# Convert libclc target to clang target triple +function(libclc_target_to_clang_triple target out_var) + string(REPLACE "-" ";" TRIPLE ${target}) + list(GET TRIPLE 0 ARCH) + set(clang_triple ${target}) + if(ARCH STREQUAL spirv AND LIBCLC_USE_SPIRV_BACKEND) + set(clang_triple spirv32--) + elseif(ARCH STREQUAL spirv64 AND LIBCLC_USE_SPIRV_BACKEND) + set(clang_triple spirv64--) + elseif(ARCH STREQUAL spirv OR ARCH STREQUAL clspv) + set(clang_triple spir--) + elseif(ARCH STREQUAL spirv64 OR ARCH STREQUAL clspv64) + set(clang_triple spir64--) + endif() + set(${out_var} ${clang_triple} PARENT_SCOPE) +endfunction() + # Converts a list of relative source paths to absolute paths and exports # it to the parent scope. macro(libclc_configure_source_list variable path) diff --git a/libclc/cmake/modules/CMakeTestCLCCompiler.cmake b/libclc/cmake/modules/CMakeTestCLCCompiler.cmake index c4501c41a8ce8..3714cd4ec6ee8 100644 --- a/libclc/cmake/modules/CMakeTestCLCCompiler.cmake +++ b/libclc/cmake/modules/CMakeTestCLCCompiler.cmake @@ -2,6 +2,8 @@ configure_file(${CMAKE_CURRENT_LIST_DIR}/CMakeCLCCompiler.cmake.in ${CMAKE_PLATFORM_INFO_DIR}/CMakeCLCCompiler.cmake @ONLY) include(${CMAKE_PLATFORM_INFO_DIR}/CMakeCLCCompiler.cmake) +include(AddLibclc) + if(CMAKE_CLC_COMPILER_FORCED) set(CMAKE_CLC_COMPILER_WORKS TRUE) return() @@ -14,21 +16,29 @@ file(MAKE_DIRECTORY "${_test_dir}") message(STATUS "Check for working CLC compiler: ${CMAKE_CLC_COMPILER}") -execute_process( - COMMAND "${CMAKE_CLC_COMPILER}" -target spir64-unknown-unknown -x cl -c -flto - -o "${_test_out}" "${_test_file}" - RESULT_VARIABLE _clc_result - ERROR_VARIABLE _clc_error -) +# Test that the compiler works for all targets in LIBCLC_TARGETS_TO_BUILD +foreach(_target ${LIBCLC_TARGETS_TO_BUILD}) + # Convert libclc target to clang triple + libclc_target_to_clang_triple(${_target} _clang_triple) + + execute_process( + COMMAND "${CMAKE_CLC_COMPILER}" --target=${_clang_triple} -x cl -c -flto + -nostdlib -nostdlibinc -cl-no-stdinc -o "${_test_out}" "${_test_file}" + RESULT_VARIABLE _clc_result + ERROR_VARIABLE _clc_error + OUTPUT_QUIET + ) + + if(NOT _clc_result EQUAL 0) + message(FATAL_ERROR + "The CLC compiler\n" + " ${CMAKE_CLC_COMPILER}\n" + "is not able to compile a simple OpenCL test program for ${_target}.\n" + "Output:\n${_clc_error}") + endif() -if(_clc_result EQUAL 0) - set(CMAKE_CLC_COMPILER_WORKS TRUE) - message(STATUS "Check for working CLC compiler: ${CMAKE_CLC_COMPILER} - works") file(REMOVE "${_test_out}") -else() - message(FATAL_ERROR - "The CLC compiler\n" - " ${CMAKE_CLC_COMPILER}\n" - "is not able to compile a simple OpenCL test program.\n" - "Output:\n${_clc_error}") -endif() +endforeach() + +set(CMAKE_CLC_COMPILER_WORKS TRUE) +message(STATUS "Check for working CLC compiler: ${CMAKE_CLC_COMPILER} - works") >From 81e9b2423d705c3616a691319f56a354fee2faa8 Mon Sep 17 00:00:00 2001 From: Wenju He <[email protected]> Date: Sun, 15 Mar 2026 00:31:31 +0100 Subject: [PATCH 3/4] Revert "Test that the compiler works for all targets in LIBCLC_TARGETS_TO_BUILD" This reverts commit 55ee855f8a62d84ab1c1916205e9cf4b22819651. --- libclc/CMakeLists.txt | 21 ++++++---- libclc/cmake/modules/AddLibclc.cmake | 17 -------- .../cmake/modules/CMakeTestCLCCompiler.cmake | 42 +++++++------------ 3 files changed, 28 insertions(+), 52 deletions(-) diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt index 265ccdbf94c51..f55f02f0e2fc0 100644 --- a/libclc/CMakeLists.txt +++ b/libclc/CMakeLists.txt @@ -10,6 +10,8 @@ set(CMAKE_CXX_STANDARD 17) # Add path for custom modules list( INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" ) +enable_language( CLC ) + include( AddLibclc ) include( GNUInstallDirs ) @@ -112,14 +114,6 @@ else() endforeach() endif() -if( NOT LIBCLC_TARGETS_TO_BUILD ) - message( FATAL_ERROR - "LIBCLC_TARGETS_TO_BUILD is empty. Specify at least one target or use 'all'.\n" - "Valid targets are: ${LIBCLC_TARGETS_ALL}\n") -endif() - -enable_language( CLC ) - list( SORT LIBCLC_TARGETS_TO_BUILD ) foreach( tool IN ITEMS opt llvm-link ) @@ -159,7 +153,16 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} ) list( GET TRIPLE 2 OS ) # Determine the clang target triple. - libclc_target_to_clang_triple(${t} clang_triple) + set(clang_triple ${t}) + if(ARCH STREQUAL spirv AND LIBCLC_USE_SPIRV_BACKEND) + set(clang_triple spirv32--) + elseif(ARCH STREQUAL spirv64 AND LIBCLC_USE_SPIRV_BACKEND) + set(clang_triple spirv64--) + elseif(ARCH STREQUAL spirv OR ARCH STREQUAL clspv) + set(clang_triple spir--) + elseif(ARCH STREQUAL spirv64 OR ARCH STREQUAL clspv64) + set(clang_triple spir64--) + endif() # Determine the preprocessor identifier for this target. set(MACRO_ARCH ${ARCH}) diff --git a/libclc/cmake/modules/AddLibclc.cmake b/libclc/cmake/modules/AddLibclc.cmake index 981bdaaa67c68..db99f53c8b421 100644 --- a/libclc/cmake/modules/AddLibclc.cmake +++ b/libclc/cmake/modules/AddLibclc.cmake @@ -1,20 +1,3 @@ -# Convert libclc target to clang target triple -function(libclc_target_to_clang_triple target out_var) - string(REPLACE "-" ";" TRIPLE ${target}) - list(GET TRIPLE 0 ARCH) - set(clang_triple ${target}) - if(ARCH STREQUAL spirv AND LIBCLC_USE_SPIRV_BACKEND) - set(clang_triple spirv32--) - elseif(ARCH STREQUAL spirv64 AND LIBCLC_USE_SPIRV_BACKEND) - set(clang_triple spirv64--) - elseif(ARCH STREQUAL spirv OR ARCH STREQUAL clspv) - set(clang_triple spir--) - elseif(ARCH STREQUAL spirv64 OR ARCH STREQUAL clspv64) - set(clang_triple spir64--) - endif() - set(${out_var} ${clang_triple} PARENT_SCOPE) -endfunction() - # Converts a list of relative source paths to absolute paths and exports # it to the parent scope. macro(libclc_configure_source_list variable path) diff --git a/libclc/cmake/modules/CMakeTestCLCCompiler.cmake b/libclc/cmake/modules/CMakeTestCLCCompiler.cmake index 3714cd4ec6ee8..c4501c41a8ce8 100644 --- a/libclc/cmake/modules/CMakeTestCLCCompiler.cmake +++ b/libclc/cmake/modules/CMakeTestCLCCompiler.cmake @@ -2,8 +2,6 @@ configure_file(${CMAKE_CURRENT_LIST_DIR}/CMakeCLCCompiler.cmake.in ${CMAKE_PLATFORM_INFO_DIR}/CMakeCLCCompiler.cmake @ONLY) include(${CMAKE_PLATFORM_INFO_DIR}/CMakeCLCCompiler.cmake) -include(AddLibclc) - if(CMAKE_CLC_COMPILER_FORCED) set(CMAKE_CLC_COMPILER_WORKS TRUE) return() @@ -16,29 +14,21 @@ file(MAKE_DIRECTORY "${_test_dir}") message(STATUS "Check for working CLC compiler: ${CMAKE_CLC_COMPILER}") -# Test that the compiler works for all targets in LIBCLC_TARGETS_TO_BUILD -foreach(_target ${LIBCLC_TARGETS_TO_BUILD}) - # Convert libclc target to clang triple - libclc_target_to_clang_triple(${_target} _clang_triple) - - execute_process( - COMMAND "${CMAKE_CLC_COMPILER}" --target=${_clang_triple} -x cl -c -flto - -nostdlib -nostdlibinc -cl-no-stdinc -o "${_test_out}" "${_test_file}" - RESULT_VARIABLE _clc_result - ERROR_VARIABLE _clc_error - OUTPUT_QUIET - ) - - if(NOT _clc_result EQUAL 0) - message(FATAL_ERROR - "The CLC compiler\n" - " ${CMAKE_CLC_COMPILER}\n" - "is not able to compile a simple OpenCL test program for ${_target}.\n" - "Output:\n${_clc_error}") - endif() +execute_process( + COMMAND "${CMAKE_CLC_COMPILER}" -target spir64-unknown-unknown -x cl -c -flto + -o "${_test_out}" "${_test_file}" + RESULT_VARIABLE _clc_result + ERROR_VARIABLE _clc_error +) +if(_clc_result EQUAL 0) + set(CMAKE_CLC_COMPILER_WORKS TRUE) + message(STATUS "Check for working CLC compiler: ${CMAKE_CLC_COMPILER} - works") file(REMOVE "${_test_out}") -endforeach() - -set(CMAKE_CLC_COMPILER_WORKS TRUE) -message(STATUS "Check for working CLC compiler: ${CMAKE_CLC_COMPILER} - works") +else() + message(FATAL_ERROR + "The CLC compiler\n" + " ${CMAKE_CLC_COMPILER}\n" + "is not able to compile a simple OpenCL test program.\n" + "Output:\n${_clc_error}") +endif() >From 944563e0cd345777ef03dc6ce91ab0adc0d01eca Mon Sep 17 00:00:00 2001 From: Wenju He <[email protected]> Date: Mon, 16 Mar 2026 12:59:50 +0100 Subject: [PATCH 4/4] [libclc] fix compiler check with --target=spirv64 and -disable-llvm-passes Fix "unknown target triple" errors when LLVM_TARGETS_TO_BUILD is empty. Adding -disable-llvm-passes reduces this to a very basic sanity check of Clang frontend. This allows the test to pass even if SPIR-V backend is not enabled, as the frontend can still generate IR for the target. --- libclc/cmake/modules/CMakeTestCLCCompiler.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libclc/cmake/modules/CMakeTestCLCCompiler.cmake b/libclc/cmake/modules/CMakeTestCLCCompiler.cmake index c4501c41a8ce8..b6b6a33aad19d 100644 --- a/libclc/cmake/modules/CMakeTestCLCCompiler.cmake +++ b/libclc/cmake/modules/CMakeTestCLCCompiler.cmake @@ -15,8 +15,8 @@ file(MAKE_DIRECTORY "${_test_dir}") message(STATUS "Check for working CLC compiler: ${CMAKE_CLC_COMPILER}") execute_process( - COMMAND "${CMAKE_CLC_COMPILER}" -target spir64-unknown-unknown -x cl -c -flto - -o "${_test_out}" "${_test_file}" + COMMAND "${CMAKE_CLC_COMPILER}" --target=spirv64-unknown-unknown -x cl -c -flto + -disable-llvm-passes -o "${_test_out}" "${_test_file}" RESULT_VARIABLE _clc_result ERROR_VARIABLE _clc_error ) _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
