diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 7926b8edd5821..796a6321daa4d 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -10325,6 +10325,7 @@ 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()); @@ -10354,6 +10355,16 @@ void OffloadPackager::ConstructJob(Compilation &C, const JobAction &JA, "kind=" + Kind.str(), }; + // 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. + SmallVector Archs; + Arch.split(Archs, ','); + if (Archs.size() > 1) { + Parts[2] = "arch=" + llvm::join(Archs, ",arch="); + } + if (TC->getDriver().isUsingOffloadLTO()) for (StringRef Feature : FeatureArgs) Parts.emplace_back("feature=" + Feature.str()); @@ -10377,7 +10388,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); @@ -10386,10 +10399,10 @@ void OffloadPackager::ConstructJob(Compilation &C, const JobAction &JA, static_cast(*TC); SYCLTC.AddImpliedTargetArgs(TC->getTriple(), Args, BuildArgs, JA, *HostTC, Arch); - SYCLTC.TranslateBackendTargetArgs(TC->getTriple(), Args, BuildArgs, Arch); + SYCLTC.TranslateBackendTargetArgs(TC->getTriple(), Args, BuildArgs); createArgString("compile-opts="); BuildArgs.clear(); - SYCLTC.TranslateLinkerTargetArgs(TC->getTriple(), Args, BuildArgs, Arch); + SYCLTC.TranslateLinkerTargetArgs(TC->getTriple(), Args, BuildArgs); createArgString("link-opts="); } diff --git a/clang/test/Driver/sycl-ftarget-compile-fast.cpp b/clang/test/Driver/sycl-ftarget-compile-fast.cpp index f9ba300a9a821..5f5bfa91f289c 100644 --- a/clang/test/Driver/sycl-ftarget-compile-fast.cpp +++ b/clang/test/Driver/sycl-ftarget-compile-fast.cpp @@ -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 \ diff --git a/clang/test/Driver/sycl-offload-new-driver.c b/clang/test/Driver/sycl-offload-new-driver.c index 51585ec738516..178ad9bcfac64 100644 --- a/clang/test/Driver/sycl-offload-new-driver.c +++ b/clang/test/Driver/sycl-offload-new-driver.c @@ -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 -device pvc,compile-opts=bdw" /// Verify the arch value for the packager is populated with different /// scenarios for spir64_gen @@ -211,6 +211,35 @@ // 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" + +// RUN: %clangxx -fsycl -### --offload-new-driver \ +// RUN: -fsycl-targets=nvptx64-nvidia-cuda,amdgcn-amd-amdhsa,spir64_gen \ +// RUN: -Xsycl-target-backend=amdgcn-amd-amdhsa --offload-arch=gfx908,gfx1010 \ +// RUN: -Xsycl-target-backend=nvptx64-nvidia-cuda --offload-arch=sm_86,sm_87,sm_89 \ +// RUN: -Xsycl-target-backend=spir64_gen "-device pvc,bdw" \ +// RUN: -Xsycl-target-linker=spir64_gen "-DFOO,BAR" \ +// RUN: -nogpulib %s 2>&1 | FileCheck -check-prefix=MULTI_ARCH2 %s +// MULTI_ARCH2: clang-offload-packager{{.*}} "--image=file={{.*}}triple=amdgcn-amd-amdhsa,arch=gfx1010,kind=sycl,compile-opts=--offload-arch=gfx908,compile-opts=gfx1010" +// MULTI_ARCH2-SAME: "--image=file={{.*}}triple=amdgcn-amd-amdhsa,arch=gfx908,kind=sycl,compile-opts=--offload-arch=gfx908,compile-opts=gfx1010" +// MULTI_ARCH2-SAME: "--image=file={{.*}}triple=nvptx64-nvidia-cuda,arch=sm_86,kind=sycl,compile-opts=--offload-arch=sm_86,compile-opts=sm_87,compile-opts=sm_89" +// MULTI_ARCH2-SAME: "--image=file={{.*}}triple=nvptx64-nvidia-cuda,arch=sm_87,kind=sycl,compile-opts=--offload-arch=sm_86,compile-opts=sm_87,compile-opts=sm_89" +// MULTI_ARCH2-SAME: "--image=file={{.*}}triple=nvptx64-nvidia-cuda,arch=sm_89,kind=sycl,compile-opts=--offload-arch=sm_86,compile-opts=sm_87,compile-opts=sm_89" +// MULTI_ARCH2-SAME: "--image=file={{.*}}triple=spir64_gen-unknown-unknown,arch=pvc,arch=bdw,kind=sycl,compile-opts=-device_options pvc -ze-intel-enable-auto-large-GRF-mode -device pvc,compile-opts=bdw,link-opts=-DFOO,link-opts=BAR" + +// 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 \