diff --git a/buildbot/configure.py b/buildbot/configure.py index 746d2c8aef52e..4f6c71d27523a 100644 --- a/buildbot/configure.py +++ b/buildbot/configure.py @@ -210,7 +210,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 4f6215966a059..4d17c33298bca 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..e1b3b98b554b4 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -1209,6 +1209,15 @@ ToolChain::getTargetSubDirPath(StringRef BaseDir) const { if (auto Path = getPathForTriple(T)) return *Path; + if (T.isSPIROrSPIRV() && T.isArch64Bit()) { + // SYCL compiles device code for 64-bit SPIR triples (spir64, spir64_gen, + // spir64_gen, spir64_x86_64), but libc is built for spirv64-unknown-unkwon + // only, so fall back to that directory. This also covers 64-bit SPIR-V. + // TODO: Remove this when SYCL device compilation uses spirv64 triples. + if (auto Path = getPathForTriple(llvm::Triple("spirv64-unknown-unknown"))) + 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 6a4415d58f6da..6c334b51b30b5 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -922,6 +922,17 @@ const char *SYCL::Linker::constructLLVMLinkCommand( return true; if (InputFilename.starts_with("libclang_rt.builtins")) return true; + 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); + return (!EC && IsSamePath); + } + return false; + } StringRef LibSyclPrefix("libsycl-"); if (!InputFilename.starts_with(LibSyclPrefix) || !InputFilename.ends_with(LibPostfix)) @@ -2103,6 +2114,25 @@ SYCLToolChain::getDeviceLibs( else getDriver().Diag(diag::err_drv_no_sycl_device_lib) << DeviceLib.Path; } + + 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; + if (std::optional StdlibPath = getStdlibPath()) { + SmallString<128> FullLibcName(*StdlibPath); + llvm::sys::path::append(FullLibcName, "libc.bc"); + if (getDriver().getVFS().exists(FullLibcName)) { + LinkDeviceLibc = true; + BCLibs.emplace_back(BitCodeLibraryInfo(FullLibcName, true)); + } + } + if (!LinkDeviceLibc) + getDriver().Diag(diag::err_drv_no_sycl_device_lib) << "libc.bc"; + } + return BCLibs; } 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-win.cpp b/clang/test/Driver/sycl-device-lib-win.cpp index fc05b0cbbdd4c..2296a5b9f5246 100644 --- a/clang/test/Driver/sycl-device-lib-win.cpp +++ b/clang/test/Driver/sycl-device-lib-win.cpp @@ -18,15 +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: "{{.*}}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 /// ########################################################################### @@ -40,6 +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: "{{.*}}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 ac3b79045ea9a..efe5c287d2c93 100644 --- a/clang/test/Driver/sycl-device-lib.cpp +++ b/clang/test/Driver/sycl-device-lib.cpp @@ -13,15 +13,46 @@ // 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/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 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 that a spirv64 triple with a non-unknown vendor still links libc.bc +/// from the spirv64-unknown-unknown directory. +// RUN: %clangxx -fsycl -fsycl-targets=spirv64-intel-unknown --offload-new-driver %s -ccc-install-dir %{clang_install_dir} -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_LINK_LIBC_SPIRV_INTEL +// SYCL_DEVICE_LIB_LINK_LIBC_SPIRV_INTEL-NOT: error: +// SYCL_DEVICE_LIB_LINK_LIBC_SPIRV_INTEL: clang{{.*}} "-triple" "spirv64-intel-unknown" +// SYCL_DEVICE_LIB_LINK_LIBC_SPIRV_INTEL-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 /// ########################################################################### @@ -40,6 +71,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" "{{.*}}/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 @@ -56,6 +88,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" "{{.*}}/lib/spirv64-unknown-unknown/libc.bc" /// ########################################################################### /// test behavior of linking libsycl-asan-cpu for CPU target AOT compilation when asan flag is applied. @@ -65,6 +98,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" "{{.*}}/lib/spirv64-unknown-unknown/libc.bc" /// ########################################################################### /// Test link behavior for multiple targets. Currently, we default to the @@ -77,10 +111,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" "{{.*}}/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" "{{.*}}/lib/spirv64-unknown-unknown/libc.bc" /// ########################################################################### /// test behavior of linking libsycl-asan-dg2 for DG2 target AOT compilation when asan flag is applied. @@ -96,6 +132,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" "{{.*}}/lib/spirv64-unknown-unknown/libc.bc" /// ########################################################################### /// test behavior of linking libsycl-asan for multiple targets AOT compilation @@ -107,6 +144,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" "{{.*}}/lib/spirv64-unknown-unknown/libc.bc" /// ########################################################################### /// test behavior of libsycl-msan.o linking when -fsanitize=memory is available @@ -124,6 +162,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" "{{.*}}/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-fat-archive-old-model.cpp b/clang/test/Driver/sycl-no-rdc-fat-archive-old-model.cpp index 321dacec1e2c9..c8ae88b0bb9b7 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 @@ -26,19 +26,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 762c4d7b53008..ba1f7f934fbf8 100644 --- a/clang/test/Driver/sycl-no-rdc-fat-archive-win.cpp +++ b/clang/test/Driver/sycl-no-rdc-fat-archive-win.cpp @@ -30,20 +30,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) 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/clang/test/Driver/sycl-no-rdc-win.cpp b/clang/test/Driver/sycl-no-rdc-win.cpp index 085c9cc1b1e8a..233c0ca2157a3 100644 --- a/clang/test/Driver/sycl-no-rdc-win.cpp +++ b/clang/test/Driver/sycl-no-rdc-win.cpp @@ -20,24 +20,25 @@ // 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, "{{.*}}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: 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) +// 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{{.*}} diff --git a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake index 95f398e10855f..101d097aa65c7 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..f1dcca4101083 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 "runtimes-${tgt}::libc") +endforeach() + foreach(tgt IN LISTS compiler-rt_targets) list(APPEND SYCL_JIT_RESOURCE_INSTALL_COMPONENTS builtins-${tgt}) endforeach() @@ -69,8 +74,13 @@ foreach(component IN LISTS SYCL_JIT_RESOURCE_INSTALL_COMPONENTS) set(tgt "${CMAKE_MATCH_1}") set(component "${CMAKE_MATCH_2}") 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") + if("${component}" STREQUAL "libc") + sycl_jit_add_install_command("libc" "${CMAKE_BINARY_DIR}/runtimes/runtimes-${tgt}-bins/" + "${CMAKE_BINARY_DIR}/runtimes/runtimes-${tgt}-stamps") + else() + sycl_jit_add_install_command("${component}" "${CMAKE_BINARY_DIR}/runtimes/runtimes-${tgt}-bins/libclc" + "${CMAKE_BINARY_DIR}/runtimes/runtimes-${tgt}-stamps") + endif() 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..1dd101977798f 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 getLibDir() const { return LibDir; } 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 LibDir = (Prefix + "/").str() + CLANG_INSTALL_LIBDIR_BASENAME; 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.getLibDir() + "/" + 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 c097bb68d9ee2..add7a2561252f 100644 --- a/sycl/CMakeLists.txt +++ b/sycl/CMakeLists.txt @@ -587,6 +587,22 @@ 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) + +# 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. +# libc and compiler-rt for spirv64 are not enabled for Mac. +if(NOT APPLE) + 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() +endif() foreach(target IN LISTS libclc_targets) add_dependencies(sycl-toolchain libclc-${target}) @@ -600,7 +616,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. +# 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) +endforeach() + foreach(target IN LISTS compiler-rt_targets) add_dependencies(sycl-toolchain builtins-${target}) list(APPEND SYCL_TOOLCHAIN_DEPLOY_COMPONENTS builtins-${target}) @@ -673,8 +695,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}") + 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() else() set(INSTALL_SCRIPT "${CMAKE_BINARY_DIR}/cmake_install.cmake") set(COMPONENT_DEPS "")