Path: blob/main/contrib/llvm-project/clang/lib/Driver/ToolChains/Cuda.h
35267 views
//===--- Cuda.h - Cuda ToolChain Implementations ----------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CUDA_H9#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CUDA_H1011#include "clang/Basic/Cuda.h"12#include "clang/Driver/Action.h"13#include "clang/Driver/Multilib.h"14#include "clang/Driver/Tool.h"15#include "clang/Driver/ToolChain.h"16#include "llvm/Support/Compiler.h"17#include "llvm/Support/VersionTuple.h"18#include <bitset>19#include <set>20#include <vector>2122namespace clang {23namespace driver {2425/// A class to find a viable CUDA installation26class CudaInstallationDetector {27private:28const Driver &D;29bool IsValid = false;30CudaVersion Version = CudaVersion::UNKNOWN;31std::string InstallPath;32std::string BinPath;33std::string LibDevicePath;34std::string IncludePath;35llvm::StringMap<std::string> LibDeviceMap;3637// CUDA architectures for which we have raised an error in38// CheckCudaVersionSupportsArch.39mutable std::bitset<(int)OffloadArch::LAST> ArchsWithBadVersion;4041public:42CudaInstallationDetector(const Driver &D, const llvm::Triple &HostTriple,43const llvm::opt::ArgList &Args);4445void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs,46llvm::opt::ArgStringList &CC1Args) const;4748/// Emit an error if Version does not support the given Arch.49///50/// If either Version or Arch is unknown, does not emit an error. Emits at51/// most one error per Arch.52void CheckCudaVersionSupportsArch(OffloadArch Arch) const;5354/// Check whether we detected a valid Cuda install.55bool isValid() const { return IsValid; }56/// Print information about the detected CUDA installation.57void print(raw_ostream &OS) const;5859/// Get the detected Cuda install's version.60CudaVersion version() const {61return Version == CudaVersion::NEW ? CudaVersion::PARTIALLY_SUPPORTED62: Version;63}64/// Get the detected Cuda installation path.65StringRef getInstallPath() const { return InstallPath; }66/// Get the detected path to Cuda's bin directory.67StringRef getBinPath() const { return BinPath; }68/// Get the detected Cuda Include path.69StringRef getIncludePath() const { return IncludePath; }70/// Get the detected Cuda device library path.71StringRef getLibDevicePath() const { return LibDevicePath; }72/// Get libdevice file for given architecture73std::string getLibDeviceFile(StringRef Gpu) const {74return LibDeviceMap.lookup(Gpu);75}76void WarnIfUnsupportedVersion();77};7879namespace tools {80namespace NVPTX {8182// Run ptxas, the NVPTX assembler.83class LLVM_LIBRARY_VISIBILITY Assembler final : public Tool {84public:85Assembler(const ToolChain &TC) : Tool("NVPTX::Assembler", "ptxas", TC) {}8687bool hasIntegratedCPP() const override { return false; }8889void ConstructJob(Compilation &C, const JobAction &JA,90const InputInfo &Output, const InputInfoList &Inputs,91const llvm::opt::ArgList &TCArgs,92const char *LinkingOutput) const override;93};9495// Runs fatbinary, which combines GPU object files ("cubin" files) and/or PTX96// assembly into a single output file.97class LLVM_LIBRARY_VISIBILITY FatBinary : public Tool {98public:99FatBinary(const ToolChain &TC) : Tool("NVPTX::Linker", "fatbinary", TC) {}100101bool hasIntegratedCPP() const override { return false; }102103void ConstructJob(Compilation &C, const JobAction &JA,104const InputInfo &Output, const InputInfoList &Inputs,105const llvm::opt::ArgList &TCArgs,106const char *LinkingOutput) const override;107};108109// Runs nvlink, which links GPU object files ("cubin" files) into a single file.110class LLVM_LIBRARY_VISIBILITY Linker final : public Tool {111public:112Linker(const ToolChain &TC) : Tool("NVPTX::Linker", "nvlink", TC) {}113114bool hasIntegratedCPP() const override { return false; }115116void ConstructJob(Compilation &C, const JobAction &JA,117const InputInfo &Output, const InputInfoList &Inputs,118const llvm::opt::ArgList &TCArgs,119const char *LinkingOutput) const override;120};121122void getNVPTXTargetFeatures(const Driver &D, const llvm::Triple &Triple,123const llvm::opt::ArgList &Args,124std::vector<StringRef> &Features);125126} // end namespace NVPTX127} // end namespace tools128129namespace toolchains {130131class LLVM_LIBRARY_VISIBILITY NVPTXToolChain : public ToolChain {132public:133NVPTXToolChain(const Driver &D, const llvm::Triple &Triple,134const llvm::Triple &HostTriple, const llvm::opt::ArgList &Args,135bool Freestanding);136137NVPTXToolChain(const Driver &D, const llvm::Triple &Triple,138const llvm::opt::ArgList &Args);139140llvm::opt::DerivedArgList *141TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch,142Action::OffloadKind DeviceOffloadKind) const override;143144void145addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,146llvm::opt::ArgStringList &CC1Args,147Action::OffloadKind DeviceOffloadKind) const override;148149// Never try to use the integrated assembler with CUDA; always fork out to150// ptxas.151bool useIntegratedAs() const override { return false; }152bool isCrossCompiling() const override { return true; }153bool isPICDefault() const override { return false; }154bool isPIEDefault(const llvm::opt::ArgList &Args) const override {155return false;156}157bool HasNativeLLVMSupport() const override { return true; }158bool isPICDefaultForced() const override { return false; }159bool SupportsProfiling() const override { return false; }160161bool IsMathErrnoDefault() const override { return false; }162163bool supportsDebugInfoOption(const llvm::opt::Arg *A) const override;164void adjustDebugInfoKind(llvm::codegenoptions::DebugInfoKind &DebugInfoKind,165const llvm::opt::ArgList &Args) const override;166167// NVPTX supports only DWARF2.168unsigned GetDefaultDwarfVersion() const override { return 2; }169unsigned getMaxDwarfVersion() const override { return 2; }170171/// Uses nvptx-arch tool to get arch of the system GPU. Will return error172/// if unable to find one.173virtual Expected<SmallVector<std::string>>174getSystemGPUArchs(const llvm::opt::ArgList &Args) const override;175176CudaInstallationDetector CudaInstallation;177178protected:179Tool *buildAssembler() const override; // ptxas.180Tool *buildLinker() const override; // nvlink.181182private:183bool Freestanding = false;184};185186class LLVM_LIBRARY_VISIBILITY CudaToolChain : public NVPTXToolChain {187public:188CudaToolChain(const Driver &D, const llvm::Triple &Triple,189const ToolChain &HostTC, const llvm::opt::ArgList &Args);190191const llvm::Triple *getAuxTriple() const override {192return &HostTC.getTriple();193}194195bool HasNativeLLVMSupport() const override { return false; }196197std::string getInputFilename(const InputInfo &Input) const override;198199llvm::opt::DerivedArgList *200TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch,201Action::OffloadKind DeviceOffloadKind) const override;202void203addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,204llvm::opt::ArgStringList &CC1Args,205Action::OffloadKind DeviceOffloadKind) const override;206207llvm::DenormalMode getDefaultDenormalModeForType(208const llvm::opt::ArgList &DriverArgs, const JobAction &JA,209const llvm::fltSemantics *FPType = nullptr) const override;210211void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs,212llvm::opt::ArgStringList &CC1Args) const override;213214void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override;215CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override;216void217AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,218llvm::opt::ArgStringList &CC1Args) const override;219void AddClangCXXStdlibIncludeArgs(220const llvm::opt::ArgList &Args,221llvm::opt::ArgStringList &CC1Args) const override;222void AddIAMCUIncludeArgs(const llvm::opt::ArgList &DriverArgs,223llvm::opt::ArgStringList &CC1Args) const override;224225SanitizerMask getSupportedSanitizers() const override;226227VersionTuple228computeMSVCVersion(const Driver *D,229const llvm::opt::ArgList &Args) const override;230231const ToolChain &HostTC;232233protected:234Tool *buildAssembler() const override; // ptxas235Tool *buildLinker() const override; // fatbinary (ok, not really a linker)236};237238} // end namespace toolchains239} // end namespace driver240} // end namespace clang241242#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CUDA_H243244245