4343#include " ToolChains/PS4CPU.h"
4444#include " ToolChains/RISCVToolchain.h"
4545#include " ToolChains/SPIRV.h"
46+ #include " ToolChains/SYCL.h"
4647#include " ToolChains/Solaris.h"
4748#include " ToolChains/TCE.h"
4849#include " ToolChains/UEFI.h"
@@ -781,6 +782,27 @@ Driver::OpenMPRuntimeKind Driver::getOpenMPRuntime(const ArgList &Args) const {
781782 return RT;
782783}
783784
785+ static const char *getDefaultSYCLArch (Compilation &C) {
786+ // If -fsycl is supplied we will assume SPIR-V
787+ if (C.getDefaultToolChain ().getTriple ().isArch32Bit ())
788+ return " spirv32" ;
789+ return " spirv64" ;
790+ }
791+
792+ static bool addSYCLDefaultTriple (Compilation &C,
793+ SmallVectorImpl<llvm::Triple> &SYCLTriples) {
794+ for (const auto &SYCLTriple : SYCLTriples) {
795+ if (SYCLTriple.getSubArch () == llvm::Triple::NoSubArch &&
796+ SYCLTriple.isSPIROrSPIRV ())
797+ return false ;
798+ }
799+ // Add the default triple as it was not found.
800+ llvm::Triple DefaultTriple =
801+ C.getDriver ().getSYCLDeviceTriple (getDefaultSYCLArch (C));
802+ SYCLTriples.insert (SYCLTriples.begin (), DefaultTriple);
803+ return true ;
804+ }
805+
784806void Driver::CreateOffloadingDeviceToolChains (Compilation &C,
785807 InputList &Inputs) {
786808
@@ -994,6 +1016,41 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
9941016 return ;
9951017 }
9961018
1019+ //
1020+ // SYCL
1021+ //
1022+ // We need to generate a SYCL toolchain if the user specified -fsycl.
1023+ bool IsSYCL = C.getInputArgs ().hasFlag (options::OPT_fsycl,
1024+ options::OPT_fno_sycl, false );
1025+
1026+ auto argSYCLIncompatible = [&](OptSpecifier OptId) {
1027+ if (!IsSYCL)
1028+ return ;
1029+ if (Arg *IncompatArg = C.getInputArgs ().getLastArg (OptId))
1030+ Diag (clang::diag::err_drv_argument_not_allowed_with)
1031+ << IncompatArg->getSpelling () << " -fsycl" ;
1032+ };
1033+ // -static-libstdc++ is not compatible with -fsycl.
1034+ argSYCLIncompatible (options::OPT_static_libstdcxx);
1035+ // -ffreestanding cannot be used with -fsycl
1036+ argSYCLIncompatible (options::OPT_ffreestanding);
1037+
1038+ llvm::SmallVector<llvm::Triple, 4 > UniqueSYCLTriplesVec;
1039+
1040+ if (IsSYCL) {
1041+ addSYCLDefaultTriple (C, UniqueSYCLTriplesVec);
1042+
1043+ // We'll need to use the SYCL and host triples as the key into
1044+ // getOffloadingDeviceToolChain, because the device toolchains we're
1045+ // going to create will depend on both.
1046+ const ToolChain *HostTC = C.getSingleOffloadToolChain <Action::OFK_Host>();
1047+ for (const auto &TT : UniqueSYCLTriplesVec) {
1048+ auto SYCLTC = &getOffloadingDeviceToolChain (C.getInputArgs (), TT, *HostTC,
1049+ Action::OFK_SYCL);
1050+ C.addOffloadDeviceToolChain (SYCLTC, Action::OFK_SYCL);
1051+ }
1052+ }
1053+
9971054 //
9981055 // TODO: Add support for other offloading programming models here.
9991056 //
@@ -2029,6 +2086,20 @@ void Driver::PrintHelp(bool ShowHidden) const {
20292086 VisibilityMask);
20302087}
20312088
2089+ llvm::Triple Driver::getSYCLDeviceTriple (StringRef TargetArch) const {
2090+ SmallVector<StringRef, 5 > SYCLAlias = {" spir" , " spir64" , " spirv32" ,
2091+ " spirv64" };
2092+ if (std::find (SYCLAlias.begin (), SYCLAlias.end (), TargetArch) !=
2093+ SYCLAlias.end ()) {
2094+ llvm::Triple TT;
2095+ TT.setArchName (TargetArch);
2096+ TT.setVendor (llvm::Triple::UnknownVendor);
2097+ TT.setOS (llvm::Triple::UnknownOS);
2098+ return TT;
2099+ }
2100+ return llvm::Triple (TargetArch);
2101+ }
2102+
20322103void Driver::PrintVersion (const Compilation &C, raw_ostream &OS) const {
20332104 if (IsFlangMode ()) {
20342105 OS << getClangToolFullVersion (" flang" ) << ' \n ' ;
@@ -4186,6 +4257,7 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args,
41864257
41874258 bool UseNewOffloadingDriver =
41884259 C.isOffloadingHostKind (Action::OFK_OpenMP) ||
4260+ C.isOffloadingHostKind (Action::OFK_SYCL) ||
41894261 Args.hasFlag (options::OPT_foffload_via_llvm,
41904262 options::OPT_fno_offload_via_llvm, false ) ||
41914263 Args.hasFlag (options::OPT_offload_new_driver,
@@ -4604,6 +4676,8 @@ Driver::getOffloadArchs(Compilation &C, const llvm::opt::DerivedArgList &Args,
46044676 Archs.insert (OffloadArchToString (OffloadArch::HIPDefault));
46054677 else if (Kind == Action::OFK_OpenMP)
46064678 Archs.insert (StringRef ());
4679+ else if (Kind == Action::OFK_SYCL)
4680+ Archs.insert (StringRef ());
46074681 } else {
46084682 Args.ClaimAllArgs (options::OPT_offload_arch_EQ);
46094683 Args.ClaimAllArgs (options::OPT_no_offload_arch_EQ);
@@ -4628,7 +4702,7 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
46284702 OffloadAction::DeviceDependences DDeps;
46294703
46304704 const Action::OffloadKind OffloadKinds[] = {
4631- Action::OFK_OpenMP, Action::OFK_Cuda, Action::OFK_HIP};
4705+ Action::OFK_OpenMP, Action::OFK_Cuda, Action::OFK_HIP, Action::OFK_SYCL };
46324706
46334707 for (Action::OffloadKind Kind : OffloadKinds) {
46344708 SmallVector<const ToolChain *, 2 > ToolChains;
@@ -4673,6 +4747,11 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
46734747 break ;
46744748 }
46754749
4750+ // Assemble actions are not used for the SYCL device side. Both compile
4751+ // and backend actions are used to generate IR and textual IR if needed.
4752+ if (Kind == Action::OFK_SYCL && Phase == phases::Assemble)
4753+ continue ;
4754+
46764755 auto TCAndArch = TCAndArchs.begin ();
46774756 for (Action *&A : DeviceActions) {
46784757 if (A->getType () == types::TY_Nothing)
@@ -4918,6 +4997,7 @@ Action *Driver::ConstructPhaseAction(
49184997 return C.MakeAction <BackendJobAction>(Input, Output);
49194998 }
49204999 if (Args.hasArg (options::OPT_emit_llvm) ||
5000+ TargetDeviceOffloadKind == Action::OFK_SYCL ||
49215001 (((Input->getOffloadingToolChain () &&
49225002 Input->getOffloadingToolChain ()->getTriple ().isAMDGPU ()) ||
49235003 TargetDeviceOffloadKind == Action::OFK_HIP) &&
@@ -6628,6 +6708,19 @@ const ToolChain &Driver::getOffloadingDeviceToolChain(
66286708 HostTC, Args);
66296709 break ;
66306710 }
6711+ case Action::OFK_SYCL:
6712+ switch (Target.getArch ()) {
6713+ case llvm::Triple::spir:
6714+ case llvm::Triple::spir64:
6715+ case llvm::Triple::spirv32:
6716+ case llvm::Triple::spirv64:
6717+ TC = std::make_unique<toolchains::SYCLToolChain>(*this , Target, HostTC,
6718+ Args);
6719+ break ;
6720+ default :
6721+ break ;
6722+ }
6723+ break ;
66316724 default :
66326725 break ;
66336726 }
0 commit comments