Skip to content

Commit f62de21

Browse files
authored
[Driver][SYCL] Improve -Xsycl-target option parsing (#1586)
Initial implementation of -Xsycl-target-backend "opts" had a simple parsing of relying on spaces. Any more complex option passing that requires args containing spaces did not pass correctly. Update parsing to be a bit smarter. Signed-off-by: Michael D Toguchi <[email protected]>
1 parent ac94b1e commit f62de21

File tree

2 files changed

+18
-14
lines changed

2 files changed

+18
-14
lines changed

clang/lib/Driver/ToolChains/SYCL.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "clang/Driver/Driver.h"
1414
#include "clang/Driver/DriverDiagnostic.h"
1515
#include "clang/Driver/Options.h"
16+
#include "llvm/Support/CommandLine.h"
1617
#include "llvm/Support/FileSystem.h"
1718
#include "llvm/Support/Path.h"
1819

@@ -421,6 +422,17 @@ SYCLToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
421422
return DAL;
422423
}
423424

425+
static void parseTargetOpts(StringRef ArgString, const llvm::opt::ArgList &Args,
426+
llvm::opt::ArgStringList &CmdArgs) {
427+
// Tokenize the string.
428+
SmallVector<const char *, 8> TargetArgs;
429+
llvm::BumpPtrAllocator A;
430+
llvm::StringSaver S(A);
431+
llvm::cl::TokenizeGNUCommandLine(ArgString, S, TargetArgs);
432+
for (StringRef TA : TargetArgs)
433+
CmdArgs.push_back(Args.MakeArgString(TA));
434+
}
435+
424436
// Expects a specific type of option (e.g. -Xsycl-target-backend) and will
425437
// extract the arguments.
426438
void SYCLToolChain::TranslateTargetOpt(const llvm::opt::ArgList &Args,
@@ -455,13 +467,7 @@ void SYCLToolChain::TranslateTargetOpt(const llvm::opt::ArgList &Args,
455467
// Triple found, add the next argument in line.
456468
ArgString = A->getValue(1);
457469

458-
// Do a simple parse of the args to pass back
459-
SmallVector<StringRef, 16> TargetArgs;
460-
// TODO: Improve parsing, as this only handles arguments separated by
461-
// spaces.
462-
ArgString.split(TargetArgs, ' ', -1, false);
463-
for (const auto &TA : TargetArgs)
464-
CmdArgs.push_back(Args.MakeArgString(TA));
470+
parseTargetOpts(ArgString, Args, CmdArgs);
465471
A->claim();
466472
}
467473
}
@@ -485,13 +491,7 @@ void SYCLToolChain::TranslateBackendTargetArgs(const llvm::opt::ArgList &Args,
485491
}
486492
if (A->getOption().matches(options::OPT_Xs_separate)) {
487493
StringRef ArgString(A->getValue());
488-
// Do a simple parse of the args to pass back
489-
SmallVector<StringRef, 16> TargetArgs;
490-
// TODO: Improve parsing, as this only handles arguments separated by
491-
// spaces.
492-
ArgString.split(TargetArgs, ' ', -1, false);
493-
for (const auto &TA : TargetArgs)
494-
CmdArgs.push_back(Args.MakeArgString(TA));
494+
parseTargetOpts(ArgString, Args, CmdArgs);
495495
A->claim();
496496
continue;
497497
}

clang/test/Driver/sycl-offload.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,10 @@
671671
// CHK-TOOLS-CPU-OPTS: opencl-aot{{.*}} "-DFOO1" "-DFOO2"
672672
// CHK-TOOLS-CPU-OPTS-NOT: clang-offload-wrapper{{.*}} "-compile-opts={{.*}}
673673

674+
// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice -Xsycl-target-backend "--bo='\"-DFOO1 -DFOO2\"'" %s 2>&1 \
675+
// RUN: | FileCheck -check-prefix=CHK-TOOLS-CPU-OPTS3 %s
676+
// CHK-TOOLS-CPU-OPTS3: opencl-aot{{.*}} "--bo=\"-DFOO1 -DFOO2\""
677+
674678
// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice -Xsycl-target-backend "-DFOO1 -DFOO2" %s 2>&1 \
675679
// RUN: | FileCheck -check-prefix=CHK-TOOLS-OPTS %s
676680
// CHK-TOOLS-OPTS: clang-offload-wrapper{{.*}} "-compile-opts=\"-DFOO1 -DFOO2\""

0 commit comments

Comments
 (0)