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 //
@@ -2027,6 +2084,20 @@ void Driver::PrintHelp(bool ShowHidden) const {
20272084 VisibilityMask);
20282085}
20292086
2087+ llvm::Triple Driver::getSYCLDeviceTriple (StringRef TargetArch) const {
2088+ SmallVector<StringRef, 5 > SYCLAlias = {" spir" , " spir64" , " spirv32" ,
2089+ " spirv64" };
2090+ if (std::find (SYCLAlias.begin (), SYCLAlias.end (), TargetArch) !=
2091+ SYCLAlias.end ()) {
2092+ llvm::Triple TT;
2093+ TT.setArchName (TargetArch);
2094+ TT.setVendor (llvm::Triple::UnknownVendor);
2095+ TT.setOS (llvm::Triple::UnknownOS);
2096+ return TT;
2097+ }
2098+ return llvm::Triple (TargetArch);
2099+ }
2100+
20302101void Driver::PrintVersion (const Compilation &C, raw_ostream &OS) const {
20312102 if (IsFlangMode ()) {
20322103 OS << getClangToolFullVersion (" flang" ) << ' \n ' ;
@@ -4184,6 +4255,7 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args,
41844255
41854256 bool UseNewOffloadingDriver =
41864257 C.isOffloadingHostKind (Action::OFK_OpenMP) ||
4258+ C.isOffloadingHostKind (Action::OFK_SYCL) ||
41874259 Args.hasFlag (options::OPT_foffload_via_llvm,
41884260 options::OPT_fno_offload_via_llvm, false ) ||
41894261 Args.hasFlag (options::OPT_offload_new_driver,
@@ -4594,6 +4666,8 @@ Driver::getOffloadArchs(Compilation &C, const llvm::opt::DerivedArgList &Args,
45944666 Archs.insert (OffloadArchToString (OffloadArch::HIPDefault));
45954667 else if (Kind == Action::OFK_OpenMP)
45964668 Archs.insert (StringRef ());
4669+ else if (Kind == Action::OFK_SYCL)
4670+ Archs.insert (StringRef ());
45974671 } else {
45984672 Args.ClaimAllArgs (options::OPT_offload_arch_EQ);
45994673 Args.ClaimAllArgs (options::OPT_no_offload_arch_EQ);
@@ -4618,7 +4692,7 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
46184692 OffloadAction::DeviceDependences DDeps;
46194693
46204694 const Action::OffloadKind OffloadKinds[] = {
4621- Action::OFK_OpenMP, Action::OFK_Cuda, Action::OFK_HIP};
4695+ Action::OFK_OpenMP, Action::OFK_Cuda, Action::OFK_HIP, Action::OFK_SYCL };
46224696
46234697 for (Action::OffloadKind Kind : OffloadKinds) {
46244698 SmallVector<const ToolChain *, 2 > ToolChains;
@@ -4663,6 +4737,11 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
46634737 break ;
46644738 }
46654739
4740+ // Assemble actions are not used for the SYCL device side. Both compile
4741+ // and backend actions are used to generate IR and textual IR if needed.
4742+ if (Kind == Action::OFK_SYCL && Phase == phases::Assemble)
4743+ continue ;
4744+
46664745 auto TCAndArch = TCAndArchs.begin ();
46674746 for (Action *&A : DeviceActions) {
46684747 if (A->getType () == types::TY_Nothing)
@@ -4901,6 +4980,7 @@ Action *Driver::ConstructPhaseAction(
49014980 return C.MakeAction <BackendJobAction>(Input, Output);
49024981 }
49034982 if (Args.hasArg (options::OPT_emit_llvm) ||
4983+ TargetDeviceOffloadKind == Action::OFK_SYCL ||
49044984 (((Input->getOffloadingToolChain () &&
49054985 Input->getOffloadingToolChain ()->getTriple ().isAMDGPU ()) ||
49064986 TargetDeviceOffloadKind == Action::OFK_HIP) &&
@@ -6592,6 +6672,19 @@ const ToolChain &Driver::getOffloadingDeviceToolChain(
65926672 HostTC, Args);
65936673 break ;
65946674 }
6675+ case Action::OFK_SYCL:
6676+ switch (Target.getArch ()) {
6677+ case llvm::Triple::spir:
6678+ case llvm::Triple::spir64:
6679+ case llvm::Triple::spirv32:
6680+ case llvm::Triple::spirv64:
6681+ TC = std::make_unique<toolchains::SYCLToolChain>(*this , Target, HostTC,
6682+ Args);
6683+ break ;
6684+ default :
6685+ break ;
6686+ }
6687+ break ;
65956688 default :
65966689 break ;
65976690 }
0 commit comments