diff options
Diffstat (limited to 'clang/lib/Driver/ToolChains/SYCL.cpp')
-rw-r--r-- | clang/lib/Driver/ToolChains/SYCL.cpp | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp new file mode 100644 index 0000000..a2b07ef --- /dev/null +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -0,0 +1,154 @@ +//===--- 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) {} + +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. + // FIXME: Add the header file locations once the SYCL library and headers + // are properly established within the build. +} + +// Unsupported options for SYCL device compilation. +static ArrayRef<options::ID> getUnsupportedOpts() { + static constexpr options::ID 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)) { + 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); +} |