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 //
@@ -2015,6 +2072,20 @@ void Driver::PrintHelp(bool ShowHidden) const {
20152072 VisibilityMask);
20162073}
20172074
2075+ llvm::Triple Driver::getSYCLDeviceTriple (StringRef TargetArch) const {
2076+ SmallVector<StringRef, 5 > SYCLAlias = {" spir" , " spir64" , " spirv32" ,
2077+ " spirv64" };
2078+ if (std::find (SYCLAlias.begin (), SYCLAlias.end (), TargetArch) !=
2079+ SYCLAlias.end ()) {
2080+ llvm::Triple TT;
2081+ TT.setArchName (TargetArch);
2082+ TT.setVendor (llvm::Triple::UnknownVendor);
2083+ TT.setOS (llvm::Triple::UnknownOS);
2084+ return TT;
2085+ }
2086+ return llvm::Triple (TargetArch);
2087+ }
2088+
20182089void Driver::PrintVersion (const Compilation &C, raw_ostream &OS) const {
20192090 if (IsFlangMode ()) {
20202091 OS << getClangToolFullVersion (" flang" ) << ' \n ' ;
@@ -4171,6 +4242,7 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args,
41714242
41724243 bool UseNewOffloadingDriver =
41734244 C.isOffloadingHostKind (Action::OFK_OpenMP) ||
4245+ C.isOffloadingHostKind (Action::OFK_SYCL) ||
41744246 Args.hasFlag (options::OPT_foffload_via_llvm,
41754247 options::OPT_fno_offload_via_llvm, false ) ||
41764248 Args.hasFlag (options::OPT_offload_new_driver,
@@ -4582,6 +4654,8 @@ Driver::getOffloadArchs(Compilation &C, const llvm::opt::DerivedArgList &Args,
45824654 Archs.insert (OffloadArchToString (OffloadArch::HIPDefault));
45834655 else if (Kind == Action::OFK_OpenMP)
45844656 Archs.insert (StringRef ());
4657+ else if (Kind == Action::OFK_SYCL)
4658+ Archs.insert (StringRef ());
45854659 } else {
45864660 Args.ClaimAllArgs (options::OPT_offload_arch_EQ);
45874661 Args.ClaimAllArgs (options::OPT_no_offload_arch_EQ);
@@ -4606,7 +4680,7 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
46064680 OffloadAction::DeviceDependences DDeps;
46074681
46084682 const Action::OffloadKind OffloadKinds[] = {
4609- Action::OFK_OpenMP, Action::OFK_Cuda, Action::OFK_HIP};
4683+ Action::OFK_OpenMP, Action::OFK_Cuda, Action::OFK_HIP, Action::OFK_SYCL };
46104684
46114685 for (Action::OffloadKind Kind : OffloadKinds) {
46124686 SmallVector<const ToolChain *, 2 > ToolChains;
@@ -4651,6 +4725,11 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
46514725 break ;
46524726 }
46534727
4728+ // Assemble actions are not used for the SYCL device side. Both compile
4729+ // and backend actions are used to generate IR and textual IR if needed.
4730+ if (Kind == Action::OFK_SYCL && Phase == phases::Assemble)
4731+ continue ;
4732+
46544733 auto TCAndArch = TCAndArchs.begin ();
46554734 for (Action *&A : DeviceActions) {
46564735 if (A->getType () == types::TY_Nothing)
@@ -4889,6 +4968,7 @@ Action *Driver::ConstructPhaseAction(
48894968 return C.MakeAction <BackendJobAction>(Input, Output);
48904969 }
48914970 if (Args.hasArg (options::OPT_emit_llvm) ||
4971+ TargetDeviceOffloadKind == Action::OFK_SYCL ||
48924972 (((Input->getOffloadingToolChain () &&
48934973 Input->getOffloadingToolChain ()->getTriple ().isAMDGPU ()) ||
48944974 TargetDeviceOffloadKind == Action::OFK_HIP) &&
@@ -6583,6 +6663,19 @@ const ToolChain &Driver::getOffloadingDeviceToolChain(
65836663 HostTC, Args);
65846664 break ;
65856665 }
6666+ case Action::OFK_SYCL:
6667+ switch (Target.getArch ()) {
6668+ case llvm::Triple::spir:
6669+ case llvm::Triple::spir64:
6670+ case llvm::Triple::spirv32:
6671+ case llvm::Triple::spirv64:
6672+ TC = std::make_unique<toolchains::SYCLToolChain>(*this , Target, HostTC,
6673+ Args);
6674+ break ;
6675+ default :
6676+ break ;
6677+ }
6678+ break ;
65866679 default :
65876680 break ;
65886681 }
0 commit comments