1 //===--- Cuda.h - Cuda ToolChain Implementations ----------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CUDA_H 11 #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CUDA_H 12 13 #include "clang/Basic/Cuda.h" 14 #include "clang/Driver/Action.h" 15 #include "clang/Driver/Multilib.h" 16 #include "clang/Driver/Tool.h" 17 #include "clang/Driver/ToolChain.h" 18 #include "llvm/ADT/Optional.h" 19 #include "llvm/ADT/SmallSet.h" 20 #include "llvm/Support/Compiler.h" 21 #include "llvm/Support/VersionTuple.h" 22 #include <set> 23 #include <vector> 24 25 namespace clang { 26 namespace driver { 27 28 /// A class to find a viable CUDA installation 29 class CudaInstallationDetector { 30 private: 31 const Driver &D; 32 bool IsValid = false; 33 CudaVersion Version = CudaVersion::UNKNOWN; 34 std::string InstallPath; 35 std::string BinPath; 36 std::string LibPath; 37 std::string LibDevicePath; 38 std::string IncludePath; 39 llvm::StringMap<std::string> LibDeviceMap; 40 41 // CUDA architectures for which we have raised an error in 42 // CheckCudaVersionSupportsArch. 43 mutable llvm::SmallSet<CudaArch, 4> ArchsWithBadVersion; 44 45 public: 46 CudaInstallationDetector(const Driver &D, const llvm::Triple &HostTriple, 47 const llvm::opt::ArgList &Args); 48 49 void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs, 50 llvm::opt::ArgStringList &CC1Args) const; 51 52 /// Emit an error if Version does not support the given Arch. 53 /// 54 /// If either Version or Arch is unknown, does not emit an error. Emits at 55 /// most one error per Arch. 56 void CheckCudaVersionSupportsArch(CudaArch Arch) const; 57 58 /// Check whether we detected a valid Cuda install. isValid()59 bool isValid() const { return IsValid; } 60 /// Print information about the detected CUDA installation. 61 void print(raw_ostream &OS) const; 62 63 /// Get the detected Cuda install's version. version()64 CudaVersion version() const { return Version; } 65 /// Get the detected Cuda installation path. getInstallPath()66 StringRef getInstallPath() const { return InstallPath; } 67 /// Get the detected path to Cuda's bin directory. getBinPath()68 StringRef getBinPath() const { return BinPath; } 69 /// Get the detected Cuda Include path. getIncludePath()70 StringRef getIncludePath() const { return IncludePath; } 71 /// Get the detected Cuda library path. getLibPath()72 StringRef getLibPath() const { return LibPath; } 73 /// Get the detected Cuda device library path. getLibDevicePath()74 StringRef getLibDevicePath() const { return LibDevicePath; } 75 /// Get libdevice file for given architecture getLibDeviceFile(StringRef Gpu)76 std::string getLibDeviceFile(StringRef Gpu) const { 77 return LibDeviceMap.lookup(Gpu); 78 } 79 }; 80 81 namespace tools { 82 namespace NVPTX { 83 84 // Run ptxas, the NVPTX assembler. 85 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool { 86 public: Assembler(const ToolChain & TC)87 Assembler(const ToolChain &TC) 88 : Tool("NVPTX::Assembler", "ptxas", TC, RF_Full, llvm::sys::WEM_UTF8, 89 "--options-file") {} 90 hasIntegratedCPP()91 bool hasIntegratedCPP() const override { return false; } 92 93 void ConstructJob(Compilation &C, const JobAction &JA, 94 const InputInfo &Output, const InputInfoList &Inputs, 95 const llvm::opt::ArgList &TCArgs, 96 const char *LinkingOutput) const override; 97 }; 98 99 // Runs fatbinary, which combines GPU object files ("cubin" files) and/or PTX 100 // assembly into a single output file. 101 class LLVM_LIBRARY_VISIBILITY Linker : public Tool { 102 public: Linker(const ToolChain & TC)103 Linker(const ToolChain &TC) 104 : Tool("NVPTX::Linker", "fatbinary", TC, RF_Full, llvm::sys::WEM_UTF8, 105 "--options-file") {} 106 hasIntegratedCPP()107 bool hasIntegratedCPP() const override { return false; } 108 109 void ConstructJob(Compilation &C, const JobAction &JA, 110 const InputInfo &Output, const InputInfoList &Inputs, 111 const llvm::opt::ArgList &TCArgs, 112 const char *LinkingOutput) const override; 113 }; 114 115 class LLVM_LIBRARY_VISIBILITY OpenMPLinker : public Tool { 116 public: OpenMPLinker(const ToolChain & TC)117 OpenMPLinker(const ToolChain &TC) 118 : Tool("NVPTX::OpenMPLinker", "nvlink", TC, RF_Full, llvm::sys::WEM_UTF8, 119 "--options-file") {} 120 hasIntegratedCPP()121 bool hasIntegratedCPP() const override { return false; } 122 123 void ConstructJob(Compilation &C, const JobAction &JA, 124 const InputInfo &Output, const InputInfoList &Inputs, 125 const llvm::opt::ArgList &TCArgs, 126 const char *LinkingOutput) const override; 127 }; 128 129 } // end namespace NVPTX 130 } // end namespace tools 131 132 namespace toolchains { 133 134 class LLVM_LIBRARY_VISIBILITY CudaToolChain : public ToolChain { 135 public: 136 CudaToolChain(const Driver &D, const llvm::Triple &Triple, 137 const ToolChain &HostTC, const llvm::opt::ArgList &Args, 138 const Action::OffloadKind OK); 139 getAuxTriple()140 const llvm::Triple *getAuxTriple() const override { 141 return &HostTC.getTriple(); 142 } 143 144 std::string getInputFilename(const InputInfo &Input) const override; 145 146 llvm::opt::DerivedArgList * 147 TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch, 148 Action::OffloadKind DeviceOffloadKind) const override; 149 void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 150 llvm::opt::ArgStringList &CC1Args, 151 Action::OffloadKind DeviceOffloadKind) const override; 152 153 // Never try to use the integrated assembler with CUDA; always fork out to 154 // ptxas. useIntegratedAs()155 bool useIntegratedAs() const override { return false; } isCrossCompiling()156 bool isCrossCompiling() const override { return true; } isPICDefault()157 bool isPICDefault() const override { return false; } isPIEDefault()158 bool isPIEDefault() const override { return false; } isPICDefaultForced()159 bool isPICDefaultForced() const override { return false; } SupportsProfiling()160 bool SupportsProfiling() const override { return false; } 161 bool supportsDebugInfoOption(const llvm::opt::Arg *A) const override; 162 void adjustDebugInfoKind(codegenoptions::DebugInfoKind &DebugInfoKind, 163 const llvm::opt::ArgList &Args) const override; IsMathErrnoDefault()164 bool IsMathErrnoDefault() const override { return false; } 165 166 void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs, 167 llvm::opt::ArgStringList &CC1Args) const override; 168 169 void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override; 170 CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override; 171 void 172 AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 173 llvm::opt::ArgStringList &CC1Args) const override; 174 void AddClangCXXStdlibIncludeArgs( 175 const llvm::opt::ArgList &Args, 176 llvm::opt::ArgStringList &CC1Args) const override; 177 void AddIAMCUIncludeArgs(const llvm::opt::ArgList &DriverArgs, 178 llvm::opt::ArgStringList &CC1Args) const override; 179 180 SanitizerMask getSupportedSanitizers() const override; 181 182 VersionTuple 183 computeMSVCVersion(const Driver *D, 184 const llvm::opt::ArgList &Args) const override; 185 GetDefaultDwarfVersion()186 unsigned GetDefaultDwarfVersion() const override { return 2; } 187 188 const ToolChain &HostTC; 189 CudaInstallationDetector CudaInstallation; 190 191 protected: 192 Tool *buildAssembler() const override; // ptxas 193 Tool *buildLinker() const override; // fatbinary (ok, not really a linker) 194 195 private: 196 const Action::OffloadKind OK; 197 }; 198 199 } // end namespace toolchains 200 } // end namespace driver 201 } // end namespace clang 202 203 #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CUDA_H 204