From f28495833d7ac98360af5e261654750ce07f4f45 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Fri, 18 Oct 2024 11:25:40 -0700 Subject: [PATCH 1/2] [Driver][SYCL] Fix crash with empty -fsycl-targets option When -fsycl-targets= -fsycl-targets=arg is passed on the command line, the empty -fsycl-targets= is processed and crashes due to the empty argument. Update the specific option parsing to use 'getLastArg' to avoid this situation. When the last arg has an empty argument, the driver will diagnose this situation and emit a friendly diagnostic. --- clang/lib/Driver/ToolChains/SYCL.cpp | 19 +++++++------------ clang/test/Driver/sycl-offload.cpp | 4 ++++ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index d0f9673bdc1cc..6e4107c2a3e1f 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -1502,18 +1502,13 @@ static void parseTargetOpts(StringRef ArgString, const llvm::opt::ArgList &Args, void SYCLToolChain::TranslateGPUTargetOpt(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs, OptSpecifier Opt_EQ) const { - for (auto *A : Args) { - if (A->getOption().matches(Opt_EQ)) { - if (auto GpuDevice = - tools::SYCL::gen::isGPUTarget( - A->getValue())) { - StringRef ArgString; - SmallString<64> OffloadArch("--offload-arch="); - OffloadArch += GpuDevice->data(); - ArgString = OffloadArch; - parseTargetOpts(ArgString, Args, CmdArgs); - A->claim(); - } + if (const Arg *TargetArg = Args.getLastArg(Opt_EQ)) { + StringRef Val = TargetArg->getValue(); + if (auto GpuDevice = + tools::SYCL::gen::isGPUTarget(Val)) { + SmallString<64> OffloadArch("--offload-arch="); + OffloadArch += GpuDevice->data(); + parseTargetOpts(OffloadArch, Args, CmdArgs); } } } diff --git a/clang/test/Driver/sycl-offload.cpp b/clang/test/Driver/sycl-offload.cpp index 9e0aa025500dc..91b96e292d2bf 100644 --- a/clang/test/Driver/sycl-offload.cpp +++ b/clang/test/Driver/sycl-offload.cpp @@ -104,3 +104,7 @@ // CHECK_FSYCL_FP64_CONV_EMU_WIN-NOT: clang{{.*}} "-cc1" "-triple x86_64-unknown-linux-gnu" {{.*}} "-fsycl-fp64-conv-emu" // CHECK_FSYCL_FP64_CONV_EMU_WIN-DAG: clang{{.*}} "-cc1" "-triple" "spir64_gen{{.*}}" "-fsycl-fp64-conv-emu" // CHECK_FSYCL_FP64_CONV_EMU_WIN-DAG: clang-offload-packager{{.*}} "--image=file={{.*}}.bc,triple=spir64_gen-unknown-unknown,arch=,kind=sycl,compile-opts={{.*}}-options -ze-fp64-gen-conv-emu{{.*}}" + +/// Compilation checks to make sure an early empty -fsycl-targets does not +/// crash. +// RUN: %clangxx -### -fsycl -fsycl-targets= -fsycl-targets=spir64 %s From 5f516687f1f80397a844917b464461992a3c2bee Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Fri, 18 Oct 2024 13:28:28 -0700 Subject: [PATCH 2/2] Update test to check for device compilation --- clang/test/Driver/sycl-offload.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/clang/test/Driver/sycl-offload.cpp b/clang/test/Driver/sycl-offload.cpp index 91b96e292d2bf..36962540d9e0e 100644 --- a/clang/test/Driver/sycl-offload.cpp +++ b/clang/test/Driver/sycl-offload.cpp @@ -107,4 +107,6 @@ /// Compilation checks to make sure an early empty -fsycl-targets does not /// crash. -// RUN: %clangxx -### -fsycl -fsycl-targets= -fsycl-targets=spir64 %s +// RUN: %clangxx -### -fsycl -fsycl-targets= -fsycl-targets=spir64 %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=CHECK_SPIR64 +// CHECK_SPIR64: clang{{.*}} "-cc1" "-triple" "spir64-unknown-unknown"{{.*}} "-fsycl-is-device"