From 593e7a4277d721f8ff31453befbf642ef2821189 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Fri, 20 Feb 2026 07:25:15 -0800 Subject: [PATCH 01/19] [Driver][SYCL][NewOffloadModel] Pull in device libraries at device compile time Pull in the device libraries during compile time when using the new offload model. This is done by using the `-mlink-builtin-bitcode` option, passing in each individual device library as needed. This frees up the responsibility of linking in the device libraries during link time, and requiring the driver to pass any libraries needed to the clang-linker-wrapper or having the clang-linker-wrapper figure out what device libraries are needed at link. --- clang/lib/Driver/Driver.cpp | 57 ++-- clang/lib/Driver/ToolChains/Clang.cpp | 19 +- clang/lib/Driver/ToolChains/SYCL.cpp | 99 +++--- clang/lib/Driver/ToolChains/SYCL.h | 15 +- clang/test/Driver/sycl-device-lib.cpp | 302 +++++++++--------- clang/test/Driver/sycl-instrumentation.cpp | 10 +- clang/test/Driver/sycl-offload-new-driver.cpp | 6 - 7 files changed, 247 insertions(+), 261 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index c3184dbfe25f6..4b6269783ed19 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -5527,8 +5527,7 @@ class OffloadingActionBuilder final { bool SYCLDeviceLibLinked = false; Action *NativeCPULib = nullptr; if (IsSPIR || IsNVPTX || IsAMDGCN || IsNativeCPU) { - SYCLDeviceLibLinked = addSYCLDeviceLibs( - TC, SYCLDeviceLibs, IsSpirvAOT, + SYCLDeviceLibLinked = addSYCLDeviceLibs(TC, SYCLDeviceLibs, C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment(), IsNativeCPU, NativeCPULib, BoundArch); } @@ -5756,46 +5755,36 @@ class OffloadingActionBuilder final { } bool addSYCLDeviceLibs(const ToolChain *TC, ActionList &DeviceLinkObjects, - bool isSpirvAOT, bool isMSVCEnv, bool isNativeCPU, + bool isMSVCEnv, bool isNativeCPU, Action *&NativeCPULib, const char *BoundArch) { - int NumOfDeviceLibLinked = 0; - SmallVector, 4> LibLocCandidates; - SYCLInstallation.getSYCLDeviceLibPath(LibLocCandidates); SmallVector DeviceLibraries; - DeviceLibraries = - tools::SYCL::getDeviceLibraries(C, TC->getTriple(), isSpirvAOT); + const toolchains::SYCLToolChain &SYCLTC = + static_cast(*TC); + DeviceLibraries = SYCLTC.getDeviceLibNames( + TC->getDriver(), C.getArgs(), TC->getTriple()); for (const auto &DeviceLib : DeviceLibraries) { - for (const auto &LLCandidate : LibLocCandidates) { - SmallString<128> LibName(LLCandidate); - llvm::sys::path::append(LibName, DeviceLib); - if (llvm::sys::fs::exists(LibName)) { - ++NumOfDeviceLibLinked; - Arg *InputArg = MakeInputArg(Args, C.getDriver().getOpts(), - Args.MakeArgString(LibName)); - // We are using the LLVM-IR device libraries directly, no need - // to unbundle any objects. - auto *SYCLDeviceLibsInputAction = - C.MakeAction(*InputArg, types::TY_LLVM_BC); - DeviceLinkObjects.push_back(SYCLDeviceLibsInputAction); - - // The device link stage may remove symbols not referenced in the - // source code. Since libsycl-nativecpu_utils contains such symbols - // which are later needed by the NativeCPU backend passes we link - // that library separately afterwards without --only-needed. - if (isNativeCPU) { - assert(!NativeCPULib); - NativeCPULib = DeviceLinkObjects.back(); - DeviceLinkObjects.pop_back(); - } - - break; - } + Arg *InputArg = MakeInputArg(Args, C.getDriver().getOpts(), + Args.MakeArgString(DeviceLib)); + // We are using the LLVM-IR device libraries directly, no need + // to unbundle any objects. + auto *SYCLDeviceLibsInputAction = + C.MakeAction(*InputArg, types::TY_LLVM_BC); + DeviceLinkObjects.push_back(SYCLDeviceLibsInputAction); + + // The device link stage may remove symbols not referenced in the + // source code. Since libsycl-nativecpu_utils contains such symbols + // which are later needed by the NativeCPU backend passes we link + // that library separately afterwards without --only-needed. + if (isNativeCPU) { + assert(!NativeCPULib); + NativeCPULib = DeviceLinkObjects.back(); + DeviceLinkObjects.pop_back(); } } - if (!NumOfDeviceLibLinked && !TC->getTriple().isNVPTX()) + if (DeviceLibraries.empty() && !TC->getTriple().isNVPTX()) return false; // For NVPTX we need to also link libclc at the same stage that we link diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index bc05d4ea10322..f3d09ba9d10ca 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -11474,7 +11474,6 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, // one bitcode library to link in for a specific triple. Additionally, the // path is *not* relative to the -sycl-device-library-location - the full // path must be provided. - SmallString<256> LibList; SmallVector BCLibList; auto appendToList = [](SmallString<256> &List, const Twine &Arg) { @@ -11487,9 +11486,14 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, for (const auto &[Kind, TC] : llvm::make_range(ToolChainRange.first, ToolChainRange.second)) { llvm::Triple TargetTriple = TC->getTriple(); - bool IsSpirAOT = TargetTriple.isSPIRAOT(); + // SPIR or SPIR-V device libraries are compiled into the device compile + // step. + if (TargetTriple.isSPIROrSPIRV()) + continue; + const toolchains::SYCLToolChain &SYCLTC = + static_cast(*TC); SmallVector SYCLDeviceLibs = - SYCL::getDeviceLibraries(C, TargetTriple, IsSpirAOT); + SYCLTC.getDeviceLibNames(D, Args, TargetTriple); for (const auto &AddLib : SYCLDeviceLibs) { if (llvm::sys::path::extension(AddLib) == ".bc") { SmallString<256> LibPath(DeviceLibDir); @@ -11498,8 +11502,6 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, (Twine(TC->getTriple().str()) + "=" + LibPath).str()); continue; } - - appendToList(LibList, AddLib); } if (TC->getTriple().isNVPTX()) @@ -11509,18 +11511,11 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, (Twine(TC->getTriple().str()) + "=" + LibSpirvFile).str()); } - if (LibList.size()) - CmdArgs.push_back( - Args.MakeArgString(Twine("-sycl-device-libraries=") + LibList)); - if (BCLibList.size()) for (const std::string &Lib : BCLibList) CmdArgs.push_back( Args.MakeArgString(Twine("--bitcode-library=") + Lib)); - CmdArgs.push_back(Args.MakeArgString( - Twine("-sycl-device-library-location=") + DeviceLibDir)); - if (C.getDriver().isSaveOffloadCodeEnabled()) { SmallString<128> DumpDir; Arg *A = C.getArgs().getLastArg(options::OPT_save_offload_code_EQ); diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 6089add6507eb..7d990dc22a9bd 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -229,15 +229,13 @@ bool SYCL::shouldDoPerObjectFileLinking(const Compilation &C) { } // Return whether to use native bfloat16 library. -static bool selectBfloatLibs(const llvm::Triple &Triple, const Compilation &C, - bool &UseNative) { - +static bool selectBfloatLibs(const llvm::opt::ArgList &Args, + const llvm::Triple &Triple, const ToolChain &TC, bool &UseNative) { static llvm::SmallSet GPUArchsWithNBF16{ "intel_gpu_pvc", "intel_gpu_acm_g10", "intel_gpu_acm_g11", "intel_gpu_acm_g12", "intel_gpu_dg2_g10", "intel_gpu_dg2_g11", "intel_dg2_g12", "intel_gpu_bmg_g21", "intel_gpu_lnl_m", "intel_gpu_ptl_h", "intel_gpu_ptl_u", "intel_gpu_wcl"}; - const llvm::opt::ArgList &Args = C.getArgs(); bool NeedLibs = false; // spir64 target is actually JIT compilation, so we defer selection of @@ -246,21 +244,11 @@ static bool selectBfloatLibs(const llvm::Triple &Triple, const Compilation &C, NeedLibs = Triple.getSubArch() != llvm::Triple::NoSubArch && !Triple.isNVPTX() && !Triple.isAMDGCN(); UseNative = false; - if (NeedLibs && Triple.getSubArch() == llvm::Triple::SPIRSubArch_gen && - C.hasOffloadToolChain()) { + if (NeedLibs && Triple.getSubArch() == llvm::Triple::SPIRSubArch_gen) { ArgStringList TargArgs; - auto ToolChains = C.getOffloadToolChains(); - // Match up the toolchain with the incoming Triple so we are grabbing the - // expected arguments to scrutinize. - for (auto TI = ToolChains.first, TE = ToolChains.second; TI != TE; ++TI) { - llvm::Triple SYCLTriple = TI->second->getTriple(); - if (SYCLTriple == Triple) { - const toolchains::SYCLToolChain *SYCLTC = - static_cast(TI->second); - SYCLTC->TranslateBackendTargetArgs(Triple, Args, TargArgs); - break; - } - } + const toolchains::SYCLToolChain &SYCLTC = + static_cast(TC); + SYCLTC.TranslateBackendTargetArgs(Triple, Args, TargArgs); // We need to select fallback/native bfloat16 devicelib in AOT compilation // targetting for Intel GPU devices. Users have 2 ways to apply AOT, @@ -416,13 +404,11 @@ static bool checkPVCDevice(std::string SingleArg, std::string &DevArg) { #if !defined(_WIN32) static void -addSYCLDeviceSanitizerLibs(const Compilation &C, bool IsSpirvAOT, - StringRef LibSuffix, +addSYCLDeviceSanitizerLibs(const llvm::opt::ArgList &Args, SmallVector &LibraryList) { - const llvm::opt::ArgList &Args = C.getArgs(); enum { JIT = 0, AOT_CPU, AOT_DG2, AOT_PVC }; auto addSingleLibrary = [&](StringRef DeviceLibName) { - LibraryList.push_back(Args.MakeArgString(Twine(DeviceLibName) + LibSuffix)); + LibraryList.push_back(Args.MakeArgString(Twine(DeviceLibName) + ".bc")); }; // This function is used to check whether there is only one GPU device @@ -445,9 +431,6 @@ addSYCLDeviceSanitizerLibs(const Compilation &C, bool IsSpirvAOT, }; auto getSingleBuildTarget = [&]() -> size_t { - if (!IsSpirvAOT) - return JIT; - llvm::opt::Arg *SYCLTarget = Args.getLastArg(options::OPT_offload_targets_EQ); if (!SYCLTarget || (SYCLTarget->getValues().size() != 1)) @@ -548,12 +531,11 @@ addSYCLDeviceSanitizerLibs(const Compilation &C, bool IsSpirvAOT, } #endif -// Get the list of SYCL device libraries to link with user's device image. +// Get the list of SYCL device library names to link with user's device image. SmallVector -SYCL::getDeviceLibraries(const Compilation &C, const llvm::Triple &TargetTriple, - bool IsSpirvAOT) { +SYCLToolChain::getDeviceLibNames(const Driver &D, + const llvm::opt::ArgList &Args, const llvm::Triple &TargetTriple) const { SmallVector LibraryList; - const llvm::opt::ArgList &Args = C.getArgs(); bool NoOffloadLib = !Args.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib, true); if (TargetTriple.isNVPTX()) { @@ -597,17 +579,9 @@ SYCL::getDeviceLibraries(const Compilation &C, const llvm::Triple &TargetTriple, "libsycl-fallback-imf", "libsycl-fallback-imf-fp64", "libsycl-fallback-imf-bf16"}; - bool IsWindowsMSVCEnv = - C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment(); - bool IsNewOffload = C.getDriver().getUseNewOffloadingDriver(); - StringRef LibSuffix = ".bc"; - if (IsNewOffload) - // For new offload model, we use packaged .bc files. - LibSuffix = IsWindowsMSVCEnv ? ".new.obj" : ".new.o"; auto addLibraries = [&](const SYCLDeviceLibsList &LibsList) { - for (const StringRef &Lib : LibsList) { - LibraryList.push_back(Args.MakeArgString(Twine(Lib) + LibSuffix)); - } + for (const StringRef &Lib : LibsList) + LibraryList.push_back(Args.MakeArgString(Twine(Lib) + ".bc")); }; if (!NoOffloadLib) @@ -627,7 +601,9 @@ SYCL::getDeviceLibraries(const Compilation &C, const llvm::Triple &TargetTriple, const SYCLDeviceLibsList SYCLDeviceBfloat16NativeLib = { "libsycl-native-bfloat16"}; bool NativeBfloatLibs; - bool NeedBfloatLibs = selectBfloatLibs(TargetTriple, C, NativeBfloatLibs); + bool NeedBfloatLibs = selectBfloatLibs(Args, TargetTriple, + *this, + NativeBfloatLibs); if (NeedBfloatLibs && !NoOffloadLib) { // Add native or fallback bfloat16 library. if (NativeBfloatLibs) @@ -640,7 +616,7 @@ SYCL::getDeviceLibraries(const Compilation &C, const llvm::Triple &TargetTriple, // Linux platform only, so compiler only provides device sanitizer libraries // on Linux platform. #if !defined(_WIN32) - addSYCLDeviceSanitizerLibs(C, IsSpirvAOT, LibSuffix, LibraryList); + addSYCLDeviceSanitizerLibs(Args, LibraryList); #endif return LibraryList; @@ -1456,6 +1432,19 @@ void SYCLToolChain::addClangTargetOptions( SYCLInstallation.addLibspirvLinkArgs(getEffectiveTriple(), DriverArgs, HostTC.getTriple(), CC1Args); } + // mtoguchi + // Add device libraries. + // This is currently only done with the new offloading model, to better fit + // with community expectations + if (!getDriver().getUseNewOffloadingDriver()) + return; + + llvm::SmallVector BCLibs; + BCLibs.append(SYCLToolChain::getDeviceLibs(DriverArgs, DeviceOffloadingKind)); + for (auto BCFile : BCLibs) { + CC1Args.push_back("-mlink-builtin-bitcode"); + CC1Args.push_back(DriverArgs.MakeArgString(BCFile.Path)); + } } llvm::opt::DerivedArgList * @@ -1892,6 +1881,34 @@ void SYCLToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &Args, HostTC.AddClangCXXStdlibIncludeArgs(Args, CC1Args); } +llvm::SmallVector +SYCLToolChain::getDeviceLibs( + const llvm::opt::ArgList &DriverArgs, + const Action::OffloadKind DeviceOffloadingKind) const { + llvm::SmallVector BCLibs; + + SmallVector, 4> LibraryPaths; + SYCLInstallation.getSYCLDeviceLibPath(LibraryPaths); + + // Formulate all of the device libraries needed for this compilation. + SmallVector DeviceLibs = + getDeviceLibNames(getDriver(), DriverArgs, getTriple()); + + // Create full path names to each device library. If found, add to the list + // of device libraries that will be linked against. + for (auto DeviceLib : DeviceLibs) { + for (auto LibraryPath : LibraryPaths) { + SmallString<1208> FullLibName(LibraryPath); + llvm::sys::path::append(FullLibName, DeviceLib); + if (llvm::sys::fs::exists(FullLibName)) { + BCLibs.emplace_back(FullLibName); + break; + } + } + } + return BCLibs; +} + SanitizerMask SYCLToolChain::getSupportedSanitizers() const { return SanitizerKind::Address | SanitizerKind::Memory | SanitizerKind::Thread; } diff --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h index c1403ae1d5036..c3f111b42fec9 100644 --- a/clang/lib/Driver/ToolChains/SYCL.h +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -33,12 +33,6 @@ void constructLLVMForeachCommand(Compilation &C, const JobAction &JA, StringRef Increment, StringRef Ext = "out", StringRef ParallelJobs = ""); -// Provides a vector of device library names that are associated with the -// given triple and AOT information. -SmallVector getDeviceLibraries(const Compilation &C, - const llvm::Triple &TargetTriple, - bool IsSpirvAOT); - // Populates the SYCL device traits macros. void populateSYCLDeviceTraitsMacrosArgs( Compilation &C, const llvm::opt::ArgList &Args, @@ -160,6 +154,11 @@ class LLVM_LIBRARY_VISIBILITY SYCLToolChain : public ToolChain { llvm::opt::OptSpecifier Opt, llvm::opt::OptSpecifier Opt_EQ, StringRef Device) const; + // Provides a vector of device library names that are associated with the + // given triple and AOT information. + SmallVector + getDeviceLibNames(const Driver &D, const llvm::opt::ArgList &Args, + const llvm::Triple &TargetTriple) const; bool useIntegratedAs() const override { return true; } bool isPICDefault() const override { @@ -189,6 +188,10 @@ class LLVM_LIBRARY_VISIBILITY SYCLToolChain : public ToolChain { const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1Args) const override; + llvm::SmallVector + getDeviceLibs(const llvm::opt::ArgList &Args, + const Action::OffloadKind DeviceOffloadingKind) const override; + SanitizerMask getSupportedSanitizers() const override; protected: diff --git a/clang/test/Driver/sycl-device-lib.cpp b/clang/test/Driver/sycl-device-lib.cpp index 16c68be8b3889..ef86ac0c62040 100644 --- a/clang/test/Driver/sycl-device-lib.cpp +++ b/clang/test/Driver/sycl-device-lib.cpp @@ -9,22 +9,22 @@ /// test behavior of device library default link // RUN: %clangxx -fsycl --offload-new-driver %s --sysroot=%S/Inputs/SYCL -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_LINK_DEFAULT -// SYCL_DEVICE_LIB_LINK_DEFAULT: clang-linker-wrapper{{.*}} "-sycl-device-libraries=libsycl-crt.new.o -// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-complex.new.o -// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-complex-fp64.new.o -// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-cmath.new.o -// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-cmath-fp64.new.o -// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-imf.new.o -// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-imf-fp64.new.o -// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-imf-bf16.new.o -// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-cstring.new.o -// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-complex.new.o -// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-complex-fp64.new.o -// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-cmath.new.o -// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-cmath-fp64.new.o -// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-imf.new.o -// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-imf-fp64.new.o -// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-imf-bf16.new.o +// SYCL_DEVICE_LIB_LINK_DEFAULT: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-crt.bc" +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-complex.bc +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-complex-fp64.bc +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-cmath.bc +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-cmath-fp64.bc +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-imf.bc +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-imf-fp64.bc +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-imf-bf16.bc +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-cstring.bc +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-complex.bc +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-complex-fp64.bc +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-cmath.bc +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-cmath-fp64.bc +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-imf.bc +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-imf-fp64.bc +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-imf-bf16.bc /// ########################################################################### @@ -32,7 +32,7 @@ // RUN: %clangxx -fsycl --offload-new-driver %s --no-offloadlib --sysroot=%S/Inputs/SYCL -### 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.new.o +// SYCL_DEVICE_LIB_LINK_NO_DEVICE_LIB-NOT: libsycl-cmath.bc /// ########################################################################### @@ -47,30 +47,28 @@ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_ASAN // RUN: %clangxx -fsycl --offload-new-driver %s --sysroot=%S/Inputs/SYCL -Xarch_device "-fsanitize=address -DUSE_SYCL_DEVICE_ASAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_ASAN +// SYCL_DEVICE_LIB_ASAN: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-crt.bc +// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-complex.bc +// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-complex-fp64.bc +// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-cmath.bc +// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-cmath-fp64.bc +// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-imf.bc +// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-imf-fp64.bc +// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-imf-bf16.bc +// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-cstring.bc +// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-complex.bc +// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-complex-fp64.bc +// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-cmath.bc +// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-cmath-fp64.bc +// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-imf.bc +// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-imf-fp64.bc +// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-imf-bf16.bc +// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-asan.bc + // RUN: %clangxx -fsycl --offload-new-driver %s --sysroot=%S/Inputs/SYCL -Xarch_device "-fsanitize=address -DUSE_SYCL_DEVICE_ASAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_ASAN_MACRO -// SYCL_DEVICE_LIB_ASAN: clang-linker-wrapper{{.*}} "-sycl-device-libraries -// SYCL_DEVICE_LIB_ASAN: {{.*}}libsycl-crt.new.o -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-complex. -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-complex-fp64. -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-cmath.new.o -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-cmath-fp64.new.o -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-imf.new.o -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-imf-fp64.new.o -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-imf-bf16.new.o -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-cstring.new.o -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-complex.new.o -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-complex-fp64.new.o -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-cmath.new.o -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-cmath-fp64.new.o -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-imf.new.o -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-imf-fp64.new.o -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-imf-bf16.new.o -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-asan.new.o -// SYCL_DEVICE_ASAN_MACRO: "-cc1" +// SYCL_DEVICE_ASAN_MACRO: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-asan.bc" // SYCL_DEVICE_ASAN_MACRO-SAME: "USE_SYCL_DEVICE_ASAN" -// SYCL_DEVICE_ASAN_MACRO: libsycl-asan.new.o - /// ########################################################################### /// test behavior of linking libsycl-asan-pvc for PVC target AOT compilation when asan flag is applied. @@ -91,47 +89,45 @@ // RUN: %clangxx -fsycl -fsycl-targets=spir64_gen --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -Xarch_device -fsanitize=address -Xs "-device 12.60.7" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_ASAN_PVC -// SYCL_DEVICE_LIB_ASAN_PVC: clang-linker-wrapper{{.*}} "-sycl-device-libraries -// SYCL_DEVICE_LIB_ASAN_PVC: {{.*}}libsycl-crt.new.o +// SYCL_DEVICE_LIB_ASAN_PVC: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-crt.bc" // SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-complex. // SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-complex-fp64. -// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-cmath.new.o -// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-cmath-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-imf.new.o -// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-imf-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-imf-bf16.new.o -// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-cstring.new.o -// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-complex.new.o -// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-complex-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-cmath.new.o -// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-cmath-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-imf.new.o -// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-imf-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-imf-bf16.new.o -// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-asan-pvc.new.o +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-cmath.bc +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-cmath-fp64.bc +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-imf.bc +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-imf-fp64.bc +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-imf-bf16.bc +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-cstring.bc +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-complex.bc +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-complex-fp64.bc +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-cmath.bc +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-cmath-fp64.bc +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-imf.bc +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-imf-fp64.bc +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-imf-bf16.bc +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-asan-pvc.bc /// ########################################################################### /// test behavior of linking libsycl-asan-cpu for CPU target AOT compilation when asan flag is applied. // RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64 --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -Xarch_device -fsanitize=address -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_ASAN_CPU -// SYCL_DEVICE_LIB_ASAN_CPU: clang-linker-wrapper{{.*}} "-sycl-device-libraries -// SYCL_DEVICE_LIB_ASAN_CPU: {{.*}}libsycl-crt.new.o -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-complex. -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-complex-fp64. -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-cmath.new.o -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-cmath-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-imf.new.o -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-imf-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-imf-bf16.new.o -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-cstring.new.o -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-complex.new.o -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-complex-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-cmath.new.o -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-cmath-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-imf.new.o -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-imf-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-imf-bf16.new.o -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-asan-cpu.new.o +// SYCL_DEVICE_LIB_ASAN_CPU: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-crt.bc" +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-complex.bc +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-complex-fp64.bc +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-cmath.bc +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-cmath-fp64.bc +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-imf.bc +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-imf-fp64.bc +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-imf-bf16.bc +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-cstring.bc +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-complex.bc +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-complex-fp64.bc +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-cmath.bc +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-cmath-fp64.bc +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-imf.bc +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-imf-fp64.bc +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-imf-bf16.bc +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-asan-cpu.bc /// ########################################################################### /// test behavior of linking libsycl-asan-dg2 for DG2 target AOT compilation when asan flag is applied. @@ -146,24 +142,23 @@ // RUN: %clangxx -fsycl -fsycl-targets=spir64_gen --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -Xarch_device -fsanitize=address -Xs "-device dg2" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_ASAN_DG2 -// SYCL_DEVICE_LIB_ASAN_DG2: clang-linker-wrapper{{.*}} "-sycl-device-libraries -// SYCL_DEVICE_LIB_ASAN_DG2: {{.*}}libsycl-crt.new.o -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-complex. -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-complex-fp64. -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-cmath.new.o -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-cmath-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-imf.new.o -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-imf-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-imf-bf16.new.o -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-cstring.new.o -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-complex.new.o -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-complex-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-cmath.new.o -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-cmath-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-imf.new.o -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-imf-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-imf-bf16.new.o -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-asan-dg2.new.o +// SYCL_DEVICE_LIB_ASAN_DG2: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-crt.bc" +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-complex.bc +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-complex-fp64.bc +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-cmath.bc +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-cmath-fp64.bc +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-imf.bc +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-imf-fp64.bc +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-imf-bf16.bc +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-cstring.bc +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-complex.bc +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-complex-fp64.bc +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-cmath.bc +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-cmath-fp64.bc +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-imf.bc +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-imf-fp64.bc +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-imf-bf16.bc +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-asan-dg2.bc /// ########################################################################### /// test behavior of linking libsycl-asan for multiple targets AOT compilation @@ -174,25 +169,23 @@ // RUN: %clangxx -fsycl -fsycl-targets=spir64_gen --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -Xarch_device -fsanitize=address -Xsycl-target-backend=spir64_gen "-device pvc,dg2" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_ASAN_MUL -// SYCL_DEVICE_LIB_ASAN_MUL: clang-linker-wrapper{{.*}} "-sycl-device-libraries -// SYCL_DEVICE_LIB_ASAN_MUL: {{.*}}libsycl-crt.new.o -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-complex. -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-complex-fp64. -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-cmath.new.o -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-cmath-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-imf.new.o -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-imf-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-imf-bf16.new.o -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-cstring.new.o -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-complex.new.o -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-complex-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-cmath.new.o -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-cmath-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-imf.new.o -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-imf-fp64.new.o -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-imf-bf16.new.o -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-asan.new.o - +// SYCL_DEVICE_LIB_ASAN_MUL: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-crt.bc" +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-complex.bc +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-complex-fp64.bc +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-cmath.bc +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-cmath-fp64.bc +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-imf.bc +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-imf-fp64.bc +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-imf-bf16.bc +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-cstring.bc +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-complex.bc +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-complex-fp64.bc +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-cmath.bc +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-cmath-fp64.bc +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-imf.bc +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-imf-fp64.bc +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-imf-bf16.bc +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-asan.bc /// ########################################################################### /// test behavior of libsycl-msan.o linking when -fsanitize=memory is available @@ -206,41 +199,39 @@ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_MSAN // RUN: %clangxx -fsycl --offload-new-driver %s --sysroot=%S/Inputs/SYCL -Xarch_device "-fsanitize=memory -DUSE_SYCL_DEVICE_MSAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_MSAN +// SYCL_DEVICE_LIB_MSAN: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-crt.bc" +// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-complex.bc +// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-complex-fp64.bc +// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-cmath.bc +// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-cmath-fp64.bc +// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-imf.bc +// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-imf-fp64.bc +// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-imf-bf16.bc +// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-cstring.bc +// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-complex.bc +// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-complex-fp64.bc +// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-cmath.bc +// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-cmath-fp64.bc +// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-imf.bc +// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-imf-fp64.bc +// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-imf-bf16.bc +// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-msan.bc + // RUN: %clangxx -fsycl --offload-new-driver %s --sysroot=%S/Inputs/SYCL -Xarch_device "-fsanitize=memory -DUSE_SYCL_DEVICE_MSAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_MSAN_MACRO -// SYCL_DEVICE_LIB_MSAN: clang-linker-wrapper{{.*}} "-sycl-device-libraries -// SYCL_DEVICE_LIB_MSAN: {{.*}}libsycl-crt.new.o -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-complex. -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-complex-fp64. -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-cmath.new.o -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-cmath-fp64.new.o -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-imf.new.o -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-imf-fp64.new.o -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-imf-bf16.new.o -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-cstring.new.o -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-complex.new.o -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-complex-fp64.new.o -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-cmath.new.o -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-cmath-fp64.new.o -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-imf.new.o -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-imf-fp64.new.o -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-imf-bf16.new.o -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-msan.new.o -// SYCL_DEVICE_MSAN_MACRO: "-cc1" +// SYCL_DEVICE_MSAN_MACRO: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-msan.bc" // SYCL_DEVICE_MSAN_MACRO-SAME: "USE_SYCL_DEVICE_MSAN" -// SYCL_DEVICE_MSAN_MACRO: libsycl-msan.new.o /// test behavior of msan libdevice linking when -fsanitize=memory is available for AOT targets // RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -fsanitize=memory -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_MSAN_PVC -// SYCL_DEVICE_LIB_MSAN_PVC: clang-linker-wrapper{{.*}} "-sycl-device-libraries -// SYCL_DEVICE_LIB_MSAN_PVC-SAME: {{.*}}libsycl-msan-pvc.new.o +// SYCL_DEVICE_LIB_MSAN_PVC: clang{{.*}} "-mlink-builtin-bitcode +// SYCL_DEVICE_LIB_MSAN_PVC-SAME: {{.*}}libsycl-msan-pvc.bc /// test behavior of msan libdevice linking when -fsanitize=memory is available for AOT targets // RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64 --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -fsanitize=memory -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_MSAN_CPU -// SYCL_DEVICE_LIB_MSAN_CPU: clang-linker-wrapper{{.*}} "-sycl-device-libraries -// SYCL_DEVICE_LIB_MSAN_CPU-SAME: {{.*}}libsycl-msan-cpu.new.o +// SYCL_DEVICE_LIB_MSAN_CPU: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-msan-cpu.bc" /// ########################################################################### /// test behavior of libsycl-tsan.o linking when -fsanitize=thread is available @@ -254,38 +245,35 @@ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_TSAN // RUN: %clangxx -fsycl --offload-new-driver %s --sysroot=%S/Inputs/SYCL -Xarch_device "-fsanitize=thread -DUSE_SYCL_DEVICE_TSAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_TSAN -// RUN: %clangxx -fsycl --offload-new-driver %s --sysroot=%S/Inputs/SYCL -Xarch_device "-fsanitize=thread -DUSE_SYCL_DEVICE_TSAN" -### 2>&1 \ -// RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_TSAN_MACRO -// SYCL_DEVICE_LIB_TSAN: clang-linker-wrapper{{.*}} "-sycl-device-libraries -// SYCL_DEVICE_LIB_TSAN: {{.*}}libsycl-crt.new.o +// SYCL_DEVICE_LIB_TSAN: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-crt.bc" // SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-complex. // SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-complex-fp64. -// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-cmath.new.o -// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-cmath-fp64.new.o -// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-imf.new.o -// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-imf-fp64.new.o -// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-imf-bf16.new.o -// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-cstring.new.o -// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-complex.new.o -// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-complex-fp64.new.o -// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-cmath.new.o -// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-cmath-fp64.new.o -// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-imf.new.o -// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-imf-fp64.new.o -// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-imf-bf16.new.o -// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-tsan.new.o -// SYCL_DEVICE_TSAN_MACRO: "-cc1" +// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-cmath.bc +// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-cmath-fp64.bc +// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-imf.bc +// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-imf-fp64.bc +// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-imf-bf16.bc +// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-cstring.bc +// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-complex.bc +// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-complex-fp64.bc +// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-cmath.bc +// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-cmath-fp64.bc +// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-imf.bc +// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-imf-fp64.bc +// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-imf-bf16.bc +// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-tsan.bc + +// RUN: %clangxx -fsycl --offload-new-driver %s --sysroot=%S/Inputs/SYCL -Xarch_device "-fsanitize=thread -DUSE_SYCL_DEVICE_TSAN" -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_TSAN_MACRO +// SYCL_DEVICE_TSAN_MACRO: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-tsan.bc" // SYCL_DEVICE_TSAN_MACRO-SAME: "USE_SYCL_DEVICE_TSAN" -// SYCL_DEVICE_TSAN_MACRO: libsycl-tsan.new.o /// test behavior of tsan libdevice linking when -fsanitize=thread is available for AOT targets // RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -fsanitize=thread -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_TSAN_PVC -// SYCL_DEVICE_LIB_TSAN_PVC: clang-linker-wrapper{{.*}} "-sycl-device-libraries -// SYCL_DEVICE_LIB_TSAN_PVC-SAME: {{.*}}libsycl-tsan-pvc.new.o +// SYCL_DEVICE_LIB_TSAN_PVC: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-tsan-pvc.bc" /// test behavior of tsan libdevice linking when -fsanitize=thread is available for AOT targets // RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64 --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -fsanitize=thread -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_TSAN_CPU -// SYCL_DEVICE_LIB_TSAN_CPU: clang-linker-wrapper{{.*}} "-sycl-device-libraries -// SYCL_DEVICE_LIB_TSAN_CPU-SAME: {{.*}}libsycl-tsan-cpu.new.o +// SYCL_DEVICE_LIB_TSAN_CPU: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-tsan-cpu.bc" diff --git a/clang/test/Driver/sycl-instrumentation.cpp b/clang/test/Driver/sycl-instrumentation.cpp index 23cb5b9558b2a..59c6a66e02343 100644 --- a/clang/test/Driver/sycl-instrumentation.cpp +++ b/clang/test/Driver/sycl-instrumentation.cpp @@ -14,10 +14,10 @@ // RUN: | FileCheck -check-prefixes=CHECK-SPIRV %s // CHECK-SPIRV: "-cc1"{{.*}} "-fsycl-is-device"{{.*}} "-fsycl-instrument-device-code" +// CHECK-SPIRV: "-mlink-builtin-bitcode" "{{.*}}libsycl-itt-user-wrappers.bc" +// CHECK-SPIRV-SAME: libsycl-itt-compiler-wrappers.bc +// CHECK-SPIRV-SAME: libsycl-itt-stubs.bc // CHECK-HOST-NOT: "-cc1"{{.*}} "-fsycl-is-host"{{.*}} "-fsycl-instrument-device-code" -// CHECK-SPIRV: clang-linker-wrapper{{.*}} {{.*}}libsycl-itt-user-wrappers.new.o -// CHECK-SPIRV-SAME: libsycl-itt-compiler-wrappers.new.o -// CHECK-SPIRV-SAME: libsycl-itt-stubs.new.o // ITT annotations in device code are disabled by default. However, for SYCL offloading, // we still link ITT annotations libraries to ensure ABI compatibility with previous release. @@ -27,7 +27,7 @@ // RUN: | FileCheck -check-prefixes=CHECK-NONPASSED %s // CHECK-ITT-LINK-ONLY-NOT: "-fsycl-instrument-device-code" -// CHECK-ITT-LINK-ONLY: clang-linker-wrapper{{.*}} {{.*}}libsycl-itt-{{.*}} +// CHECK-ITT-LINK-ONLY: "-mlink-builtin-bitcode" "{{.*}}libsycl-itt-{{.*}}" // RUN: %clangxx -fsycl --offload-new-driver -fno-sycl-instrument-device-code -fsycl-targets=spir64 -### %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHECK-NONPASSED %s @@ -35,4 +35,4 @@ // RUN: | FileCheck -check-prefixes=CHECK-NONPASSED %s // CHECK-NONPASSED-NOT: "-fsycl-instrument-device-code" -// CHECK-NONPASSED-NOT: clang-linker-wrapper{{.*}} {{.*}}libsycl-itt-{{.*}} +// CHECK-NONPASSED-NOT: {{.*}}libsycl-itt-{{.*}} diff --git a/clang/test/Driver/sycl-offload-new-driver.cpp b/clang/test/Driver/sycl-offload-new-driver.cpp index 0e8b394b1aa3b..ff787ed834af8 100644 --- a/clang/test/Driver/sycl-offload-new-driver.cpp +++ b/clang/test/Driver/sycl-offload-new-driver.cpp @@ -30,12 +30,6 @@ // CHK-FLOW-NEXT: clang-linker-wrapper{{.*}} "--host-triple=x86_64-unknown-linux-gnu"{{.*}} "--linker-path={{.*}}/ld" {{.*}} "[[CC1FINALOUT]]" /// Verify options passed to clang-linker-wrapper -// RUN: %clangxx --target=x86_64-unknown-linux-gnu -fsycl --offload-new-driver \ -// RUN: --sysroot=%S/Inputs/SYCL -### %s 2>&1 \ -// RUN: | FileCheck -check-prefix WRAPPER_OPTIONS %s -// WRAPPER_OPTIONS: clang-linker-wrapper{{.*}} "-sycl-device-libraries=libsycl-crt.new.o,libsycl-complex.new.o,libsycl-complex-fp64.new.o,libsycl-cmath.new.o,libsycl-cmath-fp64.new.o,libsycl-imf.new.o,libsycl-imf-fp64.new.o,libsycl-imf-bf16.new.o,libsycl-fallback-cstring.new.o,libsycl-fallback-complex.new.o,libsycl-fallback-complex-fp64.new.o,libsycl-fallback-cmath.new.o,libsycl-fallback-cmath-fp64.new.o,libsycl-fallback-imf.new.o,libsycl-fallback-imf-fp64.new.o,libsycl-fallback-imf-bf16.new.o,libsycl-itt-user-wrappers.new.o,libsycl-itt-compiler-wrappers.new.o,libsycl-itt-stubs.new.o" -// WRAPPER_OPTIONS-SAME: "-sycl-device-library-location={{.*}}/lib" - /// Verify phases used to generate SPIR-V instead of LLVM-IR // RUN: %clangxx --target=x86_64-unknown-linux-gnu -fsycl --offload-new-driver \ // RUN: -fsycl-device-obj=spirv -ccc-print-phases %s 2>&1 \ From 2c71f3113ef01dddd4d4f5e2ad95d0eea98dc6aa Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Fri, 27 Feb 2026 09:51:07 -0800 Subject: [PATCH 02/19] Clang format --- clang/lib/Driver/Driver.cpp | 7 ++++--- clang/lib/Driver/ToolChains/SYCL.cpp | 13 +++++++------ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 4b6269783ed19..7e465d64d690a 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -5527,7 +5527,8 @@ class OffloadingActionBuilder final { bool SYCLDeviceLibLinked = false; Action *NativeCPULib = nullptr; if (IsSPIR || IsNVPTX || IsAMDGCN || IsNativeCPU) { - SYCLDeviceLibLinked = addSYCLDeviceLibs(TC, SYCLDeviceLibs, + SYCLDeviceLibLinked = addSYCLDeviceLibs( + TC, SYCLDeviceLibs, C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment(), IsNativeCPU, NativeCPULib, BoundArch); } @@ -5761,8 +5762,8 @@ class OffloadingActionBuilder final { SmallVector DeviceLibraries; const toolchains::SYCLToolChain &SYCLTC = static_cast(*TC); - DeviceLibraries = SYCLTC.getDeviceLibNames( - TC->getDriver(), C.getArgs(), TC->getTriple()); + DeviceLibraries = SYCLTC.getDeviceLibNames(TC->getDriver(), C.getArgs(), + TC->getTriple()); for (const auto &DeviceLib : DeviceLibraries) { Arg *InputArg = MakeInputArg(Args, C.getDriver().getOpts(), diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 7d990dc22a9bd..6b7d3a15b3ecf 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -230,7 +230,8 @@ bool SYCL::shouldDoPerObjectFileLinking(const Compilation &C) { // Return whether to use native bfloat16 library. static bool selectBfloatLibs(const llvm::opt::ArgList &Args, - const llvm::Triple &Triple, const ToolChain &TC, bool &UseNative) { + const llvm::Triple &Triple, const ToolChain &TC, + bool &UseNative) { static llvm::SmallSet GPUArchsWithNBF16{ "intel_gpu_pvc", "intel_gpu_acm_g10", "intel_gpu_acm_g11", "intel_gpu_acm_g12", "intel_gpu_dg2_g10", "intel_gpu_dg2_g11", @@ -534,7 +535,8 @@ addSYCLDeviceSanitizerLibs(const llvm::opt::ArgList &Args, // Get the list of SYCL device library names to link with user's device image. SmallVector SYCLToolChain::getDeviceLibNames(const Driver &D, - const llvm::opt::ArgList &Args, const llvm::Triple &TargetTriple) const { + const llvm::opt::ArgList &Args, + const llvm::Triple &TargetTriple) const { SmallVector LibraryList; bool NoOffloadLib = !Args.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib, true); @@ -601,9 +603,8 @@ SYCLToolChain::getDeviceLibNames(const Driver &D, const SYCLDeviceLibsList SYCLDeviceBfloat16NativeLib = { "libsycl-native-bfloat16"}; bool NativeBfloatLibs; - bool NeedBfloatLibs = selectBfloatLibs(Args, TargetTriple, - *this, - NativeBfloatLibs); + bool NeedBfloatLibs = + selectBfloatLibs(Args, TargetTriple, *this, NativeBfloatLibs); if (NeedBfloatLibs && !NoOffloadLib) { // Add native or fallback bfloat16 library. if (NativeBfloatLibs) @@ -1891,7 +1892,7 @@ SYCLToolChain::getDeviceLibs( SYCLInstallation.getSYCLDeviceLibPath(LibraryPaths); // Formulate all of the device libraries needed for this compilation. - SmallVector DeviceLibs = + SmallVector DeviceLibs = getDeviceLibNames(getDriver(), DriverArgs, getTriple()); // Create full path names to each device library. If found, add to the list From f752b552f2bed6b266f5771d81efad7385bbb629 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Mon, 2 Mar 2026 15:32:22 -0800 Subject: [PATCH 03/19] Fix libs to use full paths --- clang/lib/Driver/Driver.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 7e465d64d690a..5034baa5e63d5 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -5759,15 +5759,15 @@ class OffloadingActionBuilder final { bool isMSVCEnv, bool isNativeCPU, Action *&NativeCPULib, const char *BoundArch) { - SmallVector DeviceLibraries; + SmallVector DeviceLibraries; const toolchains::SYCLToolChain &SYCLTC = static_cast(*TC); - DeviceLibraries = SYCLTC.getDeviceLibNames(TC->getDriver(), C.getArgs(), - TC->getTriple()); + DeviceLibraries.append(SYCLTC.getDeviceLibs(C.getArgs(), + Action::OFK_SYCL)); for (const auto &DeviceLib : DeviceLibraries) { Arg *InputArg = MakeInputArg(Args, C.getDriver().getOpts(), - Args.MakeArgString(DeviceLib)); + Args.MakeArgString(DeviceLib.Path)); // We are using the LLVM-IR device libraries directly, no need // to unbundle any objects. auto *SYCLDeviceLibsInputAction = From 95642b4d29802ec6abf360e3d7edc7db046ef043 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Mon, 2 Mar 2026 15:32:44 -0800 Subject: [PATCH 04/19] clang format --- clang/lib/Driver/Driver.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 5034baa5e63d5..0530df8d1a0d1 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -5762,8 +5762,8 @@ class OffloadingActionBuilder final { SmallVector DeviceLibraries; const toolchains::SYCLToolChain &SYCLTC = static_cast(*TC); - DeviceLibraries.append(SYCLTC.getDeviceLibs(C.getArgs(), - Action::OFK_SYCL)); + DeviceLibraries.append( + SYCLTC.getDeviceLibs(C.getArgs(), Action::OFK_SYCL)); for (const auto &DeviceLib : DeviceLibraries) { Arg *InputArg = MakeInputArg(Args, C.getDriver().getOpts(), From 6020fab2ad028b624024dedb7641f68170feb2ea Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Tue, 3 Mar 2026 15:15:58 -0800 Subject: [PATCH 05/19] Revert to using old way of grabbing device libs for old model --- clang/lib/Driver/Driver.cpp | 56 ++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 0530df8d1a0d1..d2a84ab2a282e 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -5759,33 +5759,49 @@ class OffloadingActionBuilder final { bool isMSVCEnv, bool isNativeCPU, Action *&NativeCPULib, const char *BoundArch) { - SmallVector DeviceLibraries; + int NumOfDeviceLibLinked = 0; + SmallVector, 4> LibLocCandidates; + SYCLInstallation.getSYCLDeviceLibPath(LibLocCandidates); + const toolchains::SYCLToolChain &SYCLTC = static_cast(*TC); - DeviceLibraries.append( - SYCLTC.getDeviceLibs(C.getArgs(), Action::OFK_SYCL)); + SmallVector DeviceLibraries; + // TODO: Use the getDeviceLibs for each toolchain instead of using the + // specific libs and doing a separate directory search. Each toolchain + // has their own getDeviceLibs that we can potentially use. + DeviceLibraries = + SYCLTC.getDeviceLibNames(C.getDriver(), Args, TC->getTriple()); for (const auto &DeviceLib : DeviceLibraries) { - Arg *InputArg = MakeInputArg(Args, C.getDriver().getOpts(), - Args.MakeArgString(DeviceLib.Path)); - // We are using the LLVM-IR device libraries directly, no need - // to unbundle any objects. - auto *SYCLDeviceLibsInputAction = - C.MakeAction(*InputArg, types::TY_LLVM_BC); - DeviceLinkObjects.push_back(SYCLDeviceLibsInputAction); - - // The device link stage may remove symbols not referenced in the - // source code. Since libsycl-nativecpu_utils contains such symbols - // which are later needed by the NativeCPU backend passes we link - // that library separately afterwards without --only-needed. - if (isNativeCPU) { - assert(!NativeCPULib); - NativeCPULib = DeviceLinkObjects.back(); - DeviceLinkObjects.pop_back(); + for (const auto &LLCandidate : LibLocCandidates) { + SmallString<128> LibName(LLCandidate); + llvm::sys::path::append(LibName, DeviceLib); + if (llvm::sys::fs::exists(LibName)) { + ++NumOfDeviceLibLinked; + Arg *InputArg = MakeInputArg(Args, C.getDriver().getOpts(), + Args.MakeArgString(LibName)); + // We are using the LLVM-IR device libraries directly, no need + // to unbundle any objects. + auto *SYCLDeviceLibsInputAction = + C.MakeAction(*InputArg, types::TY_LLVM_BC); + DeviceLinkObjects.push_back(SYCLDeviceLibsInputAction); + + // The device link stage may remove symbols not referenced in the + // source code. Since libsycl-nativecpu_utils contains such symbols + // which are later needed by the NativeCPU backend passes we link + // that library separately afterwards without --only-needed. + if (isNativeCPU) { + assert(!NativeCPULib); + NativeCPULib = DeviceLinkObjects.back(); + DeviceLinkObjects.pop_back(); + } + + break; + } } } - if (DeviceLibraries.empty() && !TC->getTriple().isNVPTX()) + if (!NumOfDeviceLibLinked && !TC->getTriple().isNVPTX()) return false; // For NVPTX we need to also link libclc at the same stage that we link From c92741b06203c953dcc1ff95dcc77972cc7f6465 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Wed, 4 Mar 2026 15:05:39 -0800 Subject: [PATCH 06/19] Only pull in native_cpu device lib via clang-linker-wrapper --- clang/lib/Driver/ToolChains/SYCL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 6b7d3a15b3ecf..6a7a4f201d7b7 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -1437,7 +1437,7 @@ void SYCLToolChain::addClangTargetOptions( // Add device libraries. // This is currently only done with the new offloading model, to better fit // with community expectations - if (!getDriver().getUseNewOffloadingDriver()) + if (!getDriver().getUseNewOffloadingDriver() || !getTriple().isSPIROrSPIRV()) return; llvm::SmallVector BCLibs; From 2372f9aacc0f31613699976160efc030b832ecc1 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Thu, 5 Mar 2026 10:10:58 -0800 Subject: [PATCH 07/19] Pass along device lib location --- clang/lib/Driver/ToolChains/Clang.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index f3d09ba9d10ca..ae3c2fb62266c 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -11516,6 +11516,9 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back( Args.MakeArgString(Twine("--bitcode-library=") + Lib)); + CmdArgs.push_back(Args.MakeArgString( + Twine("-sycl-device-library-location=") + DeviceLibDir)); + if (C.getDriver().isSaveOffloadCodeEnabled()) { SmallString<128> DumpDir; Arg *A = C.getArgs().getLastArg(options::OPT_save_offload_code_EQ); From 9e63e86f90403dfafb55ca708b690001ec6cc9f8 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Thu, 5 Mar 2026 10:26:16 -0800 Subject: [PATCH 08/19] clang format --- clang/lib/Driver/ToolChains/Clang.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index ae3c2fb62266c..7d09ea13e808a 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -11517,7 +11517,7 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, Args.MakeArgString(Twine("--bitcode-library=") + Lib)); CmdArgs.push_back(Args.MakeArgString( - Twine("-sycl-device-library-location=") + DeviceLibDir)); + Twine("-sycl-device-library-location=") + DeviceLibDir)); if (C.getDriver().isSaveOffloadCodeEnabled()) { SmallString<128> DumpDir; From 3ae1a658c95b69ea2966a2662d179b14fdac2b88 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Thu, 5 Mar 2026 14:08:31 -0800 Subject: [PATCH 09/19] Disable link warnings --- clang/lib/Driver/ToolChains/SYCL.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 6a7a4f201d7b7..5ecb0f7f171d2 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -1446,6 +1446,9 @@ void SYCLToolChain::addClangTargetOptions( CC1Args.push_back("-mlink-builtin-bitcode"); CC1Args.push_back(DriverArgs.MakeArgString(BCFile.Path)); } + // FIXME: Turn off potential linker warnings when linking in device library + // files that are built for spir64, but we are compiling for AOT. + CC1Args.push_back("-Wno-linker-warnings"); } llvm::opt::DerivedArgList * From 266927d371e15e19db0001eaf2583954ee2426cc Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Mon, 9 Mar 2026 15:34:16 -0700 Subject: [PATCH 10/19] Mark tests as Linux only, cannot mix Windows .bc files with compile --- clang/test/Driver/sycl-spirv-default-options.cpp | 1 + clang/test/Driver/sycl-spirv-ext.cpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/clang/test/Driver/sycl-spirv-default-options.cpp b/clang/test/Driver/sycl-spirv-default-options.cpp index c3ced7858e52f..b57a4742d72a1 100644 --- a/clang/test/Driver/sycl-spirv-default-options.cpp +++ b/clang/test/Driver/sycl-spirv-default-options.cpp @@ -1,4 +1,5 @@ // Generate .o file as SYCL device library file. +// REQUIRES: system-linux // // RUN: touch %t.devicelib.cpp // RUN: %clang %t.devicelib.cpp -fsycl -fsycl-targets=spir64-unknown-unknown -c --offload-new-driver -o %t_1.devicelib.o diff --git a/clang/test/Driver/sycl-spirv-ext.cpp b/clang/test/Driver/sycl-spirv-ext.cpp index a8394d1ece837..b44014641a6f6 100644 --- a/clang/test/Driver/sycl-spirv-ext.cpp +++ b/clang/test/Driver/sycl-spirv-ext.cpp @@ -1,4 +1,5 @@ // Generate .o file as SYCL device library file. +// REQUIRES: system-linux // // RUN: touch %t.devicelib.cpp // RUN: %clang %t.devicelib.cpp -fsycl -fsycl-targets=spir64-unknown-unknown -c --offload-new-driver -o %t_1.devicelib.o @@ -7,7 +8,7 @@ /// Check llvm-spirv extensions that are set -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl --offload-new-driver \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl --offload-new-driver \ // RUN: -fsycl-targets=spir64-unknown-unknown -c %s -o %t_1.o // RUN: clang-linker-wrapper -sycl-device-libraries=%t_1.devicelib.o \ // RUN: "--host-triple=x86_64-unknown-linux-gnu" "--linker-path=/usr/bin/ld" \ From 8ac9664a762635c34ecd4f5ff5d13c3002b37796 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Tue, 10 Mar 2026 17:06:28 -0700 Subject: [PATCH 11/19] Move sanitizer libraries to the clang-linker-wrapper --- clang/lib/Driver/ToolChains/Clang.cpp | 14 ++++++----- clang/lib/Driver/ToolChains/SYCL.cpp | 24 ++++++++++++++++++ clang/lib/Driver/ToolChains/SYCL.h | 7 ++++++ clang/test/Driver/sycl-device-lib.cpp | 35 +++++++++++++-------------- 4 files changed, 56 insertions(+), 24 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 7d09ea13e808a..8594bc26c43b7 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -11486,14 +11486,16 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, for (const auto &[Kind, TC] : llvm::make_range(ToolChainRange.first, ToolChainRange.second)) { llvm::Triple TargetTriple = TC->getTriple(); - // SPIR or SPIR-V device libraries are compiled into the device compile - // step. - if (TargetTriple.isSPIROrSPIRV()) - continue; const toolchains::SYCLToolChain &SYCLTC = static_cast(*TC); - SmallVector SYCLDeviceLibs = - SYCLTC.getDeviceLibNames(D, Args, TargetTriple); + SmallVector SYCLDeviceLibs; + // SPIR or SPIR-V device libraries are compiled into the device compile + // step. + if (!TargetTriple.isSPIROrSPIRV()) + SYCLDeviceLibs.append(SYCLTC.getDeviceLibNames(D, Args, TargetTriple)); + const DerivedArgList &ToolChainArgs = + C.getArgsForToolChain(TC, StringRef(), Kind); + SYCLDeviceLibs.append(SYCLTC.getDeviceSanitizerLibNames(ToolChainArgs)); for (const auto &AddLib : SYCLDeviceLibs) { if (llvm::sys::path::extension(AddLib) == ".bc") { SmallString<256> LibPath(DeviceLibDir); diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 5ecb0f7f171d2..f86c7f75b8578 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -616,6 +616,30 @@ SYCLToolChain::getDeviceLibNames(const Driver &D, // Currently, device sanitizer support is required by some developers on // Linux platform only, so compiler only provides device sanitizer libraries // on Linux platform. + // Do not pull these in with the new offloading model, as they will be pulled + // in separately to be linked in with the clang-linker-wrapper. + if (getDriver().getUseNewOffloadingDriver()) + return LibraryList; +#if !defined(_WIN32) + addSYCLDeviceSanitizerLibs(Args, LibraryList); +#endif + + return LibraryList; +} + +// Get the list of SYCL device library names associated with the sanitizers. +SmallVector +SYCLToolChain::getDeviceSanitizerLibNames( + const llvm::opt::ArgList &Args) const { + SmallVector LibraryList; + bool NoOffloadLib = + !Args.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib, true); + + if (NoOffloadLib) + return {}; + // Currently, device sanitizer support is required by some developers on + // Linux platform only, so compiler only provides device sanitizer libraries + // on Linux platform. #if !defined(_WIN32) addSYCLDeviceSanitizerLibs(Args, LibraryList); #endif diff --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h index c3f111b42fec9..7dd8c193125e3 100644 --- a/clang/lib/Driver/ToolChains/SYCL.h +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -160,6 +160,13 @@ class LLVM_LIBRARY_VISIBILITY SYCLToolChain : public ToolChain { getDeviceLibNames(const Driver &D, const llvm::opt::ArgList &Args, const llvm::Triple &TargetTriple) const; + // Provides a vector of device library names that are associated with the + // sanitizers. This is pulled out separately from the normal device library + // names to provide the ability to link in these with the clang-linker-wrapper + // instead of at compile time. + SmallVector + getDeviceSanitizerLibNames(const llvm::opt::ArgList &Args) const; + bool useIntegratedAs() const override { return true; } bool isPICDefault() const override { if (this->getTriple().isNativeCPU()) diff --git a/clang/test/Driver/sycl-device-lib.cpp b/clang/test/Driver/sycl-device-lib.cpp index ef86ac0c62040..d684bac648c74 100644 --- a/clang/test/Driver/sycl-device-lib.cpp +++ b/clang/test/Driver/sycl-device-lib.cpp @@ -63,12 +63,12 @@ // SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-asan.bc +// SYCL_DEVICE_LIB_ASAN: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-asan.bc" // RUN: %clangxx -fsycl --offload-new-driver %s --sysroot=%S/Inputs/SYCL -Xarch_device "-fsanitize=address -DUSE_SYCL_DEVICE_ASAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_ASAN_MACRO -// SYCL_DEVICE_ASAN_MACRO: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-asan.bc" -// SYCL_DEVICE_ASAN_MACRO-SAME: "USE_SYCL_DEVICE_ASAN" +// SYCL_DEVICE_ASAN_MACRO: clang{{.*}} "USE_SYCL_DEVICE_ASAN" +// SYCL_DEVICE_ASAN_MACRO: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-asan.bc" /// ########################################################################### /// test behavior of linking libsycl-asan-pvc for PVC target AOT compilation when asan flag is applied. @@ -105,7 +105,7 @@ // SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-asan-pvc.bc +// SYCL_DEVICE_LIB_ASAN_PVC: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-asan-pvc.bc" /// ########################################################################### /// test behavior of linking libsycl-asan-cpu for CPU target AOT compilation when asan flag is applied. @@ -127,7 +127,7 @@ // SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-asan-cpu.bc +// SYCL_DEVICE_LIB_ASAN_CPU: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-asan-cpu.bc" /// ########################################################################### /// test behavior of linking libsycl-asan-dg2 for DG2 target AOT compilation when asan flag is applied. @@ -158,7 +158,7 @@ // SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-asan-dg2.bc +// SYCL_DEVICE_LIB_ASAN_DG2: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-asan-dg2.bc" /// ########################################################################### /// test behavior of linking libsycl-asan for multiple targets AOT compilation @@ -185,7 +185,7 @@ // SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-asan.bc +// SYCL_DEVICE_LIB_ASAN_MUL: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-asan.bc" /// ########################################################################### /// test behavior of libsycl-msan.o linking when -fsanitize=memory is available @@ -215,23 +215,22 @@ // SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-msan.bc +// SYCL_DEVICE_LIB_MSAN: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-msan.bc" // RUN: %clangxx -fsycl --offload-new-driver %s --sysroot=%S/Inputs/SYCL -Xarch_device "-fsanitize=memory -DUSE_SYCL_DEVICE_MSAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_MSAN_MACRO -// SYCL_DEVICE_MSAN_MACRO: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-msan.bc" -// SYCL_DEVICE_MSAN_MACRO-SAME: "USE_SYCL_DEVICE_MSAN" +// SYCL_DEVICE_MSAN_MACRO: clang{{.*}} "USE_SYCL_DEVICE_MSAN" +// SYCL_DEVICE_MSAN_MACRO: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-msan.bc" /// test behavior of msan libdevice linking when -fsanitize=memory is available for AOT targets // RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -fsanitize=memory -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_MSAN_PVC -// SYCL_DEVICE_LIB_MSAN_PVC: clang{{.*}} "-mlink-builtin-bitcode -// SYCL_DEVICE_LIB_MSAN_PVC-SAME: {{.*}}libsycl-msan-pvc.bc +// SYCL_DEVICE_LIB_MSAN_PVC: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-msan-pvc.bc" /// test behavior of msan libdevice linking when -fsanitize=memory is available for AOT targets // RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64 --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -fsanitize=memory -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_MSAN_CPU -// SYCL_DEVICE_LIB_MSAN_CPU: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-msan-cpu.bc" +// SYCL_DEVICE_LIB_MSAN_CPU: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-msan-cpu.bc" /// ########################################################################### /// test behavior of libsycl-tsan.o linking when -fsanitize=thread is available @@ -261,19 +260,19 @@ // SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-tsan.bc +// SYCL_DEVICE_LIB_TSAN: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-tsan.bc" // RUN: %clangxx -fsycl --offload-new-driver %s --sysroot=%S/Inputs/SYCL -Xarch_device "-fsanitize=thread -DUSE_SYCL_DEVICE_TSAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_TSAN_MACRO -// SYCL_DEVICE_TSAN_MACRO: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-tsan.bc" -// SYCL_DEVICE_TSAN_MACRO-SAME: "USE_SYCL_DEVICE_TSAN" +// SYCL_DEVICE_TSAN_MACRO: clang{{.*}} "USE_SYCL_DEVICE_TSAN" +// SYCL_DEVICE_TSAN_MACRO: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-tsan.bc" /// test behavior of tsan libdevice linking when -fsanitize=thread is available for AOT targets // RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -fsanitize=thread -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_TSAN_PVC -// SYCL_DEVICE_LIB_TSAN_PVC: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-tsan-pvc.bc" +// SYCL_DEVICE_LIB_TSAN_PVC: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-tsan-pvc.bc" /// test behavior of tsan libdevice linking when -fsanitize=thread is available for AOT targets // RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64 --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -fsanitize=thread -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_TSAN_CPU -// SYCL_DEVICE_LIB_TSAN_CPU: clang{{.*}} "-mlink-builtin-bitcode" "{{.*}}libsycl-tsan-cpu.bc" +// SYCL_DEVICE_LIB_TSAN_CPU: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-tsan-cpu.bc" From 5539741128fd7c0fb845f84728150b04c4d3da99 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Tue, 10 Mar 2026 18:55:44 -0700 Subject: [PATCH 12/19] clang format --- clang/lib/Driver/ToolChains/SYCL.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index f86c7f75b8578..996e123dc4de5 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -628,8 +628,7 @@ SYCLToolChain::getDeviceLibNames(const Driver &D, } // Get the list of SYCL device library names associated with the sanitizers. -SmallVector -SYCLToolChain::getDeviceSanitizerLibNames( +SmallVector SYCLToolChain::getDeviceSanitizerLibNames( const llvm::opt::ArgList &Args) const { SmallVector LibraryList; bool NoOffloadLib = From 24cba66eae0159b6059e94e0b29d13d427d36b98 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Wed, 11 Mar 2026 11:01:24 -0700 Subject: [PATCH 13/19] Use -mlink-builtin-bitcode-postopt --- clang/lib/Driver/ToolChains/Clang.cpp | 2 +- clang/lib/Driver/ToolChains/SYCL.cpp | 25 ++----------------- clang/lib/Driver/ToolChains/SYCL.h | 7 ------ clang/test/Driver/sycl-device-lib.cpp | 35 ++++++++++++++------------- 4 files changed, 21 insertions(+), 48 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 8594bc26c43b7..585587655635c 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -11495,7 +11495,7 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, SYCLDeviceLibs.append(SYCLTC.getDeviceLibNames(D, Args, TargetTriple)); const DerivedArgList &ToolChainArgs = C.getArgsForToolChain(TC, StringRef(), Kind); - SYCLDeviceLibs.append(SYCLTC.getDeviceSanitizerLibNames(ToolChainArgs)); + //SYCLDeviceLibs.append(SYCLTC.getDeviceSanitizerLibNames(ToolChainArgs)); for (const auto &AddLib : SYCLDeviceLibs) { if (llvm::sys::path::extension(AddLib) == ".bc") { SmallString<256> LibPath(DeviceLibDir); diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 996e123dc4de5..e01a7d96c0a87 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -616,29 +616,6 @@ SYCLToolChain::getDeviceLibNames(const Driver &D, // Currently, device sanitizer support is required by some developers on // Linux platform only, so compiler only provides device sanitizer libraries // on Linux platform. - // Do not pull these in with the new offloading model, as they will be pulled - // in separately to be linked in with the clang-linker-wrapper. - if (getDriver().getUseNewOffloadingDriver()) - return LibraryList; -#if !defined(_WIN32) - addSYCLDeviceSanitizerLibs(Args, LibraryList); -#endif - - return LibraryList; -} - -// Get the list of SYCL device library names associated with the sanitizers. -SmallVector SYCLToolChain::getDeviceSanitizerLibNames( - const llvm::opt::ArgList &Args) const { - SmallVector LibraryList; - bool NoOffloadLib = - !Args.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib, true); - - if (NoOffloadLib) - return {}; - // Currently, device sanitizer support is required by some developers on - // Linux platform only, so compiler only provides device sanitizer libraries - // on Linux platform. #if !defined(_WIN32) addSYCLDeviceSanitizerLibs(Args, LibraryList); #endif @@ -1469,6 +1446,8 @@ void SYCLToolChain::addClangTargetOptions( CC1Args.push_back("-mlink-builtin-bitcode"); CC1Args.push_back(DriverArgs.MakeArgString(BCFile.Path)); } + CC1Args.push_back("-mlink-builtin-bitcode-postopt"); + // FIXME: Turn off potential linker warnings when linking in device library // files that are built for spir64, but we are compiling for AOT. CC1Args.push_back("-Wno-linker-warnings"); diff --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h index 7dd8c193125e3..c3f111b42fec9 100644 --- a/clang/lib/Driver/ToolChains/SYCL.h +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -160,13 +160,6 @@ class LLVM_LIBRARY_VISIBILITY SYCLToolChain : public ToolChain { getDeviceLibNames(const Driver &D, const llvm::opt::ArgList &Args, const llvm::Triple &TargetTriple) const; - // Provides a vector of device library names that are associated with the - // sanitizers. This is pulled out separately from the normal device library - // names to provide the ability to link in these with the clang-linker-wrapper - // instead of at compile time. - SmallVector - getDeviceSanitizerLibNames(const llvm::opt::ArgList &Args) const; - bool useIntegratedAs() const override { return true; } bool isPICDefault() const override { if (this->getTriple().isNativeCPU()) diff --git a/clang/test/Driver/sycl-device-lib.cpp b/clang/test/Driver/sycl-device-lib.cpp index d684bac648c74..d50f6c31b2801 100644 --- a/clang/test/Driver/sycl-device-lib.cpp +++ b/clang/test/Driver/sycl-device-lib.cpp @@ -25,6 +25,7 @@ // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: {{.*}}libsycl-fallback-imf-bf16.bc +// SYCL_DEVICE_LIB_LINK_DEFAULT-SAME: "-mlink-builtin-bitcode-postopt" /// ########################################################################### @@ -63,12 +64,12 @@ // SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_ASAN: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-asan.bc" +// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-asan.bc // RUN: %clangxx -fsycl --offload-new-driver %s --sysroot=%S/Inputs/SYCL -Xarch_device "-fsanitize=address -DUSE_SYCL_DEVICE_ASAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_ASAN_MACRO -// SYCL_DEVICE_ASAN_MACRO: clang{{.*}} "USE_SYCL_DEVICE_ASAN" -// SYCL_DEVICE_ASAN_MACRO: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-asan.bc" +// SYCL_DEVICE_ASAN_MACRO: clang{{.*}} {{.*}}libsycl-asan.bc +// SYCL_DEVICE_ASAN_MACRO-SAME: "USE_SYCL_DEVICE_ASAN" /// ########################################################################### /// test behavior of linking libsycl-asan-pvc for PVC target AOT compilation when asan flag is applied. @@ -105,7 +106,7 @@ // SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_ASAN_PVC: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-asan-pvc.bc" +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-asan-pvc.bc /// ########################################################################### /// test behavior of linking libsycl-asan-cpu for CPU target AOT compilation when asan flag is applied. @@ -127,7 +128,7 @@ // SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_ASAN_CPU: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-asan-cpu.bc" +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-asan-cpu.bc /// ########################################################################### /// test behavior of linking libsycl-asan-dg2 for DG2 target AOT compilation when asan flag is applied. @@ -158,7 +159,7 @@ // SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_ASAN_DG2: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-asan-dg2.bc" +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-asan-dg2.bc /// ########################################################################### /// test behavior of linking libsycl-asan for multiple targets AOT compilation @@ -185,7 +186,7 @@ // SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_ASAN_MUL: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-asan.bc" +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-asan.bc /// ########################################################################### /// test behavior of libsycl-msan.o linking when -fsanitize=memory is available @@ -215,22 +216,22 @@ // SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_MSAN: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-msan.bc" +// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-msan.bc // RUN: %clangxx -fsycl --offload-new-driver %s --sysroot=%S/Inputs/SYCL -Xarch_device "-fsanitize=memory -DUSE_SYCL_DEVICE_MSAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_MSAN_MACRO -// SYCL_DEVICE_MSAN_MACRO: clang{{.*}} "USE_SYCL_DEVICE_MSAN" -// SYCL_DEVICE_MSAN_MACRO: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-msan.bc" +// SYCL_DEVICE_MSAN_MACRO: clang{{.*}} {{.*}}libsycl-msan.bc +// SYCL_DEVICE_MSAN_MACRO-SAME: "USE_SYCL_DEVICE_MSAN" /// test behavior of msan libdevice linking when -fsanitize=memory is available for AOT targets // RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -fsanitize=memory -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_MSAN_PVC -// SYCL_DEVICE_LIB_MSAN_PVC: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-msan-pvc.bc" +// SYCL_DEVICE_LIB_MSAN_PVC: clang{{.*}} "{{.*}}libsycl-msan-pvc.bc" /// test behavior of msan libdevice linking when -fsanitize=memory is available for AOT targets // RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64 --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -fsanitize=memory -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_MSAN_CPU -// SYCL_DEVICE_LIB_MSAN_CPU: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-msan-cpu.bc" +// SYCL_DEVICE_LIB_MSAN_CPU: clang{{.*}} "{{.*}}libsycl-msan-cpu.bc" /// ########################################################################### /// test behavior of libsycl-tsan.o linking when -fsanitize=thread is available @@ -260,19 +261,19 @@ // SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_TSAN: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-tsan.bc" +// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-tsan.bc // RUN: %clangxx -fsycl --offload-new-driver %s --sysroot=%S/Inputs/SYCL -Xarch_device "-fsanitize=thread -DUSE_SYCL_DEVICE_TSAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_TSAN_MACRO -// SYCL_DEVICE_TSAN_MACRO: clang{{.*}} "USE_SYCL_DEVICE_TSAN" -// SYCL_DEVICE_TSAN_MACRO: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-tsan.bc" +// SYCL_DEVICE_TSAN_MACRO: clang{{.*}} "{{.*}}libsycl-tsan.bc" +// SYCL_DEVICE_TSAN_MACRO-SAME: "USE_SYCL_DEVICE_TSAN" /// test behavior of tsan libdevice linking when -fsanitize=thread is available for AOT targets // RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -fsanitize=thread -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_TSAN_PVC -// SYCL_DEVICE_LIB_TSAN_PVC: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-tsan-pvc.bc" +// SYCL_DEVICE_LIB_TSAN_PVC: clang{{.*}} "{{.*}}libsycl-tsan-pvc.bc" /// test behavior of tsan libdevice linking when -fsanitize=thread is available for AOT targets // RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64 --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -fsanitize=thread -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_TSAN_CPU -// SYCL_DEVICE_LIB_TSAN_CPU: clang-linker-wrapper{{.*}} "--bitcode-library={{.*}}libsycl-tsan-cpu.bc" +// SYCL_DEVICE_LIB_TSAN_CPU: clang{{.*}} "{{.*}}libsycl-tsan-cpu.bc" From 8f1c6b7e21aace542f489a6a8505446cafc8f112 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Wed, 11 Mar 2026 11:17:43 -0700 Subject: [PATCH 14/19] remove commented line --- clang/lib/Driver/ToolChains/Clang.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 585587655635c..5df2f00cce5cf 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -11495,7 +11495,6 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, SYCLDeviceLibs.append(SYCLTC.getDeviceLibNames(D, Args, TargetTriple)); const DerivedArgList &ToolChainArgs = C.getArgsForToolChain(TC, StringRef(), Kind); - //SYCLDeviceLibs.append(SYCLTC.getDeviceSanitizerLibNames(ToolChainArgs)); for (const auto &AddLib : SYCLDeviceLibs) { if (llvm::sys::path::extension(AddLib) == ".bc") { SmallString<256> LibPath(DeviceLibDir); From d67c13410c5723ec3647ebd6236596e9377b9db8 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Wed, 11 Mar 2026 17:02:48 -0700 Subject: [PATCH 15/19] Use -mlink-bitcode-file for sanitizer device libs --- clang/lib/Driver/ToolChains/SYCL.cpp | 59 +++++++++++++++++++++++++++ clang/lib/Driver/ToolChains/SYCL.h | 10 +++++ clang/test/Driver/sycl-device-lib.cpp | 28 ++++++------- 3 files changed, 83 insertions(+), 14 deletions(-) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index e01a7d96c0a87..d7ad4d60d50ce 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -616,6 +616,30 @@ SYCLToolChain::getDeviceLibNames(const Driver &D, // Currently, device sanitizer support is required by some developers on // Linux platform only, so compiler only provides device sanitizer libraries // on Linux platform. + // Do not pull these in with the new offloading model, as they will be pulled + // in separately to be linked in with -mlink-bitcode-file. + if (getDriver().getUseNewOffloadingDriver()) + return LibraryList; +#if !defined(_WIN32) + addSYCLDeviceSanitizerLibs(Args, LibraryList); +#endif + + return LibraryList; +} + +// Get the list of SYCL device library names associated with the sanitizers. +SmallVector +SYCLToolChain::getDeviceSanitizerLibNames( + const llvm::opt::ArgList &Args) const { + SmallVector LibraryList; + bool NoOffloadLib = + !Args.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib, true); + + if (NoOffloadLib) + return {}; + // Currently, device sanitizer support is required by some developers on + // Linux platform only, so compiler only provides device sanitizer libraries + // on Linux platform. #if !defined(_WIN32) addSYCLDeviceSanitizerLibs(Args, LibraryList); #endif @@ -1448,6 +1472,14 @@ void SYCLToolChain::addClangTargetOptions( } CC1Args.push_back("-mlink-builtin-bitcode-postopt"); + // Link in any of the Sanitizer libraries. + llvm::SmallVector BCSanitizerLibs; + BCSanitizerLibs.append(SYCLToolChain::getDeviceSanitizerLibs(DriverArgs)); + for (auto BCFile : BCSanitizerLibs) { + CC1Args.push_back("-mlink-bitcode-file"); + CC1Args.push_back(DriverArgs.MakeArgString(BCFile.Path)); + } + // FIXME: Turn off potential linker warnings when linking in device library // files that are built for spir64, but we are compiling for AOT. CC1Args.push_back("-Wno-linker-warnings"); @@ -1915,6 +1947,33 @@ SYCLToolChain::getDeviceLibs( return BCLibs; } +llvm::SmallVector +SYCLToolChain::getDeviceSanitizerLibs( + const llvm::opt::ArgList &DriverArgs) const { + llvm::SmallVector BCLibs; + + SmallVector, 4> LibraryPaths; + SYCLInstallation.getSYCLDeviceLibPath(LibraryPaths); + + // Formulate all of the device libraries needed for this compilation. + SmallVector DeviceLibs = + getDeviceSanitizerLibNames(DriverArgs); + + // Create full path names to each device library. If found, add to the list + // of device libraries that will be linked against. + for (auto DeviceLib : DeviceLibs) { + for (auto LibraryPath : LibraryPaths) { + SmallString<1208> FullLibName(LibraryPath); + llvm::sys::path::append(FullLibName, DeviceLib); + if (llvm::sys::fs::exists(FullLibName)) { + BCLibs.emplace_back(FullLibName); + break; + } + } + } + return BCLibs; +} + SanitizerMask SYCLToolChain::getSupportedSanitizers() const { return SanitizerKind::Address | SanitizerKind::Memory | SanitizerKind::Thread; } diff --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h index c3f111b42fec9..8aa4f859d964e 100644 --- a/clang/lib/Driver/ToolChains/SYCL.h +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -160,6 +160,16 @@ class LLVM_LIBRARY_VISIBILITY SYCLToolChain : public ToolChain { getDeviceLibNames(const Driver &D, const llvm::opt::ArgList &Args, const llvm::Triple &TargetTriple) const; + // Provides a vector of device library names that are associated with the + // sanitizers. This is pulled out separately from the normal device library + // names to provide the ability to link in these with the clang-linker-wrapper + // instead of at compile time. + SmallVector + getDeviceSanitizerLibNames(const llvm::opt::ArgList &Args) const; + + llvm::SmallVector + getDeviceSanitizerLibs(const llvm::opt::ArgList &Args) const; + bool useIntegratedAs() const override { return true; } bool isPICDefault() const override { if (this->getTriple().isNativeCPU()) diff --git a/clang/test/Driver/sycl-device-lib.cpp b/clang/test/Driver/sycl-device-lib.cpp index d50f6c31b2801..9df99689ac359 100644 --- a/clang/test/Driver/sycl-device-lib.cpp +++ b/clang/test/Driver/sycl-device-lib.cpp @@ -64,11 +64,11 @@ // SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_ASAN-SAME: {{.*}}libsycl-asan.bc +// SYCL_DEVICE_LIB_ASAN-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan.bc" // RUN: %clangxx -fsycl --offload-new-driver %s --sysroot=%S/Inputs/SYCL -Xarch_device "-fsanitize=address -DUSE_SYCL_DEVICE_ASAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_ASAN_MACRO -// SYCL_DEVICE_ASAN_MACRO: clang{{.*}} {{.*}}libsycl-asan.bc +// SYCL_DEVICE_ASAN_MACRO: clang{{.*}} "-mlink-bitcode-file" "{{.*}}libsycl-asan.bc" // SYCL_DEVICE_ASAN_MACRO-SAME: "USE_SYCL_DEVICE_ASAN" /// ########################################################################### @@ -106,7 +106,7 @@ // SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_ASAN_PVC-SAME: {{.*}}libsycl-asan-pvc.bc +// SYCL_DEVICE_LIB_ASAN_PVC-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan-pvc.bc" /// ########################################################################### /// test behavior of linking libsycl-asan-cpu for CPU target AOT compilation when asan flag is applied. @@ -128,7 +128,7 @@ // SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_ASAN_CPU-SAME: {{.*}}libsycl-asan-cpu.bc +// SYCL_DEVICE_LIB_ASAN_CPU-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan-cpu.bc" /// ########################################################################### /// test behavior of linking libsycl-asan-dg2 for DG2 target AOT compilation when asan flag is applied. @@ -159,7 +159,7 @@ // SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_ASAN_DG2-SAME: {{.*}}libsycl-asan-dg2.bc +// SYCL_DEVICE_LIB_ASAN_DG2-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan-dg2.bc" /// ########################################################################### /// test behavior of linking libsycl-asan for multiple targets AOT compilation @@ -186,7 +186,7 @@ // SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_ASAN_MUL-SAME: {{.*}}libsycl-asan.bc +// SYCL_DEVICE_LIB_ASAN_MUL-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-asan.bc" /// ########################################################################### /// test behavior of libsycl-msan.o linking when -fsanitize=memory is available @@ -216,22 +216,22 @@ // SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_MSAN-SAME: {{.*}}libsycl-msan.bc +// SYCL_DEVICE_LIB_MSAN-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-msan.bc" // RUN: %clangxx -fsycl --offload-new-driver %s --sysroot=%S/Inputs/SYCL -Xarch_device "-fsanitize=memory -DUSE_SYCL_DEVICE_MSAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_MSAN_MACRO -// SYCL_DEVICE_MSAN_MACRO: clang{{.*}} {{.*}}libsycl-msan.bc +// SYCL_DEVICE_MSAN_MACRO: clang{{.*}} "-mlink-bitcode-file" "{{.*}}libsycl-msan.bc" // SYCL_DEVICE_MSAN_MACRO-SAME: "USE_SYCL_DEVICE_MSAN" /// test behavior of msan libdevice linking when -fsanitize=memory is available for AOT targets // RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -fsanitize=memory -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_MSAN_PVC -// SYCL_DEVICE_LIB_MSAN_PVC: clang{{.*}} "{{.*}}libsycl-msan-pvc.bc" +// SYCL_DEVICE_LIB_MSAN_PVC: clang{{.*}} "-mlink-bitcode-file" "{{.*}}libsycl-msan-pvc.bc" /// test behavior of msan libdevice linking when -fsanitize=memory is available for AOT targets // RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64 --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -fsanitize=memory -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_MSAN_CPU -// SYCL_DEVICE_LIB_MSAN_CPU: clang{{.*}} "{{.*}}libsycl-msan-cpu.bc" +// SYCL_DEVICE_LIB_MSAN_CPU: clang{{.*}} "-mlink-bitcode-file" "{{.*}}libsycl-msan-cpu.bc" /// ########################################################################### /// test behavior of libsycl-tsan.o linking when -fsanitize=thread is available @@ -261,19 +261,19 @@ // SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-imf.bc // SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-imf-fp64.bc // SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-fallback-imf-bf16.bc -// SYCL_DEVICE_LIB_TSAN-SAME: {{.*}}libsycl-tsan.bc +// SYCL_DEVICE_LIB_TSAN-SAME: "-mlink-bitcode-file" "{{.*}}libsycl-tsan.bc" // RUN: %clangxx -fsycl --offload-new-driver %s --sysroot=%S/Inputs/SYCL -Xarch_device "-fsanitize=thread -DUSE_SYCL_DEVICE_TSAN" -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_TSAN_MACRO -// SYCL_DEVICE_TSAN_MACRO: clang{{.*}} "{{.*}}libsycl-tsan.bc" +// SYCL_DEVICE_TSAN_MACRO: clang{{.*}} "-mlink-bitcode-file" "{{.*}}libsycl-tsan.bc" // SYCL_DEVICE_TSAN_MACRO-SAME: "USE_SYCL_DEVICE_TSAN" /// test behavior of tsan libdevice linking when -fsanitize=thread is available for AOT targets // RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -fsanitize=thread -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_TSAN_PVC -// SYCL_DEVICE_LIB_TSAN_PVC: clang{{.*}} "{{.*}}libsycl-tsan-pvc.bc" +// SYCL_DEVICE_LIB_TSAN_PVC: clang{{.*}} "-mlink-bitcode-file" "{{.*}}libsycl-tsan-pvc.bc" /// test behavior of tsan libdevice linking when -fsanitize=thread is available for AOT targets // RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64 --offload-new-driver %s --sysroot=%S/Inputs/SYCL \ // RUN: -fsanitize=thread -### 2>&1 | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_TSAN_CPU -// SYCL_DEVICE_LIB_TSAN_CPU: clang{{.*}} "{{.*}}libsycl-tsan-cpu.bc" +// SYCL_DEVICE_LIB_TSAN_CPU: clang{{.*}} "-mlink-bitcode-file" "{{.*}}libsycl-tsan-cpu.bc" From 5dbc786f11cc49ae81b2f08dabf84373a14c566a Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Wed, 11 Mar 2026 17:03:33 -0700 Subject: [PATCH 16/19] clang format --- clang/lib/Driver/ToolChains/SYCL.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index d7ad4d60d50ce..6095679f502e3 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -628,8 +628,7 @@ SYCLToolChain::getDeviceLibNames(const Driver &D, } // Get the list of SYCL device library names associated with the sanitizers. -SmallVector -SYCLToolChain::getDeviceSanitizerLibNames( +SmallVector SYCLToolChain::getDeviceSanitizerLibNames( const llvm::opt::ArgList &Args) const { SmallVector LibraryList; bool NoOffloadLib = From b9ca113cc72b66dc02050be3c1eae50bd3094eb4 Mon Sep 17 00:00:00 2001 From: jinge90 Date: Wed, 11 Mar 2026 23:16:08 -0700 Subject: [PATCH 17/19] apply inline to device globals in libdevice Signed-off-by: jinge90 --- libdevice/crt_wrapper.cpp | 2 +- libdevice/sanitizer/msan_rtl.cpp | 2 +- libdevice/sanitizer/tsan_rtl.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libdevice/crt_wrapper.cpp b/libdevice/crt_wrapper.cpp index 6387051c7064f..8f5e7017bfb57 100644 --- a/libdevice/crt_wrapper.cpp +++ b/libdevice/crt_wrapper.cpp @@ -13,7 +13,7 @@ #include #define RAND_NEXT_LEN 1024 -DeviceGlobal RandNext; +inline DeviceGlobal RandNext; #ifdef __LIBDEVICE_TARGET_SUPPORT DEVICE_EXTERN_C_INLINE diff --git a/libdevice/sanitizer/msan_rtl.cpp b/libdevice/sanitizer/msan_rtl.cpp index 128b63fcd698c..63b8ec72725da 100644 --- a/libdevice/sanitizer/msan_rtl.cpp +++ b/libdevice/sanitizer/msan_rtl.cpp @@ -9,7 +9,7 @@ #include "include/msan_rtl.hpp" #include "msan/msan_libdevice.hpp" -DeviceGlobal __MsanLaunchInfo; +inline DeviceGlobal __MsanLaunchInfo; #define GetMsanLaunchInfo \ ((__SYCL_GLOBAL__ MsanRuntimeData *)__MsanLaunchInfo.get()) diff --git a/libdevice/sanitizer/tsan_rtl.cpp b/libdevice/sanitizer/tsan_rtl.cpp index 704ca581ea4bb..3c93ab93f0512 100644 --- a/libdevice/sanitizer/tsan_rtl.cpp +++ b/libdevice/sanitizer/tsan_rtl.cpp @@ -8,7 +8,7 @@ #include "include/tsan_rtl.hpp" -DeviceGlobal __TsanLaunchInfo; +inline DeviceGlobal __TsanLaunchInfo; #define TsanLaunchInfo \ ((__SYCL_GLOBAL__ TsanRuntimeData *)__TsanLaunchInfo.get()) From 6113685aae334264a91af22515329715f700584b Mon Sep 17 00:00:00 2001 From: jinge90 Date: Thu, 12 Mar 2026 00:14:26 -0700 Subject: [PATCH 18/19] use weak to replace inline to bypass CPU bug Signed-off-by: jinge90 --- libdevice/crt_wrapper.cpp | 2 +- libdevice/sanitizer/msan_rtl.cpp | 2 +- libdevice/sanitizer/tsan_rtl.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libdevice/crt_wrapper.cpp b/libdevice/crt_wrapper.cpp index 8f5e7017bfb57..ce0f8c9cbf4f6 100644 --- a/libdevice/crt_wrapper.cpp +++ b/libdevice/crt_wrapper.cpp @@ -13,7 +13,7 @@ #include #define RAND_NEXT_LEN 1024 -inline DeviceGlobal RandNext; +__attribute__((weak)) DeviceGlobal RandNext; #ifdef __LIBDEVICE_TARGET_SUPPORT DEVICE_EXTERN_C_INLINE diff --git a/libdevice/sanitizer/msan_rtl.cpp b/libdevice/sanitizer/msan_rtl.cpp index 63b8ec72725da..578d174b00699 100644 --- a/libdevice/sanitizer/msan_rtl.cpp +++ b/libdevice/sanitizer/msan_rtl.cpp @@ -9,7 +9,7 @@ #include "include/msan_rtl.hpp" #include "msan/msan_libdevice.hpp" -inline DeviceGlobal __MsanLaunchInfo; +__attribute__((weak)) inline DeviceGlobal __MsanLaunchInfo; #define GetMsanLaunchInfo \ ((__SYCL_GLOBAL__ MsanRuntimeData *)__MsanLaunchInfo.get()) diff --git a/libdevice/sanitizer/tsan_rtl.cpp b/libdevice/sanitizer/tsan_rtl.cpp index 3c93ab93f0512..51ea884c2c3ab 100644 --- a/libdevice/sanitizer/tsan_rtl.cpp +++ b/libdevice/sanitizer/tsan_rtl.cpp @@ -8,7 +8,7 @@ #include "include/tsan_rtl.hpp" -inline DeviceGlobal __TsanLaunchInfo; +__attribute__((weak)) DeviceGlobal __TsanLaunchInfo; #define TsanLaunchInfo \ ((__SYCL_GLOBAL__ TsanRuntimeData *)__TsanLaunchInfo.get()) From 975ac133a75b59831a4a26ffef5207d6965e5949 Mon Sep 17 00:00:00 2001 From: jinge90 Date: Thu, 12 Mar 2026 00:48:41 -0700 Subject: [PATCH 19/19] remove unneeded inline Signed-off-by: jinge90 --- libdevice/sanitizer/msan_rtl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libdevice/sanitizer/msan_rtl.cpp b/libdevice/sanitizer/msan_rtl.cpp index 578d174b00699..9f4c3af704ea7 100644 --- a/libdevice/sanitizer/msan_rtl.cpp +++ b/libdevice/sanitizer/msan_rtl.cpp @@ -9,7 +9,7 @@ #include "include/msan_rtl.hpp" #include "msan/msan_libdevice.hpp" -__attribute__((weak)) inline DeviceGlobal __MsanLaunchInfo; +__attribute__((weak)) DeviceGlobal __MsanLaunchInfo; #define GetMsanLaunchInfo \ ((__SYCL_GLOBAL__ MsanRuntimeData *)__MsanLaunchInfo.get())