Skip to content
18 changes: 16 additions & 2 deletions clang/lib/Driver/ToolChains/Clang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10314,9 +10314,21 @@ void OffloadPackager::ConstructJob(Compilation &C, const JobAction &JA,
File = C.getArgs().MakeArgString("@" + File);

StringRef Arch;
std::string TransformedArch;
if (OffloadAction->getOffloadingArch()) {
if (TC->getTripleString() == "spir64_gen-unknown-unknown") {
Arch = mapIntelGPUArchName(OffloadAction->getOffloadingArch());
// When compiling like -fsycl-targets=spir64_gen -Xsycl-target-backend
// "-device pvc,bdw", the offloading arch will be "pvc,bdw", which
// contains a comma. We need to transform it to "arch=pvc,arch=bdw" when
// passing to clang-offload-packager.
Arch = OffloadAction->getOffloadingArch();
SmallVector<StringRef> Archs;
Arch.split(Archs, ',');
for (StringRef &A : Archs) {
A = mapIntelGPUArchName(A);
}
TransformedArch = llvm::join(Archs, ",arch=");
Arch = TransformedArch;
} else {
Arch = OffloadAction->getOffloadingArch();
}
Expand Down Expand Up @@ -10366,7 +10378,9 @@ void OffloadPackager::ConstructJob(Compilation &C, const JobAction &JA,
AL += " ";
AL += A;
}
Parts.emplace_back(C.getArgs().MakeArgString(Twine(Opt) + AL));
for (StringRef Split : llvm::split(AL, ',')) {
Parts.emplace_back(C.getArgs().MakeArgString(Twine(Opt) + Split));
}
};
const ArgList &Args =
C.getArgsForToolChain(nullptr, StringRef(), Action::OFK_SYCL);
Expand Down
8 changes: 7 additions & 1 deletion clang/test/Driver/sycl-ftarget-compile-fast.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,14 @@
// RUN: -fsycl-targets=spir64_gen -ftarget-compile-fast %s 2>&1 \
// RUN: | FileCheck -check-prefix=TARGET_COMPILE_FAST_GEN %s


// Due to how clang-offload-packager works, if we want a value in a key-value pair to
// have a comma, we need to specify the key twice, once for each part of the value
// separated by the comma. clang-offload-packager will then combine the two parts into a single
// value with a comma in between.
// TARGET_COMPILE_FAST_GEN: clang-offload-packager
// TARGET_COMPILE_FAST_GEN: compile-opts={{.*}}-options -igc_opts 'PartitionUnit=1,SubroutineThreshold=50000'
// TARGET_COMPILE_FAST_GEN: compile-opts={{.*}}-options -igc_opts 'PartitionUnit=1
// TARGET_COMPILE_FAST_GEN-SAME: compile-opts=SubroutineThreshold=50000'

// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl --offload-new-driver \
// RUN: -ftarget-compile-fast %s 2>&1 \
Expand Down
17 changes: 16 additions & 1 deletion clang/test/Driver/sycl-offload-new-driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@
// RUN: %clangxx -fsycl -### -fsycl-targets=spir64_gen --offload-new-driver \
// RUN: -Xsycl-target-backend=spir64_gen "-device pvc,bdw" %s 2>&1 \
// RUN: | FileCheck -check-prefix COMMA_FILE %s
// COMMA_FILE: clang-offload-packager{{.*}} "--image=file={{.*}}pvc@bdw{{.*}},triple=spir64_gen-unknown-unknown,arch=pvc,bdw,kind=sycl,compile-opts=-device_options pvc -ze-intel-enable-auto-large-GRF-mode"
// COMMA_FILE: clang-offload-packager{{.*}} "--image=file={{.*}}pvc@bdw{{.*}},triple=spir64_gen-unknown-unknown,arch=pvc,arch=bdw,kind=sycl,compile-opts=-device_options pvc -ze-intel-enable-auto-large-GRF-mode"

/// Verify the arch value for the packager is populated with different
/// scenarios for spir64_gen
Expand All @@ -211,6 +211,21 @@
// RUN: | FileCheck -check-prefix ARCH_CHECK %s
// ARCH_CHECK: clang-offload-packager{{.*}} "--image=file={{.*}}triple=spir64_gen-unknown-unknown,arch=bdw,kind=sycl{{.*}}"

// Verify when a comma-separated list of architectures is provided in -device, they are
// passed to clang-offload-packager correctly
// RUN: %clangxx -fsycl -### -fsycl-targets=spir64_gen --offload-new-driver \
// RUN: -Xsycl-target-backend "-device pvc,bdw" %s 2>&1 \
// RUN: | FileCheck -check-prefix MULTI_ARCH %s
// MULTI_ARCH: clang-offload-packager{{.*}} "--image=file={{.*}}triple=spir64_gen-unknown-unknown,arch=pvc,arch=bdw,kind=sycl
// MULTI_ARCH-SAME: compile-opts=-device_options pvc -ze-intel-enable-auto-large-GRF-mode -device pvc,compile-opts=bdw"

// Verify that the driver correctly handles link-opt and compile-opt values with commas
// RUN: %clangxx -fsycl -### -fsycl-targets=spir64_gen --offload-new-driver \
// RUN: -Xsycl-target-backend "-device bdw -FOO a,b" \
// RUN: -Xsycl-target-linker "-BAR x,y" %s 2>&1 \
// RUN: | FileCheck -check-prefix COMMA_OPTS %s
// COMMA_OPTS: clang-offload-packager{{.*}} "--image=file={{.*}}triple=spir64_gen-unknown-unknown,arch=bdw,kind=sycl,compile-opts=-device bdw -FOO a,compile-opts=b,link-opts=-BAR x,link-opts=y"

/// Verify that --cuda-path is passed to clang-linker-wrapper for SYCL offload
// RUN: %clangxx -fsycl -### -fsycl-targets=nvptx64-nvidia-cuda -fno-sycl-libspirv \
// RUN: --cuda-gpu-arch=sm_20 --cuda-path=%S/Inputs/CUDA_80/usr/local/cuda %s \
Expand Down
Loading