diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index 2326f01133b2c..bd70cdfe135e5 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -626,6 +626,13 @@ class Driver { /// @name Helper Methods /// @{ + /// Utility function to parse all devices passed via -fsycl-targets. + /// Return 'true' for JIT, AOT Intel CPU/GPUs and NVidia/AMD targets. + /// Otherwise return 'false'. + bool + GetUseNewOffloadDriverForSYCLOffload(Compilation &C, + const llvm::opt::ArgList &Args) const; + /// getSYCLDeviceTriple - Returns the SYCL device triple for the /// specified subarch // TODO: Additional Arg input parameter is for diagnostic output information diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index ccd58f032c77a..db1edeee4175c 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1565,6 +1565,32 @@ static void appendOneArg(InputArgList &Args, const Arg *Opt) { } } +// Utility function to parse all devices passed via -fsycl-targets. +// Return 'true' for JIT, AOT Intel CPU/GPUs and NVidia/AMD targets. +// Otherwise return 'false'. +bool Driver::GetUseNewOffloadDriverForSYCLOffload(Compilation &C, + const ArgList &Args) const { + // Check only if enabled with -fsycl + if (!Args.hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, false)) + return false; + + if (Args.hasFlag(options::OPT_no_offload_new_driver, + options::OPT_offload_new_driver, false)) + return false; + + if (Args.hasArg(options::OPT_fintelfpga)) + return false; + + if (const Arg *A = Args.getLastArg(options::OPT_fsycl_targets_EQ)) { + for (const char *Val : A->getValues()) { + llvm::Triple TT(C.getDriver().getSYCLDeviceTriple(Val)); + if ((!TT.isSPIROrSPIRV()) || TT.isSPIRAOT()) + return false; + } + } + return true; +} + bool Driver::readConfigFile(StringRef FileName, llvm::cl::ExpansionContext &ExpCtx) { // Try opening the given file. @@ -2195,12 +2221,12 @@ Compilation *Driver::BuildCompilation(ArrayRef ArgList) { // Use new offloading path for OpenMP. This is disabled as the SYCL // offloading path is not properly setup to use the updated device linking // scheme. - if ((C->isOffloadingHostKind(Action::OFK_OpenMP) && - TranslatedArgs->hasFlag(options::OPT_fopenmp_new_driver, - options::OPT_no_offload_new_driver, true)) || + if (C->isOffloadingHostKind(Action::OFK_OpenMP) || TranslatedArgs->hasFlag(options::OPT_offload_new_driver, - options::OPT_no_offload_new_driver, false)) + options::OPT_no_offload_new_driver, false) || + GetUseNewOffloadDriverForSYCLOffload(*C, *TranslatedArgs)) { setUseNewOffloadingDriver(); + } // Construct the list of abstract actions to perform for this compilation. On // MachO targets this uses the driver-driver and universal actions. @@ -7085,7 +7111,8 @@ void Driver::BuildDefaultActions(Compilation &C, DerivedArgList &Args, options::OPT_fno_offload_via_llvm, false) || Args.hasFlag(options::OPT_offload_new_driver, options::OPT_no_offload_new_driver, - C.isOffloadingHostKind(Action::OFK_Cuda)); + C.isOffloadingHostKind(Action::OFK_Cuda)) || + GetUseNewOffloadDriverForSYCLOffload(C, Args); bool HIPNoRDC = C.isOffloadingHostKind(Action::OFK_HIP) && diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 02d6187ad7b77..b925b380d82a3 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -5233,7 +5233,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, (JA.isHostOffloading(C.getActiveOffloadKinds()) && Args.hasFlag(options::OPT_offload_new_driver, options::OPT_no_offload_new_driver, - C.isOffloadingHostKind(Action::OFK_Cuda))); + C.isOffloadingHostKind(Action::OFK_Cuda))) || + (JA.isHostOffloading(Action::OFK_SYCL) && + C.getDriver().GetUseNewOffloadDriverForSYCLOffload(C, Args)); bool IsRDCMode = Args.hasFlag(options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc, IsSYCL); @@ -11449,43 +11451,17 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, for (auto &ToolChainMember : llvm::make_range(ToolChainRange.first, ToolChainRange.second)) { const ToolChain *TC = ToolChainMember.second; - bool IsJIT = false; StringRef WrapperOption; - StringRef WrapperLinkOption; if (TC->getTriple().isSPIROrSPIRV()) { - if (TC->getTriple().getSubArch() == llvm::Triple::NoSubArch) { - IsJIT = true; - WrapperOption = "--sycl-backend-compile-options="; - } if (TC->getTriple().getSubArch() == llvm::Triple::SPIRSubArch_gen) WrapperOption = "--gpu-tool-arg="; if (TC->getTriple().getSubArch() == llvm::Triple::SPIRSubArch_x86_64) WrapperOption = "--cpu-tool-arg="; + Args.MakeArgString(Twine(WrapperOption)); } else continue; - ArgStringList BuildArgs; - SmallString<128> BackendOptString; - SmallString<128> LinkOptString; - SYCLTC.TranslateBackendTargetArgs(TC->getTriple(), Args, BuildArgs); - for (const auto &A : BuildArgs) - appendOption(BackendOptString, A); - - BuildArgs.clear(); - SYCLTC.TranslateLinkerTargetArgs(TC->getTriple(), Args, BuildArgs); - for (const auto &A : BuildArgs) { - if (IsJIT) - appendOption(LinkOptString, A); - else - // For AOT, combine the Backend and Linker strings into one. - appendOption(BackendOptString, A); - } - if (!BackendOptString.empty()) - CmdArgs.push_back( - Args.MakeArgString(Twine(WrapperOption) + BackendOptString)); - if (!LinkOptString.empty()) - CmdArgs.push_back( - Args.MakeArgString("--sycl-target-link-options=" + LinkOptString)); } + // Add option to enable creating of the .syclbin file. if (Arg *A = Args.getLastArg(options::OPT_fsyclbin_EQ)) CmdArgs.push_back(