diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index ede3173cd05f3..5954f2c29676e 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -781,6 +781,10 @@ class ToolChain { virtual void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const; + /// Add arguments to use SYCL specific includes. + virtual void AddSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; + /// Add arguments to use MCU GCC toolchain includes. virtual void AddIAMCUIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const; diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 79fada5ba2746..6ec663ef60bca 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -1519,6 +1519,9 @@ void ToolChain::AddCudaIncludeArgs(const ArgList &DriverArgs, void ToolChain::AddHIPIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const {} +void ToolChain::AddSYCLIncludeArgs(const ArgList &DriverArgs, + ArgStringList &CC1Args) const {} + llvm::SmallVector ToolChain::getDeviceLibs( const ArgList &DriverArgs, diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index a7f8a61402533..3bf481144e21f 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1160,7 +1160,7 @@ void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA, getToolChain().AddHIPIncludeArgs(Args, CmdArgs); if (JA.isOffloading(Action::OFK_SYCL)) { - toolchains::SYCLToolChain::AddSYCLIncludeArgs(D, Args, CmdArgs); + getToolChain().AddSYCLIncludeArgs(Args, CmdArgs); if (Inputs[0].getType() == types::TY_CUDA) { // Include __clang_cuda_runtime_wrapper.h in .cu SYCL compilation. getToolChain().AddCudaIncludeArgs(Args, CmdArgs); diff --git a/clang/lib/Driver/ToolChains/Cuda.cpp b/clang/lib/Driver/ToolChains/Cuda.cpp index a2b6db69b9284..42d192e06cfab 100644 --- a/clang/lib/Driver/ToolChains/Cuda.cpp +++ b/clang/lib/Driver/ToolChains/Cuda.cpp @@ -924,7 +924,7 @@ CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple, const ToolChain &HostTC, const ArgList &Args, const Action::OffloadKind OK) : NVPTXToolChain(D, Triple, HostTC.getTriple(), Args), HostTC(HostTC), - OK(OK) {} + SYCLInstallation(D), OK(OK) {} void CudaToolChain::addClangTargetOptions( const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, @@ -941,8 +941,7 @@ void CudaToolChain::addClangTargetOptions( // If we are compiling SYCL kernels for Nvidia GPUs, we do not support Cuda // device code compatability, hence we do not set Cuda mode in that instance. if (DeviceOffloadingKind == Action::OFK_SYCL) { - toolchains::SYCLToolChain::AddSYCLIncludeArgs(getDriver(), DriverArgs, - CC1Args); + SYCLInstallation.AddSYCLIncludeArgs(DriverArgs, CC1Args); if (DriverArgs.hasArg(options::OPT_fsycl_fp32_prec_sqrt)) CC1Args.push_back("-fcuda-prec-sqrt"); @@ -1196,8 +1195,7 @@ CudaToolChain::GetCXXStdlibType(const ArgList &Args) const { void CudaToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { if (DriverArgs.hasArg(options::OPT_fsycl)) { - toolchains::SYCLToolChain::AddSYCLIncludeArgs(getDriver(), DriverArgs, - CC1Args); + SYCLInstallation.AddSYCLIncludeArgs(DriverArgs, CC1Args); } HostTC.AddClangSystemIncludeArgs(DriverArgs, CC1Args); diff --git a/clang/lib/Driver/ToolChains/Cuda.h b/clang/lib/Driver/ToolChains/Cuda.h index 9ea82bd379d54..20ae29a60c15b 100644 --- a/clang/lib/Driver/ToolChains/Cuda.h +++ b/clang/lib/Driver/ToolChains/Cuda.h @@ -260,6 +260,8 @@ class LLVM_LIBRARY_VISIBILITY CudaToolChain : public NVPTXToolChain { Tool *SelectTool(const JobAction &JA) const override; const ToolChain &HostTC; + SYCLInstallationDetector SYCLInstallation; + protected: Tool *buildAssembler() const override; // ptxas Tool *buildLinker() const override; // fatbinary (ok, not really a linker) diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index 95adffb17b18d..e0ccbe182c596 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -3190,7 +3190,8 @@ bool Generic_GCC::GCCInstallationDetector::ScanGentooGccConfig( Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) : ToolChain(D, Triple, Args), GCCInstallation(D), - CudaInstallation(D, Triple, Args), RocmInstallation(D, Triple, Args) { + CudaInstallation(D, Triple, Args), RocmInstallation(D, Triple, Args), + SYCLInstallation(D) { getProgramPaths().push_back(getDriver().Dir); } diff --git a/clang/lib/Driver/ToolChains/Gnu.h b/clang/lib/Driver/ToolChains/Gnu.h index 740dcd7484881..bb050474c757b 100644 --- a/clang/lib/Driver/ToolChains/Gnu.h +++ b/clang/lib/Driver/ToolChains/Gnu.h @@ -294,6 +294,7 @@ class LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain { GCCInstallationDetector GCCInstallation; LazyDetector CudaInstallation; LazyDetector RocmInstallation; + SYCLInstallationDetector SYCLInstallation; public: Generic_GCC(const Driver &D, const llvm::Triple &Triple, diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp index 24db5ac01c613..e1a0c1b2a085b 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.cpp +++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp @@ -253,7 +253,8 @@ void AMDGCN::Linker::ConstructJob(Compilation &C, const JobAction &JA, HIPAMDToolChain::HIPAMDToolChain(const Driver &D, const llvm::Triple &Triple, const ToolChain &HostTC, const ArgList &Args, const Action::OffloadKind OK) - : ROCMToolChain(D, Triple, Args), HostTC(HostTC), OK(OK) { + : ROCMToolChain(D, Triple, Args), HostTC(HostTC), SYCLInstallation(D), + OK(OK) { // Lookup binaries into the driver directory, this is used to // discover the clang-offload-bundler executable. getProgramPaths().push_back(getDriver().Dir); @@ -318,8 +319,7 @@ void HIPAMDToolChain::addClangTargetOptions( CC1Args.push_back("-fembed-bitcode=marker"); if (DeviceOffloadingKind == Action::OFK_SYCL) { - toolchains::SYCLToolChain::AddSYCLIncludeArgs(getDriver(), DriverArgs, - CC1Args); + SYCLInstallation.AddSYCLIncludeArgs(DriverArgs, CC1Args); } auto NoLibSpirv = DriverArgs.hasArg(options::OPT_fno_sycl_libspirv) || diff --git a/clang/lib/Driver/ToolChains/HIPAMD.h b/clang/lib/Driver/ToolChains/HIPAMD.h index 89bd67db1fc30..3f9c76920953a 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.h +++ b/clang/lib/Driver/ToolChains/HIPAMD.h @@ -110,6 +110,8 @@ class LLVM_LIBRARY_VISIBILITY HIPAMDToolChain final : public ROCMToolChain { void checkTargetID(const llvm::opt::ArgList &DriverArgs) const override; Tool *SelectTool(const JobAction &JA) const override; + SYCLInstallationDetector SYCLInstallation; + protected: Tool *buildLinker() const override; diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp index 625e2d490e292..6ba26bb5cbd18 100644 --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -768,6 +768,11 @@ void Linux::AddIAMCUIncludeArgs(const ArgList &DriverArgs, } } +void Linux::AddSYCLIncludeArgs(const ArgList &DriverArgs, + ArgStringList &CC1Args) const { + SYCLInstallation.AddSYCLIncludeArgs(DriverArgs, CC1Args); +} + bool Linux::isPIEDefault(const llvm::opt::ArgList &Args) const { return CLANG_DEFAULT_PIE_ON_LINUX || getTriple().isAndroid() || getTriple().isMusl() || getSanitizerArgs(Args).requiresPIE(); diff --git a/clang/lib/Driver/ToolChains/Linux.h b/clang/lib/Driver/ToolChains/Linux.h index 2d9e674e50a63..cdec2fd39bbfa 100644 --- a/clang/lib/Driver/ToolChains/Linux.h +++ b/clang/lib/Driver/ToolChains/Linux.h @@ -41,6 +41,8 @@ class LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF { llvm::opt::ArgStringList &CmdArgs) const override; void AddIAMCUIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; + void AddSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const override; RuntimeLibType GetDefaultRuntimeLibType() const override; unsigned GetDefaultDwarfVersion() const override; CXXStdlibType GetDefaultCXXStdlibType() const override; diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp b/clang/lib/Driver/ToolChains/MSVC.cpp index 0a0eef63557f5..a5e6221b2c3ac 100644 --- a/clang/lib/Driver/ToolChains/MSVC.cpp +++ b/clang/lib/Driver/ToolChains/MSVC.cpp @@ -507,7 +507,7 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA, MSVCToolChain::MSVCToolChain(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) : ToolChain(D, Triple, Args), CudaInstallation(D, Triple, Args), - RocmInstallation(D, Triple, Args) { + RocmInstallation(D, Triple, Args), SYCLInstallation(D) { getProgramPaths().push_back(getDriver().Dir); std::optional VCToolsDir, VCToolsVersion; @@ -586,6 +586,11 @@ void MSVCToolChain::AddHIPIncludeArgs(const ArgList &DriverArgs, RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args); } +void MSVCToolChain::AddSYCLIncludeArgs(const ArgList &DriverArgs, + ArgStringList &CC1Args) const { + SYCLInstallation.AddSYCLIncludeArgs(DriverArgs, CC1Args); +} + void MSVCToolChain::AddHIPRuntimeLibArgs(const ArgList &Args, ArgStringList &CmdArgs) const { CmdArgs.append({Args.MakeArgString(StringRef("-libpath:") + diff --git a/clang/lib/Driver/ToolChains/MSVC.h b/clang/lib/Driver/ToolChains/MSVC.h index 55a3d2edec8d0..17d694c72c7b4 100644 --- a/clang/lib/Driver/ToolChains/MSVC.h +++ b/clang/lib/Driver/ToolChains/MSVC.h @@ -106,6 +106,9 @@ class LLVM_LIBRARY_VISIBILITY MSVCToolChain : public ToolChain { void AddHIPRuntimeLibArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const override; + void AddSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const override; + bool getWindowsSDKLibraryPath( const llvm::opt::ArgList &Args, std::string &path) const; bool getUniversalCRTLibraryPath(const llvm::opt::ArgList &Args, @@ -144,6 +147,7 @@ class LLVM_LIBRARY_VISIBILITY MSVCToolChain : public ToolChain { llvm::ToolsetLayout VSLayout = llvm::ToolsetLayout::OlderVS; LazyDetector CudaInstallation; LazyDetector RocmInstallation; + SYCLInstallationDetector SYCLInstallation; }; } // end namespace toolchains diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 6938815da785d..c12685e52ff95 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -43,6 +43,26 @@ void SYCLInstallationDetector::getSYCLDeviceLibPath( DeviceLibPaths.emplace_back(D.SysRoot + "/lib"); } +void SYCLInstallationDetector::AddSYCLIncludeArgs( + const ArgList &DriverArgs, ArgStringList &CC1Args) const { + // Add the SYCL header search locations in the specified order. + // ../include/sycl/stl_wrappers + // ../include + SmallString<128> IncludePath(D.Dir); + llvm::sys::path::append(IncludePath, ".."); + llvm::sys::path::append(IncludePath, "include"); + // This is used to provide our wrappers around STL headers that provide + // additional functions/template specializations when the user includes those + // STL headers in their programs (e.g., ). + SmallString<128> STLWrappersPath(IncludePath); + llvm::sys::path::append(STLWrappersPath, "sycl"); + llvm::sys::path::append(STLWrappersPath, "stl_wrappers"); + CC1Args.push_back("-internal-isystem"); + CC1Args.push_back(DriverArgs.MakeArgString(STLWrappersPath)); + CC1Args.push_back("-internal-isystem"); + CC1Args.push_back(DriverArgs.MakeArgString(IncludePath)); +} + void SYCLInstallationDetector::print(llvm::raw_ostream &OS) const { if (!InstallationCandidates.size()) return; @@ -1381,7 +1401,7 @@ static std::vector getUnsupportedOpts(void) { SYCLToolChain::SYCLToolChain(const Driver &D, const llvm::Triple &Triple, const ToolChain &HostTC, const ArgList &Args) : ToolChain(D, Triple, Args), HostTC(HostTC), - IsSYCLNativeCPU(Triple == HostTC.getTriple()) { + IsSYCLNativeCPU(Triple == HostTC.getTriple()), SYCLInstallation(D) { // Lookup binaries into the driver directory, this is used to // discover the clang-offload-bundler executable. getProgramPaths().push_back(getDriver().Dir); @@ -1815,25 +1835,9 @@ SYCLToolChain::GetCXXStdlibType(const ArgList &Args) const { return HostTC.GetCXXStdlibType(Args); } -void SYCLToolChain::AddSYCLIncludeArgs(const clang::driver::Driver &Driver, - const ArgList &DriverArgs, - ArgStringList &CC1Args) { - // Add the SYCL header search locations in the specified order. - // ../include/sycl/stl_wrappers - // ../include - SmallString<128> IncludePath(Driver.Dir); - llvm::sys::path::append(IncludePath, ".."); - llvm::sys::path::append(IncludePath, "include"); - // This is used to provide our wrappers around STL headers that provide - // additional functions/template specializations when the user includes those - // STL headers in their programs (e.g., ). - SmallString<128> STLWrappersPath(IncludePath); - llvm::sys::path::append(STLWrappersPath, "sycl"); - llvm::sys::path::append(STLWrappersPath, "stl_wrappers"); - CC1Args.push_back("-internal-isystem"); - CC1Args.push_back(DriverArgs.MakeArgString(STLWrappersPath)); - CC1Args.push_back("-internal-isystem"); - CC1Args.push_back(DriverArgs.MakeArgString(IncludePath)); +void SYCLToolChain::AddSYCLIncludeArgs(const ArgList &DriverArgs, + ArgStringList &CC1Args) const { + SYCLInstallation.AddSYCLIncludeArgs(DriverArgs, CC1Args); } void SYCLToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs, diff --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h index 504ecd1247591..0d3aefa355a80 100644 --- a/clang/lib/Driver/ToolChains/SYCL.h +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -21,6 +21,8 @@ class SYCLInstallationDetector { SYCLInstallationDetector(const Driver &D); void getSYCLDeviceLibPath( llvm::SmallVector, 4> &DeviceLibPaths) const; + void AddSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; void print(llvm::raw_ostream &OS) const; private: @@ -211,9 +213,8 @@ class LLVM_LIBRARY_VISIBILITY SYCLToolChain : public ToolChain { void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override; CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override; - static void AddSYCLIncludeArgs(const clang::driver::Driver &Driver, - const llvm::opt::ArgList &DriverArgs, - llvm::opt::ArgStringList &CC1Args); + void AddSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const override; void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; void AddClangCXXStdlibIncludeArgs( @@ -225,6 +226,8 @@ class LLVM_LIBRARY_VISIBILITY SYCLToolChain : public ToolChain { const ToolChain &HostTC; const bool IsSYCLNativeCPU; + SYCLInstallationDetector SYCLInstallation; + protected: Tool *buildBackendCompiler() const override; Tool *buildLinker() const override;