[clang] e422530 - [Driver][SYCL] Link libclang_rt.builtins.bc for spirv64 at compile time via getDeviceLibs (#218528)

via cfe-commits cfe-commits at lists.llvm.org
Sat Oct 24 13:22:33 PDT 2026


Author: Srividya Sundaram
Date: 2026-10-24T13:22:28-07:00
New Revision: e4225302cd112b4f72bb33374f5f800cb7be8d09

URL: https://github.com/llvm/llvm-project/commit/e4225302cd112b4f72bb33374f5f800cb7be8d09
DIFF: https://github.com/llvm/llvm-project/commit/e4225302cd112b4f72bb33374f5f800cb7be8d09.diff

LOG: [Driver][SYCL] Link libclang_rt.builtins.bc for spirv64 at compile time via getDeviceLibs (#218528)

Add support for linking `libclang_rt.builtins.bc` for the `spirv64`
target at compile time by integrating it into the SYCL `getDeviceLibs`
mechanism. This ensures built-in runtime library functions are available
for SYCL device code targeting `SPIR-V` 64-bit.

Re-land of https://github.com/llvm/llvm-project/pull/212550 (Only Clang
Driver changes)

---------

Co-authored-by: Claude Sonnet 4.6 <noreply at anthropic.com>

Added: 
    clang/test/Driver/Inputs/spirv64-sycl-flat-layout/lib/linux/libclang_rt.builtins-spirv64.bc
    clang/test/Driver/Inputs/spirv64-sycl/lib/spirv64-unknown-unknown/libclang_rt.builtins.bc
    clang/test/Driver/sycl-device-lib-spirv64.cpp

Modified: 
    clang/include/clang/Basic/DiagnosticDriverKinds.td
    clang/include/clang/Driver/Driver.h
    clang/lib/Driver/Driver.cpp
    clang/lib/Driver/ToolChain.cpp
    clang/lib/Driver/ToolChains/CommonArgs.cpp
    clang/lib/Driver/ToolChains/SYCL.cpp
    clang/lib/Driver/ToolChains/SYCL.h
    clang/test/Driver/sycl-msvc-version-propagation.cpp
    clang/test/Driver/sycl-nordc-fatbin.cpp
    clang/test/Driver/sycl-offload-jit-unix.cpp
    clang/test/Driver/sycl-offload-jit-xarch.cpp
    clang/test/Driver/sycl-offload-jit.cpp
    clang/test/Driver/sycl-rtlib-sysroot-mismatch.cpp
    clang/test/Driver/sycl-std-default.cpp
    clang/test/Driver/sycl-windows.cpp
    clang/test/Driver/sycl.cpp

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 79859e724a8179..c5836a2012ab69 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -449,7 +449,10 @@ def warn_drv_fraw_string_literals_in_cxx11 : Warning<
   "ignoring '-f%select{no-|}0raw-string-literals', which is only valid for C and C++ standards before C++11">,
   InGroup<UnusedCommandLineArgument>;
 
-def err_drv_libclc_not_found : Error<"no libclc library '%0' found in the clang resource directory">;
+def err_drv_device_lib_not_found : Error<
+  "no %select{libclc|compiler-rt builtins bitcode}0 library '%1' found in the "
+  "clang resource directory%select{|; build compiler-rt with SPIR-V support or "
+  "pass '--no-offloadlib' to compile without it}0">;
 
 def err_drv_invalid_malign_branch_EQ : Error<
   "invalid argument '%0' to -malign-branch=; each element must be one of: %1">;

diff  --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h
index 914ef62cd62fa9..6ba0acacdeaf26 100644
--- a/clang/include/clang/Driver/Driver.h
+++ b/clang/include/clang/Driver/Driver.h
@@ -338,7 +338,7 @@ class Driver {
   // TODO: Much of what getFinalPhase returns are not actually true compiler
   //       modes. Fold this functionality into Types::getCompilationPhases and
   //       handleArguments.
-  phases::ID getFinalPhase(const llvm::opt::DerivedArgList &DAL,
+  phases::ID getFinalPhase(const llvm::opt::ArgList &Args,
                            llvm::opt::Arg **FinalPhaseArg = nullptr) const;
 
   llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>>

diff  --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 707d6847caf446..955443bc142ed4 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -354,52 +354,51 @@ InputArgList Driver::ParseArgStrings(ArrayRef<const char *> ArgStrings,
 // Determine which compilation mode we are in. We look for options which
 // affect the phase, starting with the earliest phases, and record which
 // option we used to determine the final phase.
-phases::ID Driver::getFinalPhase(const DerivedArgList &DAL,
+phases::ID Driver::getFinalPhase(const ArgList &Args,
                                  Arg **FinalPhaseArg) const {
   Arg *PhaseArg = nullptr;
   phases::ID FinalPhase;
 
   // -{E,EP,P,M,MM} only run the preprocessor.
-  if (CCCIsCPP() || (PhaseArg = DAL.getLastArg(options::OPT_E)) ||
-      (PhaseArg = DAL.getLastArg(options::OPT__SLASH_EP)) ||
-      (PhaseArg = DAL.getLastArg(options::OPT_M, options::OPT_MM)) ||
-      (PhaseArg = DAL.getLastArg(options::OPT__SLASH_P)) ||
-      CCGenDiagnostics) {
+  if (CCCIsCPP() || (PhaseArg = Args.getLastArg(options::OPT_E)) ||
+      (PhaseArg = Args.getLastArg(options::OPT__SLASH_EP)) ||
+      (PhaseArg = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
+      (PhaseArg = Args.getLastArg(options::OPT__SLASH_P)) || CCGenDiagnostics) {
     FinalPhase = phases::Preprocess;
 
     // --precompile only runs up to precompilation.
     // Options that cause the output of C++20 compiled module interfaces or
     // header units have the same effect.
-  } else if ((PhaseArg = DAL.getLastArg(options::OPT__precompile)) ||
+  } else if ((PhaseArg = Args.getLastArg(options::OPT__precompile)) ||
              (PhaseArg =
-                  DAL.getLastArg(options::OPT__precompile_reduced_bmi)) ||
-             (PhaseArg = DAL.getLastArg(options::OPT_extract_api)) ||
-             (PhaseArg = DAL.getLastArg(options::OPT_fmodule_header,
-                                        options::OPT_fmodule_header_EQ))) {
+                  Args.getLastArg(options::OPT__precompile_reduced_bmi)) ||
+             (PhaseArg = Args.getLastArg(options::OPT_extract_api)) ||
+             (PhaseArg = Args.getLastArg(options::OPT_fmodule_header,
+                                         options::OPT_fmodule_header_EQ))) {
     FinalPhase = phases::Precompile;
     // -{fsyntax-only,-analyze,emit-ast} only run up to the compiler.
-  } else if ((PhaseArg = DAL.getLastArg(options::OPT_fsyntax_only)) ||
-             (PhaseArg = DAL.getLastArg(options::OPT_print_supported_cpus)) ||
+  } else if ((PhaseArg = Args.getLastArg(options::OPT_fsyntax_only)) ||
+             (PhaseArg = Args.getLastArg(options::OPT_print_supported_cpus)) ||
              (PhaseArg =
-                  DAL.getLastArg(options::OPT_print_enabled_extensions)) ||
-             (PhaseArg = DAL.getLastArg(options::OPT_module_file_info)) ||
-             (PhaseArg = DAL.getLastArg(options::OPT_verify_pch)) ||
-             (PhaseArg = DAL.getLastArg(options::OPT_rewrite_objc)) ||
-             (PhaseArg = DAL.getLastArg(options::OPT_rewrite_legacy_objc)) ||
-             (PhaseArg = DAL.getLastArg(options::OPT__analyze)) ||
-             (PhaseArg = DAL.getLastArg(options::OPT_emit_cir)) ||
-             (PhaseArg = DAL.getLastArg(options::OPT_emit_ast))) {
+                  Args.getLastArg(options::OPT_print_enabled_extensions)) ||
+             (PhaseArg = Args.getLastArg(options::OPT_module_file_info)) ||
+             (PhaseArg = Args.getLastArg(options::OPT_verify_pch)) ||
+             (PhaseArg = Args.getLastArg(options::OPT_rewrite_objc)) ||
+             (PhaseArg = Args.getLastArg(options::OPT_rewrite_legacy_objc)) ||
+             (PhaseArg = Args.getLastArg(options::OPT__analyze)) ||
+             (PhaseArg = Args.getLastArg(options::OPT_emit_cir)) ||
+             (PhaseArg = Args.getLastArg(options::OPT_emit_ast))) {
     FinalPhase = phases::Compile;
 
   // -S only runs up to the backend.
-  } else if ((PhaseArg = DAL.getLastArg(options::OPT_S))) {
+  } else if ((PhaseArg = Args.getLastArg(options::OPT_S))) {
     FinalPhase = phases::Backend;
 
   // -c compilation only runs up to the assembler.
-  } else if ((PhaseArg = DAL.getLastArg(options::OPT_c))) {
+  } else if ((PhaseArg = Args.getLastArg(options::OPT_c))) {
     FinalPhase = phases::Assemble;
 
-  } else if ((PhaseArg = DAL.getLastArg(options::OPT_emit_interface_stubs))) {
+  } else if ((PhaseArg = Args.getLastArg(options::OPT_emit_interface_stubs))) {
     FinalPhase = phases::IfsMerge;
 
     // Otherwise do everything.

diff  --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 242f75af52d7b0..b3e7043a64fe56 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -1137,6 +1137,15 @@ ToolChain::getTargetSubDirPath(StringRef BaseDir) const {
       return *Path;
   }
 
+  // Short SPIR-V spellings like "spirv64" are installed under the three-part
+  // name, "spirv64-unknown-unknown".
+  if (T.isSPIRV()) {
+    llvm::Triple SPIRVTriple(
+        T.normalize(llvm::Triple::CanonicalForm::THREE_IDENT));
+    if (auto Path = getPathForTriple(SPIRVTriple))
+      return *Path;
+  }
+
   if (T.isOSAIX()) {
     llvm::Triple AIXTriple;
     if (T.getEnvironment() == Triple::UnknownEnvironment) {

diff  --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 7d77cd0b916324..39dcec2f823bdd 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -2937,7 +2937,7 @@ bool tools::addOpenCLBuiltinsLib(const Driver &D, const llvm::Triple &TT,
       CC1Args.push_back(DriverArgs.MakeArgString(LibclcFile));
       return true;
     }
-    D.Diag(diag::err_drv_libclc_not_found) << LibclcFile;
+    D.Diag(diag::err_drv_device_lib_not_found) << /*libclc*/ 0 << LibclcFile;
     return false;
   }
 
@@ -3004,7 +3004,7 @@ bool tools::addOpenCLBuiltinsLib(const Driver &D, const llvm::Triple &TT,
       return true;
   }
 
-  D.Diag(diag::err_drv_libclc_not_found) << "libclc.bc";
+  D.Diag(diag::err_drv_device_lib_not_found) << /*libclc*/ 0 << "libclc.bc";
   return false;
 }
 

diff  --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp
index b0c07dd1be2eeb..ec694ff9f151a4 100644
--- a/clang/lib/Driver/ToolChains/SYCL.cpp
+++ b/clang/lib/Driver/ToolChains/SYCL.cpp
@@ -8,6 +8,7 @@
 #include "SYCL.h"
 #include "SPIRV.h"
 #include "clang/Driver/CommonArgs.h"
+#include "llvm/Support/Path.h"
 #include "llvm/Support/VirtualFileSystem.h"
 
 using namespace clang::driver;
@@ -128,6 +129,18 @@ void SYCLToolChain::addClangTargetOptions(
     const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
     BoundArch BA, Action::OffloadKind DeviceOffloadingKind) const {
   HostTC.addClangTargetOptions(DriverArgs, CC1Args, BA, DeviceOffloadingKind);
+
+  // Compilations that stop at or before the compile phase (-E, --precompile,
+  // -fsyntax-only) emit no IR, so they need no device libraries.
+  if (getDriver().getFinalPhase(DriverArgs) <= phases::Compile)
+    return;
+
+  for (const auto &BCFile :
+       getDeviceLibs(DriverArgs, BA, DeviceOffloadingKind)) {
+    CC1Args.push_back(BCFile.ShouldInternalize ? "-mlink-builtin-bitcode"
+                                               : "-mlink-bitcode-file");
+    CC1Args.push_back(DriverArgs.MakeArgStringRef(BCFile.Path));
+  }
 }
 
 llvm::opt::DerivedArgList *
@@ -211,3 +224,30 @@ VersionTuple SYCLToolChain::computeMSVCVersion(const Driver *D,
                                                const ArgList &Args) const {
   return HostTC.computeMSVCVersion(D, Args);
 }
+
+llvm::SmallVector<ToolChain::BitCodeLibraryInfo, 12>
+SYCLToolChain::getDeviceLibs(
+    const llvm::opt::ArgList &DriverArgs, BoundArch /*BA*/,
+    const Action::OffloadKind /*DeviceOffloadingKind*/) const {
+  if (getTriple().getArch() != llvm::Triple::spirv64)
+    return {};
+  if (!DriverArgs.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib,
+                          true))
+    return {};
+  // Per-target layout: lib/<triple>/libclang_rt.builtins.bc.
+  if (std::optional<std::string> RuntimeDir = getRuntimePath()) {
+    SmallString<128> BCPath(*RuntimeDir);
+    llvm::sys::path::append(BCPath, "libclang_rt.builtins.bc");
+    if (getVFS().exists(BCPath))
+      return {{std::string(BCPath), /*ShouldInternalize=*/true}};
+  }
+  // Flat layout (LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF):
+  // lib/<os>/libclang_rt.builtins-spirv64.bc.
+  SmallString<128> BCPath(HostTC.getCompilerRTPath());
+  llvm::sys::path::append(BCPath, "libclang_rt.builtins-spirv64.bc");
+  if (getVFS().exists(BCPath))
+    return {{std::string(BCPath), /*ShouldInternalize=*/true}};
+  getDriver().Diag(diag::err_drv_device_lib_not_found)
+      << /*compiler-rt builtins*/ 1 << BCPath;
+  return {};
+}

diff  --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h
index 969199ef249494..d754544e30d971 100644
--- a/clang/lib/Driver/ToolChains/SYCL.h
+++ b/clang/lib/Driver/ToolChains/SYCL.h
@@ -58,6 +58,10 @@ class LLVM_LIBRARY_VISIBILITY SYCLToolChain : public ToolChain {
   computeMSVCVersion(const Driver *D,
                      const llvm::opt::ArgList &Args) const override;
 
+  llvm::SmallVector<BitCodeLibraryInfo, 12>
+  getDeviceLibs(const llvm::opt::ArgList &Args, BoundArch BA,
+                const Action::OffloadKind DeviceOffloadingKind) const override;
+
 protected:
   Tool *buildLinker() const override;
 

diff  --git a/clang/test/Driver/Inputs/spirv64-sycl-flat-layout/lib/linux/libclang_rt.builtins-spirv64.bc b/clang/test/Driver/Inputs/spirv64-sycl-flat-layout/lib/linux/libclang_rt.builtins-spirv64.bc
new file mode 100644
index 00000000000000..e69de29bb2d1d6

diff  --git a/clang/test/Driver/Inputs/spirv64-sycl/lib/spirv64-unknown-unknown/libclang_rt.builtins.bc b/clang/test/Driver/Inputs/spirv64-sycl/lib/spirv64-unknown-unknown/libclang_rt.builtins.bc
new file mode 100644
index 00000000000000..e69de29bb2d1d6

diff  --git a/clang/test/Driver/sycl-device-lib-spirv64.cpp b/clang/test/Driver/sycl-device-lib-spirv64.cpp
new file mode 100644
index 00000000000000..4ae884bec8c738
--- /dev/null
+++ b/clang/test/Driver/sycl-device-lib-spirv64.cpp
@@ -0,0 +1,57 @@
+// Tests that the SYCL toolchain links libclang_rt.builtins.bc for spirv64
+// via -mlink-builtin-bitcode, that --no-offloadlib suppresses it, and that
+// -nolibsycl does not suppress it (builtins are target infrastructure, not
+// SYCL runtime).
+
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   -resource-dir=%S/Inputs/spirv64-sycl %s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-BUILTIN-BC
+// CHECK-BUILTIN-BC: "-triple" "spirv64-unknown-unknown"
+// CHECK-BUILTIN-BC: "-mlink-builtin-bitcode" "{{.*}}lib{{[/\\]+}}spirv64-unknown-unknown{{[/\\]+}}libclang_rt.builtins.bc"
+
+// A short --offload-targets= spelling finds the same per-target directory.
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   --offload-targets=spirv64 -resource-dir=%S/Inputs/spirv64-sycl %s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-SHORT-TRIPLE
+// CHECK-SHORT-TRIPLE: "-triple" "spirv64"
+// CHECK-SHORT-TRIPLE: "-mlink-builtin-bitcode" "{{.*}}lib{{[/\\]+}}spirv64-unknown-unknown{{[/\\]+}}libclang_rt.builtins.bc"
+
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl --no-offloadlib \
+// RUN:   -resource-dir=%S/Inputs/spirv64-sycl %s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-NO-OFFLOADLIB
+// CHECK-NO-OFFLOADLIB: "-cc1" "-triple" "spirv64-unknown-unknown"
+// CHECK-NO-OFFLOADLIB-NOT: "-mlink-builtin-bitcode"
+
+// -nolibsycl suppresses the SYCL runtime library but NOT compiler-rt builtins.
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl -nolibsycl \
+// RUN:   -resource-dir=%S/Inputs/spirv64-sycl %s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-NOLIBSYCL
+// CHECK-NOLIBSYCL: "-triple" "spirv64-unknown-unknown"
+// CHECK-NOLIBSYCL: "-mlink-builtin-bitcode" "{{.*}}lib{{[/\\]+}}spirv64-unknown-unknown{{[/\\]+}}libclang_rt.builtins.bc"
+
+// Test the flat layout used with LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF:
+// lib/<os>/libclang_rt.builtins-spirv64.bc
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   -resource-dir=%S/Inputs/spirv64-sycl-flat-layout %s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-FLAT-LAYOUT-BC
+// CHECK-FLAT-LAYOUT-BC: "-triple" "spirv64-unknown-unknown"
+// CHECK-FLAT-LAYOUT-BC: "-mlink-builtin-bitcode" "{{.*}}lib{{[/\\]+}}linux{{[/\\]+}}libclang_rt.builtins-spirv64.bc"
+
+// RUN: not %clang -### --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   -resource-dir=%t/nonexistent %s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-MISSING
+// CHECK-MISSING: error: no compiler-rt builtins bitcode library '{{.*}}libclang_rt.builtins{{.*}}.bc' found in the clang resource directory
+
+// Compilations that stop at or before the compile phase never link bitcode, so
+// a missing builtins library is not an error for them.
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl -E \
+// RUN:   -resource-dir=%t/nonexistent %s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-NO-CODEGEN
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl -fsyntax-only \
+// RUN:   -resource-dir=%t/nonexistent %s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-NO-CODEGEN
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl --precompile \
+// RUN:   -resource-dir=%t/nonexistent -x c++-header %s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-NO-CODEGEN
+// CHECK-NO-CODEGEN-NOT: error:
+// CHECK-NO-CODEGEN-NOT: "-mlink-builtin-bitcode"

diff  --git a/clang/test/Driver/sycl-msvc-version-propagation.cpp b/clang/test/Driver/sycl-msvc-version-propagation.cpp
index c542ceef80ade7..1c45a6ff1602a8 100644
--- a/clang/test/Driver/sycl-msvc-version-propagation.cpp
+++ b/clang/test/Driver/sycl-msvc-version-propagation.cpp
@@ -2,6 +2,7 @@
 /// SPIR-V device compilation.
 
 // RUN: %clang -### -fsycl --target=x86_64-pc-windows-msvc \
+// RUN:   -resource-dir=%S/Inputs/spirv64-sycl \
 // RUN:   -x c++ %s 2>&1 | FileCheck %s
 
 // CHECK: "-triple" "spirv64-unknown-unknown"

diff  --git a/clang/test/Driver/sycl-nordc-fatbin.cpp b/clang/test/Driver/sycl-nordc-fatbin.cpp
index 6bc75a27f49fcd..e6652d91911aa0 100644
--- a/clang/test/Driver/sycl-nordc-fatbin.cpp
+++ b/clang/test/Driver/sycl-nordc-fatbin.cpp
@@ -1,23 +1,27 @@
 // REQUIRES: spirv-registered-target, x86-registered-target
 
 /// Verify which section carries the SYCL device binary in the host object.
-// RUN: %clangxx --target=x86_64-unknown-linux-gnu -fsycl -fno-gpu-rdc \
+// RUN: %clangxx --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   --no-offloadlib -fno-gpu-rdc \
 // RUN:   -c %s -o %t.nordc.o
 // RUN: llvm-readelf -S %t.nordc.o \
 // RUN:   | FileCheck -check-prefix=NORDC %s --implicit-check-not='.llvm.offloading'
 
-// RUN: %clangxx --target=x86_64-unknown-linux-gnu -fsycl -fgpu-rdc \
+// RUN: %clangxx --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   --no-offloadlib -fgpu-rdc \
 // RUN:   -c %s -o %t.rdc.o
 // RUN: llvm-readelf -S %t.rdc.o \
 // RUN:   | FileCheck -check-prefix=RDC %s --implicit-check-not='.sycl_fatbin'
 
 /// The choice does not depend on the object format.
-// RUN: %clangxx --target=x86_64-pc-windows-msvc -fsycl -fno-gpu-rdc \
+// RUN: %clangxx --target=x86_64-pc-windows-msvc -fsycl \
+// RUN:   --no-offloadlib -fno-gpu-rdc \
 // RUN:   -c %s -o %t.nordc.obj
 // RUN: llvm-readobj --sections %t.nordc.obj \
 // RUN:   | FileCheck -check-prefix=NORDC %s --implicit-check-not='.llvm.offloading'
 
-// RUN: %clangxx --target=x86_64-pc-windows-msvc -fsycl -fgpu-rdc \
+// RUN: %clangxx --target=x86_64-pc-windows-msvc -fsycl \
+// RUN:   --no-offloadlib -fgpu-rdc \
 // RUN:   -c %s -o %t.rdc.obj
 // RUN: llvm-readobj --sections %t.rdc.obj \
 // RUN:   | FileCheck -check-prefix=RDC %s --implicit-check-not='.sycl_fatbin'

diff  --git a/clang/test/Driver/sycl-offload-jit-unix.cpp b/clang/test/Driver/sycl-offload-jit-unix.cpp
index 34812576f78746..c6d78a189ac56c 100644
--- a/clang/test/Driver/sycl-offload-jit-unix.cpp
+++ b/clang/test/Driver/sycl-offload-jit-unix.cpp
@@ -10,7 +10,8 @@
 // RUN: rm -rf %t && mkdir -p %t/bin %t/lib/x86_64-unknown-linux-gnu
 // RUN: touch %t/lib/x86_64-unknown-linux-gnu/libLLVMSYCL.so
 // RUN: ln -s %clang %t/bin/clang
-// RUN: %t/bin/clang -### -no-canonical-prefixes --target=x86_64-unknown-linux-gnu -fsycl %s 2>&1 \
+// RUN: %t/bin/clang -### -no-canonical-prefixes --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   -resource-dir=%S/Inputs/spirv64-sycl %s 2>&1 \
 // RUN:   | FileCheck -check-prefixes=CHECK-LSYCL,CHECK-SYCL-HEADERS-HOST,CHECK-SYCL-HEADERS-DEVICE %s
 // CHECK-SYCL-HEADERS-DEVICE: "-fsycl-is-device"{{.*}} "-internal-isystem" "{{.*}}bin{{[/\\]+}}..{{[/\\]+}}include"
 // CHECK-SYCL-HEADERS-HOST: "-fsycl-is-host"{{.*}} "-internal-isystem" "{{.*}}bin{{[/\\]+}}..{{[/\\]+}}include"
@@ -20,7 +21,8 @@
 // RUN: rm -rf %t && mkdir -p %t/bin %t/lib
 // RUN: touch %t/lib/libLLVMSYCL.so
 // RUN: ln -s %clang %t/bin/clang
-// RUN: %t/bin/clang -### -no-canonical-prefixes --target=x86_64-unknown-linux-gnu -fsycl %s 2>&1 \
+// RUN: %t/bin/clang -### -no-canonical-prefixes --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   -resource-dir=%S/Inputs/spirv64-sycl %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-LSYCL-FLAT %s
 // CHECK-LSYCL-FLAT: clang-linker-wrapper{{.*}} "{{.*}}bin{{[/\\]+}}..{{[/\\]+}}lib{{[/\\]+}}libLLVMSYCL.so"
 
@@ -28,6 +30,7 @@
 // RUN: rm -rf %t && mkdir -p %t/bin %t/lib/x86_64-unknown-linux-gnu
 // RUN: touch %t/lib/x86_64-unknown-linux-gnu/libLLVMSYCL.so
 // RUN: ln -s %clang %t/bin/clang
-// RUN: %t/bin/clang -### -no-canonical-prefixes --target=x86_64-unknown-linux-gnu -fsycl -nolibsycl %s 2>&1 \
+// RUN: %t/bin/clang -### -no-canonical-prefixes --target=x86_64-unknown-linux-gnu -fsycl -nolibsycl \
+// RUN:   -resource-dir=%S/Inputs/spirv64-sycl %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-NOLIBSYCL %s
 // CHECK-NOLIBSYCL-NOT: libLLVMSYCL.so

diff  --git a/clang/test/Driver/sycl-offload-jit-xarch.cpp b/clang/test/Driver/sycl-offload-jit-xarch.cpp
index 53af2b16a33f1b..6801cb5e6da9bc 100644
--- a/clang/test/Driver/sycl-offload-jit-xarch.cpp
+++ b/clang/test/Driver/sycl-offload-jit-xarch.cpp
@@ -2,12 +2,14 @@
 
 // Verify that -Xarch_spirv64 forwards options to the SYCL device compilation
 // and clang-linker-wrapper call.
-// RUN: %clang -fsycl --offload-targets=spirv64-unknown-unknown -Xarch_spirv64 -O3 -### %s 2>&1 \
+// RUN: %clang -fsycl --no-offloadlib \
+// RUN:   --offload-targets=spirv64-unknown-unknown -Xarch_spirv64 -O3 -### %s 2>&1 \
 // RUN: | FileCheck -check-prefix=SYCL-DEVICE-O3 %s
 // SYCL-DEVICE-O3: "-triple" "spirv64-unknown-unknown" "-aux-triple" "{{.*}}" "-O3"{{.*}} "-fsycl-is-device"
 // SYCL-DEVICE-O3: {{"[^"]*clang-linker-wrapper[^"]*".* "--device-compiler=spirv64-unknown-unknown=-O3"}}
 
 // Verify that `-Xarch_spirv64` forwards libraries to the device linker.
-// RUN: %clang -fsycl --offload-targets=spirv64-unknown-unknown -Xarch_spirv64 -Wl,-lfoo -### %s 2>&1 \
+// RUN: %clang -fsycl --no-offloadlib \
+// RUN:   --offload-targets=spirv64-unknown-unknown -Xarch_spirv64 -Wl,-lfoo -### %s 2>&1 \
 // RUN: | FileCheck -check-prefix=DEVICE-LINKER %s
 // DEVICE-LINKER: {{"[^"]*clang-linker-wrapper[^"]*".* "--device-linker=spirv64-unknown-unknown=-lfoo"}}

diff  --git a/clang/test/Driver/sycl-offload-jit.cpp b/clang/test/Driver/sycl-offload-jit.cpp
index 82733ccd2bc6f2..6060bc4632f5d7 100644
--- a/clang/test/Driver/sycl-offload-jit.cpp
+++ b/clang/test/Driver/sycl-offload-jit.cpp
@@ -21,7 +21,8 @@
 
 /// Check expected default values for device compilation when using -fsycl as
 /// well as llvm-offload-binary inputs.
-// RUN: %clang -### -fsycl -c --target=x86_64-unknown-linux-gnu %s 2>&1 \
+// RUN: %clang -### -fsycl --no-offloadlib \
+// RUN:   -c --target=x86_64-unknown-linux-gnu %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-DEVICE-TRIPLE %s
 // CHK-DEVICE-TRIPLE: "-cc1"{{.*}} "-triple" "spirv64-unknown-unknown"
 // CHK-DEVICE-TRIPLE-SAME: "-aux-triple" "x86_64-unknown-linux-gnu"
@@ -36,22 +37,23 @@
 
 /// Check -fsycl-is-device is passed when compiling for the device.
 /// Check -fsycl-is-host is passed when compiling for host.
-// RUN: %clang -### -fsycl -c %s 2>&1 \
+// RUN: %clang -### -fsycl --no-offloadlib -c %s 2>&1 \
 // RUN:   | FileCheck -check-prefixes=CHK-FSYCL-IS-DEVICE,CHK-FSYCL-IS-HOST %s
-// RUN: %clang -### -fsycl -fsycl-device-only %s 2>&1 \
+// RUN: %clang -### -fsycl --no-offloadlib -fsycl-device-only %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-FSYCL-IS-DEVICE %s
-// RUN: %clang_cl -### -fsycl -c -- %s 2>&1 \
+// RUN: %clang_cl -### -fsycl --no-offloadlib -c -- %s 2>&1 \
 // RUN:   | FileCheck -check-prefixes=CHK-FSYCL-IS-DEVICE,CHK-FSYCL-IS-HOST %s
-// RUN: %clang -### -fsycl -fsycl-host-only %s 2>&1 \
+// RUN: %clang -### -fsycl --no-offloadlib -fsycl-host-only %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-FSYCL-IS-HOST %s
 // CHK-FSYCL-IS-DEVICE: "-cc1"{{.*}} "-fsycl-is-device" {{.*}} "-emit-llvm-bc"
 // CHK-FSYCL-IS-HOST: "-cc1"{{.*}} "-fsycl-is-host"
 
 /// Check that -S with a device-only compilation produces textual SPIR-V, while
 /// -S -emit-llvm continues to produce textual LLVM IR.
-// RUN: %clang -### -fsycl -fsycl-device-only -S %s 2>&1 \
+// RUN: %clang -### -fsycl --no-offloadlib -fsycl-device-only -S %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-DEVICE-ONLY-ASM %s
-// RUN: %clang -### -fsycl -fsycl-device-only -S -emit-llvm %s 2>&1 \
+// RUN: %clang -### -fsycl \
+// RUN:   --no-offloadlib -fsycl-device-only -S -emit-llvm %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-DEVICE-ONLY-LL %s
 // CHK-DEVICE-ONLY-ASM: "-cc1"{{.*}} "-fsycl-is-device"
 // CHK-DEVICE-ONLY-ASM-NOT: "-emit-llvm"
@@ -63,11 +65,11 @@
 /// Check that SYCL compilation defaults to relocatable device code (-fgpu-rdc
 /// is passed to both the device and the host -cc1 invocation) and that
 /// -fno-gpu-rdc disables it.
-// RUN: %clang -### -fsycl -c %s 2>&1 \
+// RUN: %clang -### -fsycl --no-offloadlib -c %s 2>&1 \
 // RUN:   | FileCheck -check-prefixes=CHK-SYCL-RDC,CHK-SYCL-RDC-HOST %s
-// RUN: %clang -### -fsycl -fgpu-rdc -c %s 2>&1 \
+// RUN: %clang -### -fsycl --no-offloadlib -fgpu-rdc -c %s 2>&1 \
 // RUN:   | FileCheck -check-prefixes=CHK-SYCL-RDC,CHK-SYCL-RDC-HOST %s
-// RUN: %clang -### -fsycl -fno-gpu-rdc -c %s 2>&1 \
+// RUN: %clang -### -fsycl --no-offloadlib -fno-gpu-rdc -c %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-SYCL-NORDC %s
 // CHK-SYCL-RDC: "-cc1"{{.*}} "-fsycl-is-device" {{.*}} "-fgpu-rdc"
 // CHK-SYCL-RDC-HOST: "-cc1"{{.*}} "-fsycl-is-host" {{.*}} "-fgpu-rdc"
@@ -96,13 +98,15 @@
 // CHK-PHASES-NORDC-ARCHS-NEXT: 14: clang-linker-wrapper, {13}, sycl-fatbin, (device-sycl)
 
 /// Multiple device triples are not supported today in non-RDC mode.
-// RUN: not %clang -### --target=x86_64-unknown-linux-gnu -fsycl -fno-gpu-rdc \
+// RUN: not %clang -### --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   --no-offloadlib -fno-gpu-rdc \
 // RUN:   --offload-targets=spirv64-unknown-unknown,spirv32-unknown-unknown -c %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-NORDC-MULTI-TRIPLE %s
 // CHK-NORDC-MULTI-TRIPLE: error: '-fno-gpu-rdc' is not supported with multiple SYCL offloading targets
 
 /// Multiple device triples are supported in RDC mode.
-// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl -fgpu-rdc \
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   --no-offloadlib -fgpu-rdc \
 // RUN:   --offload-targets=spirv64-unknown-unknown,spirv32-unknown-unknown -c %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-RDC-MULTI-TRIPLE %s
 // CHK-RDC-MULTI-TRIPLE-NOT: error:
@@ -110,7 +114,8 @@
 // CHK-RDC-MULTI-TRIPLE: "-cc1" "-triple" "spirv64-unknown-unknown"{{.*}} "-fsycl-is-device"
 
 /// A single target repeated is one target.
-// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl -fno-gpu-rdc \
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   --no-offloadlib -fno-gpu-rdc \
 // RUN:   --offload-targets=spirv64-unknown-unknown,spirv64-unknown-unknown -c %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-NORDC-DUP-TRIPLE %s
 // CHK-NORDC-DUP-TRIPLE-NOT: error:
@@ -119,21 +124,22 @@
 /// Check that in non-RDC mode clang-linker-wrapper finalizes the packaged
 /// device images into a fat binary rather than a host object, and that the
 /// binary is included into the host compilation via -foffload-include-binary.
-// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl -fno-gpu-rdc -c %s 2>&1 \
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl --no-offloadlib -fno-gpu-rdc -c %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-NORDC-INCLUDE %s \
 // RUN:     --implicit-check-not='"-fembed-offload-object='
 // CHK-NORDC-INCLUDE: clang-linker-wrapper{{.*}} "--linker-path={{.*}}clang-sycl-linker" "--emit-fatbin-only" "-o" "[[FB:.*]].syclfb"
 // CHK-NORDC-INCLUDE: "-cc1"{{.*}} "-fsycl-is-host"{{.*}} "-foffload-include-binary" "[[FB]].syclfb"
 
 /// Conversely, RDC mode embeds unlinked device code via -fembed-offload-object.
-// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl -fgpu-rdc %s 2>&1 \
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   --no-offloadlib -fgpu-rdc %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-RDC-EMBED %s \
 // RUN:     --implicit-check-not='"-foffload-include-binary"' \
 // RUN:     --implicit-check-not='"--emit-fatbin-only"'
 // CHK-RDC-EMBED: "-cc1"{{.*}} "-fsycl-is-host"{{.*}} "-fembed-offload-object=
 
 /// -v reaches the per-TU device finalize and the wrapper itself.
-// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl -fno-gpu-rdc -v -c %s 2>&1 \
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl --no-offloadlib -fno-gpu-rdc -v -c %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-NORDC-VERBOSE %s
 // CHK-NORDC-VERBOSE: clang-linker-wrapper{{.*}} "--device-compiler=spirv64-unknown-unknown=-v"
 // CHK-NORDC-VERBOSE-SAME: "--wrapper-verbose"
@@ -143,10 +149,12 @@
 /// per-TU device finalize to llvm-lto, which would write bitcode where a
 /// finalized device image is expected; the device link is unaffected and the
 /// binary is still included at compile time.
-// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl -fno-gpu-rdc \
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   --no-offloadlib -fno-gpu-rdc \
 // RUN:   -flto -c %s 2>&1 | FileCheck -check-prefix=CHK-NORDC-LTO %s \
 // RUN:     --implicit-check-not=llvm-lto
-// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl -fno-gpu-rdc \
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   --no-offloadlib -fno-gpu-rdc \
 // RUN:   -flto %s 2>&1 | FileCheck -check-prefix=CHK-NORDC-LTO %s \
 // RUN:     --implicit-check-not=llvm-lto
 // CHK-NORDC-LTO: clang-linker-wrapper{{.*}} "--linker-path={{.*}}clang-sycl-linker" "--emit-fatbin-only"
@@ -154,29 +162,35 @@
 
 // Check that --allow-partial-linkage and --create-library are not passed to
 // clang-linker-wrapper for SYCL (they are spirv-link flags, not clang-sycl-linker flags).
-// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl %s 2>&1 \
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   --no-offloadlib %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-NO-SPIRVLINK-FLAGS %s
 // CHECK-NO-SPIRVLINK-FLAGS-NOT: --device-linker=spirv64-unknown-unknown=--allow-partial-linkage
 // CHECK-NO-SPIRVLINK-FLAGS-NOT: --device-linker=spirv64-unknown-unknown=--create-library
 
 /// Check -fsycl-device-image-split= is forwarded to clang-sycl-linker as the
 /// corresponding --module-split-mode= value.
-// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl -fsycl-device-image-split=kernel %s 2>&1 \
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl --no-offloadlib \
+// RUN:   -fsycl-device-image-split=kernel %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-SPLIT-KERNEL %s
 // CHK-SPLIT-KERNEL: clang-linker-wrapper{{.*}}"--device-linker=spirv64-unknown-unknown=--module-split-mode=kernel"
-// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl -fsycl-device-image-split=translation_unit %s 2>&1 \
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl --no-offloadlib \
+// RUN:   -fsycl-device-image-split=translation_unit %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-SPLIT-TU %s
 // CHK-SPLIT-TU: clang-linker-wrapper{{.*}}"--device-linker=spirv64-unknown-unknown=--module-split-mode=translation_unit"
-// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl -fsycl-device-image-split=link_unit %s 2>&1 \
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl --no-offloadlib \
+// RUN:   -fsycl-device-image-split=link_unit %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-SPLIT-LU %s
 // CHK-SPLIT-LU: clang-linker-wrapper{{.*}}"--device-linker=spirv64-unknown-unknown=--module-split-mode=link_unit"
 
 /// Check the bare -fsycl-device-image-split flag aliases to 'translation_unit'.
-// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl -fsycl-device-image-split %s 2>&1 \
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl --no-offloadlib \
+// RUN:   -fsycl-device-image-split %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-SPLIT-TU %s
 
 /// Check that without -fsycl-device-image-split, no --module-split-mode= is passed.
-// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl %s 2>&1 \
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   --no-offloadlib %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-NO-SPLIT %s
 // CHK-NO-SPLIT-NOT: --module-split-mode=
 
@@ -186,12 +200,15 @@
 // CHK-SPLIT-INVALID: error: invalid value 'bogus' in '-fsycl-device-image-split='
 
 /// Check -fsycl-device-image-split is unused when not linking (e.g. -c).
-// RUN: %clang -### -c --target=x86_64-unknown-linux-gnu -fsycl -fsycl-device-image-split=kernel %s 2>&1 \
+// RUN: %clang -### -c --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   --no-offloadlib \
+// RUN:   -fsycl-device-image-split=kernel %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-SPLIT-UNUSED %s
 // CHK-SPLIT-UNUSED: warning: argument unused during compilation: '-fsycl-device-image-split=kernel'
 
 /// In non-RDC mode the split does happen while compiling.
-// RUN: %clang -### -c --target=x86_64-unknown-linux-gnu -fsycl -fno-gpu-rdc \
+// RUN: %clang -### -c --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   --no-offloadlib -fno-gpu-rdc \
 // RUN:   -fsycl-device-image-split=kernel %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-SPLIT-KERNEL %s \
 // RUN:     --implicit-check-not='argument unused during compilation'

diff  --git a/clang/test/Driver/sycl-rtlib-sysroot-mismatch.cpp b/clang/test/Driver/sycl-rtlib-sysroot-mismatch.cpp
index 87ed4ba1f9ff79..8a339edaeeeca2 100644
--- a/clang/test/Driver/sycl-rtlib-sysroot-mismatch.cpp
+++ b/clang/test/Driver/sycl-rtlib-sysroot-mismatch.cpp
@@ -5,13 +5,15 @@
 // RUN: rm -rf %t && mkdir -p %t/bin %t/lib
 // RUN: touch %t/lib/libLLVMSYCL.so
 // RUN: ln -s %clang %t/bin/clang
-// RUN: %t/bin/clang -### -no-canonical-prefixes --target=x86_64-unknown-linux-gnu -fsycl --sysroot=/nonexistent-prefix %s 2>&1 \
+// RUN: %t/bin/clang -### -no-canonical-prefixes --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   -resource-dir=%S/Inputs/spirv64-sycl --sysroot=/nonexistent-prefix %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-FLAT %s
 
 // RUN: rm -rf %t && mkdir -p %t/bin %t/lib/x86_64-unknown-linux-gnu
 // RUN: touch %t/lib/x86_64-unknown-linux-gnu/libLLVMSYCL.so
 // RUN: ln -s %clang %t/bin/clang
-// RUN: %t/bin/clang -### -no-canonical-prefixes --target=x86_64-unknown-linux-gnu -fsycl --sysroot=/nonexistent-prefix %s 2>&1 \
+// RUN: %t/bin/clang -### -no-canonical-prefixes --target=x86_64-unknown-linux-gnu -fsycl \
+// RUN:   -resource-dir=%S/Inputs/spirv64-sycl --sysroot=/nonexistent-prefix %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-PER-TARGET %s
 
 // CHECK-FLAT: "{{.*}}/bin/../lib/libLLVMSYCL.so"

diff  --git a/clang/test/Driver/sycl-std-default.cpp b/clang/test/Driver/sycl-std-default.cpp
index df377169a39441..ad73522bed1c63 100644
--- a/clang/test/Driver/sycl-std-default.cpp
+++ b/clang/test/Driver/sycl-std-default.cpp
@@ -1,6 +1,6 @@
 // Tests that SYCL defaults to C++17 when no -std= is specified
 
-// RUN: %clangxx -### -fsycl -c %s 2>&1 | FileCheck %s --check-prefixes=CHECK-DEVICE,CHECK-HOST
+// RUN: %clangxx -### -fsycl --no-offloadlib -c %s 2>&1 | FileCheck %s --check-prefixes=CHECK-DEVICE,CHECK-HOST
 
 // CHECK-DEVICE: "-cc1"{{.*}} "-fsycl-is-device"
 // CHECK-DEVICE-SAME: "-std=c++17"
@@ -8,7 +8,7 @@
 // CHECK-HOST-SAME: "-std=c++17"
 
 // Test that explicit -std= overrides the default
-// RUN: %clangxx -### -fsycl -std=c++20 -c %s 2>&1 | FileCheck %s --check-prefixes=CHECK-OVERRIDE-DEVICE,CHECK-OVERRIDE-HOST
+// RUN: %clangxx -### -fsycl --no-offloadlib -std=c++20 -c %s 2>&1 | FileCheck %s --check-prefixes=CHECK-OVERRIDE-DEVICE,CHECK-OVERRIDE-HOST
 
 // CHECK-OVERRIDE-DEVICE: "-cc1"{{.*}} "-fsycl-is-device"
 // CHECK-OVERRIDE-DEVICE-SAME: "-std=c++20"
@@ -34,7 +34,7 @@
 // CHECK-C99-ERROR: error: invalid argument '-std=c99' not allowed with '-fsycl'
 
 // Test on Windows with clang-cl (MSVC mode)
-// RUN: %clang_cl --target=x86_64-pc-windows-msvc -### -fsycl -- %s 2>&1 | FileCheck %s --check-prefixes=CHECK-MSVC-DEVICE,CHECK-MSVC-HOST
+// RUN: %clang_cl --target=x86_64-pc-windows-msvc -### -fsycl --no-offloadlib -- %s 2>&1 | FileCheck %s --check-prefixes=CHECK-MSVC-DEVICE,CHECK-MSVC-HOST
 
 // CHECK-MSVC-DEVICE: "-cc1"{{.*}} "-fsycl-is-device"
 // CHECK-MSVC-DEVICE-SAME: "-std=c++17"
@@ -42,7 +42,7 @@
 // CHECK-MSVC-HOST-SAME: "-std=c++17"
 
 // Test that /std: override works on Windows
-// RUN: %clang_cl --target=x86_64-pc-windows-msvc -### -fsycl /std:c++20 -- %s 2>&1 | FileCheck %s --check-prefixes=CHECK-MSVC-OVERRIDE-DEVICE,CHECK-MSVC-OVERRIDE-HOST
+// RUN: %clang_cl --target=x86_64-pc-windows-msvc -### -fsycl --no-offloadlib /std:c++20 -- %s 2>&1 | FileCheck %s --check-prefixes=CHECK-MSVC-OVERRIDE-DEVICE,CHECK-MSVC-OVERRIDE-HOST
 
 // CHECK-MSVC-OVERRIDE-DEVICE: "-cc1"{{.*}} "-fsycl-is-device"
 // CHECK-MSVC-OVERRIDE-DEVICE-SAME: "-std=c++20"

diff  --git a/clang/test/Driver/sycl-windows.cpp b/clang/test/Driver/sycl-windows.cpp
index f07c05e74c3c7c..e4b26feaa9292c 100644
--- a/clang/test/Driver/sycl-windows.cpp
+++ b/clang/test/Driver/sycl-windows.cpp
@@ -6,7 +6,7 @@
 // -libpath: in linker output.
 
 /// Test 1: /MD (explicit) and release library dependency
-// RUN: %clang_cl -### -fsycl /MD --target=x86_64-pc-windows-msvc -- %s 2>&1 \
+// RUN: %clang_cl -### -fsycl --no-offloadlib /MD --target=x86_64-pc-windows-msvc -- %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-MD %s
 // CHECK-MD: "-cc1"
 // CHECK-MD: "--dependent-lib=LLVMSYCL"
@@ -24,14 +24,14 @@
 // CHECK-MTD-ERROR: error: SYCL requires dynamic C++ runtime
 
 /// Test 4: /MD uses release library
-// RUN: %clang_cl -### -fsycl /MD --target=x86_64-pc-windows-msvc -- %s 2>&1 \
+// RUN: %clang_cl -### -fsycl --no-offloadlib /MD --target=x86_64-pc-windows-msvc -- %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-RELEASE %s
 // CHECK-RELEASE: "-cc1"
 // CHECK-RELEASE: "--dependent-lib=LLVMSYCL"
 // CHECK-RELEASE-NOT: LLVMSYCLd
 
 /// Test 5: /MDd uses debug library
-// RUN: %clang_cl -### -fsycl /MDd --target=x86_64-pc-windows-msvc -- %s 2>&1 \
+// RUN: %clang_cl -### -fsycl --no-offloadlib /MDd --target=x86_64-pc-windows-msvc -- %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-DEBUG %s
 // CHECK-DEBUG: "-cc1"
 // CHECK-DEBUG: "--dependent-lib=LLVMSYCLd"
@@ -44,70 +44,70 @@
 // CHECK-STATIC-ERROR: error: SYCL requires dynamic C++ runtime
 
 /// Test 7: -fms-runtime-lib=dll_dbg uses debug library
-// RUN: %clang_cl -### -fsycl -fms-runtime-lib=dll_dbg \
+// RUN: %clang_cl -### -fsycl --no-offloadlib -fms-runtime-lib=dll_dbg \
 // RUN:   --target=x86_64-pc-windows-msvc -- %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-FLAG-DEBUG %s
 // CHECK-FLAG-DEBUG: "-cc1"
 // CHECK-FLAG-DEBUG: "--dependent-lib=LLVMSYCLd"
 
 /// Test 8: LNK4078 warning is suppressed
-// RUN: %clang_cl -### -fsycl --target=x86_64-pc-windows-msvc -- %s 2>&1 \
+// RUN: %clang_cl -### -fsycl --no-offloadlib --target=x86_64-pc-windows-msvc -- %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-IGNORE %s
 // CHECK-IGNORE: clang-linker-wrapper"
 // CHECK-IGNORE: "/IGNORE:4078"
 
 /// Test 9: -nolibsycl skips library dependency and CRT check
-// RUN: %clang_cl -### -fsycl -nolibsycl /MT \
+// RUN: %clang_cl -### -fsycl -nolibsycl --no-offloadlib /MT \
 // RUN:   --target=x86_64-pc-windows-msvc -- %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-NOLIBSYCL %s
 // CHECK-NOLIBSYCL-NOT: error:
 // CHECK-NOLIBSYCL-NOT: "--dependent-lib=LLVMSYCL"
 
 /// Test 10: Explicit /MD results in correct library
-// RUN: %clang_cl -### -fsycl /MD --target=x86_64-pc-windows-msvc -- %s 2>&1 \
+// RUN: %clang_cl -### -fsycl --no-offloadlib /MD --target=x86_64-pc-windows-msvc -- %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-EXPLICIT-MD %s
 // CHECK-EXPLICIT-MD: "-cc1"
 // CHECK-EXPLICIT-MD: "--dependent-lib=LLVMSYCL"
 
 /// Test 11: Library search path is added at linker stage
-// RUN: %clang_cl -### -fsycl /MD --target=x86_64-pc-windows-msvc -- %s 2>&1 \
+// RUN: %clang_cl -### -fsycl --no-offloadlib /MD --target=x86_64-pc-windows-msvc -- %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-LIBPATH %s
 // CHECK-LIBPATH: clang-linker-wrapper"
 // CHECK-LIBPATH: "-libpath:{{.*}}{{[/\\]+}}lib"
 
 /// Test 12: clang (non-clang-cl) with MSVC target uses -defaultlib:
-// RUN: %clang -### -fsycl -fms-runtime-lib=dll --target=x86_64-pc-windows-msvc -- %s 2>&1 \
+// RUN: %clang -### -fsycl --no-offloadlib -fms-runtime-lib=dll --target=x86_64-pc-windows-msvc -- %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-CLANG-DEFAULTLIB %s
 // CHECK-CLANG-DEFAULTLIB: clang-linker-wrapper"
 // CHECK-CLANG-DEFAULTLIB: "-libpath:{{.*}}{{[/\\]+}}lib"
 // CHECK-CLANG-DEFAULTLIB: "-defaultlib:LLVMSYCL"
 
 /// Test 13: clang with -fms-runtime-lib=dll_dbg uses debug library via -defaultlib:
-// RUN: %clang -### -fsycl -fms-runtime-lib=dll_dbg --target=x86_64-pc-windows-msvc -- %s 2>&1 \
+// RUN: %clang -### -fsycl --no-offloadlib -fms-runtime-lib=dll_dbg --target=x86_64-pc-windows-msvc -- %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-CLANG-DEBUG %s
 // CHECK-CLANG-DEBUG: clang-linker-wrapper"
 // CHECK-CLANG-DEBUG: "-defaultlib:LLVMSYCLd"
 
 /// Test 14: Default CRT behavior - release library when no CRT flag specified
-// RUN: %clang -### -fsycl -fms-runtime-lib=dll --target=x86_64-pc-windows-msvc -- %s 2>&1 \
+// RUN: %clang -### -fsycl --no-offloadlib -fms-runtime-lib=dll --target=x86_64-pc-windows-msvc -- %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-DEFAULT-CRT %s
 // CHECK-DEFAULT-CRT: "-cc1"
 // CHECK-DEFAULT-CRT: "--dependent-lib=LLVMSYCL"
 // CHECK-DEFAULT-CRT-NOT: LLVMSYCLd
 
 /// Test 15: Separate compilation - compile step embeds --dependent-lib in object
-// RUN: %clang -### -fsycl -c -fms-runtime-lib=dll --target=x86_64-pc-windows-msvc -- %s 2>&1 \
+// RUN: %clang -### -fsycl --no-offloadlib -c -fms-runtime-lib=dll --target=x86_64-pc-windows-msvc -- %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-SEP-COMPILE %s
 // CHECK-SEP-COMPILE: "--dependent-lib=LLVMSYCL"
 
 /// Test 16: Separate compilation - link step adds -libpath: and -defaultlib: for pre-compiled object
 // RUN: touch %t.obj
-// RUN: %clang -### -fsycl -fms-runtime-lib=dll --target=x86_64-pc-windows-msvc -- %t.obj 2>&1 \
+// RUN: %clang -### -fsycl --no-offloadlib -fms-runtime-lib=dll --target=x86_64-pc-windows-msvc -- %t.obj 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-SEP-LINK %s
 // CHECK-SEP-LINK: "-libpath:{{.*}}{{[/\\]+}}lib"
 // CHECK-SEP-LINK: "-defaultlib:LLVMSYCL"
 
 /// Test 17: clang (non-clang-cl) with -nolibsycl suppresses -defaultlib:LLVMSYCL
-// RUN: %clang -### -fsycl -nolibsycl -fms-runtime-lib=dll --target=x86_64-pc-windows-msvc -- %s 2>&1 \
+// RUN: %clang -### -fsycl -nolibsycl --no-offloadlib -fms-runtime-lib=dll --target=x86_64-pc-windows-msvc -- %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-CLANG-NOLIBSYCL %s
 // CHECK-CLANG-NOLIBSYCL-NOT: "-defaultlib:LLVMSYCL"

diff  --git a/clang/test/Driver/sycl.cpp b/clang/test/Driver/sycl.cpp
index e78b2a75933232..fdd397579af0fa 100644
--- a/clang/test/Driver/sycl.cpp
+++ b/clang/test/Driver/sycl.cpp
@@ -1,18 +1,18 @@
-// RUN: %clang -### -fsycl -c %s 2>&1 | FileCheck %s --check-prefix=ENABLED
-// RUN: %clang -### -fsycl %s 2>&1 | FileCheck %s --check-prefix=ENABLED
-// RUN: %clang -### -fsycl -sycl-std=1.2.1 %s 2>&1 | FileCheck %s --check-prefix=ENABLED
-// RUN: %clang -### -fsycl -sycl-std=121 %s 2>&1 | FileCheck %s --check-prefix=ENABLED
-// RUN: %clang -### -fsycl -sycl-std=2017 %s 2>&1 | FileCheck %s --check-prefix=ENABLED
-// RUN: %clang -### -fsycl -sycl-std=2020 %s 2>&1 | FileCheck %s --check-prefix=ENABLED
-// RUN: %clang -### -fsycl -sycl-std=sycl-1.2.1 %s 2>&1 | FileCheck %s --check-prefix=ENABLED
-// RUN: %clang -### -fno-sycl -fsycl %s 2>&1 | FileCheck %s --check-prefix=ENABLED
+// RUN: %clang -### -fsycl --no-offloadlib -c %s 2>&1 | FileCheck %s --check-prefix=ENABLED
+// RUN: %clang -### -fsycl --no-offloadlib %s 2>&1 | FileCheck %s --check-prefix=ENABLED
+// RUN: %clang -### -fsycl --no-offloadlib -sycl-std=1.2.1 %s 2>&1 | FileCheck %s --check-prefix=ENABLED
+// RUN: %clang -### -fsycl --no-offloadlib -sycl-std=121 %s 2>&1 | FileCheck %s --check-prefix=ENABLED
+// RUN: %clang -### -fsycl --no-offloadlib -sycl-std=2017 %s 2>&1 | FileCheck %s --check-prefix=ENABLED
+// RUN: %clang -### -fsycl --no-offloadlib -sycl-std=2020 %s 2>&1 | FileCheck %s --check-prefix=ENABLED
+// RUN: %clang -### -fsycl --no-offloadlib -sycl-std=sycl-1.2.1 %s 2>&1 | FileCheck %s --check-prefix=ENABLED
+// RUN: %clang -### -fno-sycl -fsycl --no-offloadlib %s 2>&1 | FileCheck %s --check-prefix=ENABLED
 // RUN: %clang -### -sycl-std=2017 %s 2>&1 | FileCheck %s --check-prefix=DISABLED
-// RUN: %clangxx -### -fsycl %s 2>&1 | FileCheck %s --check-prefix=ENABLED
+// RUN: %clangxx -### -fsycl --no-offloadlib %s 2>&1 | FileCheck %s --check-prefix=ENABLED
 // RUN: %clangxx -### -fno-sycl %s 2>&1 | FileCheck %s --check-prefix=DISABLED
 // RUN: %clangxx -### -fsycl -fno-sycl %s 2>&1 | FileCheck %s --check-prefix=DISABLED
 // RUN: %clangxx -### %s 2>&1 | FileCheck %s --check-prefix=DISABLED
-// RUN: %clang_cl -### -fsycl -sycl-std=2017 -- %s 2>&1 | FileCheck %s --check-prefix=ENABLED
-// RUN: %clang_cl -### -fsycl -- %s 2>&1 | FileCheck %s --check-prefix=ENABLED
+// RUN: %clang_cl -### -fsycl --no-offloadlib -sycl-std=2017 -- %s 2>&1 | FileCheck %s --check-prefix=ENABLED
+// RUN: %clang_cl -### -fsycl --no-offloadlib -- %s 2>&1 | FileCheck %s --check-prefix=ENABLED
 // RUN: %clang_cl -### -- %s 2>&1 | FileCheck %s --check-prefix=DISABLED
 
 // ENABLED: "-cc1"{{.*}} "-fsycl-is-device"
@@ -20,9 +20,9 @@
 // DISABLED-NOT: "-fsycl-is-device"
 // DISABLED-NOT: "-sycl-std="
 
-// RUN: %clang -### -fsycl  %s 2>&1 | FileCheck %s --check-prefix=DEFAULT
-// RUN: %clangxx -### -fsycl %s 2>&1 | FileCheck %s --check-prefix=DEFAULT
-// RUN: %clang_cl -### -fsycl -- %s 2>&1 | FileCheck %s --check-prefix=DEFAULT
+// RUN: %clang -### -fsycl --no-offloadlib %s 2>&1 | FileCheck %s --check-prefix=DEFAULT
+// RUN: %clangxx -### -fsycl --no-offloadlib %s 2>&1 | FileCheck %s --check-prefix=DEFAULT
+// RUN: %clang_cl -### -fsycl --no-offloadlib -- %s 2>&1 | FileCheck %s --check-prefix=DEFAULT
 
 // DEFAULT: "-sycl-std=2020"
 
@@ -32,5 +32,5 @@
 // CHECK-NO-OFFLOADLIB-NOT: warning: unknown argument ignored in clang-cl: '--no-offloadlib'
 
 // Verify that -fsycl with a C input is an error (enforced in the frontend).
-// RUN: not %clang -fsycl -x c %s 2>&1 | FileCheck %s --check-prefix=CHECK-C-INPUT
+// RUN: not %clang -fsycl --no-offloadlib -x c %s 2>&1 | FileCheck %s --check-prefix=CHECK-C-INPUT
 // CHECK-C-INPUT: error: invalid argument 'C' not allowed with '-fsycl'


        


More information about the cfe-commits mailing list