From 445d0664ec229b09e2a07362504df1fe066b2180 Mon Sep 17 00:00:00 2001 From: jinge90 Date: Mon, 26 Oct 2026 14:19:02 +0800 Subject: [PATCH 01/13] Enable libc for spirv64 Signed-off-by: jinge90 --- buildbot/configure.py | 2 +- clang/lib/Driver/Driver.cpp | 22 +++++++++--- clang/lib/Driver/ToolChain.cpp | 8 +++++ clang/lib/Driver/ToolChains/SYCL.cpp | 29 +++++++++++++++ .../SYCL/lib/spirv64-unknown-unknown/libc.bc | 0 .../test/Driver/sycl-device-lib-old-model.cpp | 12 +++++++ clang/test/Driver/sycl-device-lib.cpp | 9 +++++ clang/test/Driver/sycl-no-rdc-old-model.cpp | 35 ++++++++++--------- .../modules/LLVMLibCCompileOptionRules.cmake | 4 +++ libdevice/crt_wrapper.cpp | 3 ++ libdevice/fallback-cstring.hpp | 3 +- sycl-jit/jit-compiler/CMakeLists.txt | 11 +++++- .../lib/rtc/DeviceCompilation.cpp | 12 ++++--- sycl/CMakeLists.txt | 18 ++++++++-- 14 files changed, 136 insertions(+), 32 deletions(-) create mode 100644 clang/test/Driver/Inputs/SYCL/lib/spirv64-unknown-unknown/libc.bc diff --git a/buildbot/configure.py b/buildbot/configure.py index 71a9bcbf9fa32..f59fe28778a34 100644 --- a/buildbot/configure.py +++ b/buildbot/configure.py @@ -211,7 +211,7 @@ def do_configure(args, passthrough_args): ] if sys.platform != "darwin": - llvm_spirv64_runtimes = "compiler-rt" + llvm_spirv64_runtimes = "compiler-rt;libc" llvm_spirv64_sanitizers = "" runtime_targets += ";spirv64-unknown-unknown" cmake_cmd.extend( diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 17252ffe78608..c8764e4016bee 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -6165,11 +6165,21 @@ class OffloadingActionBuilder final { SmallVector, 4> LibLocCandidates; SYCLInstallation.getSYCLDeviceLibPath(LibLocCandidates); - if (TC->getTriple().isSPIROrSPIRV()) { + bool LinkDeviceLibc = false; + bool LinkDeviceBuiltin = false; + bool NoOffloadLib = !Args.hasFlag(options::OPT_offloadlib, + options::OPT_no_offloadlib, true); + if (TC->getTriple().isSPIROrSPIRV() && !NoOffloadLib) { + if (std::optional StdlibPath = TC->getStdlibPath()) { + LinkDeviceLibc = true; + LibLocCandidates.emplace_back(*StdlibPath); + } SmallString<128> SPIRVCompilerRTPath(TC->getCompilerRTPath()); llvm::sys::path::append(SPIRVCompilerRTPath, "spirv64-unknown-unknown"); - if (llvm::sys::fs::exists(SPIRVCompilerRTPath)) + if (llvm::sys::fs::exists(SPIRVCompilerRTPath)) { + LinkDeviceBuiltin = true; LibLocCandidates.emplace_back(SPIRVCompilerRTPath); + } } // NVPTX/AMDGCN reuse CudaToolChain/AMDGPUToolChain, not SYCLToolChain. @@ -6183,6 +6193,10 @@ class OffloadingActionBuilder final { // has their own getDeviceLibs that we can potentially use. DeviceLibraries = SYCLTC.getDeviceLibNames(C.getDriver(), Args, TC->getTriple()); + if (LinkDeviceLibc) { + ToolChain::BitCodeLibraryInfo DeviceLibcInfo("libc.bc"); + DeviceLibraries.emplace_back(DeviceLibcInfo); + } // There is some work in upstream to enable compiler-rt builtins for // SYCL: https://github.com/llvm/llvm-project/pull/218528, we will // cherry-pick it to intel/llvm once it is merged. Before it happens, @@ -6190,9 +6204,7 @@ class OffloadingActionBuilder final { // advance, so enable it in old model for now. // TODO: when upstream PR lands into intel/llvm, remove the special // handling for compiler-rt builtins here. - bool NoOffloadLib = !Args.hasFlag(options::OPT_offloadlib, - options::OPT_no_offloadlib, true); - if (!NoOffloadLib) { + if (LinkDeviceBuiltin) { ToolChain::BitCodeLibraryInfo RTBuiltinInfo("libclang_rt.builtins.bc"); DeviceLibraries.emplace_back(RTBuiltinInfo); } diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 2bdd968ec2875..288dae208855e 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -1209,6 +1209,14 @@ ToolChain::getTargetSubDirPath(StringRef BaseDir) const { if (auto Path = getPathForTriple(T)) return *Path; + if (T.isSPIROrSPIRV() && T.isArch64Bit()) { + llvm::Triple Canon(T); + Canon.setArchName("spirv64"); + Canon = llvm::Triple(Canon.normalize()); + if (auto Path = getPathForTriple(Canon)) + return *Path; + } + if (T.isAMDGCN()) { // Clear the subarch as a fallback. // TODO: Remove this when libc and compiler-rt builds are migrated. diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index f00a39aa8238a..4a1895214211d 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -909,6 +909,21 @@ const char *SYCL::Linker::constructLLVMLinkCommand( return true; if (InputFilename.starts_with("libclang_rt.builtins")) return true; + if (InputFilename.compare("libc.bc") == 0) { + std::optional StdlibPath = + this->getToolChain().getStdlibPath(); + if (StdlibPath) { + llvm::StringRef LibcDirPath = llvm::sys::path::parent_path(FileName); + bool IsSamePath = false; + auto EC = + llvm::sys::fs::equivalent(LibcDirPath, *StdlibPath, IsSamePath); + if (EC) + return false; + else + return IsSamePath; + } else + return false; + } StringRef LibSyclPrefix("libsycl-"); if (!InputFilename.starts_with(LibSyclPrefix) || !InputFilename.ends_with(LibPostfix)) @@ -2077,11 +2092,25 @@ SYCLToolChain::getDeviceLibs( SmallVector, 4> LibraryPaths; SYCLInstallation.getSYCLDeviceLibPath(LibraryPaths); + bool LinkDeviceLibc = false; + bool NoOffloadLib = !DriverArgs.hasFlag(options::OPT_offloadlib, + options::OPT_no_offloadlib, true); + if (getTriple().isSPIROrSPIRV() && !NoOffloadLib) { + if (std::optional StdlibPath = getStdlibPath()) { + LinkDeviceLibc = true; + LibraryPaths.emplace_back(*StdlibPath); + } + } // Formulate all of the device libraries needed for this compilation. SmallVector DeviceLibs = getDeviceLibNames(getDriver(), DriverArgs, getTriple()); + if (LinkDeviceLibc) { + ToolChain::BitCodeLibraryInfo RTBuiltinInfo("libc.bc"); + DeviceLibs.emplace_back(RTBuiltinInfo); + } + // Create full path names to each device library. If found, add to the list // of device libraries that will be linked against. for (const auto &DeviceLib : DeviceLibs) { diff --git a/clang/test/Driver/Inputs/SYCL/lib/spirv64-unknown-unknown/libc.bc b/clang/test/Driver/Inputs/SYCL/lib/spirv64-unknown-unknown/libc.bc new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/sycl-device-lib-old-model.cpp b/clang/test/Driver/sycl-device-lib-old-model.cpp index 25739e7d723a5..c206ad234d227 100644 --- a/clang/test/Driver/sycl-device-lib-old-model.cpp +++ b/clang/test/Driver/sycl-device-lib-old-model.cpp @@ -18,6 +18,7 @@ // SYCL_DEVICE_LIB_LINK_DEFAULT: llvm-link{{.*}} "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-crt.bc" // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-cmath.bc" // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-imf.bc" +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: "{{.*}}libc.bc" // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: "{{.*}}libclang_rt.builtins.bc" /// ########################################################################### @@ -44,6 +45,7 @@ // SYCL_LLVM_LINK_DEVICE_LIB-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-crt.bc" // SYCL_LLVM_LINK_DEVICE_LIB-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-cmath.bc" // SYCL_LLVM_LINK_DEVICE_LIB-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-imf.bc" +// SYCL_LLVM_LINK_DEVICE_LIB-SAME: "{{.*}}libc.bc" // SYCL_LLVM_LINK_DEVICE_LIB-SAME: "{{.*}}libclang_rt.builtins.bc" /// ########################################################################### @@ -73,6 +75,7 @@ // SYCL_DEVICE_LIB_ASAN-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-cmath.bc" // SYCL_DEVICE_LIB_ASAN-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-imf.bc" // SYCL_DEVICE_LIB_ASAN-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-asan.bc" +// SYCL_DEVICE_LIB_ASAN-SAME: "{{.*}}libc.bc" // SYCL_DEVICE_LIB_ASAN-SAME: "{{.*}}libclang_rt.builtins.bc" // SYCL_DEVICE_ASAN_MACRO: "-cc1" // SYCL_DEVICE_ASAN_MACRO-SAME: "USE_SYCL_DEVICE_ASAN" @@ -95,6 +98,7 @@ // SYCL_DEVICE_LIB_ASAN_PVC-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-cmath.bc" // SYCL_DEVICE_LIB_ASAN_PVC-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-imf.bc" // SYCL_DEVICE_LIB_ASAN_PVC-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-asan-pvc.bc" +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: "{{.*}}libc.bc" // SYCL_DEVICE_LIB_ASAN_PVC-SAME: "{{.*}}libclang_rt.builtins.bc" /// ########################################################################### @@ -105,6 +109,7 @@ // SYCL_DEVICE_LIB_ASAN_CPU-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-cmath.bc" // SYCL_DEVICE_LIB_ASAN_CPU-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-imf.bc" // SYCL_DEVICE_LIB_ASAN_CPU-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-asan-cpu.bc" +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: "{{.*}}libc.bc" // SYCL_DEVICE_LIB_ASAN_CPU-SAME: "{{.*}}libclang_rt.builtins.bc" /// ########################################################################### @@ -124,6 +129,7 @@ // SYCL_DEVICE_LIB_ASAN_DG2-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-cmath.bc" // SYCL_DEVICE_LIB_ASAN_DG2-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-imf.bc" // SYCL_DEVICE_LIB_ASAN_DG2-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-asan-dg2.bc" +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: "{{.*}}libc.bc" // SYCL_DEVICE_LIB_ASAN_DG2-SAME: "{{.*}}libclang_rt.builtins.bc" @@ -145,6 +151,7 @@ // SYCL_DEVICE_LIB_MSAN-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-cmath.bc" // SYCL_DEVICE_LIB_MSAN-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-imf.bc" // SYCL_DEVICE_LIB_MSAN-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-msan.bc" +// SYCL_DEVICE_LIB_MSAN-SAME: "{{.*}}libc.bc" // SYCL_DEVICE_LIB_MSAN-SAME: "{{.*}}libclang_rt.builtins.bc" // SYCL_DEVICE_MSAN_MACRO: "-cc1" // SYCL_DEVICE_MSAN_MACRO-SAME: "USE_SYCL_DEVICE_MSAN" @@ -165,6 +172,7 @@ // RUN: -Xarch_device -fsanitize=memory -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_MSAN_PVC // SYCL_DEVICE_LIB_MSAN_PVC: llvm-link{{.*}} "--only-needed" "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-crt.bc" // SYCL_DEVICE_LIB_MSAN_PVC-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-msan-pvc.bc" +// SYCL_DEVICE_LIB_MSAN_PVC-SAME: "{{.*}}libc.bc" // SYCL_DEVICE_LIB_MSAN_PVC-SAME: "{{.*}}libclang_rt.builtins.bc" @@ -174,6 +182,7 @@ // RUN: -Xarch_device -fsanitize=memory -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_MSAN_CPU // SYCL_DEVICE_LIB_MSAN_CPU: llvm-link{{.*}} "--only-needed" "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-crt.bc" // SYCL_DEVICE_LIB_MSAN_CPU-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-msan-cpu.bc" +// SYCL_DEVICE_LIB_MSAN_CPU-SAME: "{{.*}}libc.bc" // SYCL_DEVICE_LIB_MSAN_CPU-SAME: "{{.*}}libclang_rt.builtins.bc" /// ########################################################################### @@ -194,6 +203,7 @@ // SYCL_DEVICE_LIB_TSAN-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-cmath.bc" // SYCL_DEVICE_LIB_TSAN-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-imf.bc" // SYCL_DEVICE_LIB_TSAN-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-tsan.bc" +// SYCL_DEVICE_LIB_TSAN-SAME: "{{.*}}libc.bc" // SYCL_DEVICE_LIB_TSAN-SAME: "{{.*}}libclang_rt.builtins.bc" // SYCL_DEVICE_TSAN_MACRO: "-cc1" // SYCL_DEVICE_TSAN_MACRO-SAME: "USE_SYCL_DEVICE_TSAN" @@ -214,6 +224,7 @@ // RUN: -Xarch_device -fsanitize=thread -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_TSAN_PVC // SYCL_DEVICE_LIB_TSAN_PVC: llvm-link{{.*}} "--only-needed" "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-crt.bc" // SYCL_DEVICE_LIB_TSAN_PVC-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-tsan-pvc.bc" +// SYCL_DEVICE_LIB_TSAN_PVC-SAME: "{{.*}}libc.bc" // SYCL_DEVICE_LIB_TSAN_PVC-SAME: "{{.*}}libclang_rt.builtins.bc" @@ -223,4 +234,5 @@ // RUN: -Xarch_device -fsanitize=thread -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_TSAN_CPU // SYCL_DEVICE_LIB_TSAN_CPU: llvm-link{{.*}} "--only-needed" "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-crt.bc" // SYCL_DEVICE_LIB_TSAN_CPU-SAME: "{{.*}}dpcpp-{{[0-9]+}}/sycl/libsycl-tsan-cpu.bc" +// SYCL_DEVICE_LIB_TSAN_CPU-SAME: "{{.*}}libc.bc" // SYCL_DEVICE_LIB_TSAN_CPU-SAME: "{{.*}}libclang_rt.builtins.bc" diff --git a/clang/test/Driver/sycl-device-lib.cpp b/clang/test/Driver/sycl-device-lib.cpp index ac3b79045ea9a..3e17402a22e4f 100644 --- a/clang/test/Driver/sycl-device-lib.cpp +++ b/clang/test/Driver/sycl-device-lib.cpp @@ -13,6 +13,7 @@ // SYCL_DEVICE_LIB_LINK_DEFAULT: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}/lib/dpcpp-{{[0-9]+}}/sycl/libsycl-crt.bc" // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}/lib/dpcpp-{{[0-9]+}}/sycl/libsycl-cmath.bc // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}/lib/dpcpp-{{[0-9]+}}/sycl/libsycl-imf.bc +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}/lib/{{.*}}/libc.bc // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: "-mlink-builtin-bitcode-postopt" /// ########################################################################### @@ -40,6 +41,7 @@ // SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-cmath.bc // SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-imf.bc // SYCL_DEVICE_LIB_ASAN-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan.bc" +// SYCL_DEVICE_LIB_ASAN-SAME: "-mlink-builtin-bitcode" "{{.*}}libc.bc" // RUN: %clangxx -fsycl --offload-new-driver %s -ccc-install-dir %{clang_install_dir} -Xarch_device "-fsanitize=address -DUSE_SYCL_DEVICE_ASAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_ASAN_MACRO @@ -56,6 +58,7 @@ // SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-cmath.bc // SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-imf.bc // SYCL_DEVICE_LIB_ASAN_PVC-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan-pvc.bc" +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: "-mlink-builtin-bitcode" "{{.*}}libc.bc" /// ########################################################################### /// test behavior of linking libsycl-asan-cpu for CPU target AOT compilation when asan flag is applied. @@ -65,6 +68,7 @@ // SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-cmath.bc // SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-imf.bc // SYCL_DEVICE_LIB_ASAN_CPU-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan-cpu.bc" +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: "-mlink-builtin-bitcode" "{{.*}}libc.bc" /// ########################################################################### /// Test link behavior for multiple targets. Currently, we default to the @@ -77,10 +81,12 @@ // SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: {{.*}}libsycl-cmath.bc // SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: {{.*}}libsycl-imf.bc // SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan.bc" +// SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: "-mlink-builtin-bitcode" "{{.*}}libc.bc" // SYCL_DEVICE_LIB_ASAN_CPU_GPU: clang{{.*}} "-triple" "spir64_x86_64-unknown-unknown"{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-crt.bc" // SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: {{.*}}libsycl-cmath.bc // SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: {{.*}}libsycl-imf.bc // SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan.bc" +// SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: "-mlink-builtin-bitcode" "{{.*}}libc.bc" /// ########################################################################### /// test behavior of linking libsycl-asan-dg2 for DG2 target AOT compilation when asan flag is applied. @@ -96,6 +102,7 @@ // SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-cmath.bc // SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-imf.bc // SYCL_DEVICE_LIB_ASAN_DG2-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan-dg2.bc" +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: "-mlink-builtin-bitcode" "{{.*}}libc.bc" /// ########################################################################### /// test behavior of linking libsycl-asan for multiple targets AOT compilation @@ -107,6 +114,7 @@ // SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-cmath.bc // SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-imf.bc // SYCL_DEVICE_LIB_ASAN_MUL-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan.bc" +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: "-mlink-builtin-bitcode" "{{.*}}libc.bc" /// ########################################################################### /// test behavior of libsycl-msan.o linking when -fsanitize=memory is available @@ -124,6 +132,7 @@ // SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-cmath.bc // SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-imf.bc // SYCL_DEVICE_LIB_MSAN-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-msan.bc" +// SYCL_DEVICE_LIB_MSAN-SAME: "-mlink-builtin-bitcode" "{{.*}}libc.bc" // RUN: %clangxx -fsycl --offload-new-driver %s -ccc-install-dir %{clang_install_dir} -Xarch_device "-fsanitize=memory -DUSE_SYCL_DEVICE_MSAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_MSAN_MACRO diff --git a/clang/test/Driver/sycl-no-rdc-old-model.cpp b/clang/test/Driver/sycl-no-rdc-old-model.cpp index 295077e083748..b88eedc150cb3 100644 --- a/clang/test/Driver/sycl-no-rdc-old-model.cpp +++ b/clang/test/Driver/sycl-no-rdc-old-model.cpp @@ -18,20 +18,21 @@ // CHECK: 12: preprocessor, {11}, c++-cpp-output, (device-sycl) // CHECK: 13: compiler, {12}, ir, (device-sycl) // CHECK: 18: input, "{{.*}}libsycl-crt.bc", ir, (device-sycl) -// CHECK: 24: input, "{{.*}}libclang_rt.builtins.bc", ir, (device-sycl) -// CHECK: 25: linker, {18, {{.*}}, 24}, ir, (device-sycl) -// CHECK: 26: linker, {4, 25}, ir, (device-sycl) -// CHECK: 27: sycl-post-link, {26}, tempfiletable, (device-sycl) -// CHECK: 28: file-table-tform, {27}, tempfilelist, (device-sycl) -// CHECK: 29: llvm-spirv, {28}, tempfilelist, (device-sycl) -// CHECK: 30: file-table-tform, {27, 29}, tempfiletable, (device-sycl) -// CHECK: 31: clang-offload-wrapper, {30}, object, (device-sycl) -// CHECK: 32: offload, "device-sycl (spir64-unknown-unknown)" {31}, object -// CHECK: 33: linker, {13, 25}, ir, (device-sycl) -// CHECK: 34: sycl-post-link, {33}, tempfiletable, (device-sycl) -// CHECK: 35: file-table-tform, {34}, tempfilelist, (device-sycl) -// CHECK: 36: llvm-spirv, {35}, tempfilelist, (device-sycl) -// CHECK: 37: file-table-tform, {34, 36}, tempfiletable, (device-sycl) -// CHECK: 38: clang-offload-wrapper, {37}, object, (device-sycl) -// CHECK: 39: offload, "device-sycl (spir64-unknown-unknown)" {38}, object -// CHECK: 40: linker, {8, 17, 32, 39}, image, (host-sycl) +// CHECK: 24: input, "{{.*}}libc.bc", ir, (device-sycl) +// CHECK: 25: input, "{{.*}}libclang_rt.builtins.bc", ir, (device-sycl) +// CHECK: 26: linker, {18, {{.*}}, 25}, ir, (device-sycl) +// CHECK: 27: linker, {4, 26}, ir, (device-sycl) +// CHECK: 28: sycl-post-link, {27}, tempfiletable, (device-sycl) +// CHECK: 29: file-table-tform, {28}, tempfilelist, (device-sycl) +// CHECK: 30: llvm-spirv, {29}, tempfilelist, (device-sycl) +// CHECK: 31: file-table-tform, {28, 30}, tempfiletable, (device-sycl) +// CHECK: 32: clang-offload-wrapper, {31}, object, (device-sycl) +// CHECK: 33: offload, "device-sycl (spir64-unknown-unknown)" {32}, object +// CHECK: 34: linker, {13, 26}, ir, (device-sycl) +// CHECK: 35: sycl-post-link, {34}, tempfiletable, (device-sycl) +// CHECK: 36: file-table-tform, {35}, tempfilelist, (device-sycl) +// CHECK: 37: llvm-spirv, {36}, tempfilelist, (device-sycl) +// CHECK: 38: file-table-tform, {35, 37}, tempfiletable, (device-sycl) +// CHECK: 39: clang-offload-wrapper, {38}, object, (device-sycl) +// CHECK: 40: offload, "device-sycl (spir64-unknown-unknown)" {39}, object +// CHECK: 41: linker, {8, 17, 33, 40}, image, (host-sycl) diff --git a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake index 79f2d80bcba7a..aad7585e5c3b6 100644 --- a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake +++ b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake @@ -353,6 +353,10 @@ function(_get_common_compile_options output_var flags) endif() elseif(LIBC_TARGET_ARCHITECTURE_IS_AMDGPU) list(APPEND compile_options "SHELL:-Xclang -mcode-object-version=none") + # TODO: remove usage of 'spirv-default-addr-space-is-generic' when default addr space + # ambiguity for SPIR targets is removed in upstream. + elseif(LIBC_TARGET_ARCHITECTURE_IS_SPIRV) + list(APPEND compile_options "SHELL:-Xclang -fspirv-default-addr-space-is-generic") endif() endif() set(${output_var} ${compile_options} PARENT_SCOPE) diff --git a/libdevice/crt_wrapper.cpp b/libdevice/crt_wrapper.cpp index 8c9cb715f7036..01fb1d209b3b2 100644 --- a/libdevice/crt_wrapper.cpp +++ b/libdevice/crt_wrapper.cpp @@ -17,6 +17,8 @@ __attribute__((weak)) DeviceGlobal RandNext; #ifdef __LIBDEVICE_TARGET_SUPPORT + +#if !defined(__SPIR__) && !defined(__SPIRV__) DEVICE_EXTERN_C_INLINE void *memcpy(void *dest, const void *src, size_t n) { return __devicelib_memcpy(dest, src, n); @@ -84,6 +86,7 @@ int strncmp(const char *s1, const char *s2, size_t n) { return s1[idx] - s2[idx]; } +#endif // !__SPIR__ && !__SPIRV__ // This simple rand is for ease of use only, the implementation aligns with // LLVM libc rand which is based on xorshift64star pseudo random number diff --git a/libdevice/fallback-cstring.hpp b/libdevice/fallback-cstring.hpp index 7fbded7844530..80180f8097f86 100644 --- a/libdevice/fallback-cstring.hpp +++ b/libdevice/fallback-cstring.hpp @@ -11,7 +11,7 @@ #include #ifdef __LIBDEVICE_TARGET_SUPPORT - +#if !defined(__SPIR__) && !defined(__SPIRV__) static void *__devicelib_memcpy_uint8_aligned(void *dest, const void *src, size_t n) { if (dest == NULL || src == NULL || n == 0) @@ -200,4 +200,5 @@ static inline int __devicelib_memcmp(const void *s1, const void *s2, size_t n) { return head_cmp; } +#endif // !__SPIR__ && !__SPIRV__ #endif // __LIBDEVICE_TARGET_SUPPORT diff --git a/sycl-jit/jit-compiler/CMakeLists.txt b/sycl-jit/jit-compiler/CMakeLists.txt index a5fb48ddd9da9..dd07c0e34c4bc 100644 --- a/sycl-jit/jit-compiler/CMakeLists.txt +++ b/sycl-jit/jit-compiler/CMakeLists.txt @@ -32,6 +32,7 @@ set(SYCL_JIT_RESOURCE_INSTALL_COMPONENTS include(GetTargetsBuildingLLVMRuntime) get_targets_building_llvm_runtime(libclc libclc_targets) get_targets_building_llvm_runtime(compiler-rt compiler-rt_targets) +get_targets_building_llvm_runtime(libc libc_targets) foreach(tgt IN LISTS libclc_targets) # If some targets required `libclc` then we should embed it for the @@ -41,7 +42,11 @@ foreach(tgt IN LISTS libclc_targets) list(APPEND SYCL_JIT_RESOURCE_INSTALL_COMPONENTS "runtimes-${tgt}::libspirv-builtins") endforeach() -# We only enable compiler-rt builtin library for spirv64 target. +# We only enable compiler-rt builtin library and libc for spirv64 target. +foreach(tgt IN LISTS libc_targets) + list(APPEND SYCL_JIT_RESOURCE_INSTALL_COMPONENTS libc) +endforeach() + foreach(tgt IN LISTS compiler-rt_targets) list(APPEND SYCL_JIT_RESOURCE_INSTALL_COMPONENTS builtins-${tgt}) endforeach() @@ -71,6 +76,10 @@ foreach(component IN LISTS SYCL_JIT_RESOURCE_INSTALL_COMPONENTS) list(APPEND SYCL_JIT_RESOURCE_DEPS runtimes-${tgt}) sycl_jit_add_install_command("${component}" "${CMAKE_BINARY_DIR}/runtimes/runtimes-${tgt}-bins/libclc" "${CMAKE_BINARY_DIR}/runtimes/runtimes-${tgt}-stamps") + elseif("${component}" STREQUAL "libc") + list(APPEND SYCL_JIT_RESOURCE_DEPS runtimes-spirv64-unknown-unknown) + sycl_jit_add_install_command("libc" "${CMAKE_BINARY_DIR}/runtimes/runtimes-spirv64-unknown-unknown-bins/" + "${CMAKE_BINARY_DIR}/runtimes/runtimes-spirv64-unknown-unknown-stamps") elseif("${component}" STREQUAL "builtins-spirv64-unknown-unknown") list(APPEND SYCL_JIT_RESOURCE_DEPS builtins-spirv64-unknown-unknown) sycl_jit_add_install_command("clang_rt.builtins-spirv64" "${CMAKE_BINARY_DIR}/runtimes/builtins-spirv64-unknown-unknown-bins/") diff --git a/sycl-jit/jit-compiler/lib/rtc/DeviceCompilation.cpp b/sycl-jit/jit-compiler/lib/rtc/DeviceCompilation.cpp index f97727396f4b5..5b00be7337980 100644 --- a/sycl-jit/jit-compiler/lib/rtc/DeviceCompilation.cpp +++ b/sycl-jit/jit-compiler/lib/rtc/DeviceCompilation.cpp @@ -634,6 +634,7 @@ class SYCLToolchain { std::string_view getPrefix() const { return Prefix; } std::string_view getClangXXExe() const { return ClangXXExe; } std::string_view getLibclcDir() const { return LibclcDir; } + std::string_view getStdlibPath() const { return StdlibPathBase; } private: clang::IgnoringDiagConsumer IgnoreDiag; @@ -641,6 +642,7 @@ class SYCLToolchain { jit_compiler::resource::ToolchainPrefix.Size}; std::string ClangXXExe = (Prefix + "/bin/clang++").str(); std::string LibclcDir = GetResourcesPath(ClangXXExe) + "/lib/"; + std::string StdlibPathBase = (Prefix + "/lib/").str(); PrecompiledPreambles Preambles; }; @@ -801,12 +803,12 @@ static void getDeviceLibraries(const ArgList &Args, } using SYCLDeviceLibsList = SmallVector; - const SYCLDeviceLibsList SYCLDeviceLibs = {"libsycl-crt", "libsycl-cmath", + const SYCLDeviceLibsList SYCLDeviceLibs = { + "libsycl-crt", "libsycl-cmath", #if defined(_WIN32) - "libsycl-msvc-math", + "libsycl-msvc-math", #endif - "libsycl-imf", - "libclang_rt.builtins"}; + "libsycl-imf", "libc", "libclang_rt.builtins"}; StringRef LibSuffix = ".bc"; auto AddLibraries = [&](const SYCLDeviceLibsList &LibsList) { @@ -866,6 +868,8 @@ Error jit_compiler::linkDeviceLibraries(llvm::Module &Module, std::string LibPath; if (LibName.find("libspirv") != std::string::npos) LibPath = (TC.getLibclcDir() + TripleName + "/" + LibName).str(); + else if (LibName == "libc.bc") + LibPath = (TC.getStdlibPath() + "/" + TripleName + "/" + LibName).str(); else if (LibName == "libclang_rt.builtins.bc") LibPath = (TC.getPrefix() + getCompilerRTSuffix() + TripleName + "/" + LibName) diff --git a/sycl/CMakeLists.txt b/sycl/CMakeLists.txt index 802f62d3caa80..d38e44452e20a 100644 --- a/sycl/CMakeLists.txt +++ b/sycl/CMakeLists.txt @@ -587,6 +587,7 @@ endif() include(GetTargetsBuildingLLVMRuntime) get_targets_building_llvm_runtime(libclc libclc_targets) get_targets_building_llvm_runtime(compiler-rt compiler-rt_targets) +get_targets_building_llvm_runtime(libc libc_targets) foreach(target IN LISTS libclc_targets) add_dependencies(sycl-toolchain libclc-${target}) @@ -600,7 +601,13 @@ foreach(target IN LISTS libclc_targets) list(APPEND SYCL_TOOLCHAIN_DEPLOY_COMPONENTS runtimes-${target}::libspirv-builtins) endforeach() -# Currently, we only enable compiler-rt builtin library for spirv64 targets + +# Currently, we only enable compiler-rt builtin library and libc for spirv64 targets. +foreach(target IN LISTS libc_targets) + add_dependencies(sycl-toolchain runtimes-${target}) + list(APPEND SYCL_TOOLCHAIN_DEPLOY_COMPONENTS runtimes-${target}::libc) +endforeach() + foreach(target IN LISTS compiler-rt_targets) add_dependencies(sycl-toolchain builtins-${target}) list(APPEND SYCL_TOOLCHAIN_DEPLOY_COMPONENTS builtins-${target}) @@ -672,8 +679,13 @@ foreach(component IN LISTS SYCL_TOOLCHAIN_DEPLOY_COMPONENTS) if("${component}" MATCHES "^runtimes-(.*)::(.*)") set(tgt "${CMAKE_MATCH_1}") set(component "${CMAKE_MATCH_2}") - set(INSTALL_SCRIPT "${CMAKE_BINARY_DIR}/runtimes/runtimes-${tgt}-bins/libclc/cmake_install.cmake") - sycl_add_install_command("${component}" "${component}_${tgt}" "${INSTALL_SCRIPT}" "libclc-${tgt}") + if ("${component}" STREQUAL "libc") + set(INSTALL_SCRIPT "${CMAKE_BINARY_DIR}/runtimes/runtimes-${tgt}-bins/libc/cmake_install.cmake") + sycl_add_install_command("${component}" "${component}_${tgt}" "${INSTALL_SCRIPT}" "runtimes-${tgt}") + elseif() + set(INSTALL_SCRIPT "${CMAKE_BINARY_DIR}/runtimes/runtimes-${tgt}-bins/libclc/cmake_install.cmake") + sycl_add_install_command("${component}" "${component}_${tgt}" "${INSTALL_SCRIPT}" "libclc-${tgt}") + endif() else() set(INSTALL_SCRIPT "${CMAKE_BINARY_DIR}/cmake_install.cmake") set(COMPONENT_DEPS "") From d15467d8383aa02c1cff1f52663344d8e20c5367 Mon Sep 17 00:00:00 2001 From: Jin Date: Mon, 26 Oct 2026 14:33:27 +0800 Subject: [PATCH 02/13] update driver tests for win Signed-off-by: Jin --- clang/test/Driver/sycl-device-lib-win.cpp | 2 ++ clang/test/Driver/sycl-no-rdc-win.cpp | 35 ++++++++++++----------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/clang/test/Driver/sycl-device-lib-win.cpp b/clang/test/Driver/sycl-device-lib-win.cpp index fc05b0cbbdd4c..a915045130f96 100644 --- a/clang/test/Driver/sycl-device-lib-win.cpp +++ b/clang/test/Driver/sycl-device-lib-win.cpp @@ -18,6 +18,7 @@ // SYCL_DEVICE_LIB_LINK_DEFAULT: llvm-link{{.*}} "{{.*}}lib\\libsycl-crt.bc" // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: "{{.*}}lib\\libsycl-cmath.bc" // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: "{{.*}}lib\\libsycl-imf.bc" +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: "{{.*}}libc.bc" // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: "{{.*}}libclang_rt.builtins.bc" /// ########################################################################### @@ -40,6 +41,7 @@ // SYCL_LLVM_LINK_DEVICE_LIB-SAME: "{{.*}}libsycl-crt.bc" // SYCL_LLVM_LINK_DEVICE_LIB-SAME: "{{.*}}libsycl-cmath.bc" // SYCL_LLVM_LINK_DEVICE_LIB-SAME: "{{.*}}libsycl-imf.bc" +// SYCL_LLVM_LINK_DEVICE_LIB-SAME: "{{.*}}libc.bc" // SYCL_LLVM_LINK_DEVICE_LIB-SAME: "{{.*}}libclang_rt.builtins.bc" /// ########################################################################### diff --git a/clang/test/Driver/sycl-no-rdc-win.cpp b/clang/test/Driver/sycl-no-rdc-win.cpp index 085c9cc1b1e8a..6672722e4846a 100644 --- a/clang/test/Driver/sycl-no-rdc-win.cpp +++ b/clang/test/Driver/sycl-no-rdc-win.cpp @@ -21,23 +21,24 @@ // CHECK: 13: compiler, {12}, ir, (device-sycl) // CHECK: 14: offload, "host-sycl (x86_64-pc-windows-msvc)" {10}, "device-sycl (spir64-unknown-unknown)" {13}, c++-cpp-output // CHECK: 18: input, "{{.*}}libsycl-crt{{.*}}", ir, (device-sycl) -// CHECK: 25: input, "{{.*}}libclang_rt.builtins{{.*}}", ir, (device-sycl) -// CHECK: 26: linker, {18, {{.*}}, 25}, ir, (device-sycl) -// CHECK: 27: linker, {4, 26}, ir, (device-sycl) -// CHECK: 28: sycl-post-link, {27}, tempfiletable, (device-sycl) -// CHECK: 29: file-table-tform, {28}, tempfilelist, (device-sycl) -// CHECK: 30: llvm-spirv, {29}, tempfilelist, (device-sycl) -// CHECK: 31: file-table-tform, {28, 30}, tempfiletable, (device-sycl) -// CHECK: 32: clang-offload-wrapper, {31}, object, (device-sycl) -// CHECK: 33: offload, "device-sycl (spir64-unknown-unknown)" {32}, object -// CHECK: 34: linker, {13, 26}, ir, (device-sycl) -// CHECK: 35: sycl-post-link, {34}, tempfiletable, (device-sycl) -// CHECK: 36: file-table-tform, {35}, tempfilelist, (device-sycl) -// CHECK: 37: llvm-spirv, {36}, tempfilelist, (device-sycl) -// CHECK: 38: file-table-tform, {35, 37}, tempfiletable, (device-sycl) -// CHECK: 39: clang-offload-wrapper, {38}, object, (device-sycl) -// CHECK: 40: offload, "device-sycl (spir64-unknown-unknown)" {39}, object -// CHECK: 41: linker, {8, 17, 33, 40}, image, (host-sycl) +// CHECK: 25: input, "{{.*}}libc{{.*}}", ir, (device-sycl) +// CHECK: 26: input, "{{.*}}libclang_rt.builtins{{.*}}", ir, (device-sycl) +// CHECK: 27: linker, {18, {{.*}}, 26}, ir, (device-sycl) +// CHECK: 28: linker, {4, 27}, ir, (device-sycl) +// CHECK: 29: sycl-post-link, {28}, tempfiletable, (device-sycl) +// CHECK: 30: file-table-tform, {29}, tempfilelist, (device-sycl) +// CHECK: 31: llvm-spirv, {30}, tempfilelist, (device-sycl) +// CHECK: 32: file-table-tform, {29, 31}, tempfiletable, (device-sycl) +// CHECK: 33: clang-offload-wrapper, {32}, object, (device-sycl) +// CHECK: 34: offload, "device-sycl (spir64-unknown-unknown)" {33}, object +// CHECK: 35: linker, {13, 27}, ir, (device-sycl) +// CHECK: 36: sycl-post-link, {35}, tempfiletable, (device-sycl) +// CHECK: 37: file-table-tform, {36}, tempfilelist, (device-sycl) +// CHECK: 38: llvm-spirv, {37}, tempfilelist, (device-sycl) +// CHECK: 39: file-table-tform, {36, 38}, tempfiletable, (device-sycl) +// CHECK: 40: clang-offload-wrapper, {39}, object, (device-sycl) +// CHECK: 41: offload, "device-sycl (spir64-unknown-unknown)" {40}, object +// CHECK: 42: linker, {8, 17, 34, 41}, image, (host-sycl) // RUN: %clang -### -fsycl -fno-sycl-rdc -c -fsycl-targets=spir64_gen -ccc-install-dir %{clang_install_dir} %t1.cpp 2>&1 | FileCheck -check-prefix=CHECK-EARLY %s // RUN: %clang_cl -### -fsycl -fno-sycl-rdc -c -fsycl-targets=spir64_gen -ccc-install-dir %{clang_install_dir} %t1.cpp 2>&1 | FileCheck -check-prefix=CHECK-EARLY %s // CHECK-EARLY: llvm-link{{.*}} From d55ece9f07033ea943c07806916cebc6f2c15b52 Mon Sep 17 00:00:00 2001 From: jinge90 Date: Mon, 26 Oct 2026 15:22:22 +0800 Subject: [PATCH 03/13] Potential fix for pull request finding 'Fix empty elseif preventing libclc installation' Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- sycl/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sycl/CMakeLists.txt b/sycl/CMakeLists.txt index d38e44452e20a..2dd6251007cfb 100644 --- a/sycl/CMakeLists.txt +++ b/sycl/CMakeLists.txt @@ -682,7 +682,7 @@ foreach(component IN LISTS SYCL_TOOLCHAIN_DEPLOY_COMPONENTS) if ("${component}" STREQUAL "libc") set(INSTALL_SCRIPT "${CMAKE_BINARY_DIR}/runtimes/runtimes-${tgt}-bins/libc/cmake_install.cmake") sycl_add_install_command("${component}" "${component}_${tgt}" "${INSTALL_SCRIPT}" "runtimes-${tgt}") - elseif() + else() set(INSTALL_SCRIPT "${CMAKE_BINARY_DIR}/runtimes/runtimes-${tgt}-bins/libclc/cmake_install.cmake") sycl_add_install_command("${component}" "${component}_${tgt}" "${INSTALL_SCRIPT}" "libclc-${tgt}") endif() From 8091b7e360d1d940beb5613f1fd3decf290a2ddf Mon Sep 17 00:00:00 2001 From: jinge90 Date: Mon, 26 Oct 2026 16:15:18 +0800 Subject: [PATCH 04/13] fix driver lit tests Signed-off-by: jinge90 --- .../sycl-no-rdc-fat-archive-old-model.cpp | 33 ++++++++--------- .../Driver/sycl-no-rdc-fat-archive-win.cpp | 35 ++++++++++--------- 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/clang/test/Driver/sycl-no-rdc-fat-archive-old-model.cpp b/clang/test/Driver/sycl-no-rdc-fat-archive-old-model.cpp index 1874e7fd0e96c..750aa0d5561d3 100644 --- a/clang/test/Driver/sycl-no-rdc-fat-archive-old-model.cpp +++ b/clang/test/Driver/sycl-no-rdc-fat-archive-old-model.cpp @@ -17,19 +17,20 @@ // CHECK: 2: clang-offload-unbundler, {1}, tempfilelist // CHECK: 3: spirv-to-ir-wrapper, {2}, tempfilelist, (device-sycl) // CHECK: 4: input, "{{.*}}libsycl-crt.bc", ir, (device-sycl) -// CHECK: 10: input, "{{.*}}libclang_rt.builtins.bc", ir, (device-sycl) -// CHECK: 11: linker, {4, {{.*}}, 10}, ir, (device-sycl) -// CHECK: 12: linker, {3, 11}, ir, (device-sycl) -// CHECK: 13: foreach, {3, 12}, ir, (device-sycl) -// CHECK: 14: file-table-tform, {3, 13}, tempfilelist, (device-sycl) -// CHECK: 15: sycl-post-link, {14}, tempfiletable, (device-sycl) -// CHECK: 16: foreach, {14, 15}, tempfiletable, (device-sycl) -// CHECK: 17: file-table-tform, {16}, tempfilelist, (device-sycl) -// CHECK: 18: file-table-tform, {16}, tempfilelist, (device-sycl) -// CHECK: 19: foreach, {14, 18}, tempfilelist, (device-sycl) -// CHECK: 20: file-table-tform, {19}, tempfilelist, (device-sycl) -// CHECK: 21: llvm-spirv, {20}, tempfilelist, (device-sycl) -// CHECK: 22: file-table-tform, {17, 21}, tempfiletable, (device-sycl) -// CHECK: 23: clang-offload-wrapper, {22}, object, (device-sycl) -// CHECK: 24: offload, "device-sycl (spir64-unknown-unknown)" {23}, object -// CHECK: 25: linker, {0, 24}, image, (host-sycl) +// CHECK: 10: input, "{{.*}}libc.bc", ir, (device-sycl) +// CHECK: 11: input, "{{.*}}libclang_rt.builtins.bc", ir, (device-sycl) +// CHECK: 12: linker, {4, {{.*}}, 11}, ir, (device-sycl) +// CHECK: 13: linker, {3, 12}, ir, (device-sycl) +// CHECK: 14: foreach, {3, 13}, ir, (device-sycl) +// CHECK: 15: file-table-tform, {3, 14}, tempfilelist, (device-sycl) +// CHECK: 16: sycl-post-link, {15}, tempfiletable, (device-sycl) +// CHECK: 17: foreach, {15, 16}, tempfiletable, (device-sycl) +// CHECK: 18: file-table-tform, {17}, tempfilelist, (device-sycl) +// CHECK: 19: file-table-tform, {17}, tempfilelist, (device-sycl) +// CHECK: 20: foreach, {15, 19}, tempfilelist, (device-sycl) +// CHECK: 21: file-table-tform, {20}, tempfilelist, (device-sycl) +// CHECK: 22: llvm-spirv, {21}, tempfilelist, (device-sycl) +// CHECK: 23: file-table-tform, {18, 22}, tempfiletable, (device-sycl) +// CHECK: 24: clang-offload-wrapper, {23}, object, (device-sycl) +// CHECK: 25: offload, "device-sycl (spir64-unknown-unknown)" {24}, object +// CHECK: 26: linker, {0, 25}, image, (host-sycl) diff --git a/clang/test/Driver/sycl-no-rdc-fat-archive-win.cpp b/clang/test/Driver/sycl-no-rdc-fat-archive-win.cpp index 3425625c2b061..557633fe26b2c 100644 --- a/clang/test/Driver/sycl-no-rdc-fat-archive-win.cpp +++ b/clang/test/Driver/sycl-no-rdc-fat-archive-win.cpp @@ -21,20 +21,21 @@ // CHECK: 1: input, "[[INPUT]]", archive // CHECK: 2: clang-offload-unbundler, {1}, tempfilelist // CHECK: 3: spirv-to-ir-wrapper, {2}, tempfilelist, (device-sycl) -// CHECK: 4: input, "{{.*}}libsycl-crt{{.*}}", ir, (device-sycl) -// CHECK: 11: input, "{{.*}}libclang_rt.builtins{{.*}}", ir, (device-sycl) -// CHECK: 12: linker, {4, {{.*}}, 11}, ir, (device-sycl) -// CHECK: 13: linker, {3, 12}, ir, (device-sycl) -// CHECK: 14: foreach, {3, 13}, ir, (device-sycl) -// CHECK: 15: file-table-tform, {3, 14}, tempfilelist, (device-sycl) -// CHECK: 16: sycl-post-link, {15}, tempfiletable, (device-sycl) -// CHECK: 17: foreach, {15, 16}, tempfiletable, (device-sycl) -// CHECK: 18: file-table-tform, {17}, tempfilelist, (device-sycl) -// CHECK: 19: file-table-tform, {17}, tempfilelist, (device-sycl) -// CHECK: 20: foreach, {15, 19}, tempfilelist, (device-sycl) -// CHECK: 21: file-table-tform, {20}, tempfilelist, (device-sycl) -// CHECK: 22: llvm-spirv, {21}, tempfilelist, (device-sycl) -// CHECK: 23: file-table-tform, {18, 22}, tempfiletable, (device-sycl) -// CHECK: 24: clang-offload-wrapper, {23}, object, (device-sycl) -// CHECK: 25: offload, "device-sycl (spir64-unknown-unknown)" {24}, object -// CHECK: 26: linker, {0, 25}, image, (host-sycl) +// CHECK: 4: input, "{{.*}}libsycl-crt.bc", ir, (device-sycl) +// CHECK: 11: input, "{{.*}}libc.bc", ir, (device-sycl) +// CHECK: 12: input, "{{.*}}libclang_rt.builtins.bc", ir, (device-sycl) +// CHECK: 13: linker, {4, {{.*}}, 12}, ir, (device-sycl) +// CHECK: 14: linker, {3, 13}, ir, (device-sycl) +// CHECK: 15: foreach, {3, 14}, ir, (device-sycl) +// CHECK: 16: file-table-tform, {3, 15}, tempfilelist, (device-sycl) +// CHECK: 17: sycl-post-link, {16}, tempfiletable, (device-sycl) +// CHECK: 18: foreach, {16, 17}, tempfiletable, (device-sycl) +// CHECK: 19: file-table-tform, {18}, tempfilelist, (device-sycl) +// CHECK: 20: file-table-tform, {18}, tempfilelist, (device-sycl) +// CHECK: 21: foreach, {16, 20}, tempfilelist, (device-sycl) +// CHECK: 22: file-table-tform, {21}, tempfilelist, (device-sycl) +// CHECK: 23: llvm-spirv, {22}, tempfilelist, (device-sycl) +// CHECK: 24: file-table-tform, {19, 23}, tempfiletable, (device-sycl) +// CHECK: 25: clang-offload-wrapper, {24}, object, (device-sycl) +// CHECK: 26: offload, "device-sycl (spir64-unknown-unknown)" {25}, object +// CHECK: 27: linker, {0, 26}, image, (host-sycl) From df70a809c0c88260d58c3c95e661addf31b8c5bc Mon Sep 17 00:00:00 2001 From: jinge90 Date: Tue, 27 Oct 2026 14:13:46 +0800 Subject: [PATCH 05/13] Report error for libc not found in new offload driver Signed-off-by: jinge90 --- clang/lib/Driver/ToolChains/SYCL.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 4a1895214211d..c1939ceceb8d9 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -2096,10 +2096,9 @@ SYCLToolChain::getDeviceLibs( bool NoOffloadLib = !DriverArgs.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib, true); if (getTriple().isSPIROrSPIRV() && !NoOffloadLib) { - if (std::optional StdlibPath = getStdlibPath()) { - LinkDeviceLibc = true; + LinkDeviceLibc = true; + if (std::optional StdlibPath = getStdlibPath()) LibraryPaths.emplace_back(*StdlibPath); - } } // Formulate all of the device libraries needed for this compilation. From f3f9292e33c5327cd374d0c4940b30c459cd13be Mon Sep 17 00:00:00 2001 From: jinge90 Date: Wed, 4 Nov 2026 11:12:45 +0800 Subject: [PATCH 06/13] address some review comments Signed-off-by: jinge90 --- clang/lib/Driver/ToolChains/SYCL.cpp | 23 +++++++++-------------- sycl/CMakeLists.txt | 3 +-- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 6f01333ee6442..6c334b51b30b5 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -922,20 +922,16 @@ const char *SYCL::Linker::constructLLVMLinkCommand( return true; if (InputFilename.starts_with("libclang_rt.builtins")) return true; - if (InputFilename.compare("libc.bc") == 0) { - std::optional StdlibPath = - this->getToolChain().getStdlibPath(); + if (InputFilename == "libc.bc") { + std::optional StdlibPath = getToolChain().getStdlibPath(); if (StdlibPath) { llvm::StringRef LibcDirPath = llvm::sys::path::parent_path(FileName); bool IsSamePath = false; auto EC = llvm::sys::fs::equivalent(LibcDirPath, *StdlibPath, IsSamePath); - if (EC) - return false; - else - return IsSamePath; - } else - return false; + return (!EC && IsSamePath); + } + return false; } StringRef LibSyclPrefix("libsycl-"); if (!InputFilename.starts_with(LibSyclPrefix) || @@ -2103,9 +2099,6 @@ SYCLToolChain::getDeviceLibs( const Action::OffloadKind DeviceOffloadingKind) const { llvm::SmallVector BCLibs; - bool NoOffloadLib = !DriverArgs.hasFlag(options::OPT_offloadlib, - options::OPT_no_offloadlib, true); - // Formulate all of the device libraries needed for this compilation. SmallVector DeviceLibs = getDeviceLibNames(getDriver(), DriverArgs, getTriple()); @@ -2122,7 +2115,9 @@ SYCLToolChain::getDeviceLibs( getDriver().Diag(diag::err_drv_no_sycl_device_lib) << DeviceLib.Path; } - // Link deivce libc for spirv64 target. + bool NoOffloadLib = !DriverArgs.hasFlag(options::OPT_offloadlib, + options::OPT_no_offloadlib, true); + // Link device libc for spirv64 target. if (getTriple().isSPIROrSPIRV() && getTriple().isArch64Bit() && !NoOffloadLib) { bool LinkDeviceLibc = false; @@ -2131,7 +2126,7 @@ SYCLToolChain::getDeviceLibs( llvm::sys::path::append(FullLibcName, "libc.bc"); if (getDriver().getVFS().exists(FullLibcName)) { LinkDeviceLibc = true; - BCLibs.emplace_back(BitCodeLibraryInfo({FullLibcName, true})); + BCLibs.emplace_back(BitCodeLibraryInfo(FullLibcName, true)); } } if (!LinkDeviceLibc) diff --git a/sycl/CMakeLists.txt b/sycl/CMakeLists.txt index 4b67ea87da47e..3186d3600c489 100644 --- a/sycl/CMakeLists.txt +++ b/sycl/CMakeLists.txt @@ -601,7 +601,6 @@ foreach(target IN LISTS libclc_targets) list(APPEND SYCL_TOOLCHAIN_DEPLOY_COMPONENTS runtimes-${target}::libspirv-builtins) endforeach() - # Currently, we only enable compiler-rt builtin library and libc for spirv64 targets. foreach(target IN LISTS libc_targets) add_dependencies(sycl-toolchain runtimes-${target}) @@ -680,7 +679,7 @@ foreach(component IN LISTS SYCL_TOOLCHAIN_DEPLOY_COMPONENTS) if("${component}" MATCHES "^runtimes-(.*)::(.*)") set(tgt "${CMAKE_MATCH_1}") set(component "${CMAKE_MATCH_2}") - if ("${component}" STREQUAL "libc") + if("${component}" STREQUAL "libc") set(INSTALL_SCRIPT "${CMAKE_BINARY_DIR}/runtimes/runtimes-${tgt}-bins/libc/cmake_install.cmake") sycl_add_install_command("${component}" "${component}_${tgt}" "${INSTALL_SCRIPT}" "runtimes-${tgt}") else() From 5e2379c8479a767e4c23ff2736a72794cd451219 Mon Sep 17 00:00:00 2001 From: jinge90 Date: Wed, 4 Nov 2026 11:34:31 +0800 Subject: [PATCH 07/13] Address comments in jit-compiler Signed-off-by: jinge90 --- sycl-jit/jit-compiler/lib/rtc/DeviceCompilation.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sycl-jit/jit-compiler/lib/rtc/DeviceCompilation.cpp b/sycl-jit/jit-compiler/lib/rtc/DeviceCompilation.cpp index 5b00be7337980..a7ef53ba3ac56 100644 --- a/sycl-jit/jit-compiler/lib/rtc/DeviceCompilation.cpp +++ b/sycl-jit/jit-compiler/lib/rtc/DeviceCompilation.cpp @@ -634,7 +634,7 @@ class SYCLToolchain { std::string_view getPrefix() const { return Prefix; } std::string_view getClangXXExe() const { return ClangXXExe; } std::string_view getLibclcDir() const { return LibclcDir; } - std::string_view getStdlibPath() const { return StdlibPathBase; } + std::string_view getLibDir() const { return LibDir; } private: clang::IgnoringDiagConsumer IgnoreDiag; @@ -642,7 +642,7 @@ class SYCLToolchain { jit_compiler::resource::ToolchainPrefix.Size}; std::string ClangXXExe = (Prefix + "/bin/clang++").str(); std::string LibclcDir = GetResourcesPath(ClangXXExe) + "/lib/"; - std::string StdlibPathBase = (Prefix + "/lib/").str(); + std::string LibDir = CLANG_INSTALL_LIBDIR_BASENAME; PrecompiledPreambles Preambles; }; @@ -869,7 +869,7 @@ Error jit_compiler::linkDeviceLibraries(llvm::Module &Module, if (LibName.find("libspirv") != std::string::npos) LibPath = (TC.getLibclcDir() + TripleName + "/" + LibName).str(); else if (LibName == "libc.bc") - LibPath = (TC.getStdlibPath() + "/" + TripleName + "/" + LibName).str(); + LibPath = (TC.getLibDir() + TripleName + "/" + LibName).str(); else if (LibName == "libclang_rt.builtins.bc") LibPath = (TC.getPrefix() + getCompilerRTSuffix() + TripleName + "/" + LibName) From c063ed597e221384df68fcc8ffbdd09b4f116a4a Mon Sep 17 00:00:00 2001 From: jinge90 Date: Tue, 3 Nov 2026 21:23:14 -0800 Subject: [PATCH 08/13] address review comments in driver lit Signed-off-by: jinge90 --- clang/test/Driver/sycl-device-lib-win.cpp | 15 +++++++++-- clang/test/Driver/sycl-device-lib.cpp | 32 ++++++++++++++++------- clang/test/Driver/sycl-no-rdc-win.cpp | 6 ++--- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/clang/test/Driver/sycl-device-lib-win.cpp b/clang/test/Driver/sycl-device-lib-win.cpp index a915045130f96..6c496f41e2ece 100644 --- a/clang/test/Driver/sycl-device-lib-win.cpp +++ b/clang/test/Driver/sycl-device-lib-win.cpp @@ -18,16 +18,27 @@ // SYCL_DEVICE_LIB_LINK_DEFAULT: llvm-link{{.*}} "{{.*}}lib\\libsycl-crt.bc" // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: "{{.*}}lib\\libsycl-cmath.bc" // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: "{{.*}}lib\\libsycl-imf.bc" -// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: "{{.*}}libc.bc" +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: "{{.*}}lib{{[/\\]}}spirv64-unknown-unknown{{[/\\]}}libc.bc" // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: "{{.*}}libclang_rt.builtins.bc" /// ########################################################################### +/// test behavior of libc.bc linking for spir64_gen and spir64_x86_64 targets +// RUN: %clangxx -fsycl -fsycl-targets=spir64_gen %s -ccc-install-dir %{clang_install_dir} -resource-dir=%{resource_dir} -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_LINK_LIBC +// RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64 %s -ccc-install-dir %{clang_install_dir} -resource-dir=%{resource_dir} -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_LINK_LIBC +// SYCL_DEVICE_LIB_LINK_LIBC: llvm-link{{.*}} "--only-needed" +// SYCL_DEVICE_LIB_LINK_LIBC-SAME: "{{.*}}lib{{[/\\]}}spirv64-unknown-unknown{{[/\\]}}libc.bc" + +/// ########################################################################### + /// test behavior of disabling all device libraries // RUN: %clangxx -fsycl %s --no-offloadlib -ccc-install-dir %{clang_install_dir} -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_LINK_NO_DEVICE_LIB // SYCL_DEVICE_LIB_LINK_NO_DEVICE_LIB: {{.*}}clang{{.*}} "-cc1" "-triple" "spir64-unknown-unknown" // SYCL_DEVICE_LIB_LINK_NO_DEVICE_LIB-NOT: libsycl-cmath.bc +// SYCL_DEVICE_LIB_LINK_NO_DEVICE_LIB-NOT: libc.bc /// ########################################################################### @@ -41,7 +52,7 @@ // SYCL_LLVM_LINK_DEVICE_LIB-SAME: "{{.*}}libsycl-crt.bc" // SYCL_LLVM_LINK_DEVICE_LIB-SAME: "{{.*}}libsycl-cmath.bc" // SYCL_LLVM_LINK_DEVICE_LIB-SAME: "{{.*}}libsycl-imf.bc" -// SYCL_LLVM_LINK_DEVICE_LIB-SAME: "{{.*}}libc.bc" +// SYCL_LLVM_LINK_DEVICE_LIB-SAME: "{{.*}}lib{{[/\\]}}spirv64-unknown-unknown{{[/\\]}}libc.bc" // SYCL_LLVM_LINK_DEVICE_LIB-SAME: "{{.*}}libclang_rt.builtins.bc" /// ########################################################################### diff --git a/clang/test/Driver/sycl-device-lib.cpp b/clang/test/Driver/sycl-device-lib.cpp index 3e17402a22e4f..e4205754ec45a 100644 --- a/clang/test/Driver/sycl-device-lib.cpp +++ b/clang/test/Driver/sycl-device-lib.cpp @@ -13,16 +13,30 @@ // SYCL_DEVICE_LIB_LINK_DEFAULT: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}/lib/dpcpp-{{[0-9]+}}/sycl/libsycl-crt.bc" // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}/lib/dpcpp-{{[0-9]+}}/sycl/libsycl-cmath.bc // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}/lib/dpcpp-{{[0-9]+}}/sycl/libsycl-imf.bc -// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}/lib/{{.*}}/libc.bc +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}/lib/spirv64-unknown-unknown/libc.bc // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: "-mlink-builtin-bitcode-postopt" /// ########################################################################### +/// test behavior of libc.bc linking for spir64_gen and spir64_x86_64 targets. +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc --offload-new-driver %s -ccc-install-dir %{clang_install_dir} -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_LINK_LIBC_GEN +// SYCL_DEVICE_LIB_LINK_LIBC_GEN: clang{{.*}} "-triple" "spir64_gen-unknown-unknown" +// SYCL_DEVICE_LIB_LINK_LIBC_GEN-SAME: "-mlink-builtin-bitcode" "{{.*}}/lib/spirv64-unknown-unknown/libc.bc" + +// RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64 --offload-new-driver %s -ccc-install-dir %{clang_install_dir} -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_LINK_LIBC_CPU +// SYCL_DEVICE_LIB_LINK_LIBC_CPU: clang{{.*}} "-triple" "spir64_x86_64-unknown-unknown" +// SYCL_DEVICE_LIB_LINK_LIBC_CPU-SAME: "-mlink-builtin-bitcode" "{{.*}}/lib/spirv64-unknown-unknown/libc.bc" + +/// ########################################################################### + /// test behavior of disabling all device libraries // RUN: %clangxx -fsycl --offload-new-driver %s --no-offloadlib -ccc-install-dir %{clang_install_dir} -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_LINK_NO_DEVICE_LIB // SYCL_DEVICE_LIB_LINK_NO_DEVICE_LIB: {{.*}}clang{{.*}} "-cc1" "-triple" "spir64-unknown-unknown" // SYCL_DEVICE_LIB_LINK_NO_DEVICE_LIB-NOT: libsycl-cmath.bc +// SYCL_DEVICE_LIB_LINK_NO_DEVICE_LIB-NOT: libc.bc /// ########################################################################### @@ -41,7 +55,7 @@ // SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-cmath.bc // SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-imf.bc // SYCL_DEVICE_LIB_ASAN-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan.bc" -// SYCL_DEVICE_LIB_ASAN-SAME: "-mlink-builtin-bitcode" "{{.*}}libc.bc" +// SYCL_DEVICE_LIB_ASAN-SAME: "-mlink-builtin-bitcode" "{{.*}}/lib/spirv64-unknown-unknown/libc.bc" // RUN: %clangxx -fsycl --offload-new-driver %s -ccc-install-dir %{clang_install_dir} -Xarch_device "-fsanitize=address -DUSE_SYCL_DEVICE_ASAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_ASAN_MACRO @@ -58,7 +72,7 @@ // SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-cmath.bc // SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-imf.bc // SYCL_DEVICE_LIB_ASAN_PVC-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan-pvc.bc" -// SYCL_DEVICE_LIB_ASAN_PVC-SAME: "-mlink-builtin-bitcode" "{{.*}}libc.bc" +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: "-mlink-builtin-bitcode" "{{.*}}/lib/spirv64-unknown-unknown/libc.bc" /// ########################################################################### /// test behavior of linking libsycl-asan-cpu for CPU target AOT compilation when asan flag is applied. @@ -68,7 +82,7 @@ // SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-cmath.bc // SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-imf.bc // SYCL_DEVICE_LIB_ASAN_CPU-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan-cpu.bc" -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: "-mlink-builtin-bitcode" "{{.*}}libc.bc" +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: "-mlink-builtin-bitcode" "{{.*}}/lib/spirv64-unknown-unknown/libc.bc" /// ########################################################################### /// Test link behavior for multiple targets. Currently, we default to the @@ -81,12 +95,12 @@ // SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: {{.*}}libsycl-cmath.bc // SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: {{.*}}libsycl-imf.bc // SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan.bc" -// SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: "-mlink-builtin-bitcode" "{{.*}}libc.bc" +// SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: "-mlink-builtin-bitcode" "{{.*}}/lib/spirv64-unknown-unknown/libc.bc" // SYCL_DEVICE_LIB_ASAN_CPU_GPU: clang{{.*}} "-triple" "spir64_x86_64-unknown-unknown"{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-crt.bc" // SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: {{.*}}libsycl-cmath.bc // SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: {{.*}}libsycl-imf.bc // SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan.bc" -// SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: "-mlink-builtin-bitcode" "{{.*}}libc.bc" +// SYCL_DEVICE_LIB_ASAN_CPU_GPU-SAME: "-mlink-builtin-bitcode" "{{.*}}/lib/spirv64-unknown-unknown/libc.bc" /// ########################################################################### /// test behavior of linking libsycl-asan-dg2 for DG2 target AOT compilation when asan flag is applied. @@ -102,7 +116,7 @@ // SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-cmath.bc // SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-imf.bc // SYCL_DEVICE_LIB_ASAN_DG2-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan-dg2.bc" -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: "-mlink-builtin-bitcode" "{{.*}}libc.bc" +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: "-mlink-builtin-bitcode" "{{.*}}/lib/spirv64-unknown-unknown/libc.bc" /// ########################################################################### /// test behavior of linking libsycl-asan for multiple targets AOT compilation @@ -114,7 +128,7 @@ // SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-cmath.bc // SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-imf.bc // SYCL_DEVICE_LIB_ASAN_MUL-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan.bc" -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: "-mlink-builtin-bitcode" "{{.*}}libc.bc" +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: "-mlink-builtin-bitcode" "{{.*}}/lib/spirv64-unknown-unknown/libc.bc" /// ########################################################################### /// test behavior of libsycl-msan.o linking when -fsanitize=memory is available @@ -132,7 +146,7 @@ // SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-cmath.bc // SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-imf.bc // SYCL_DEVICE_LIB_MSAN-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-msan.bc" -// SYCL_DEVICE_LIB_MSAN-SAME: "-mlink-builtin-bitcode" "{{.*}}libc.bc" +// SYCL_DEVICE_LIB_MSAN-SAME: "-mlink-builtin-bitcode" "{{.*}}/lib/spirv64-unknown-unknown/libc.bc" // RUN: %clangxx -fsycl --offload-new-driver %s -ccc-install-dir %{clang_install_dir} -Xarch_device "-fsanitize=memory -DUSE_SYCL_DEVICE_MSAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_MSAN_MACRO diff --git a/clang/test/Driver/sycl-no-rdc-win.cpp b/clang/test/Driver/sycl-no-rdc-win.cpp index 6672722e4846a..233c0ca2157a3 100644 --- a/clang/test/Driver/sycl-no-rdc-win.cpp +++ b/clang/test/Driver/sycl-no-rdc-win.cpp @@ -20,9 +20,9 @@ // CHECK: 12: preprocessor, {11}, c++-cpp-output, (device-sycl) // CHECK: 13: compiler, {12}, ir, (device-sycl) // CHECK: 14: offload, "host-sycl (x86_64-pc-windows-msvc)" {10}, "device-sycl (spir64-unknown-unknown)" {13}, c++-cpp-output -// CHECK: 18: input, "{{.*}}libsycl-crt{{.*}}", ir, (device-sycl) -// CHECK: 25: input, "{{.*}}libc{{.*}}", ir, (device-sycl) -// CHECK: 26: input, "{{.*}}libclang_rt.builtins{{.*}}", ir, (device-sycl) +// CHECK: 18: input, "{{.*}}libsycl-crt.bc", ir, (device-sycl) +// CHECK: 25: input, "{{.*}}lib{{[/\\]}}spirv64-unknown-unknown{{[/\\]}}libc.bc", ir, (device-sycl) +// CHECK: 26: input, "{{.*}}libclang_rt.builtins.bc", ir, (device-sycl) // CHECK: 27: linker, {18, {{.*}}, 26}, ir, (device-sycl) // CHECK: 28: linker, {4, 27}, ir, (device-sycl) // CHECK: 29: sycl-post-link, {28}, tempfiletable, (device-sycl) From a6fade491158658687145d566452f1977415435b Mon Sep 17 00:00:00 2001 From: jinge90 Date: Tue, 3 Nov 2026 21:59:16 -0800 Subject: [PATCH 09/13] fix kernelcompiler failure Signed-off-by: jinge90 --- sycl-jit/jit-compiler/lib/rtc/DeviceCompilation.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sycl-jit/jit-compiler/lib/rtc/DeviceCompilation.cpp b/sycl-jit/jit-compiler/lib/rtc/DeviceCompilation.cpp index a7ef53ba3ac56..1dd101977798f 100644 --- a/sycl-jit/jit-compiler/lib/rtc/DeviceCompilation.cpp +++ b/sycl-jit/jit-compiler/lib/rtc/DeviceCompilation.cpp @@ -642,7 +642,7 @@ class SYCLToolchain { jit_compiler::resource::ToolchainPrefix.Size}; std::string ClangXXExe = (Prefix + "/bin/clang++").str(); std::string LibclcDir = GetResourcesPath(ClangXXExe) + "/lib/"; - std::string LibDir = CLANG_INSTALL_LIBDIR_BASENAME; + std::string LibDir = (Prefix + "/").str() + CLANG_INSTALL_LIBDIR_BASENAME; PrecompiledPreambles Preambles; }; @@ -869,7 +869,7 @@ Error jit_compiler::linkDeviceLibraries(llvm::Module &Module, if (LibName.find("libspirv") != std::string::npos) LibPath = (TC.getLibclcDir() + TripleName + "/" + LibName).str(); else if (LibName == "libc.bc") - LibPath = (TC.getLibDir() + TripleName + "/" + LibName).str(); + LibPath = (TC.getLibDir() + "/" + TripleName + "/" + LibName).str(); else if (LibName == "libclang_rt.builtins.bc") LibPath = (TC.getPrefix() + getCompilerRTSuffix() + TripleName + "/" + LibName) From 5dea3eabadc9d482f4b7aa5f57d43395439b0ea1 Mon Sep 17 00:00:00 2001 From: jinge90 Date: Tue, 3 Nov 2026 22:28:53 -0800 Subject: [PATCH 10/13] report error when libc and compiler are not enabled for spirv64 Signed-off-by: jinge90 --- sycl/CMakeLists.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sycl/CMakeLists.txt b/sycl/CMakeLists.txt index 3186d3600c489..950e861f887f9 100644 --- a/sycl/CMakeLists.txt +++ b/sycl/CMakeLists.txt @@ -589,6 +589,18 @@ get_targets_building_llvm_runtime(libclc libclc_targets) get_targets_building_llvm_runtime(compiler-rt compiler-rt_targets) get_targets_building_llvm_runtime(libc libc_targets) +# Ensure that libc and compiler-rt are enabled for the spirv64 target, the SYCL +# driver links libc.bc and libclang_rt.builtins.bc for spirv64 device code. +foreach(runtime IN ITEMS libc compiler-rt) + if(NOT ("spirv64-unknown-unknown" IN_LIST ${runtime}_targets)) + message(FATAL_ERROR + "SYCL toolchain requires building \"${runtime}\" for the spirv64 target. " + "Add \"spirv64-unknown-unknown\" to the CMake argument " + "\"LLVM_RUNTIME_TARGETS\" and \"${runtime}\" to the CMake argument " + "\"RUNTIMES_spirv64-unknown-unknown_LLVM_ENABLE_RUNTIMES\"") + endif() +endforeach() + foreach(target IN LISTS libclc_targets) add_dependencies(sycl-toolchain libclc-${target}) # libspirv is built in a sub invocation of cmake (called the runtimes build) for each target From 4ad14b3488a2fbb73b00f7550c59a8b4ba6ddaed Mon Sep 17 00:00:00 2001 From: jinge90 Date: Wed, 4 Nov 2026 14:58:59 +0800 Subject: [PATCH 11/13] add TODO to remind to enable libc/compiler-rt for other targets Signed-off-by: jinge90 --- sycl/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/sycl/CMakeLists.txt b/sycl/CMakeLists.txt index 950e861f887f9..2c7a3ae6580c5 100644 --- a/sycl/CMakeLists.txt +++ b/sycl/CMakeLists.txt @@ -614,6 +614,7 @@ foreach(target IN LISTS libclc_targets) endforeach() # Currently, we only enable compiler-rt builtin library and libc for spirv64 targets. +# TODO: enable libc and compiler-rt builtins for other targets including nvptx64. foreach(target IN LISTS libc_targets) add_dependencies(sycl-toolchain runtimes-${target}) list(APPEND SYCL_TOOLCHAIN_DEPLOY_COMPONENTS runtimes-${target}::libc) From b7f5f3e4b377e1cc9db9b8053c3d08e5f959f096 Mon Sep 17 00:00:00 2001 From: jinge90 Date: Tue, 3 Nov 2026 23:34:07 -0800 Subject: [PATCH 12/13] Use spirv64-unknown-unknown triple in getStdlibPath Signed-off-by: jinge90 --- clang/lib/Driver/ToolChain.cpp | 5 +---- clang/test/Driver/sycl-device-lib.cpp | 8 ++++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 288dae208855e..19ed5cbbd9b68 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -1210,10 +1210,7 @@ ToolChain::getTargetSubDirPath(StringRef BaseDir) const { return *Path; if (T.isSPIROrSPIRV() && T.isArch64Bit()) { - llvm::Triple Canon(T); - Canon.setArchName("spirv64"); - Canon = llvm::Triple(Canon.normalize()); - if (auto Path = getPathForTriple(Canon)) + if (auto Path = getPathForTriple(llvm::Triple("spirv64-unknown-unknown"))) return *Path; } diff --git a/clang/test/Driver/sycl-device-lib.cpp b/clang/test/Driver/sycl-device-lib.cpp index e4205754ec45a..0ffb2e2a53646 100644 --- a/clang/test/Driver/sycl-device-lib.cpp +++ b/clang/test/Driver/sycl-device-lib.cpp @@ -29,6 +29,14 @@ // SYCL_DEVICE_LIB_LINK_LIBC_CPU: clang{{.*}} "-triple" "spir64_x86_64-unknown-unknown" // SYCL_DEVICE_LIB_LINK_LIBC_CPU-SAME: "-mlink-builtin-bitcode" "{{.*}}/lib/spirv64-unknown-unknown/libc.bc" +/// test that a spir64 triple with a non-unknown OS still links libc.bc from +/// the spirv64-unknown-unknown directory. +// RUN: %clangxx -fsycl -fsycl-targets=spir64-unknown-linux --offload-new-driver %s -ccc-install-dir %{clang_install_dir} -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_LINK_LIBC_LINUX +// SYCL_DEVICE_LIB_LINK_LIBC_LINUX-NOT: error: +// SYCL_DEVICE_LIB_LINK_LIBC_LINUX: clang{{.*}} "-triple" "spir64-unknown-linux" +// SYCL_DEVICE_LIB_LINK_LIBC_LINUX-SAME: "-mlink-builtin-bitcode" "{{.*}}/lib/spirv64-unknown-unknown/libc.bc" + /// ########################################################################### /// test behavior of disabling all device libraries From 6cbdb476705170fbba79343cb942adbc3be55c98 Mon Sep 17 00:00:00 2001 From: jinge90 Date: Tue, 3 Nov 2026 23:42:15 -0800 Subject: [PATCH 13/13] Add TODO for getStdlibPath Signed-off-by: jinge90 --- clang/lib/Driver/ToolChain.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 19ed5cbbd9b68..93bf96c3d6cf7 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -1210,6 +1210,10 @@ ToolChain::getTargetSubDirPath(StringRef BaseDir) const { return *Path; if (T.isSPIROrSPIRV() && T.isArch64Bit()) { + // SYCL compiles device code for spir64 triples (spir64, spir64_gen, + // spir64_x86_64, ...), but libc is built for spirv64-unknown-unknown + // only, so fall back to that directory. + // TODO: Remove this when SYCL device compilation uses spirv64 triples. if (auto Path = getPathForTriple(llvm::Triple("spirv64-unknown-unknown"))) return *Path; }