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.
426438void 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 }
0 commit comments