Skip to content

Commit c623223

Browse files
authored
[Driver][SYCL] Fix -Xsycl option triple check with multiple -fsycl-targets (#4789)
When passing multiple -fsycl-targets on the command line, the last one wins. There is a check for the number of target triples provided by the user when applying -Xsycl-target* options to the device compilation. We were improperly counting all of the -fsycl-targets values instead of only taking into account the last one only.
1 parent 2cf651f commit c623223

File tree

3 files changed

+22
-4
lines changed

3 files changed

+22
-4
lines changed

clang/lib/Driver/ToolChain.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1247,12 +1247,19 @@ llvm::opt::DerivedArgList *ToolChain::TranslateOffloadTargetArgs(
12471247
if (XOffloadTargetNoTriple && XOffloadTargetArg) {
12481248
// TODO: similar behaviors with OpenMP and SYCL offloading, can be
12491249
// improved upon
1250+
auto SingleTargetTripleCount = [&Args](OptSpecifier Opt) {
1251+
const Arg *TargetArg = Args.getLastArg(Opt);
1252+
if (TargetArg && TargetArg->getValues().size() == 1)
1253+
return true;
1254+
return false;
1255+
};
12501256
if (DeviceOffloadKind == Action::OFK_OpenMP &&
1251-
Args.getAllArgValues(options::OPT_fopenmp_targets_EQ).size() != 1) {
1257+
!SingleTargetTripleCount(options::OPT_fopenmp_targets_EQ)) {
12521258
getDriver().Diag(diag::err_drv_Xopenmp_target_missing_triple);
12531259
continue;
1254-
} else if (DeviceOffloadKind == Action::OFK_SYCL &&
1255-
Args.getAllArgValues(options::OPT_fsycl_targets_EQ).size() > 1) {
1260+
}
1261+
if (DeviceOffloadKind == Action::OFK_SYCL &&
1262+
!SingleTargetTripleCount(options::OPT_fsycl_targets_EQ)) {
12561263
getDriver().Diag(diag::err_drv_Xsycl_target_missing_triple)
12571264
<< A->getSpelling();
12581265
continue;

clang/lib/Driver/ToolChains/SYCL.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,8 @@ void SYCLToolChain::TranslateTargetOpt(const llvm::opt::ArgList &Args,
734734
if (OptNoTriple) {
735735
// With multiple -fsycl-targets, a triple is required so we know where
736736
// the options should go.
737-
if (Args.getAllArgValues(options::OPT_fsycl_targets_EQ).size() != 1) {
737+
const Arg *TargetArg = Args.getLastArg(options::OPT_fsycl_targets_EQ);
738+
if (TargetArg && TargetArg->getValues().size() != 1) {
738739
getDriver().Diag(diag::err_drv_Xsycl_target_missing_triple)
739740
<< A->getSpelling();
740741
continue;

clang/test/Driver/sycl-offload.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,16 @@
623623
// RUN: | FileCheck -check-prefix=CHK-FSYCL-TARGET-AMBIGUOUS-ERROR %s
624624
// CHK-FSYCL-TARGET-AMBIGUOUS-ERROR: clang{{.*}} error: cannot deduce implicit triple value for '-Xsycl-target-backend', specify triple using '-Xsycl-target-backend=<triple>'
625625

626+
/// Check -Xsycl-target-* does not trigger an error when multiple instances of
627+
/// -fsycl-targets is used.
628+
// RUN: %clang -### -fsycl -fsycl-targets=spir64-unknown-unknown -fsycl-targets=spir64_gen-unknown-unknown -Xsycl-target-backend -DFOO %s 2>&1 \
629+
// RUN: | FileCheck -check-prefix=CHK-FSYCL-TARGET-2X-ERROR %s
630+
// RUN: %clang -### -fsycl -fsycl-targets=spir64-unknown-unknown -fsycl-targets=spir64_gen-unknown-unknown -Xsycl-target-frontend -DFOO %s 2>&1 \
631+
// RUN: | FileCheck -check-prefix=CHK-FSYCL-TARGET-2X-ERROR %s
632+
// RUN: %clang -### -fsycl -fsycl-targets=spir64-unknown-unknown -fsycl-targets=spir64_gen-unknown-unknown -Xsycl-target-linker -DFOO %s 2>&1 \
633+
// RUN: | FileCheck -check-prefix=CHK-FSYCL-TARGET-2X-ERROR %s
634+
// CHK-FSYCL-TARGET-2X-ERROR-NOT: clang{{.*}} error: cannot deduce implicit triple value for '-Xsycl-target{{.*}}', specify triple using '-Xsycl-target{{.*}}=<triple>'
635+
626636
/// ###########################################################################
627637

628638
/// Ahead of Time compilation for fpga, gen, cpu

0 commit comments

Comments
 (0)