https://github.com/mdtoguchi updated https://github.com/llvm/llvm-project/pull/117268
>From 3fdc74687dbf6da831a1c27995d9d7fef3a2a51f Mon Sep 17 00:00:00 2001 From: Michael Toguchi <michael.d.togu...@intel.com> Date: Fri, 15 Nov 2024 05:14:21 -0700 Subject: [PATCH 1/7] Reland - [Driver][SYCL] Add initial SYCL offload compilation support (#107493) Introduces the SYCL based toolchain and initial toolchain construction when using the '-fsycl' option. This option will enable SYCL based offloading, creating a SPIR-V based IR file packaged into the compiled host object. This includes early support for creating the host/device object using the new offloading model. The device object is created using the spir64-unknown-unknown target triple. New/Updated Options: -fsycl Enables SYCL offloading for host and device -fsycl-device-only Enables device only compilation for SYCL -fsycl-host-only Enables host only compilation for SYCL RFC Reference: https://discourse.llvm.org/t/rfc-sycl-driver-enhancements/74092 Was reverted due to buildbot issues. Contains additional fixes to pull in the SYCL header dependencies to other toolchains. --- clang/include/clang/Driver/Action.h | 1 + clang/include/clang/Driver/Options.td | 20 ++- clang/include/clang/Driver/ToolChain.h | 4 + clang/lib/Driver/Action.cpp | 8 +- clang/lib/Driver/CMakeLists.txt | 1 + clang/lib/Driver/Compilation.cpp | 9 +- clang/lib/Driver/Driver.cpp | 104 +++++++++++++- clang/lib/Driver/ToolChain.cpp | 3 + clang/lib/Driver/ToolChains/Clang.cpp | 58 ++++++-- clang/lib/Driver/ToolChains/Darwin.cpp | 8 +- clang/lib/Driver/ToolChains/Darwin.h | 4 + clang/lib/Driver/ToolChains/Gnu.cpp | 8 +- clang/lib/Driver/ToolChains/Gnu.h | 5 + clang/lib/Driver/ToolChains/Linux.cpp | 5 + clang/lib/Driver/ToolChains/Linux.h | 2 + clang/lib/Driver/ToolChains/MSVC.cpp | 7 +- clang/lib/Driver/ToolChains/MSVC.h | 5 + clang/lib/Driver/ToolChains/MinGW.cpp | 7 +- clang/lib/Driver/ToolChains/MinGW.h | 4 + clang/lib/Driver/ToolChains/SYCL.cpp | 179 ++++++++++++++++++++++++ clang/lib/Driver/ToolChains/SYCL.h | 82 +++++++++++ clang/test/Driver/sycl-offload-jit.cpp | 80 +++++++++++ llvm/include/llvm/TargetParser/Triple.h | 3 + 23 files changed, 579 insertions(+), 28 deletions(-) create mode 100644 clang/lib/Driver/ToolChains/SYCL.cpp create mode 100644 clang/lib/Driver/ToolChains/SYCL.h create mode 100644 clang/test/Driver/sycl-offload-jit.cpp diff --git a/clang/include/clang/Driver/Action.h b/clang/include/clang/Driver/Action.h index 04fa8b01b418f8..feeabae89d6b1c 100644 --- a/clang/include/clang/Driver/Action.h +++ b/clang/include/clang/Driver/Action.h @@ -94,6 +94,7 @@ class Action { OFK_Cuda = 0x02, OFK_OpenMP = 0x04, OFK_HIP = 0x08, + OFK_SYCL = 0x10, }; static const char *getClassName(ActionClass AC); diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 5167c3c39e315a..1da3c9a1118ca8 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -182,7 +182,8 @@ def opencl_Group : OptionGroup<"<opencl group>">, Group<f_Group>, DocName<"OpenCL options">; def sycl_Group : OptionGroup<"<SYCL group>">, Group<f_Group>, - DocName<"SYCL options">; + DocName<"SYCL options">, + Visibility<[ClangOption, CLOption]>; def cuda_Group : OptionGroup<"<CUDA group>">, Group<f_Group>, DocName<"CUDA options">, @@ -6782,16 +6783,21 @@ defm : FlangIgnoredDiagOpt<"frontend-loop-interchange">; defm : FlangIgnoredDiagOpt<"target-lifetime">; // C++ SYCL options +let Group = sycl_Group in { def fsycl : Flag<["-"], "fsycl">, - Visibility<[ClangOption, CLOption]>, - Group<sycl_Group>, HelpText<"Enables SYCL kernels compilation for device">; + HelpText<"Enable SYCL C++ extensions">; def fno_sycl : Flag<["-"], "fno-sycl">, - Visibility<[ClangOption, CLOption]>, - Group<sycl_Group>, HelpText<"Disables SYCL kernels compilation for device">; + HelpText<"Disable SYCL C++ extensions">; +def fsycl_device_only : Flag<["-"], "fsycl-device-only">, + Alias<offload_device_only>, HelpText<"Compile SYCL code for device only">; +def fsycl_host_only : Flag<["-"], "fsycl-host-only">, + Alias<offload_host_only>, HelpText<"Compile SYCL code for host only. Has no " + "effect on non-SYCL compilations">; def sycl_link : Flag<["--"], "sycl-link">, Flags<[HelpHidden]>, - Visibility<[ClangOption, CLOption]>, - Group<sycl_Group>, HelpText<"Perform link through clang-sycl-linker via the target " + HelpText<"Perform link through clang-sycl-linker via the target " "offloading toolchain.">; +} // let Group = sycl_Group + // OS-specific options let Flags = [TargetSpecific] in { defm android_pad_segment : BooleanFFlag<"android-pad-segment">, Group<f_Group>; diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index 5347e29be91439..4efef49346fa4d 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -762,6 +762,10 @@ class ToolChain { virtual void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const; + /// Add arguments to use system-specific SYCL 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/Action.cpp b/clang/lib/Driver/Action.cpp index 849bf6035ebd2e..23dbcebc9a1ca1 100644 --- a/clang/lib/Driver/Action.cpp +++ b/clang/lib/Driver/Action.cpp @@ -111,6 +111,8 @@ std::string Action::getOffloadingKindPrefix() const { return "device-openmp"; case OFK_HIP: return "device-hip"; + case OFK_SYCL: + return "device-sycl"; // TODO: Add other programming models here. } @@ -128,6 +130,8 @@ std::string Action::getOffloadingKindPrefix() const { Res += "-hip"; if (ActiveOffloadKindMask & OFK_OpenMP) Res += "-openmp"; + if (ActiveOffloadKindMask & OFK_SYCL) + Res += "-sycl"; // TODO: Add other programming models here. @@ -164,6 +168,8 @@ StringRef Action::GetOffloadKindName(OffloadKind Kind) { return "openmp"; case OFK_HIP: return "hip"; + case OFK_SYCL: + return "sycl"; // TODO: Add other programming models here. } @@ -320,7 +326,7 @@ void OffloadAction::DeviceDependences::add(Action &A, const ToolChain &TC, DeviceBoundArchs.push_back(BoundArch); // Add each active offloading kind from a mask. - for (OffloadKind OKind : {OFK_OpenMP, OFK_Cuda, OFK_HIP}) + for (OffloadKind OKind : {OFK_OpenMP, OFK_Cuda, OFK_HIP, OFK_SYCL}) if (OKind & OffloadKindMask) DeviceOffloadKinds.push_back(OKind); } diff --git a/clang/lib/Driver/CMakeLists.txt b/clang/lib/Driver/CMakeLists.txt index 4fd10bf671512f..ea2fc967cad476 100644 --- a/clang/lib/Driver/CMakeLists.txt +++ b/clang/lib/Driver/CMakeLists.txt @@ -77,6 +77,7 @@ add_clang_library(clangDriver ToolChains/RISCVToolchain.cpp ToolChains/Solaris.cpp ToolChains/SPIRV.cpp + ToolChains/SYCL.cpp ToolChains/TCE.cpp ToolChains/UEFI.cpp ToolChains/VEToolchain.cpp diff --git a/clang/lib/Driver/Compilation.cpp b/clang/lib/Driver/Compilation.cpp index 4d4080507175c2..a39952e3c280ab 100644 --- a/clang/lib/Driver/Compilation.cpp +++ b/clang/lib/Driver/Compilation.cpp @@ -214,10 +214,11 @@ static bool ActionFailed(const Action *A, if (FailingCommands.empty()) return false; - // CUDA/HIP can have the same input source code compiled multiple times so do - // not compiled again if there are already failures. It is OK to abort the - // CUDA pipeline on errors. - if (A->isOffloading(Action::OFK_Cuda) || A->isOffloading(Action::OFK_HIP)) + // CUDA/HIP/SYCL can have the same input source code compiled multiple times + // so do not compile again if there are already failures. It is OK to abort + // the CUDA/HIP/SYCL pipeline on errors. + if (A->isOffloading(Action::OFK_Cuda) || A->isOffloading(Action::OFK_HIP) || + A->isOffloading(Action::OFK_SYCL)) return true; for (const auto &CI : FailingCommands) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index a0f4329e36136b..d16c4cd33e15c4 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -43,6 +43,7 @@ #include "ToolChains/PS4CPU.h" #include "ToolChains/RISCVToolchain.h" #include "ToolChains/SPIRV.h" +#include "ToolChains/SYCL.h" #include "ToolChains/Solaris.h" #include "ToolChains/TCE.h" #include "ToolChains/UEFI.h" @@ -780,6 +781,41 @@ Driver::OpenMPRuntimeKind Driver::getOpenMPRuntime(const ArgList &Args) const { return RT; } +static const char *getDefaultSYCLArch(Compilation &C) { + // If -fsycl is supplied we will assume SPIR-V + if (C.getDefaultToolChain().getTriple().isArch32Bit()) + return "spirv32"; + return "spirv64"; +} + +static llvm::Triple getSYCLDeviceTriple(StringRef TargetArch) { + SmallVector<StringRef, 5> SYCLAlias = {"spir", "spir64", "spirv", "spirv32", + "spirv64"}; + if (std::find(SYCLAlias.begin(), SYCLAlias.end(), TargetArch) != + SYCLAlias.end()) { + llvm::Triple TargetTriple; + TargetTriple.setArchName(TargetArch); + TargetTriple.setVendor(llvm::Triple::UnknownVendor); + TargetTriple.setOS(llvm::Triple::UnknownOS); + return TargetTriple; + } + return llvm::Triple(TargetArch); +} + +static bool addSYCLDefaultTriple(Compilation &C, + SmallVectorImpl<llvm::Triple> &SYCLTriples) { + // Check current set of triples to see if the default has already been set. + for (const auto &SYCLTriple : SYCLTriples) { + if (SYCLTriple.getSubArch() == llvm::Triple::NoSubArch && + SYCLTriple.isSPIROrSPIRV()) + return false; + } + // Add the default triple as it was not found. + llvm::Triple DefaultTriple = getSYCLDeviceTriple(getDefaultSYCLArch(C)); + SYCLTriples.insert(SYCLTriples.begin(), DefaultTriple); + return true; +} + void Driver::CreateOffloadingDeviceToolChains(Compilation &C, InputList &Inputs) { @@ -993,6 +1029,42 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, return; } + // + // SYCL + // + // We need to generate a SYCL toolchain if the user specified -fsycl. + bool IsSYCL = C.getInputArgs().hasFlag(options::OPT_fsycl, + options::OPT_fno_sycl, false); + + auto argSYCLIncompatible = [&](OptSpecifier OptId) { + if (!IsSYCL) + return; + if (Arg *IncompatArg = C.getInputArgs().getLastArg(OptId)) + Diag(clang::diag::err_drv_argument_not_allowed_with) + << IncompatArg->getSpelling() << "-fsycl"; + }; + // -static-libstdc++ is not compatible with -fsycl. + argSYCLIncompatible(options::OPT_static_libstdcxx); + // -ffreestanding cannot be used with -fsycl + argSYCLIncompatible(options::OPT_ffreestanding); + + llvm::SmallVector<llvm::Triple, 4> UniqueSYCLTriplesVec; + + if (IsSYCL) { + addSYCLDefaultTriple(C, UniqueSYCLTriplesVec); + + // We'll need to use the SYCL and host triples as the key into + // getOffloadingDeviceToolChain, because the device toolchains we're + // going to create will depend on both. + const ToolChain *HostTC = C.getSingleOffloadToolChain<Action::OFK_Host>(); + for (const auto &TargetTriple : UniqueSYCLTriplesVec) { + auto SYCLTC = &getOffloadingDeviceToolChain( + C.getInputArgs(), TargetTriple, *HostTC, Action::OFK_SYCL); + assert(SYCLTC && "Could not create offloading device tool chain."); + C.addOffloadDeviceToolChain(SYCLTC, Action::OFK_SYCL); + } + } + // // TODO: Add support for other offloading programming models here. // @@ -4183,6 +4255,7 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args, bool UseNewOffloadingDriver = C.isOffloadingHostKind(Action::OFK_OpenMP) || + C.isOffloadingHostKind(Action::OFK_SYCL) || Args.hasFlag(options::OPT_foffload_via_llvm, options::OPT_fno_offload_via_llvm, false) || Args.hasFlag(options::OPT_offload_new_driver, @@ -4593,6 +4666,8 @@ Driver::getOffloadArchs(Compilation &C, const llvm::opt::DerivedArgList &Args, Archs.insert(OffloadArchToString(OffloadArch::HIPDefault)); else if (Kind == Action::OFK_OpenMP) Archs.insert(StringRef()); + else if (Kind == Action::OFK_SYCL) + Archs.insert(StringRef()); } else { Args.ClaimAllArgs(options::OPT_offload_arch_EQ); Args.ClaimAllArgs(options::OPT_no_offload_arch_EQ); @@ -4617,7 +4692,7 @@ Action *Driver::BuildOffloadingActions(Compilation &C, OffloadAction::DeviceDependences DDeps; const Action::OffloadKind OffloadKinds[] = { - Action::OFK_OpenMP, Action::OFK_Cuda, Action::OFK_HIP}; + Action::OFK_OpenMP, Action::OFK_Cuda, Action::OFK_HIP, Action::OFK_SYCL}; for (Action::OffloadKind Kind : OffloadKinds) { SmallVector<const ToolChain *, 2> ToolChains; @@ -4654,6 +4729,15 @@ Action *Driver::BuildOffloadingActions(Compilation &C, if (DeviceActions.empty()) return HostAction; + // FIXME: Do not collapse the host side for Darwin targets with SYCL offload + // compilations. The toolchain is not properly initialized for the target. + if (isa<CompileJobAction>(HostAction) && Kind == Action::OFK_SYCL && + HostAction->getType() != types::TY_Nothing && + C.getSingleOffloadToolChain<Action::OFK_Host>() + ->getTriple() + .isOSDarwin()) + HostAction->setCannotBeCollapsedWithNextDependentAction(); + auto PL = types::getCompilationPhases(*this, Args, InputType); for (phases::ID Phase : PL) { @@ -4662,6 +4746,11 @@ Action *Driver::BuildOffloadingActions(Compilation &C, break; } + // Assemble actions are not used for the SYCL device side. Both compile + // and backend actions are used to generate IR and textual IR if needed. + if (Kind == Action::OFK_SYCL && Phase == phases::Assemble) + continue; + auto TCAndArch = TCAndArchs.begin(); for (Action *&A : DeviceActions) { if (A->getType() == types::TY_Nothing) @@ -4900,6 +4989,7 @@ Action *Driver::ConstructPhaseAction( return C.MakeAction<BackendJobAction>(Input, Output); } if (Args.hasArg(options::OPT_emit_llvm) || + TargetDeviceOffloadKind == Action::OFK_SYCL || (((Input->getOffloadingToolChain() && Input->getOffloadingToolChain()->getTriple().isAMDGPU()) || TargetDeviceOffloadKind == Action::OFK_HIP) && @@ -6591,6 +6681,18 @@ const ToolChain &Driver::getOffloadingDeviceToolChain( HostTC, Args); break; } + case Action::OFK_SYCL: + switch (Target.getArch()) { + case llvm::Triple::spir: + case llvm::Triple::spir64: + case llvm::Triple::spirv32: + case llvm::Triple::spirv64: + TC = std::make_unique<toolchains::SYCLToolChain>(*this, Target, HostTC, + Args); + break; + default: + break; + } default: break; } diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 0d426a467e9a3b..dc950e2afa8aea 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -1485,6 +1485,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::BitCodeLibraryInfo, 12> ToolChain::getDeviceLibs(const ArgList &DriverArgs) const { return {}; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index d3eec9fea0d498..5110cca167aace 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -24,6 +24,7 @@ #include "Hexagon.h" #include "MSP430.h" #include "PS4CPU.h" +#include "SYCL.h" #include "clang/Basic/CLWarnings.h" #include "clang/Basic/CharInfo.h" #include "clang/Basic/CodeGenOptions.h" @@ -122,6 +123,13 @@ forAllAssociatedToolChains(Compilation &C, const JobAction &JA, } else if (JA.isDeviceOffloading(Action::OFK_OpenMP)) Work(*C.getSingleOffloadToolChain<Action::OFK_Host>()); + if (JA.isHostOffloading(Action::OFK_SYCL)) { + auto TCs = C.getOffloadToolChains<Action::OFK_SYCL>(); + for (auto II = TCs.first, IE = TCs.second; II != IE; ++II) + Work(*II->second); + } else if (JA.isDeviceOffloading(Action::OFK_SYCL)) + Work(*C.getSingleOffloadToolChain<Action::OFK_Host>()); + // // TODO: Add support for other offloading programming models here. // @@ -1070,14 +1078,16 @@ void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA, Args.AddLastArg(CmdArgs, options::OPT_MP); Args.AddLastArg(CmdArgs, options::OPT_MV); - // Add offload include arguments specific for CUDA/HIP. This must happen + // Add offload include arguments specific for CUDA/HIP/SYCL. This must happen // before we -I or -include anything else, because we must pick up the - // CUDA/HIP headers from the particular CUDA/ROCm installation, rather than - // from e.g. /usr/local/include. + // CUDA/HIP/SYCL headers from the particular CUDA/ROCm/SYCL installation, + // rather than from e.g. /usr/local/include. if (JA.isOffloading(Action::OFK_Cuda)) getToolChain().AddCudaIncludeArgs(Args, CmdArgs); if (JA.isOffloading(Action::OFK_HIP)) getToolChain().AddHIPIncludeArgs(Args, CmdArgs); + if (JA.isOffloading(Action::OFK_SYCL)) + getToolChain().AddSYCLIncludeArgs(Args, CmdArgs); // If we are offloading to a target via OpenMP we need to include the // openmp_wrappers folder which contains alternative system headers. @@ -5032,17 +5042,21 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // second input. Module precompilation accepts a list of header files to // include as part of the module. API extraction accepts a list of header // files whose API information is emitted in the output. All other jobs are - // expected to have exactly one input. + // expected to have exactly one input. SYCL compilation only expects a + // single input. bool IsCuda = JA.isOffloading(Action::OFK_Cuda); bool IsCudaDevice = JA.isDeviceOffloading(Action::OFK_Cuda); bool IsHIP = JA.isOffloading(Action::OFK_HIP); bool IsHIPDevice = JA.isDeviceOffloading(Action::OFK_HIP); + bool IsSYCL = JA.isOffloading(Action::OFK_SYCL); + bool IsSYCLDevice = JA.isDeviceOffloading(Action::OFK_SYCL); bool IsOpenMPDevice = JA.isDeviceOffloading(Action::OFK_OpenMP); bool IsExtractAPI = isa<ExtractAPIJobAction>(JA); bool IsDeviceOffloadAction = !(JA.isDeviceOffloading(Action::OFK_None) || JA.isDeviceOffloading(Action::OFK_Host)); bool IsHostOffloadingAction = JA.isHostOffloading(Action::OFK_OpenMP) || + JA.isHostOffloading(Action::OFK_SYCL) || (JA.isHostOffloading(C.getActiveOffloadKinds()) && Args.hasFlag(options::OPT_offload_new_driver, options::OPT_no_offload_new_driver, false)); @@ -5092,10 +5106,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, bool IsWindowsMSVC = RawTriple.isWindowsMSVCEnvironment(); bool IsIAMCU = RawTriple.isOSIAMCU(); - // Adjust IsWindowsXYZ for CUDA/HIP compilations. Even when compiling in + // Adjust IsWindowsXYZ for CUDA/HIP/SYCL compilations. Even when compiling in // device mode (i.e., getToolchain().getTriple() is NVPTX/AMDGCN, not // Windows), we need to pass Windows-specific flags to cc1. - if (IsCuda || IsHIP) + if (IsCuda || IsHIP || IsSYCL) IsWindowsMSVC |= AuxTriple && AuxTriple->isWindowsMSVCEnvironment(); // C++ is not supported for IAMCU. @@ -5179,11 +5193,33 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, if (const Arg *PF = Args.getLastArg(options::OPT_mprintf_kind_EQ)) PF->claim(); - if (Args.hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, false)) { - CmdArgs.push_back("-fsycl-is-device"); + if (IsSYCL) { + if (IsSYCLDevice) { + // Host triple is needed when doing SYCL device compilations. + llvm::Triple AuxT = C.getDefaultToolChain().getTriple(); + std::string NormalizedTriple = AuxT.normalize(); + CmdArgs.push_back("-aux-triple"); + CmdArgs.push_back(Args.MakeArgString(NormalizedTriple)); - if (Arg *A = Args.getLastArg(options::OPT_sycl_std_EQ)) { - A->render(Args, CmdArgs); + // We want to compile sycl kernels. + CmdArgs.push_back("-fsycl-is-device"); + + // Set O2 optimization level by default + if (!Args.getLastArg(options::OPT_O_Group)) + CmdArgs.push_back("-O2"); + } else { + // Add any options that are needed specific to SYCL offload while + // performing the host side compilation. + + // Let the front-end host compilation flow know about SYCL offload + // compilation. + CmdArgs.push_back("-fsycl-is-host"); + } + + // Set options for both host and device. + Arg *SYCLStdArg = Args.getLastArg(options::OPT_sycl_std_EQ); + if (SYCLStdArg) { + SYCLStdArg->render(Args, CmdArgs); } else { // Ensure the default version in SYCL mode is 2020. CmdArgs.push_back("-sycl-std=2020"); @@ -6129,7 +6165,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // Prepare `-aux-target-cpu` and `-aux-target-feature` unless // `--gpu-use-aux-triple-only` is specified. if (!Args.getLastArg(options::OPT_gpu_use_aux_triple_only) && - (IsCudaDevice || IsHIPDevice)) { + (IsCudaDevice || IsHIPDevice || IsSYCLDevice)) { const ArgList &HostArgs = C.getArgsForToolChain(nullptr, StringRef(), Action::OFK_None); std::string HostCPU = diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index 87380869f6fdab..f225c5b16a7c0a 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -965,7 +965,8 @@ MachO::MachO(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) /// Darwin - Darwin tool chain for i386 and x86_64. Darwin::Darwin(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) : MachO(D, Triple, Args), TargetInitialized(false), - CudaInstallation(D, Triple, Args), RocmInstallation(D, Triple, Args) {} + CudaInstallation(D, Triple, Args), RocmInstallation(D, Triple, Args), + SYCLInstallation(D, Triple, Args) {} types::ID MachO::LookupTypeForExtension(StringRef Ext) const { types::ID Ty = ToolChain::LookupTypeForExtension(Ext); @@ -1024,6 +1025,11 @@ void Darwin::AddHIPIncludeArgs(const ArgList &DriverArgs, RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args); } +void Darwin::AddSYCLIncludeArgs(const ArgList &DriverArgs, + ArgStringList &CC1Args) const { + SYCLInstallation->AddSYCLIncludeArgs(DriverArgs, CC1Args); +} + // This is just a MachO name translation routine and there's no // way to join this into ARMTargetParser without breaking all // other assumptions. Maybe MachO should consider standardising diff --git a/clang/lib/Driver/ToolChains/Darwin.h b/clang/lib/Driver/ToolChains/Darwin.h index 2e55b49682a7e9..fd9270a584119e 100644 --- a/clang/lib/Driver/ToolChains/Darwin.h +++ b/clang/lib/Driver/ToolChains/Darwin.h @@ -12,6 +12,7 @@ #include "Cuda.h" #include "LazyDetector.h" #include "ROCm.h" +#include "SYCL.h" #include "clang/Basic/DarwinSDKInfo.h" #include "clang/Basic/LangOptions.h" #include "clang/Driver/Tool.h" @@ -331,6 +332,7 @@ class LLVM_LIBRARY_VISIBILITY Darwin : public MachO { LazyDetector<CudaInstallationDetector> CudaInstallation; LazyDetector<RocmInstallationDetector> RocmInstallation; + LazyDetector<SYCLInstallationDetector> SYCLInstallation; private: void AddDeploymentTarget(llvm::opt::DerivedArgList &Args) const; @@ -563,6 +565,8 @@ class LLVM_LIBRARY_VISIBILITY Darwin : public MachO { llvm::opt::ArgStringList &CC1Args) const override; void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; + void AddSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const override; bool UseObjCMixedDispatch() const override { // This is only used with the non-fragile ABI and non-legacy dispatch. diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index 8397f1121ec2ce..c04b209ecd8d30 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -3058,7 +3058,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, Triple, Args) { getProgramPaths().push_back(getDriver().Dir); } @@ -3274,6 +3275,11 @@ void Generic_GCC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, } } +void Generic_GCC::AddSYCLIncludeArgs(const ArgList &DriverArgs, + ArgStringList &CC1Args) const { + SYCLInstallation->AddSYCLIncludeArgs(DriverArgs, CC1Args); +} + void Generic_GCC::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const { diff --git a/clang/lib/Driver/ToolChains/Gnu.h b/clang/lib/Driver/ToolChains/Gnu.h index 0b664a182d75e1..96352d3559ffd2 100644 --- a/clang/lib/Driver/ToolChains/Gnu.h +++ b/clang/lib/Driver/ToolChains/Gnu.h @@ -12,6 +12,7 @@ #include "Cuda.h" #include "LazyDetector.h" #include "ROCm.h" +#include "SYCL.h" #include "clang/Driver/Tool.h" #include "clang/Driver/ToolChain.h" #include <set> @@ -288,6 +289,7 @@ class LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain { GCCInstallationDetector GCCInstallation; LazyDetector<CudaInstallationDetector> CudaInstallation; LazyDetector<RocmInstallationDetector> RocmInstallation; + LazyDetector<SYCLInstallationDetector> SYCLInstallation; public: Generic_GCC(const Driver &D, const llvm::Triple &Triple, @@ -336,6 +338,9 @@ class LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain { const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; + void AddSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const override; + virtual void addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const; diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp index d1cb625613415b..3119ba0b939ba0 100644 --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -759,6 +759,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 2d9e674e50a630..cdec2fd39bbfa0 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 80799d1e715f07..77b75e506861e7 100644 --- a/clang/lib/Driver/ToolChains/MSVC.cpp +++ b/clang/lib/Driver/ToolChains/MSVC.cpp @@ -424,7 +424,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, Triple, Args) { getProgramPaths().push_back(getDriver().Dir); std::optional<llvm::StringRef> VCToolsDir, VCToolsVersion; @@ -503,6 +503,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 3950a8ed38e8b4..1925ec2febd611 100644 --- a/clang/lib/Driver/ToolChains/MSVC.h +++ b/clang/lib/Driver/ToolChains/MSVC.h @@ -12,6 +12,7 @@ #include "AMDGPU.h" #include "Cuda.h" #include "LazyDetector.h" +#include "SYCL.h" #include "clang/Driver/Compilation.h" #include "clang/Driver/Tool.h" #include "clang/Driver/ToolChain.h" @@ -100,6 +101,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, @@ -138,6 +142,7 @@ class LLVM_LIBRARY_VISIBILITY MSVCToolChain : public ToolChain { llvm::ToolsetLayout VSLayout = llvm::ToolsetLayout::OlderVS; LazyDetector<CudaInstallationDetector> CudaInstallation; LazyDetector<RocmInstallationDetector> RocmInstallation; + LazyDetector<SYCLInstallationDetector> SYCLInstallation; }; } // end namespace toolchains diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp b/clang/lib/Driver/ToolChains/MinGW.cpp index 963de81027ca9f..9a302f3e34ae00 100644 --- a/clang/lib/Driver/ToolChains/MinGW.cpp +++ b/clang/lib/Driver/ToolChains/MinGW.cpp @@ -491,7 +491,7 @@ static bool looksLikeMinGWSysroot(const std::string &Directory) { toolchains::MinGW::MinGW(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, Triple, Args) { getProgramPaths().push_back(getDriver().Dir); std::string InstallBase = @@ -630,6 +630,11 @@ void toolchains::MinGW::AddHIPIncludeArgs(const ArgList &DriverArgs, RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args); } +void toolchains::MinGW::AddSYCLIncludeArgs(const ArgList &DriverArgs, + ArgStringList &CC1Args) const { + SYCLInstallation->AddSYCLIncludeArgs(DriverArgs, CC1Args); +} + void toolchains::MinGW::printVerboseInfo(raw_ostream &OS) const { CudaInstallation->print(OS); RocmInstallation->print(OS); diff --git a/clang/lib/Driver/ToolChains/MinGW.h b/clang/lib/Driver/ToolChains/MinGW.h index a9963d8d06c29d..e9884bab5826fb 100644 --- a/clang/lib/Driver/ToolChains/MinGW.h +++ b/clang/lib/Driver/ToolChains/MinGW.h @@ -13,6 +13,7 @@ #include "Gnu.h" #include "LazyDetector.h" #include "ROCm.h" +#include "SYCL.h" #include "clang/Driver/Tool.h" #include "clang/Driver/ToolChain.h" #include "llvm/Support/ErrorOr.h" @@ -92,6 +93,8 @@ class LLVM_LIBRARY_VISIBILITY MinGW : public ToolChain { llvm::opt::ArgStringList &CC1Args) const override; void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; + void AddSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const override; void printVerboseInfo(raw_ostream &OS) const override; @@ -105,6 +108,7 @@ class LLVM_LIBRARY_VISIBILITY MinGW : public ToolChain { private: LazyDetector<CudaInstallationDetector> CudaInstallation; LazyDetector<RocmInstallationDetector> RocmInstallation; + LazyDetector<SYCLInstallationDetector> SYCLInstallation; std::string Base; std::string GccLibDir; diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp new file mode 100644 index 00000000000000..77edc5b976f022 --- /dev/null +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -0,0 +1,179 @@ +//===--- SYCL.cpp - SYCL Tool and ToolChain Implementations -----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#include "SYCL.h" +#include "CommonArgs.h" +#include "llvm/Support/Path.h" + +using namespace clang::driver; +using namespace clang::driver::toolchains; +using namespace clang::driver::tools; +using namespace clang; +using namespace llvm::opt; + +SYCLInstallationDetector::SYCLInstallationDetector( + const Driver &D, const llvm::Triple &HostTriple, + const llvm::opt::ArgList &Args) + : D(D) {} + +void SYCLInstallationDetector::AddSYCLIncludeArgs( + const ArgList &DriverArgs, ArgStringList &CC1Args) const { + if (DriverArgs.hasArg(clang::driver::options::OPT_nobuiltininc)) + return; + + // 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., <complex>). + 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)); +} + +// Unsupported options for SYCL device compilation. +static std::vector<OptSpecifier> getUnsupportedOpts() { + std::vector<OptSpecifier> UnsupportedOpts = { + options::OPT_fsanitize_EQ, // -fsanitize + options::OPT_fcf_protection_EQ, // -fcf-protection + options::OPT_fprofile_generate, + options::OPT_fprofile_generate_EQ, + options::OPT_fno_profile_generate, // -f[no-]profile-generate + options::OPT_ftest_coverage, + options::OPT_fno_test_coverage, // -f[no-]test-coverage + options::OPT_fcoverage_mapping, + options::OPT_fno_coverage_mapping, // -f[no-]coverage-mapping + options::OPT_coverage, // --coverage + options::OPT_fprofile_instr_generate, + options::OPT_fprofile_instr_generate_EQ, + options::OPT_fno_profile_instr_generate, // -f[no-]profile-instr-generate + options::OPT_fprofile_arcs, + options::OPT_fno_profile_arcs, // -f[no-]profile-arcs + options::OPT_fcreate_profile, // -fcreate-profile + options::OPT_fprofile_instr_use, + options::OPT_fprofile_instr_use_EQ, // -fprofile-instr-use + options::OPT_forder_file_instrumentation, // -forder-file-instrumentation + options::OPT_fcs_profile_generate, // -fcs-profile-generate + options::OPT_fcs_profile_generate_EQ}; + return UnsupportedOpts; +} + +SYCLToolChain::SYCLToolChain(const Driver &D, const llvm::Triple &Triple, + const ToolChain &HostTC, const ArgList &Args) + : ToolChain(D, Triple, Args), HostTC(HostTC), + SYCLInstallation(D, Triple, Args) { + // Lookup binaries into the driver directory, this is used to discover any + // dependent SYCL offload compilation tools. + getProgramPaths().push_back(getDriver().Dir); + + // Diagnose unsupported options only once. + for (OptSpecifier Opt : getUnsupportedOpts()) { + if (const Arg *A = Args.getLastArg(Opt)) { + // All sanitizer options are not currently supported, except + // AddressSanitizer. + if (A->getOption().getID() == options::OPT_fsanitize_EQ && + A->getValues().size() == 1) { + std::string SanitizeVal = A->getValue(); + if (SanitizeVal == "address") + continue; + } + D.Diag(clang::diag::warn_drv_unsupported_option_for_target) + << A->getAsString(Args) << getTriple().str(); + } + } +} + +void SYCLToolChain::addClangTargetOptions( + const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, + Action::OffloadKind DeviceOffloadingKind) const { + HostTC.addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadingKind); +} + +llvm::opt::DerivedArgList * +SYCLToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args, + StringRef BoundArch, + Action::OffloadKind DeviceOffloadKind) const { + DerivedArgList *DAL = + HostTC.TranslateArgs(Args, BoundArch, DeviceOffloadKind); + + bool IsNewDAL = false; + if (!DAL) { + DAL = new DerivedArgList(Args.getBaseArgs()); + IsNewDAL = true; + } + + for (Arg *A : Args) { + // Filter out any options we do not want to pass along to the device + // compilation. + auto Opt(A->getOption()); + bool Unsupported = false; + for (OptSpecifier UnsupportedOpt : getUnsupportedOpts()) { + if (Opt.matches(UnsupportedOpt)) { + if (Opt.getID() == options::OPT_fsanitize_EQ && + A->getValues().size() == 1) { + std::string SanitizeVal = A->getValue(); + if (SanitizeVal == "address") { + if (IsNewDAL) + DAL->append(A); + continue; + } + } + if (!IsNewDAL) + DAL->eraseArg(Opt.getID()); + Unsupported = true; + } + } + if (Unsupported) + continue; + if (IsNewDAL) + DAL->append(A); + } + + const OptTable &Opts = getDriver().getOpts(); + if (!BoundArch.empty()) { + DAL->eraseArg(options::OPT_march_EQ); + DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), + BoundArch); + } + return DAL; +} + +void SYCLToolChain::addClangWarningOptions(ArgStringList &CC1Args) const { + HostTC.addClangWarningOptions(CC1Args); +} + +ToolChain::CXXStdlibType +SYCLToolChain::GetCXXStdlibType(const ArgList &Args) const { + return HostTC.GetCXXStdlibType(Args); +} + +void SYCLToolChain::AddSYCLIncludeArgs(const ArgList &DriverArgs, + ArgStringList &CC1Args) const { + SYCLInstallation.AddSYCLIncludeArgs(DriverArgs, CC1Args); +} + +void SYCLToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs, + ArgStringList &CC1Args) const { + HostTC.AddClangSystemIncludeArgs(DriverArgs, CC1Args); +} + +void SYCLToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &Args, + ArgStringList &CC1Args) const { + HostTC.AddClangCXXStdlibIncludeArgs(Args, CC1Args); +} + +SanitizerMask SYCLToolChain::getSupportedSanitizers() const { + return SanitizerKind::Address; +} diff --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h new file mode 100644 index 00000000000000..8c15cd6c6fc224 --- /dev/null +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -0,0 +1,82 @@ +//===--- SYCL.h - SYCL ToolChain Implementations ----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_SYCL_H +#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_SYCL_H + +#include "clang/Driver/Tool.h" +#include "clang/Driver/ToolChain.h" + +namespace clang { +namespace driver { + +class SYCLInstallationDetector { +public: + SYCLInstallationDetector(const Driver &D, const llvm::Triple &HostTriple, + const llvm::opt::ArgList &Args); + + void AddSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; + +private: + const Driver &D; +}; + +namespace toolchains { + +class LLVM_LIBRARY_VISIBILITY SYCLToolChain : public ToolChain { +public: + SYCLToolChain(const Driver &D, const llvm::Triple &Triple, + const ToolChain &HostTC, const llvm::opt::ArgList &Args); + + const llvm::Triple *getAuxTriple() const override { + return &HostTC.getTriple(); + } + + llvm::opt::DerivedArgList * + TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch, + Action::OffloadKind DeviceOffloadKind) const override; + void + addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args, + Action::OffloadKind DeviceOffloadKind) const override; + + bool useIntegratedAs() const override { return true; } + bool isPICDefault() const override { return false; } + llvm::codegenoptions::DebugInfoFormat getDefaultDebugFormat() const override { + return this->HostTC.getDefaultDebugFormat(); + } + bool isPIEDefault(const llvm::opt::ArgList &Args) const override { + return false; + } + bool isPICDefaultForced() const override { return false; } + + void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override; + CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override; + 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( + const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CC1Args) const override; + + SanitizerMask getSupportedSanitizers() const override; + +private: + const ToolChain &HostTC; + SYCLInstallationDetector SYCLInstallation; +}; + +} // end namespace toolchains + +} // end namespace driver +} // end namespace clang + +#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_SYCL_H diff --git a/clang/test/Driver/sycl-offload-jit.cpp b/clang/test/Driver/sycl-offload-jit.cpp new file mode 100644 index 00000000000000..6287e9617b5433 --- /dev/null +++ b/clang/test/Driver/sycl-offload-jit.cpp @@ -0,0 +1,80 @@ +/// +/// Perform several driver tests for SYCL offloading for JIT +/// + +/// Check the phases graph with -fsycl. Use of -fsycl enables offload +// RUN: %clang -ccc-print-phases --target=x86_64-unknown-linux-gnu \ +// RUN: -fsycl %s 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHK-PHASES %s +// RUN: %clang_cl -ccc-print-phases --target=x86_64-pc-windows-msvc -fsycl \ +// RUN: %s 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHK-PHASES %s +// CHK-PHASES: 0: input, "[[INPUT:.+\.cpp]]", c++, (host-sycl) +// CHK-PHASES: 1: preprocessor, {0}, c++-cpp-output, (host-sycl) +// CHK-PHASES: 2: compiler, {1}, ir, (host-sycl) +// CHK-PHASES: 3: input, "[[INPUT]]", c++, (device-sycl) +// CHK-PHASES: 4: preprocessor, {3}, c++-cpp-output, (device-sycl) +// CHK-PHASES: 5: compiler, {4}, ir, (device-sycl) +// CHK-PHASES: 6: backend, {5}, ir, (device-sycl) +// CHK-PHASES: 7: offload, "device-sycl (spirv64-unknown-unknown)" {6}, ir +// CHK-PHASES: 8: clang-offload-packager, {7}, image, (device-sycl) +// CHK-PHASES: 9: offload, "host-sycl (x86_64{{.*}})" {2}, "device-sycl (x86_64{{.*}})" {8}, ir +// CHK-PHASES: 10: backend, {9}, assembler, (host-sycl) +// CHK-PHASES: 11: assembler, {10}, object, (host-sycl) +// CHK-PHASES: 12: clang-linker-wrapper, {11}, image, (host-sycl) + +/// Check expected default values for device compilation when using -fsycl as +/// well as clang-offload-packager inputs. +// RUN: %clang -### -fsycl -c --target=x86_64-unknown-linux-gnu %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHK-DEVICE-TRIPLE %s +// CHK-DEVICE-TRIPLE: clang{{.*}} "-triple" "spirv64-unknown-unknown" +// CHK-DEVICE-TRIPLE-SAME: "-aux-triple" "x86_64-unknown-linux-gnu" +// CHK-DEVICE-TRIPLE-SAME: "-fsycl-is-device" +// CHK-DEVICE-TRIPLE-SAME: "-O2" +// CHK-DEVICE-TRIPLE: clang-offload-packager{{.*}} "--image=file={{.*}}.bc,triple=spirv64-unknown-unknown,arch=,kind=sycl" + +/// Check -fsycl-is-device is passed when compiling for the device. +/// Check -fsycl-is-host is passed when compiling for host. +// RUN: %clang -### -fsycl -c %s 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHK-FSYCL-IS-DEVICE,CHK-FSYCL-IS-HOST %s +// RUN: %clang -### -fsycl -fsycl-device-only %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHK-FSYCL-IS-DEVICE %s +// RUN: %clang_cl -### -fsycl -c %s 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHK-FSYCL-IS-DEVICE,CHK-FSYCL-IS-HOST %s +// RUN: %clang -### -fsycl -fsycl-host-only %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHK-FSYCL-IS-HOST %s +// CHK-FSYCL-IS-DEVICE: clang{{.*}} "-fsycl-is-device" {{.*}} "-emit-llvm-bc" +// CHK-FSYCL-IS-HOST: clang{{.*}} "-fsycl-is-host" + +// Verify header search dirs are added with -fsycl +// RUN: %clang -### -fsycl %s 2>&1 \ +// RUN: | FileCheck %s -check-prefixes=CHECK-HEADER-DIR +// RUN: %clang_cl -### -fsycl %s 2>&1 \ +// RUN: | FileCheck %s -check-prefixes=CHECK-HEADER-DIR +// CHECK-HEADER-DIR: clang{{.*}} "-fsycl-is-device" +// CHECK-HEADER-DIR-SAME: "-internal-isystem" "[[ROOT:[^"]*]]bin{{[/\\]+}}..{{[/\\]+}}include{{[/\\]+}}sycl{{[/\\]+}}stl_wrappers" +// CHECK-HEADER-DIR-NOT: -internal-isystem +// CHECK-HEADER-DIR-SAME: "-internal-isystem" "[[ROOT]]bin{{[/\\]+}}..{{[/\\]+}}include" +// CHECK-HEADER-DIR: clang{{.*}} "-fsycl-is-host" +// CHECK-HEADER-DIR-SAME: "-internal-isystem" "[[ROOT]]bin{{[/\\]+}}..{{[/\\]+}}include{{[/\\]+}}sycl{{[/\\]+}}stl_wrappers" +// CHECK-HEADER-DIR-NOT: -internal-isystem +// CHECK-HEADER-DIR-SAME: "-internal-isystem" "[[ROOT]]bin{{[/\\]+}}..{{[/\\]+}}include" + +// Verify no header search dirs are added with -fsycl -nobuiltininc +// RUN: %clang -### -fsycl -nobuiltininc %s 2>&1 \ +// RUN: | FileCheck %s -check-prefixes=NO-HEADER-DIR +// RUN: %clang_cl -### -fsycl -nobuiltininc %s 2>&1 \ +// RUN: | FileCheck %s -check-prefixes=NO-HEADER-DIR +// NO-HEADER-DIR: clang{{.*}} "-fsycl-is-device" +// NO-HEADER-DIR-NOT: "-internal-isystem" "{{.*}}include{{[/\\]+}}sycl{{[/\\]+}}stl_wrappers" +// NO-HEADER-DIR: clang{{.*}} "-fsycl-is-host" +// NO-HEADER-DIR-NOT: "-internal-isystem" "{{.*}}include{{[/\\]+}}sycl{{[/\\]+}}stl_wrappers" + +/// Check for option incompatibility with -fsycl +// RUN: not %clang -### -fsycl -ffreestanding %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHK-INCOMPATIBILITY %s \ +// RUN: -DINCOMPATOPT=-ffreestanding +// RUN: not %clang -### -fsycl --offload-new-driver -static-libstdc++ %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHK-INCOMPATIBILITY %s \ +// RUN: -DINCOMPATOPT=-static-libstdc++ +// CHK-INCOMPATIBILITY: error: invalid argument '[[INCOMPATOPT]]' not allowed with '-fsycl' diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h index 779bd9017d7f12..ecbf2914495085 100644 --- a/llvm/include/llvm/TargetParser/Triple.h +++ b/llvm/include/llvm/TargetParser/Triple.h @@ -844,6 +844,9 @@ class Triple { getArch() == Triple::spirv; } + // Tests whether the target is SPIR-V or SPIR. + bool isSPIROrSPIRV() const { return isSPIR() || isSPIRV(); } + /// Tests whether the target is SPIR-V Logical bool isSPIRVLogical() const { return getArch() == Triple::spirv; >From 6b937eb360360e13189693858608f7930309dec5 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi <michael.d.togu...@intel.com> Date: Fri, 22 Nov 2024 10:47:12 -0800 Subject: [PATCH 2/7] Remove sanitizer support checks --- clang/lib/Driver/ToolChains/SYCL.cpp | 12 ------------ clang/lib/Driver/ToolChains/SYCL.h | 2 -- 2 files changed, 14 deletions(-) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 77edc5b976f022..4245efa34e4d04 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -81,14 +81,6 @@ SYCLToolChain::SYCLToolChain(const Driver &D, const llvm::Triple &Triple, // Diagnose unsupported options only once. for (OptSpecifier Opt : getUnsupportedOpts()) { if (const Arg *A = Args.getLastArg(Opt)) { - // All sanitizer options are not currently supported, except - // AddressSanitizer. - if (A->getOption().getID() == options::OPT_fsanitize_EQ && - A->getValues().size() == 1) { - std::string SanitizeVal = A->getValue(); - if (SanitizeVal == "address") - continue; - } D.Diag(clang::diag::warn_drv_unsupported_option_for_target) << A->getAsString(Args) << getTriple().str(); } @@ -173,7 +165,3 @@ void SYCLToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &Args, ArgStringList &CC1Args) const { HostTC.AddClangCXXStdlibIncludeArgs(Args, CC1Args); } - -SanitizerMask SYCLToolChain::getSupportedSanitizers() const { - return SanitizerKind::Address; -} diff --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h index 8c15cd6c6fc224..011cfe1c16e593 100644 --- a/clang/lib/Driver/ToolChains/SYCL.h +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -67,8 +67,6 @@ class LLVM_LIBRARY_VISIBILITY SYCLToolChain : public ToolChain { const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1Args) const override; - SanitizerMask getSupportedSanitizers() const override; - private: const ToolChain &HostTC; SYCLInstallationDetector SYCLInstallation; >From 5e63d1e345966b41b52c8a037240cd018cf87c96 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi <michael.d.togu...@intel.com> Date: Mon, 9 Dec 2024 14:50:30 -0800 Subject: [PATCH 3/7] Do not add header search directories at this time --- clang/lib/Driver/ToolChains/SYCL.cpp | 17 ++--------------- clang/test/Driver/sycl-offload-jit.cpp | 24 ------------------------ 2 files changed, 2 insertions(+), 39 deletions(-) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 4245efa34e4d04..005faf34feffac 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -26,21 +26,8 @@ void SYCLInstallationDetector::AddSYCLIncludeArgs( return; // 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., <complex>). - 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)); + // FIXME: Add the header file locations once the SYCL library and headers + // are properly established within the build. } // Unsupported options for SYCL device compilation. diff --git a/clang/test/Driver/sycl-offload-jit.cpp b/clang/test/Driver/sycl-offload-jit.cpp index 6287e9617b5433..89fd4fe9462e10 100644 --- a/clang/test/Driver/sycl-offload-jit.cpp +++ b/clang/test/Driver/sycl-offload-jit.cpp @@ -46,30 +46,6 @@ // CHK-FSYCL-IS-DEVICE: clang{{.*}} "-fsycl-is-device" {{.*}} "-emit-llvm-bc" // CHK-FSYCL-IS-HOST: clang{{.*}} "-fsycl-is-host" -// Verify header search dirs are added with -fsycl -// RUN: %clang -### -fsycl %s 2>&1 \ -// RUN: | FileCheck %s -check-prefixes=CHECK-HEADER-DIR -// RUN: %clang_cl -### -fsycl %s 2>&1 \ -// RUN: | FileCheck %s -check-prefixes=CHECK-HEADER-DIR -// CHECK-HEADER-DIR: clang{{.*}} "-fsycl-is-device" -// CHECK-HEADER-DIR-SAME: "-internal-isystem" "[[ROOT:[^"]*]]bin{{[/\\]+}}..{{[/\\]+}}include{{[/\\]+}}sycl{{[/\\]+}}stl_wrappers" -// CHECK-HEADER-DIR-NOT: -internal-isystem -// CHECK-HEADER-DIR-SAME: "-internal-isystem" "[[ROOT]]bin{{[/\\]+}}..{{[/\\]+}}include" -// CHECK-HEADER-DIR: clang{{.*}} "-fsycl-is-host" -// CHECK-HEADER-DIR-SAME: "-internal-isystem" "[[ROOT]]bin{{[/\\]+}}..{{[/\\]+}}include{{[/\\]+}}sycl{{[/\\]+}}stl_wrappers" -// CHECK-HEADER-DIR-NOT: -internal-isystem -// CHECK-HEADER-DIR-SAME: "-internal-isystem" "[[ROOT]]bin{{[/\\]+}}..{{[/\\]+}}include" - -// Verify no header search dirs are added with -fsycl -nobuiltininc -// RUN: %clang -### -fsycl -nobuiltininc %s 2>&1 \ -// RUN: | FileCheck %s -check-prefixes=NO-HEADER-DIR -// RUN: %clang_cl -### -fsycl -nobuiltininc %s 2>&1 \ -// RUN: | FileCheck %s -check-prefixes=NO-HEADER-DIR -// NO-HEADER-DIR: clang{{.*}} "-fsycl-is-device" -// NO-HEADER-DIR-NOT: "-internal-isystem" "{{.*}}include{{[/\\]+}}sycl{{[/\\]+}}stl_wrappers" -// NO-HEADER-DIR: clang{{.*}} "-fsycl-is-host" -// NO-HEADER-DIR-NOT: "-internal-isystem" "{{.*}}include{{[/\\]+}}sycl{{[/\\]+}}stl_wrappers" - /// Check for option incompatibility with -fsycl // RUN: not %clang -### -fsycl -ffreestanding %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-INCOMPATIBILITY %s \ >From df928e839dc3350419066ec2b85a365cdf1d9502 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi <michael.d.togu...@intel.com> Date: Mon, 9 Dec 2024 14:59:53 -0800 Subject: [PATCH 4/7] Adjust offloading toolchain creation check. --- clang/lib/Driver/Driver.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index d16c4cd33e15c4..5ba73eb14e5492 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -877,7 +877,6 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, return; auto *HIPTC = &getOffloadingDeviceToolChain(C.getInputArgs(), *HIPTriple, *HostTC, OFK); - assert(HIPTC && "Could not create offloading device tool chain."); C.addOffloadDeviceToolChain(HIPTC, OFK); } @@ -1060,7 +1059,6 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, for (const auto &TargetTriple : UniqueSYCLTriplesVec) { auto SYCLTC = &getOffloadingDeviceToolChain( C.getInputArgs(), TargetTriple, *HostTC, Action::OFK_SYCL); - assert(SYCLTC && "Could not create offloading device tool chain."); C.addOffloadDeviceToolChain(SYCLTC, Action::OFK_SYCL); } } @@ -6697,7 +6695,7 @@ const ToolChain &Driver::getOffloadingDeviceToolChain( break; } } - + assert(TC && "Could not create offloading device tool chain."); return *TC; } >From 94485acf429512654d52fcb2323237af85da54f6 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi <michael.d.togu...@intel.com> Date: Thu, 2 Jan 2025 14:28:22 -0800 Subject: [PATCH 5/7] Address a few review comments - remove simple function and inline usage - use if statement for type - use is_contained --- clang/lib/Driver/Driver.cpp | 28 ++++++---------------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 5ba73eb14e5492..0458c28a9cac4e 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -781,18 +781,10 @@ Driver::OpenMPRuntimeKind Driver::getOpenMPRuntime(const ArgList &Args) const { return RT; } -static const char *getDefaultSYCLArch(Compilation &C) { - // If -fsycl is supplied we will assume SPIR-V - if (C.getDefaultToolChain().getTriple().isArch32Bit()) - return "spirv32"; - return "spirv64"; -} - static llvm::Triple getSYCLDeviceTriple(StringRef TargetArch) { SmallVector<StringRef, 5> SYCLAlias = {"spir", "spir64", "spirv", "spirv32", "spirv64"}; - if (std::find(SYCLAlias.begin(), SYCLAlias.end(), TargetArch) != - SYCLAlias.end()) { + if (llvm::is_contained(SYCLAlias, TargetArch)) { llvm::Triple TargetTriple; TargetTriple.setArchName(TargetArch); TargetTriple.setVendor(llvm::Triple::UnknownVendor); @@ -811,7 +803,9 @@ static bool addSYCLDefaultTriple(Compilation &C, return false; } // Add the default triple as it was not found. - llvm::Triple DefaultTriple = getSYCLDeviceTriple(getDefaultSYCLArch(C)); + llvm::Triple DefaultTriple = getSYCLDeviceTriple( + C.getDefaultToolChain().getTriple().isArch32Bit() ? "spirv32" + : "spirv64"); SYCLTriples.insert(SYCLTriples.begin(), DefaultTriple); return true; } @@ -1028,9 +1022,6 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, return; } - // - // SYCL - // // We need to generate a SYCL toolchain if the user specified -fsycl. bool IsSYCL = C.getInputArgs().hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, false); @@ -6680,17 +6671,10 @@ const ToolChain &Driver::getOffloadingDeviceToolChain( break; } case Action::OFK_SYCL: - switch (Target.getArch()) { - case llvm::Triple::spir: - case llvm::Triple::spir64: - case llvm::Triple::spirv32: - case llvm::Triple::spirv64: + if (Target.isSPIROrSPIRV()) TC = std::make_unique<toolchains::SYCLToolChain>(*this, Target, HostTC, Args); - break; - default: - break; - } + break; default: break; } >From e611f4c0ab21793055112ca8475f3f192eae0b91 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi <michael.d.togu...@intel.com> Date: Thu, 2 Jan 2025 14:53:26 -0800 Subject: [PATCH 6/7] Update function name to use lowercase first letter --- clang/include/clang/Driver/ToolChain.h | 2 +- clang/lib/Driver/ToolChain.cpp | 2 +- clang/lib/Driver/ToolChains/Clang.cpp | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp | 4 ++-- clang/lib/Driver/ToolChains/Darwin.h | 2 +- clang/lib/Driver/ToolChains/Gnu.cpp | 4 ++-- clang/lib/Driver/ToolChains/Gnu.h | 2 +- clang/lib/Driver/ToolChains/Linux.cpp | 4 ++-- clang/lib/Driver/ToolChains/Linux.h | 2 +- clang/lib/Driver/ToolChains/MSVC.cpp | 4 ++-- clang/lib/Driver/ToolChains/MSVC.h | 2 +- clang/lib/Driver/ToolChains/MinGW.cpp | 4 ++-- clang/lib/Driver/ToolChains/MinGW.h | 2 +- clang/lib/Driver/ToolChains/SYCL.cpp | 6 +++--- clang/lib/Driver/ToolChains/SYCL.h | 4 ++-- 15 files changed, 23 insertions(+), 23 deletions(-) diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index 4efef49346fa4d..701a1d25ca4c8d 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -763,7 +763,7 @@ class ToolChain { llvm::opt::ArgStringList &CC1Args) const; /// Add arguments to use system-specific SYCL includes. - virtual void AddSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, + virtual void addSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const; /// Add arguments to use MCU GCC toolchain includes. diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index dc950e2afa8aea..49f4bf6ae5c8ea 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -1485,7 +1485,7 @@ void ToolChain::AddCudaIncludeArgs(const ArgList &DriverArgs, void ToolChain::AddHIPIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const {} -void ToolChain::AddSYCLIncludeArgs(const ArgList &DriverArgs, +void ToolChain::addSYCLIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const {} llvm::SmallVector<ToolChain::BitCodeLibraryInfo, 12> diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 5110cca167aace..66dc5cb0759fde 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1087,7 +1087,7 @@ void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA, if (JA.isOffloading(Action::OFK_HIP)) getToolChain().AddHIPIncludeArgs(Args, CmdArgs); if (JA.isOffloading(Action::OFK_SYCL)) - getToolChain().AddSYCLIncludeArgs(Args, CmdArgs); + getToolChain().addSYCLIncludeArgs(Args, CmdArgs); // If we are offloading to a target via OpenMP we need to include the // openmp_wrappers folder which contains alternative system headers. diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index f225c5b16a7c0a..7e0dd725c6e3c8 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -1025,9 +1025,9 @@ void Darwin::AddHIPIncludeArgs(const ArgList &DriverArgs, RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args); } -void Darwin::AddSYCLIncludeArgs(const ArgList &DriverArgs, +void Darwin::addSYCLIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { - SYCLInstallation->AddSYCLIncludeArgs(DriverArgs, CC1Args); + SYCLInstallation->addSYCLIncludeArgs(DriverArgs, CC1Args); } // This is just a MachO name translation routine and there's no diff --git a/clang/lib/Driver/ToolChains/Darwin.h b/clang/lib/Driver/ToolChains/Darwin.h index fd9270a584119e..5bc18581cfd2e8 100644 --- a/clang/lib/Driver/ToolChains/Darwin.h +++ b/clang/lib/Driver/ToolChains/Darwin.h @@ -565,7 +565,7 @@ class LLVM_LIBRARY_VISIBILITY Darwin : public MachO { llvm::opt::ArgStringList &CC1Args) const override; void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; - void AddSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, + void addSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; bool UseObjCMixedDispatch() const override { diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index c04b209ecd8d30..e5db1b2f1550b8 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -3275,9 +3275,9 @@ void Generic_GCC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, } } -void Generic_GCC::AddSYCLIncludeArgs(const ArgList &DriverArgs, +void Generic_GCC::addSYCLIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { - SYCLInstallation->AddSYCLIncludeArgs(DriverArgs, CC1Args); + SYCLInstallation->addSYCLIncludeArgs(DriverArgs, CC1Args); } void diff --git a/clang/lib/Driver/ToolChains/Gnu.h b/clang/lib/Driver/ToolChains/Gnu.h index 96352d3559ffd2..3b8df71bbf9d30 100644 --- a/clang/lib/Driver/ToolChains/Gnu.h +++ b/clang/lib/Driver/ToolChains/Gnu.h @@ -338,7 +338,7 @@ class LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain { const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; - void AddSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, + void addSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; virtual void diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp index 3119ba0b939ba0..2f3c5dbb7ba3e6 100644 --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -759,9 +759,9 @@ void Linux::AddIAMCUIncludeArgs(const ArgList &DriverArgs, } } -void Linux::AddSYCLIncludeArgs(const ArgList &DriverArgs, +void Linux::addSYCLIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { - SYCLInstallation->AddSYCLIncludeArgs(DriverArgs, CC1Args); + SYCLInstallation->addSYCLIncludeArgs(DriverArgs, CC1Args); } bool Linux::isPIEDefault(const llvm::opt::ArgList &Args) const { diff --git a/clang/lib/Driver/ToolChains/Linux.h b/clang/lib/Driver/ToolChains/Linux.h index cdec2fd39bbfa0..2eb2d05786fe3a 100644 --- a/clang/lib/Driver/ToolChains/Linux.h +++ b/clang/lib/Driver/ToolChains/Linux.h @@ -41,7 +41,7 @@ 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, + void addSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; RuntimeLibType GetDefaultRuntimeLibType() const override; unsigned GetDefaultDwarfVersion() const override; diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp b/clang/lib/Driver/ToolChains/MSVC.cpp index 77b75e506861e7..b04587628e7741 100644 --- a/clang/lib/Driver/ToolChains/MSVC.cpp +++ b/clang/lib/Driver/ToolChains/MSVC.cpp @@ -503,9 +503,9 @@ void MSVCToolChain::AddHIPIncludeArgs(const ArgList &DriverArgs, RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args); } -void MSVCToolChain::AddSYCLIncludeArgs(const ArgList &DriverArgs, +void MSVCToolChain::addSYCLIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { - SYCLInstallation->AddSYCLIncludeArgs(DriverArgs, CC1Args); + SYCLInstallation->addSYCLIncludeArgs(DriverArgs, CC1Args); } void MSVCToolChain::AddHIPRuntimeLibArgs(const ArgList &Args, diff --git a/clang/lib/Driver/ToolChains/MSVC.h b/clang/lib/Driver/ToolChains/MSVC.h index 1925ec2febd611..b35390c52a0492 100644 --- a/clang/lib/Driver/ToolChains/MSVC.h +++ b/clang/lib/Driver/ToolChains/MSVC.h @@ -101,7 +101,7 @@ 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, + void addSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; bool getWindowsSDKLibraryPath( diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp b/clang/lib/Driver/ToolChains/MinGW.cpp index 9a302f3e34ae00..7886c03e51d395 100644 --- a/clang/lib/Driver/ToolChains/MinGW.cpp +++ b/clang/lib/Driver/ToolChains/MinGW.cpp @@ -630,9 +630,9 @@ void toolchains::MinGW::AddHIPIncludeArgs(const ArgList &DriverArgs, RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args); } -void toolchains::MinGW::AddSYCLIncludeArgs(const ArgList &DriverArgs, +void toolchains::MinGW::addSYCLIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { - SYCLInstallation->AddSYCLIncludeArgs(DriverArgs, CC1Args); + SYCLInstallation->addSYCLIncludeArgs(DriverArgs, CC1Args); } void toolchains::MinGW::printVerboseInfo(raw_ostream &OS) const { diff --git a/clang/lib/Driver/ToolChains/MinGW.h b/clang/lib/Driver/ToolChains/MinGW.h index e9884bab5826fb..8216045a1ae460 100644 --- a/clang/lib/Driver/ToolChains/MinGW.h +++ b/clang/lib/Driver/ToolChains/MinGW.h @@ -93,7 +93,7 @@ class LLVM_LIBRARY_VISIBILITY MinGW : public ToolChain { llvm::opt::ArgStringList &CC1Args) const override; void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; - void AddSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, + void addSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; void printVerboseInfo(raw_ostream &OS) const override; diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 005faf34feffac..63092c6ca16011 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -20,7 +20,7 @@ SYCLInstallationDetector::SYCLInstallationDetector( const llvm::opt::ArgList &Args) : D(D) {} -void SYCLInstallationDetector::AddSYCLIncludeArgs( +void SYCLInstallationDetector::addSYCLIncludeArgs( const ArgList &DriverArgs, ArgStringList &CC1Args) const { if (DriverArgs.hasArg(clang::driver::options::OPT_nobuiltininc)) return; @@ -138,9 +138,9 @@ SYCLToolChain::GetCXXStdlibType(const ArgList &Args) const { return HostTC.GetCXXStdlibType(Args); } -void SYCLToolChain::AddSYCLIncludeArgs(const ArgList &DriverArgs, +void SYCLToolChain::addSYCLIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { - SYCLInstallation.AddSYCLIncludeArgs(DriverArgs, CC1Args); + 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 011cfe1c16e593..9af2fd0c45c5ed 100644 --- a/clang/lib/Driver/ToolChains/SYCL.h +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -20,7 +20,7 @@ class SYCLInstallationDetector { SYCLInstallationDetector(const Driver &D, const llvm::Triple &HostTriple, const llvm::opt::ArgList &Args); - void AddSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, + void addSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const; private: @@ -58,7 +58,7 @@ class LLVM_LIBRARY_VISIBILITY SYCLToolChain : public ToolChain { void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override; CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override; - void AddSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, + void addSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, >From a884680e1972af31890631740a9312c6c6da6f97 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi <michael.d.togu...@intel.com> Date: Thu, 2 Jan 2025 15:09:49 -0800 Subject: [PATCH 7/7] Update test to address review comments --- clang/test/Driver/sycl-offload-jit.cpp | 56 ++++++++++++-------------- 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/clang/test/Driver/sycl-offload-jit.cpp b/clang/test/Driver/sycl-offload-jit.cpp index 89fd4fe9462e10..af5fb30f979210 100644 --- a/clang/test/Driver/sycl-offload-jit.cpp +++ b/clang/test/Driver/sycl-offload-jit.cpp @@ -3,31 +3,29 @@ /// /// Check the phases graph with -fsycl. Use of -fsycl enables offload -// RUN: %clang -ccc-print-phases --target=x86_64-unknown-linux-gnu \ -// RUN: -fsycl %s 2>&1 \ -// RUN: | FileCheck -check-prefixes=CHK-PHASES %s -// RUN: %clang_cl -ccc-print-phases --target=x86_64-pc-windows-msvc -fsycl \ -// RUN: %s 2>&1 \ -// RUN: | FileCheck -check-prefixes=CHK-PHASES %s +// RUN: %clang -ccc-print-phases --target=x86_64-unknown-linux-gnu -fsycl %s 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHK-PHASES %s +// RUN: %clang_cl -ccc-print-phases --target=x86_64-pc-windows-msvc -fsycl %s 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHK-PHASES %s // CHK-PHASES: 0: input, "[[INPUT:.+\.cpp]]", c++, (host-sycl) -// CHK-PHASES: 1: preprocessor, {0}, c++-cpp-output, (host-sycl) -// CHK-PHASES: 2: compiler, {1}, ir, (host-sycl) -// CHK-PHASES: 3: input, "[[INPUT]]", c++, (device-sycl) -// CHK-PHASES: 4: preprocessor, {3}, c++-cpp-output, (device-sycl) -// CHK-PHASES: 5: compiler, {4}, ir, (device-sycl) -// CHK-PHASES: 6: backend, {5}, ir, (device-sycl) -// CHK-PHASES: 7: offload, "device-sycl (spirv64-unknown-unknown)" {6}, ir -// CHK-PHASES: 8: clang-offload-packager, {7}, image, (device-sycl) -// CHK-PHASES: 9: offload, "host-sycl (x86_64{{.*}})" {2}, "device-sycl (x86_64{{.*}})" {8}, ir -// CHK-PHASES: 10: backend, {9}, assembler, (host-sycl) -// CHK-PHASES: 11: assembler, {10}, object, (host-sycl) -// CHK-PHASES: 12: clang-linker-wrapper, {11}, image, (host-sycl) +// CHK-PHASES-NEXT: 1: preprocessor, {0}, c++-cpp-output, (host-sycl) +// CHK-PHASES-NEXT: 2: compiler, {1}, ir, (host-sycl) +// CHK-PHASES-NEXT: 3: input, "[[INPUT]]", c++, (device-sycl) +// CHK-PHASES-NEXT: 4: preprocessor, {3}, c++-cpp-output, (device-sycl) +// CHK-PHASES-NEXT: 5: compiler, {4}, ir, (device-sycl) +// CHK-PHASES-NEXT: 6: backend, {5}, ir, (device-sycl) +// CHK-PHASES-NEXT: 7: offload, "device-sycl (spirv64-unknown-unknown)" {6}, ir +// CHK-PHASES-NEXT: 8: clang-offload-packager, {7}, image, (device-sycl) +// CHK-PHASES-NEXT: 9: offload, "host-sycl (x86_64{{.*}})" {2}, "device-sycl (x86_64{{.*}})" {8}, ir +// CHK-PHASES-NEXT: 10: backend, {9}, assembler, (host-sycl) +// CHK-PHASES-NEXT: 11: assembler, {10}, object, (host-sycl) +// CHK-PHASES-NEXT: 12: clang-linker-wrapper, {11}, image, (host-sycl) /// Check expected default values for device compilation when using -fsycl as /// well as clang-offload-packager inputs. // RUN: %clang -### -fsycl -c --target=x86_64-unknown-linux-gnu %s 2>&1 \ -// RUN: | FileCheck -check-prefix=CHK-DEVICE-TRIPLE %s -// CHK-DEVICE-TRIPLE: clang{{.*}} "-triple" "spirv64-unknown-unknown" +// RUN: | FileCheck -check-prefix=CHK-DEVICE-TRIPLE %s +// CHK-DEVICE-TRIPLE: "-cc1"{{.*}} "-triple" "spirv64-unknown-unknown" // CHK-DEVICE-TRIPLE-SAME: "-aux-triple" "x86_64-unknown-linux-gnu" // CHK-DEVICE-TRIPLE-SAME: "-fsycl-is-device" // CHK-DEVICE-TRIPLE-SAME: "-O2" @@ -36,21 +34,19 @@ /// Check -fsycl-is-device is passed when compiling for the device. /// Check -fsycl-is-host is passed when compiling for host. // RUN: %clang -### -fsycl -c %s 2>&1 \ -// RUN: | FileCheck -check-prefixes=CHK-FSYCL-IS-DEVICE,CHK-FSYCL-IS-HOST %s +// RUN: | FileCheck -check-prefixes=CHK-FSYCL-IS-DEVICE,CHK-FSYCL-IS-HOST %s // RUN: %clang -### -fsycl -fsycl-device-only %s 2>&1 \ -// RUN: | FileCheck -check-prefix=CHK-FSYCL-IS-DEVICE %s +// RUN: | FileCheck -check-prefix=CHK-FSYCL-IS-DEVICE %s // RUN: %clang_cl -### -fsycl -c %s 2>&1 \ -// RUN: | FileCheck -check-prefixes=CHK-FSYCL-IS-DEVICE,CHK-FSYCL-IS-HOST %s +// RUN: | FileCheck -check-prefixes=CHK-FSYCL-IS-DEVICE,CHK-FSYCL-IS-HOST %s // RUN: %clang -### -fsycl -fsycl-host-only %s 2>&1 \ -// RUN: | FileCheck -check-prefix=CHK-FSYCL-IS-HOST %s -// CHK-FSYCL-IS-DEVICE: clang{{.*}} "-fsycl-is-device" {{.*}} "-emit-llvm-bc" -// CHK-FSYCL-IS-HOST: clang{{.*}} "-fsycl-is-host" +// RUN: | FileCheck -check-prefix=CHK-FSYCL-IS-HOST %s +// CHK-FSYCL-IS-DEVICE: "-cc1"{{.*}} "-fsycl-is-device" {{.*}} "-emit-llvm-bc" +// CHK-FSYCL-IS-HOST: "-cc1"{{.*}} "-fsycl-is-host" /// Check for option incompatibility with -fsycl // RUN: not %clang -### -fsycl -ffreestanding %s 2>&1 \ -// RUN: | FileCheck -check-prefix=CHK-INCOMPATIBILITY %s \ -// RUN: -DINCOMPATOPT=-ffreestanding +// RUN: | FileCheck -check-prefix=CHK-INCOMPATIBILITY %s -DINCOMPATOPT=-ffreestanding // RUN: not %clang -### -fsycl --offload-new-driver -static-libstdc++ %s 2>&1 \ -// RUN: | FileCheck -check-prefix=CHK-INCOMPATIBILITY %s \ -// RUN: -DINCOMPATOPT=-static-libstdc++ +// RUN: | FileCheck -check-prefix=CHK-INCOMPATIBILITY %s -DINCOMPATOPT=-static-libstdc++ // CHK-INCOMPATIBILITY: error: invalid argument '[[INCOMPATOPT]]' not allowed with '-fsycl' _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits