diff --git a/clang/tools/clang-offload-bundler/CMakeLists.txt b/clang/tools/clang-offload-bundler/CMakeLists.txt index e75292ab2a5bd..a466cf31d82db 100644 --- a/clang/tools/clang-offload-bundler/CMakeLists.txt +++ b/clang/tools/clang-offload-bundler/CMakeLists.txt @@ -18,6 +18,9 @@ add_clang_tool(clang-offload-bundler intrinsics_gen ) +setup_host_tool(clang-offload-bundler CLANG_OFFLOAD_BUNDLER + clang-offload-bundler_exe clang-offload-bundler_target) + set(CLANG_OFFLOAD_BUNDLER_LIB_DEPS clangBasic clangDriver diff --git a/clang/tools/clang-offload-packager/CMakeLists.txt b/clang/tools/clang-offload-packager/CMakeLists.txt index cd7e1b0181e2a..3518788c55af1 100644 --- a/clang/tools/clang-offload-packager/CMakeLists.txt +++ b/clang/tools/clang-offload-packager/CMakeLists.txt @@ -12,6 +12,9 @@ add_clang_tool(clang-offload-packager ${tablegen_deps} ) +setup_host_tool(clang-offload-packager CLANG_OFFLOAD_PACKAGER_EXE + clang-offload-packager_exe clang-offload-packager_target) + clang_target_link_libraries(clang-offload-packager PRIVATE clangBasic diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt index bd9e14dfc0b8a..92bcde283916b 100644 --- a/libclc/CMakeLists.txt +++ b/libclc/CMakeLists.txt @@ -69,7 +69,7 @@ if( LIBCLC_STANDALONE_BUILD OR CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DI # Import required tools if( NOT EXISTS ${LIBCLC_CUSTOM_LLVM_TOOLS_BINARY_DIR} ) - foreach( tool IN ITEMS clang llvm-as llvm-link opt ) + foreach( tool IN ITEMS clang llvm-as llvm-link llvm-spirv opt ) find_program( LLVM_TOOL_${tool} ${tool} PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH ) set( ${tool}_exe ${LLVM_TOOL_${tool}} ) set( ${tool}_target ) @@ -92,6 +92,7 @@ else() get_host_tool_path( clang CLANG clang_exe clang_target ) get_host_tool_path( llvm-as LLVM_AS llvm-as_exe llvm-as_target ) get_host_tool_path( llvm-link LLVM_LINK llvm-link_exe llvm-link_target ) + get_host_tool_path( llvm-spirv LLVM_SPIRV llvm-spirv_exe llvm-spirv_target ) get_host_tool_path( opt OPT opt_exe opt_target ) endif() endif() @@ -113,13 +114,15 @@ if( EXISTS ${LIBCLC_CUSTOM_LLVM_TOOLS_BINARY_DIR} ) # If we've requested a custom binary directory, there are some otherwise # optional tools which we want to ensure are present. - if( NOT TARGET libclc::llvm-spirv OR NOT TARGET libclc::libclc-remangler ) - message( FATAL_ERROR "libclc toolchain incomplete!" ) - endif() + foreach( tool IN ITEMS llvm-spirv libclc-remangler ) + if( NOT EXISTS "${${tool}_exe}" AND "${${tool}_target}" STREQUAL "" ) + message( FATAL_ERROR "libclc toolchain incomplete!" ) + endif() + endforeach() endif() foreach( tool IN ITEMS clang opt llvm-as llvm-link ) - if( NOT EXISTS "${${tool}_exe}" AND "${tool}_target" STREQUAL "" ) + if( NOT EXISTS "${${tool}_exe}" AND "${${tool}_target}" STREQUAL "" ) message( FATAL_ERROR "libclc toolchain incomplete - missing tool ${tool}!" ) endif() endforeach() diff --git a/libclc/cmake/modules/AddLibclc.cmake b/libclc/cmake/modules/AddLibclc.cmake index d94b17f5ab032..3ae174633f97e 100644 --- a/libclc/cmake/modules/AddLibclc.cmake +++ b/libclc/cmake/modules/AddLibclc.cmake @@ -456,13 +456,13 @@ function(add_libclc_builtin_set) "${LIBCLC_LIBRARY_OUTPUT_INTDIR}/remangled-${long_width}-${signedness}_char.${obj_suffix_mangled}" ) add_custom_command( OUTPUT "${builtins_remangle_path}" COMMAND ${CMAKE_COMMAND} -E make_directory ${LIBCLC_LIBRARY_OUTPUT_INTDIR} - COMMAND libclc::libclc-remangler + COMMAND ${libclc-remangler_exe} -o "${builtins_remangle_path}" --long-width=${long_width} --char-signedness=${signedness} --input-ir=${builtins_lib} ${dummy_in} - DEPENDS ${builtins_lib} libclc::libclc-remangler ${dummy_in}) + DEPENDS ${builtins_lib} ${libclc-remangler_target} ${dummy_in}) add_custom_target( "remangled-${long_width}-${signedness}_char.${obj_suffix_mangled}" ALL DEPENDS "${builtins_remangle_path}" "${dummy_in}") set_target_properties("remangled-${long_width}-${signedness}_char.${obj_suffix_mangled}" @@ -489,12 +489,12 @@ function(add_libclc_builtin_set) math(EXPR libclc-remangler-test-no "${libclc-remangler-test-no}+1") set(current-test "libclc-remangler-test-${obj_suffix}-${libclc-remangler-test-no}") add_custom_target(${current-test} - COMMAND libclc::libclc-remangler + COMMAND ${libclc-remangler_exe} --long-width=l32 --char-signedness=signed --input-ir=${target-ir} ${dummy_in} -t -o - - DEPENDS ${builtins_lib} "${dummy_in}" libclc::libclc-remangler) + DEPENDS ${builtins_lib} "${dummy_in}" ${libclc-remangler_target}) list(APPEND libclc-remangler-tests ${current-test}) endforeach() endif() diff --git a/libclc/utils/libclc-remangler/CMakeLists.txt b/libclc/utils/libclc-remangler/CMakeLists.txt index 9e50722cbbb7b..e5783f134feab 100644 --- a/libclc/utils/libclc-remangler/CMakeLists.txt +++ b/libclc/utils/libclc-remangler/CMakeLists.txt @@ -11,6 +11,9 @@ set(LLVM_LINK_COMPONENTS add_clang_tool(libclc-remangler LibclcRemangler.cpp) +setup_host_tool( libclc-remangler LIBCLC_REMANGLER + libclc-remangler_exe libclc-remangler_target ) + target_include_directories(libclc-remangler PRIVATE ${CMAKE_SOURCE_DIR}/../clang/include ${CMAKE_BINARY_DIR}/tools/clang/include) @@ -24,9 +27,3 @@ clang_target_link_libraries(libclc-remangler clangSerialization LLVMOption ) - -# If we've not already imported a libclc-remangler tool from an external build, -# set it up now. -if(NOT TARGET libclc::libclc-remangler) - add_executable(libclc::libclc-remangler ALIAS libclc-remangler) -endif() diff --git a/libdevice/CMakeLists.txt b/libdevice/CMakeLists.txt index a985c101a6f94..d96c4fe69201d 100644 --- a/libdevice/CMakeLists.txt +++ b/libdevice/CMakeLists.txt @@ -19,6 +19,25 @@ else() will not build libdevice sanitizer") endif() +if(NOT EXISTS ${LIBCLC_CUSTOM_LLVM_TOOLS_BINARY_DIR}) + get_host_tool_path(clang CLANG clang_exe clang_target) + get_host_tool_path(llvm-ar LLVM_AR llvm-ar_exe llvm-ar_target) + get_host_tool_path(append-file APPEND_FILE append-file_exe append-file_target) + get_host_tool_path(clang-offload-bundler CLANG_OFFLOAD_BUNDLER clang-offload-bundler_exe clang-offload-bundler_target) + get_host_tool_path(clang-offload-packager CLANG_OFFLOAD_PACKAGER clang-offload-packager_exe clang-offload-packager_target) + get_host_tool_path(file-table-tform FILE_TABLE_TFORM file-table-tform_exe file-table-tform_target) + get_host_tool_path(llvm-foreach LLVM_FOREACH llvm-foreach_exe llvm-foreach_target) + get_host_tool_path(llvm-spirv LLVM_SPIRV llvm-spirv_exe llvm-spirv_target) + get_host_tool_path(sycl-post-link SYCL_POST_LINK sycl-post-link_exe sycl-post-link_target) +else() + foreach(tool IN ITEMS clang llvm-ar append-file clang-offload-bundler clang-offload-packager file-table-tform llvm-foreach llvm-spirv sycl-post-link) + find_program(LLVM_CUSTOM_TOOL_${tool} ${tool} + PATHS ${LIBCLC_CUSTOM_LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) + set(${tool}_exe ${LLVM_CUSTOM_TOOL_${tool}}) + set(${tool}_target) + endforeach() +endif() + # Build libdevice for SYCL. include(SYCLLibdevice) diff --git a/libdevice/cmake/modules/SYCLLibdevice.cmake b/libdevice/cmake/modules/SYCLLibdevice.cmake index a2ca6a03f50f1..81c58ebf6a494 100644 --- a/libdevice/cmake/modules/SYCLLibdevice.cmake +++ b/libdevice/cmake/modules/SYCLLibdevice.cmake @@ -22,11 +22,6 @@ set(install_dest_obj lib${LLVM_LIBDIR_SUFFIX}) set(install_dest_obj-new-offload lib${LLVM_LIBDIR_SUFFIX}) set(install_dest_bc lib${LLVM_LIBDIR_SUFFIX}) -set(clang $) -set(llvm-ar $) -set(llvm-link $) -set(llvm-opt $) - string(CONCAT sycl_targets_opt "-fsycl-targets=" "spir64_x86_64-unknown-unknown," @@ -55,6 +50,7 @@ set(compile_opts # we declare all functions as 'static'. -Wno-undefined-internal -sycl-std=2020 + --target=${LLVM_HOST_TRIPLE} ) set(SYCL_LIBDEVICE_GCC_TOOLCHAIN "" CACHE PATH "Path to GCC installation") @@ -146,7 +142,8 @@ function(compile_lib_ext filename) add_custom_command( OUTPUT ${devicelib-file} - COMMAND ${clang} ${ARG_OPTS} + COMMAND ${clang_exe} -I ${PROJECT_BINARY_DIR}/include + ${ARG_OPTS} ${CMAKE_CURRENT_SOURCE_DIR}/${ARG_SRC} -o ${devicelib-file} MAIN_DEPENDENCY ${ARG_SRC} DEPENDS ${ARG_DEPENDENCIES} @@ -224,20 +221,26 @@ function(add_devicelibs filename) endforeach() endfunction() -# Set up the dependency lists for the libdevice libraries -set(crt_obj_deps wrapper.h device.h spirv_vars.h sycl-compiler) -set(complex_obj_deps device_complex.h device.h sycl-compiler) -set(cmath_obj_deps device_math.h device.h sycl-compiler) -set(imf_obj_deps device_imf.hpp imf_half.hpp imf_bf16.hpp imf_rounding_op.hpp imf_impl_utils.hpp device.h sycl-compiler) -set(itt_obj_deps device_itt.h spirv_vars.h device.h sycl-compiler) -set(bfloat16_obj_deps sycl-headers sycl-compiler) +# For native builds, sycl-compiler will already include everything we need. +# For cross builds, we also need native versions of the tools. +set(sycl-compiler_deps + sycl-compiler ${clang_target} ${append-file_target} + ${clang-offload-bundler_target} ${clang-offload-packager_target} + ${file-table-tform_target} ${llvm-foreach_target} ${llvm-spirv_target} + ${sycl-post-link_target}) +set(crt_obj_deps wrapper.h device.h spirv_vars.h ${sycl-compiler_deps}) +set(complex_obj_deps device_complex.h device.h ${sycl-compiler_deps}) +set(cmath_obj_deps device_math.h device.h ${sycl-compiler_deps}) +set(imf_obj_deps device_imf.hpp imf_half.hpp imf_bf16.hpp imf_rounding_op.hpp imf_impl_utils.hpp device.h ${sycl-compiler_deps}) +set(itt_obj_deps device_itt.h spirv_vars.h device.h ${sycl-compiler_deps}) +set(bfloat16_obj_deps sycl-headers ${sycl-compiler_deps}) if (NOT MSVC AND UR_SANITIZER_INCLUDE_DIR) set(asan_obj_deps device.h atomic.hpp spirv_vars.h ${UR_SANITIZER_INCLUDE_DIR}/asan/asan_libdevice.hpp include/asan_rtl.hpp include/spir_global_var.hpp - sycl-compiler) + ${sycl-compiler_deps}) set(sanitizer_generic_compile_opts ${compile_opts} -fno-sycl-instrument-device-code @@ -427,6 +430,7 @@ set(imf_fp64_fallback_src ${imf_fallback_src_dir}/imf_fp64_fallback.cpp) set(imf_bf16_fallback_src ${imf_fallback_src_dir}/imf_bf16_fallback.cpp) set(imf_host_cxx_flags -c + --target=${LLVM_HOST_TRIPLE} -D__LIBDEVICE_HOST_IMPL__ ) @@ -520,13 +524,13 @@ function(add_lib_imf name) add_custom_command( OUTPUT ${ARG_DIR}/${name}.${${ARG_FTYPE}-suffix} - COMMAND ${clang} ${compile_opts} ${ARG_EXTRA_OPTS} + COMMAND ${clang_exe} ${compile_opts} ${ARG_EXTRA_OPTS} -I ${CMAKE_CURRENT_SOURCE_DIR}/imf ${imf_${ARG_DTYPE}_fallback_src} -o ${ARG_DIR}/${name}.${${ARG_FTYPE}-suffix} DEPENDS ${imf_fallback_${ARG_DTYPE}_deps} - get_imf_fallback_${ARG_DTYPE} sycl-compiler + get_imf_fallback_${ARG_DTYPE} ${sycl-compiler_deps} VERBATIM) add_custom_target(${ARG_TGT_NAME} @@ -620,7 +624,7 @@ foreach(dtype IN ITEMS bf16 fp32 fp64) endif() add_custom_command( OUTPUT ${${ftype}_binary_dir}/imf-${dtype}-host.${${ftype}-suffix} - COMMAND ${clang} ${${ftype}_host_compile_opts} + COMMAND ${clang_exe} ${${ftype}_host_compile_opts} ${CMAKE_CURRENT_SOURCE_DIR}/${wrapper_name} -o ${${ftype}_binary_dir}/imf-${dtype}-host.${${ftype}-suffix} MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/${wrapper_name} @@ -637,7 +641,7 @@ foreach(ftype IN ITEMS obj obj-new-offload) DEPENDS ${${ftype}_binary_dir}/${devicelib_host_static_${ftype}}) add_custom_command( OUTPUT ${${ftype}_binary_dir}/${devicelib_host_static_${ftype}} - COMMAND ${llvm-ar} rcs + COMMAND ${llvm-ar_exe} rcs ${${ftype}_binary_dir}/${devicelib_host_static_${ftype}} ${${ftype}_binary_dir}/imf-fp32-host.${${ftype}-suffix} ${${ftype}_binary_dir}/fallback-imf-fp32-host.${${ftype}-suffix} @@ -648,7 +652,7 @@ foreach(ftype IN ITEMS obj obj-new-offload) DEPENDS imf_fp32_host_${ftype} imf_fallback_fp32_host_${ftype} DEPENDS imf_fp64_host_${ftype} imf_fallback_fp64_host_${ftype} DEPENDS imf_bf16_host_${ftype} imf_fallback_bf16_host_${ftype} - DEPENDS sycl-compiler + DEPENDS ${llvm-ar_target} VERBATIM) add_dependencies(libsycldevice-obj imf_host_${ftype}) diff --git a/llvm/tools/append-file/CMakeLists.txt b/llvm/tools/append-file/CMakeLists.txt index 21a9260d3491a..8479a2c3a21ce 100644 --- a/llvm/tools/append-file/CMakeLists.txt +++ b/llvm/tools/append-file/CMakeLists.txt @@ -9,3 +9,5 @@ add_llvm_tool(append-file DEPENDS intrinsics_gen ) + +setup_host_tool(append-file APPEND_FILE append_file_exe append_file_target) diff --git a/llvm/tools/file-table-tform/CMakeLists.txt b/llvm/tools/file-table-tform/CMakeLists.txt index b96e494508fe8..7a7b4305c2965 100644 --- a/llvm/tools/file-table-tform/CMakeLists.txt +++ b/llvm/tools/file-table-tform/CMakeLists.txt @@ -5,3 +5,5 @@ set(LLVM_LINK_COMPONENTS add_llvm_tool(file-table-tform file-table-tform.cpp ) + +setup_host_tool(file-table-tform FILE_TABLE_TFORM file-table-tform_exe file-table-tform_target) diff --git a/llvm/tools/llvm-ar/CMakeLists.txt b/llvm/tools/llvm-ar/CMakeLists.txt index 4d0718f8cefe6..30e2507c6e6f2 100644 --- a/llvm/tools/llvm-ar/CMakeLists.txt +++ b/llvm/tools/llvm-ar/CMakeLists.txt @@ -19,6 +19,8 @@ add_llvm_tool(llvm-ar GENERATE_DRIVER ) +setup_host_tool(llvm-ar LLVM_AR llvm_ar_exe llvm_ar_target) + add_llvm_tool_symlink(llvm-ranlib llvm-ar) add_llvm_tool_symlink(llvm-lib llvm-ar) add_llvm_tool_symlink(llvm-dlltool llvm-ar) diff --git a/llvm/tools/llvm-foreach/CMakeLists.txt b/llvm/tools/llvm-foreach/CMakeLists.txt index 12f037101a6d8..7258c29fd2a68 100644 --- a/llvm/tools/llvm-foreach/CMakeLists.txt +++ b/llvm/tools/llvm-foreach/CMakeLists.txt @@ -5,3 +5,5 @@ set(LLVM_LINK_COMPONENTS add_llvm_tool(llvm-foreach llvm-foreach.cpp ) + +setup_host_tool(llvm-foreach LLVM_FOREACH llvm-foreach_exe llvm-foreach_target) diff --git a/llvm/tools/sycl-post-link/CMakeLists.txt b/llvm/tools/sycl-post-link/CMakeLists.txt index 2a8f99795d599..f95d159d0174a 100644 --- a/llvm/tools/sycl-post-link/CMakeLists.txt +++ b/llvm/tools/sycl-post-link/CMakeLists.txt @@ -33,4 +33,7 @@ add_llvm_tool(sycl-post-link LLVMGenXIntrinsics ) +setup_host_tool(sycl-post-link SYCL_POST_LINK + sycl-post-link_exe sycl-post-link_target) + target_link_libraries(sycl-post-link PRIVATE LLVMGenXIntrinsics)