Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 8 additions & 11 deletions clang/lib/Driver/ToolChains/Clang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11735,17 +11735,14 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
}
}

// -sycl-device-libraries=<comma separated list> contains a list of
// file names for fat object files that contain SYCL device library bitcode
// necessary for SYCL offloading that will be linked to the user's device
// code. clang-linker-wrapper uses the value provided to
// -sycl-device-library-location=<dir> to construct the full paths of the
// device libraries.

// On the other hand, --bitcode-library=<triple>=<path to bc file> specifies
// 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.
// Device libraries for SYCL offloading are specified using
// --bitcode-library=<triple>=<path to bc file> for each library.
// The full path must be provided (not relative to
// -sycl-device-library-location).
//
// Note: SPIR/SPIRV device libraries are linked at compile time using
// -mlink-builtin-bitcode, so they are not passed here. Only non-SPIR
// targets (NVPTX, AMD) pass device libraries to clang-linker-wrapper.
SmallVector<std::string, 4> BCLibList;

auto appendToList = [](SmallString<256> &List, const Twine &Arg) {
Expand Down
87 changes: 41 additions & 46 deletions clang/test/Driver/clang-linker-wrapper.cpp

Large diffs are not rendered by default.

5 changes: 3 additions & 2 deletions clang/test/Driver/linker-wrapper-image.c
Original file line number Diff line number Diff line change
Expand Up @@ -265,12 +265,13 @@
// HIP-NEXT: ret void
// HIP-NEXT: }

// RUN: %clang -cc1 -fsycl-is-device -emit-llvm-bc -o %t.sycl.bc %s
// RUN: llvm-offload-binary -o %t.out --image=file=%t.elf.o,kind=sycl,triple=spirv64-unknown-unknown,arch=generic
// RUN: %clang -cc1 %s -triple x86_64-unknown-linux-gnu -emit-obj -o %t.o \
// RUN: -fembed-offload-object=%t.out
// RUN: clang-linker-wrapper --print-wrapped-module --dry-run --host-triple=x86_64-unknown-linux-gnu -sycl-device-libraries=%t.o \
// RUN: clang-linker-wrapper --print-wrapped-module --dry-run --host-triple=x86_64-unknown-linux-gnu --bitcode-library=spirv64-unknown-unknown=%t.sycl.bc \
// RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck %s --check-prefixes=SYCL-INTEL
// RUN: clang-linker-wrapper --print-wrapped-module --dry-run --host-triple=x86_64-unknown-linux-gnu -r -sycl-device-libraries=%t.o \
// RUN: clang-linker-wrapper --print-wrapped-module --dry-run --host-triple=x86_64-unknown-linux-gnu -r --bitcode-library=spirv64-unknown-unknown=%t.sycl.bc \
// RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck %s --check-prefixes=SYCL-INTEL

// SYCL-INTEL: spirv-to-ir-wrapper
Expand Down
2 changes: 1 addition & 1 deletion clang/test/Driver/linker-wrapper.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ __attribute__((visibility("protected"), used)) int x;
// RUN: llvm-offload-binary -o %t.out \
// RUN: --image=file=%t.spirv.bc,kind=sycl,triple=spirv64-unknown-unknown,arch=generic
// RUN: %clang -cc1 %s -triple x86_64-unknown-linux-gnu -emit-obj -o %t.o -fembed-offload-object=%t.out
// RUN: clang-linker-wrapper --host-triple=x86_64-unknown-linux-gnu --dry-run -sycl-device-libraries=%t.out \
// RUN: clang-linker-wrapper --host-triple=x86_64-unknown-linux-gnu --dry-run --bitcode-library=spirv64-unknown-unknown=%t.spirv.bc \
// RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck %s --check-prefix=SPIRV-LINK-INTEL

// TODO: Remove SPIRV-LINK-INTEL once migration to community flow is completed.
Expand Down
7 changes: 3 additions & 4 deletions clang/test/Driver/sycl-linker-wrapper-image.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,14 @@
// RUN: llvm-offload-binary -o %t.fat --image=file=%t.device.bc,kind=sycl,triple=spir64-unknown-unknown
// RUN: %clang -cc1 %s -triple=x86_64-unknown-linux-gnu -emit-obj -o %t.o -fembed-offload-object=%t.fat
//
// Generate .o file as SYCL device library file.
// Generate .bc file as SYCL device library file.
//
// RUN: touch %t.devicelib.cpp
// RUN: %clang %t.devicelib.cpp -fsycl -fsycl-targets=spir64-unknown-unknown -c --offload-new-driver -o %t.devicelib.o
// RUN: touch %t.devicelib.bc
//
// Run clang-linker-wrapper test
//
//// RUN: clang-linker-wrapper --print-wrapped-module --host-triple=x86_64-unknown-linux-gnu \
// RUN: -sycl-device-libraries=%t.devicelib.o \
// RUN: --bitcode-library=spir64-unknown-unknown=%t.devicelib.bc \
// RUN: -sycl-post-link-options="-split=auto -symbols -properties" %t.o -o %t.out 2>&1 --linker-path="/usr/bin/ld" | FileCheck %s

template <typename t, typename Func>
Expand Down
20 changes: 9 additions & 11 deletions clang/test/Driver/sycl-post-link-options.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,22 @@
//
// RUN: %clang %s -fsycl -fsycl-targets=spir64-unknown-unknown -c --offload-new-driver -o %t.o
//
// Generate .o file as SYCL device library file.
// Generate .bc file as SYCL device library file.
//
// RUN: touch %t.devicelib.cpp
// RUN: %clang %t.devicelib.cpp -fsycl -fsycl-targets=spir64-unknown-unknown -c --offload-new-driver -o %t.devicelib.o
// RUN: touch %t.devicelib.bc
//
// Run clang-linker-wrapper test
//
// RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu \
// RUN: -sycl-device-libraries=%t.devicelib.o \
// RUN: --bitcode-library=spir64-unknown-unknown=%t.devicelib.bc \
// RUN: --sycl-post-link-options="-O2 -device-globals -O0" \
// RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck --check-prefix OPTIONS_POSTLINK_JIT_NEW %s
// OPTIONS_POSTLINK_JIT_NEW: sycl-post-link{{.*}} -spec-const=native -properties -emit-only-kernels-as-entry-points -emit-param-info -symbols -emit-exported-symbols -emit-imported-symbols -split-esimd -lower-esimd -O2 -device-globals -O0
//
// Run clang-linker-wrapper test for generating SYCLBIN files.
//
// RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu \
// RUN: -syclbin=executable -sycl-device-libraries=%t.devicelib.o \
// RUN: -syclbin=executable --bitcode-library=spir64-unknown-unknown=%t.devicelib.bc \
// RUN: --sycl-post-link-options="-O2 -device-globals -O0" \
// RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck --check-prefix OPTIONS_POSTLINK_JIT_NEW_SYCLBIN %s
// OPTIONS_POSTLINK_JIT_NEW_SYCLBIN: sycl-post-link{{.*}} -spec-const=native -properties -emit-only-kernels-as-entry-points -emit-param-info -symbols -emit-kernel-names -emit-exported-symbols -emit-imported-symbols -split-esimd -lower-esimd -O2 -device-globals -O0
Expand Down Expand Up @@ -58,15 +57,15 @@
// Check -no-sycl-remove-unused-external-funcs option disables emitting
// -emit-only-kernels-as-entry-points in sycl-post-link.
// RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu \
// RUN: -sycl-device-libraries=%t.devicelib.o \
// RUN: --bitcode-library=spir64-unknown-unknown=%t.devicelib.bc \
// RUN: -no-sycl-remove-unused-external-funcs \
// RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck --check-prefix OPTIONS_NO_EMIT_ONLY_KERNELS %s
// OPTIONS_NO_EMIT_ONLY_KERNELS: sycl-post-link{{.*}} -spec-const=native -properties -emit-param-info -symbols -emit-exported-symbols -emit-imported-symbols -split-esimd -lower-esimd
//
// Check -no-sycl-device-code-split-esimd option disables emitting
// -split-esimd in sycl-post-link.
// RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu \
// RUN: -sycl-device-libraries=%t.devicelib.o \
// RUN: --bitcode-library=spir64-unknown-unknown=%t.devicelib.bc \
// RUN: -no-sycl-device-code-split-esimd \
// RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck --check-prefix OPTIONS_NO_SPLIT_ESIMD %s
// OPTIONS_NO_SPLIT_ESIMD: sycl-post-link{{.*}} -spec-const=native -properties -emit-only-kernels-as-entry-points -emit-param-info -symbols -emit-exported-symbols -emit-imported-symbols -lower-esimd
Expand All @@ -75,15 +74,14 @@
//
// RUN: %clang %s -fsycl -fsycl-targets=spir64_gen-unknown-unknown -c --offload-new-driver -o %t_aot.o
//
// Generate AOT .o file as SYCL device library file.
// Generate AOT .bc file as SYCL device library file.
//
// RUN: touch %t.devicelib.cpp
// RUN: %clang %t.devicelib.cpp -fsycl -fsycl-targets=spir64_gen-unknown-unknown -c --offload-new-driver -o %t.devicelib_aot.o
// RUN: touch %t.devicelib_aot.bc
//
// Check -sycl-add-default-spec-consts-image option enables emitting
// -generate-device-image-default-spec-consts in sycl-post-link.
// RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu \
// RUN: -sycl-device-libraries=%t.devicelib_aot.o \
// RUN: --bitcode-library=spir64_gen-unknown-unknown=%t.devicelib_aot.bc \
// RUN: -sycl-add-default-spec-consts-image \
// RUN: --linker-path=/usr/bin/ld %t_aot.o -o a.out 2>&1 | FileCheck --check-prefix OPTIONS_DEFAULT_SPEC_CONSTS %s
// OPTIONS_DEFAULT_SPEC_CONSTS: sycl-post-link{{.*}} -spec-const=emulation -properties -emit-only-kernels-as-entry-points -emit-param-info -symbols -emit-exported-symbols -emit-imported-symbols -split-esimd -lower-esimd -generate-device-image-default-spec-consts
13 changes: 5 additions & 8 deletions clang/test/Driver/sycl-spirv-default-options.cpp
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
// Generate .o file as SYCL device library file.
// Generate .bc 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
// RUN: %clang %t.devicelib.cpp -fsycl -fsycl-targets=spir64_gen-unknown-unknown -c --offload-new-driver -o %t_2.devicelib.o
// RUN: %clang %t.devicelib.cpp -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown -c --offload-new-driver -o %t_3.devicelib.o
// RUN: touch %t.devicelib.bc

// Test for default llvm-spirv options

// 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: -fsycl-targets=spir64-unknown-unknown -c %s -o %t.o
// RUN: clang-linker-wrapper --bitcode-library=spir64-unknown-unknown=%t.devicelib.bc \
// RUN: "--host-triple=x86_64-unknown-linux-gnu" "--linker-path=/usr/bin/ld" \
// RUN: "--" "-o" "a.out" %t_1.o --dry-run 2>&1 | FileCheck %s
// RUN: "--" "-o" "a.out" %t.o --dry-run 2>&1 | FileCheck %s

// CHECK: llvm-spirv{{.*}}-spirv-debug-info-version=nonsemantic-shader-200
// CHECK-NOT: ocl-100
15 changes: 7 additions & 8 deletions clang/test/Driver/sycl-spirv-ext.cpp
Original file line number Diff line number Diff line change
@@ -1,28 +1,27 @@
// Generate .o file as SYCL device library file.
// Generate .bc 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
// RUN: %clang %t.devicelib.cpp -fsycl -fsycl-targets=spir64_gen-unknown-unknown -c --offload-new-driver -o %t_2.devicelib.o
// RUN: %clang %t.devicelib.cpp -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown -c --offload-new-driver -o %t_3.devicelib.o
// RUN: touch %t_1.devicelib.bc
// RUN: touch %t_2.devicelib.bc
// RUN: touch %t_3.devicelib.bc

/// Check llvm-spirv extensions that are set

// 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: clang-linker-wrapper --bitcode-library=spir64-unknown-unknown=%t_1.devicelib.bc \
// RUN: "--host-triple=x86_64-unknown-linux-gnu" "--linker-path=/usr/bin/ld" \
// RUN: "--" "-o" "a.out" %t_1.o --dry-run 2>&1 \
// RUN: | FileCheck -check-prefix=CHECK-DEFAULT %s
// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl --offload-new-driver \
// RUN: -fsycl-targets=spir64_gen-unknown-unknown -c %s -o %t_2.o
// RUN: clang-linker-wrapper -sycl-device-libraries=%t_2.devicelib.o \
// RUN: clang-linker-wrapper --bitcode-library=spir64_gen-unknown-unknown=%t_2.devicelib.bc \
// RUN: "--host-triple=x86_64-unknown-linux-gnu" "--linker-path=/usr/bin/ld" \
// RUN: "--" "-o" "a.out" %t_2.o --dry-run 2>&1 \
// RUN: | FileCheck -check-prefix=CHECK-DEFAULT %s
// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl --offload-new-driver \
// RUN: -fsycl-targets=spir64_x86_64-unknown-unknown -c %s -o %t_3.o
// RUN: clang-linker-wrapper -sycl-device-libraries=%t_3.devicelib.o \
// RUN: clang-linker-wrapper --bitcode-library=spir64_x86_64-unknown-unknown=%t_3.devicelib.bc \
// RUN: "--host-triple=x86_64-unknown-linux-gnu" "--linker-path=/usr/bin/ld" \
// RUN: "--" "-o" "a.out" %t_3.o --dry-run 2>&1 \
// RUN: | FileCheck -check-prefix=CHECK-DEFAULT %s
Expand Down
91 changes: 22 additions & 69 deletions clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -633,33 +633,6 @@ fatbinary(ArrayRef<std::tuple<StringRef, StringRef, StringRef>> InputFiles,
} // namespace amdgcn

namespace sycl {
// This utility function is used to gather all SYCL device library files that
// will be linked with input device files.
// The list of files and its location are passed from driver.
static Error getSYCLDeviceLibs(SmallVector<std::string, 16> &DeviceLibFiles,
const ArgList &Args) {
StringRef SYCLDeviceLibLoc("");
if (Arg *A = Args.getLastArg(OPT_sycl_device_library_location_EQ))
SYCLDeviceLibLoc = A->getValue();
if (Arg *A = Args.getLastArg(OPT_sycl_device_lib_EQ)) {
if (A->getValues().size() == 0)
return createStringError(
inconvertibleErrorCode(),
"Number of device library files cannot be zero.");
for (StringRef Val : A->getValues()) {
SmallString<128> LibName(SYCLDeviceLibLoc);
llvm::sys::path::append(LibName, Val);
if (llvm::sys::fs::exists(LibName))
DeviceLibFiles.push_back(std::string(LibName));
else
return createStringError(inconvertibleErrorCode(),
std::string(LibName) +
" SYCL device library file is not found.");
}
}
return Error::success();
}

/// This routine is used to convert SPIR-V input files into LLVM IR files.
/// 'llvm-spirv -r' command is used for this purpose.
/// If input is not a SPIR-V file, then the original file is returned.
Expand Down Expand Up @@ -1482,51 +1455,31 @@ linkDeviceLibFiles(SmallVectorImpl<StringRef> &InputFiles,
return *OutFileOrErr;
}

/// This function is used to link all SYCL device input files into a single
/// LLVM IR file. This file is in turn linked with all SYCL device library
/// files.
/// 'InputFiles' is the list of all LLVM IR device input files.
/// 'Args' encompasses all arguments required for linking and wrapping device
/// code and will be parsed to generate options required to be passed into the
/// llvm-link tool.
/// Link all SYCL device input files into a single LLVM IR file, then link
/// with device library files specified via --bitcode-library option.
///
/// SPIR/SPIRV device libraries are linked at compile time using
/// -mlink-builtin-bitcode. This function now primarily handles device library
/// linking for non-SPIR targets (NVPTX, AMD) at link time.
///
/// The legacy -sycl-device-libraries option (fat objects) has been removed.
/// Use --bitcode-library=<triple>=<path> for device libraries instead.
///
/// \param InputFiles List of LLVM IR device input files to link
/// \param Args Command line arguments for linking and wrapping device code
/// \return Path to the final linked device file
static Expected<StringRef> linkDevice(ArrayRef<StringRef> InputFiles,
const ArgList &Args) {
// First llvm-link step.
// First llvm-link step: link all device input files.
auto LinkedFile = sycl::linkDeviceInputFiles(InputFiles, Args);
if (!LinkedFile)
reportError(LinkedFile.takeError());

// Gathering device library files
SmallVector<std::string, 16> DeviceLibFiles;
if (Error Err = sycl::getSYCLDeviceLibs(DeviceLibFiles, Args))
reportError(std::move(Err));
// Gather device library files from --bitcode-library option.
const llvm::Triple Triple(Args.getLastArgValue(OPT_triple_EQ));
SmallVector<std::string, 16> ExtractedDeviceLibFiles;
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Only the unused device library extraction code was removed. The general fat object extraction logic remains in place for processing user input files/libraries.
What was removed was the old device-library-specific extraction path in sycl::linkDevice(), since fat object device libraries (libsycl-*.new.o) no longer exist and device libraries are now passed directly as .bc files via --bitcode-library=

for (auto &File : DeviceLibFiles) {
auto BufferOrErr = MemoryBuffer::getFile(File);
if (!BufferOrErr)
return createFileError(File, BufferOrErr.getError());
auto Buffer = std::move(*BufferOrErr);
SmallVector<OffloadFile> Binaries;
if (Error Err = extractOffloadBinaries(Buffer->getMemBufferRef(), Binaries))
return std::move(Err);
bool CompatibleBinaryFound = false;
for (auto &Binary : Binaries) {
auto BinTriple = Binary.getBinary()->getTriple();
if (BinTriple == Triple.getTriple()) {
auto FileNameOrErr =
writeOffloadFile(Binary, true /* HasSYCLOffloadKind */);
if (!FileNameOrErr)
return FileNameOrErr.takeError();
ExtractedDeviceLibFiles.emplace_back(*FileNameOrErr);
CompatibleBinaryFound = true;
}
}
if (!CompatibleBinaryFound)
WithColor::warning(errs(), LinkerExecutable)
<< "Compatible SYCL device library binary not found\n";
}
SmallVector<std::string, 16> DeviceLibFiles;

// Collect bitcode libraries from --bitcode-library option
for (StringRef Library : Args.getAllArgValues(OPT_bitcode_library_EQ)) {
auto [LibraryTriple, LibraryPath] = Library.split('=');
if (llvm::Triple(LibraryTriple) != Triple)
Expand All @@ -1537,19 +1490,19 @@ static Expected<StringRef> linkDevice(ArrayRef<StringRef> InputFiles,
"The specified device library " + LibraryPath +
" does not exist.");

ExtractedDeviceLibFiles.emplace_back(LibraryPath.str());
DeviceLibFiles.emplace_back(LibraryPath.str());
}

// No device library files provided, second device linking step not required.
if (ExtractedDeviceLibFiles.empty())
if (DeviceLibFiles.empty())
return *LinkedFile;

SmallVector<StringRef, 16> InputFilesVec;
InputFilesVec.reserve(ExtractedDeviceLibFiles.size() + 1 /*LinkedFile*/);
InputFilesVec.reserve(DeviceLibFiles.size() + 1 /*LinkedFile*/);
InputFilesVec.emplace_back(*LinkedFile);
for (auto &File : ExtractedDeviceLibFiles)
for (auto &File : DeviceLibFiles)
InputFilesVec.emplace_back(File);
// second llvm-link step
// Second llvm-link step to incorporate device libraries
auto DeviceLinkedFile = sycl::linkDeviceLibFiles(InputFilesVec, Args);
if (!DeviceLinkedFile)
reportError(DeviceLinkedFile.takeError());
Expand Down
3 changes: 0 additions & 3 deletions clang/tools/clang-linker-wrapper/LinkerWrapperOpts.td
Original file line number Diff line number Diff line change
Expand Up @@ -159,9 +159,6 @@ def libpath : Joined<["/", "-", "/?", "-?"], "libpath:">, Flags<[HelpHidden]>;
def wholearchive_flag : Joined<["/", "-", "/?", "-?"], "wholearchive">, Flags<[HelpHidden]>;

// Options to specify SYCL device library files
def sycl_device_lib_EQ : CommaJoined<["--", "-"], "sycl-device-libraries=">,
Flags<[WrapperOnlyOption]>,
HelpText<"A comma separated list of device libraries that are linked during the device link.">;
def sycl_device_library_location_EQ : Joined<["--", "-"],
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit (not necessarily for this PR) - just wondering why this option is still needed and if it is an opportunity for more clean up.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The -sycl-device-library-location= option is still used/needed by both old and new offload models.
It serves two purposes that are still actively used:
sycl-post-link bfloat16 Device Library Lookup here
Required for NativeCPU target to find utilities library here
Also the driver passes this option to clang-linker-wrapper with the device library directory path.
So we shouldn't be removing this option.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For now, this option is needed as there is a native_cpu dependency on this one. I'm working on alleviating this dependency in a separate PR.

"sycl-device-library-location=">, Flags<[WrapperOnlyOption]>,
HelpText<"Location of SYCL device library files">;
Expand Down
Loading