Skip to content

Commit f284958

Browse files
committed
[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.
1 parent 04b0d3f commit f284958

File tree

2 files changed

+11
-12
lines changed

2 files changed

+11
-12
lines changed

clang/lib/Driver/ToolChains/SYCL.cpp

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1502,18 +1502,13 @@ static void parseTargetOpts(StringRef ArgString, const llvm::opt::ArgList &Args,
15021502
void SYCLToolChain::TranslateGPUTargetOpt(const llvm::opt::ArgList &Args,
15031503
llvm::opt::ArgStringList &CmdArgs,
15041504
OptSpecifier Opt_EQ) const {
1505-
for (auto *A : Args) {
1506-
if (A->getOption().matches(Opt_EQ)) {
1507-
if (auto GpuDevice =
1508-
tools::SYCL::gen::isGPUTarget<tools::SYCL::gen::AmdGPU>(
1509-
A->getValue())) {
1510-
StringRef ArgString;
1511-
SmallString<64> OffloadArch("--offload-arch=");
1512-
OffloadArch += GpuDevice->data();
1513-
ArgString = OffloadArch;
1514-
parseTargetOpts(ArgString, Args, CmdArgs);
1515-
A->claim();
1516-
}
1505+
if (const Arg *TargetArg = Args.getLastArg(Opt_EQ)) {
1506+
StringRef Val = TargetArg->getValue();
1507+
if (auto GpuDevice =
1508+
tools::SYCL::gen::isGPUTarget<tools::SYCL::gen::AmdGPU>(Val)) {
1509+
SmallString<64> OffloadArch("--offload-arch=");
1510+
OffloadArch += GpuDevice->data();
1511+
parseTargetOpts(OffloadArch, Args, CmdArgs);
15171512
}
15181513
}
15191514
}

clang/test/Driver/sycl-offload.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,7 @@
104104
// CHECK_FSYCL_FP64_CONV_EMU_WIN-NOT: clang{{.*}} "-cc1" "-triple x86_64-unknown-linux-gnu" {{.*}} "-fsycl-fp64-conv-emu"
105105
// CHECK_FSYCL_FP64_CONV_EMU_WIN-DAG: clang{{.*}} "-cc1" "-triple" "spir64_gen{{.*}}" "-fsycl-fp64-conv-emu"
106106
// 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{{.*}}"
107+
108+
/// Compilation checks to make sure an early empty -fsycl-targets does not
109+
/// crash.
110+
// RUN: %clangxx -### -fsycl -fsycl-targets= -fsycl-targets=spir64 %s

0 commit comments

Comments
 (0)