11#include "clang/Config/config.h"
18#include "llvm/ADT/SmallSet.h"
19#include "llvm/ADT/StringExtras.h"
20#include "llvm/Config/llvm-config.h"
21#include "llvm/Option/ArgList.h"
22#include "llvm/Support/FileSystem.h"
23#include "llvm/Support/Path.h"
24#include "llvm/Support/Process.h"
25#include "llvm/Support/Program.h"
26#include "llvm/Support/VirtualFileSystem.h"
27#include "llvm/TargetParser/Host.h"
28#include "llvm/TargetParser/TargetParser.h"
29#include <system_error>
40 if (raw_version < 7050)
42 if (raw_version < 8000)
44 if (raw_version < 9000)
46 if (raw_version < 9010)
48 if (raw_version < 9020)
50 if (raw_version < 10000)
52 if (raw_version < 10010)
54 if (raw_version < 10020)
56 if (raw_version < 11000)
58 if (raw_version < 11010)
60 if (raw_version < 11020)
62 if (raw_version < 11030)
64 if (raw_version < 11040)
66 if (raw_version < 11050)
68 if (raw_version < 11060)
70 if (raw_version < 11070)
72 if (raw_version < 11080)
74 if (raw_version < 11090)
76 if (raw_version < 12010)
78 if (raw_version < 12020)
80 if (raw_version < 12030)
82 if (raw_version < 12040)
84 if (raw_version < 12050)
86 if (raw_version < 12060)
88 if (raw_version < 12070)
90 if (raw_version < 12090)
92 if (raw_version < 13000)
100 auto StartsWithWords =
101 [](llvm::StringRef
Line,
103 for (StringRef word : words) {
104 if (!
Line.consume_front(word))
111 Input = Input.ltrim();
112 while (!Input.empty()) {
114 StartsWithWords(Input.ltrim(), {
"#",
"define",
"CUDA_VERSION"})) {
116 Line->consumeInteger(10, RawVersion);
117 return getCudaVersion(RawVersion);
120 Input = Input.drop_front(Input.find_first_of(
"\n\r")).ltrim();
129 if (!VersionString.empty())
130 VersionString.insert(0,
" ");
131 D.Diag(diag::warn_drv_new_cuda_version)
136 D.Diag(diag::warn_drv_partially_supported_cuda_version)
141 const Driver &D,
const llvm::Triple &HostTriple,
142 const llvm::opt::ArgList &Args)
148 Candidate(std::string Path,
bool StrictChecking =
false)
149 : Path(Path), StrictChecking(StrictChecking) {}
154 std::initializer_list<const char *> Versions = {
"8.0",
"7.5",
"7.0"};
155 auto &FS = D.getVFS();
157 if (Args.hasArg(options::OPT_cuda_path_EQ)) {
158 Candidates.emplace_back(
159 Args.getLastArgValue(options::OPT_cuda_path_EQ).str());
160 }
else if (HostTriple.isOSWindows()) {
161 for (
const char *Ver : Versions)
162 Candidates.emplace_back(
163 D.SysRoot +
"/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v" +
166 if (!Args.hasArg(options::OPT_cuda_path_ignore_env)) {
175 if (llvm::ErrorOr<std::string> ptxas =
176 llvm::sys::findProgramByName(
"ptxas")) {
178 llvm::sys::fs::real_path(*ptxas, ptxasAbsolutePath);
180 StringRef ptxasDir = llvm::sys::path::parent_path(ptxasAbsolutePath);
181 if (llvm::sys::path::filename(ptxasDir) ==
"bin")
182 Candidates.emplace_back(
183 std::string(llvm::sys::path::parent_path(ptxasDir)),
188 Candidates.emplace_back(D.SysRoot +
"/usr/local/cuda");
189 for (
const char *Ver : Versions)
190 Candidates.emplace_back(D.SysRoot +
"/usr/local/cuda-" + Ver);
192 Distro Dist(FS, llvm::Triple(llvm::sys::getProcessTriple()));
196 Candidates.emplace_back(D.SysRoot +
"/usr/lib/cuda");
200 !Args.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib,
true);
202 for (
const auto &Candidate : Candidates) {
203 InstallPath = Candidate.Path;
204 if (InstallPath.empty() || !FS.exists(InstallPath))
207 BinPath = InstallPath +
"/bin";
208 IncludePath = InstallPath +
"/include";
209 LibDevicePath = InstallPath +
"/nvvm/libdevice";
211 if (!(FS.exists(IncludePath) && FS.exists(BinPath)))
213 bool CheckLibDevice = (!NoCudaLib || Candidate.StrictChecking);
214 if (CheckLibDevice && !FS.exists(LibDevicePath))
218 if (
auto CudaHFile = FS.getBufferForFile(InstallPath +
"/include/cuda.h"))
219 Version = parseCudaHFile((*CudaHFile)->getBuffer());
223 Version = FS.exists(LibDevicePath +
"/libdevice.10.bc")
230 std::string FilePath = LibDevicePath +
"/libdevice.10.bc";
231 if (FS.exists(FilePath)) {
238 LibDeviceMap[OffloadArchName] = FilePath;
243 for (llvm::vfs::directory_iterator LI = FS.dir_begin(LibDevicePath, EC),
245 !EC && LI != LE; LI = LI.increment(EC)) {
246 StringRef FilePath = LI->path();
247 StringRef
FileName = llvm::sys::path::filename(FilePath);
250 const StringRef LibDeviceName =
"libdevice.";
254 LibDeviceName.size(),
FileName.find(
'.', LibDeviceName.size()));
255 LibDeviceMap[GpuArch] = FilePath.str();
259 if (GpuArch ==
"compute_20") {
260 LibDeviceMap[
"sm_20"] = std::string(FilePath);
261 LibDeviceMap[
"sm_21"] = std::string(FilePath);
262 LibDeviceMap[
"sm_32"] = std::string(FilePath);
263 }
else if (GpuArch ==
"compute_30") {
264 LibDeviceMap[
"sm_30"] = std::string(FilePath);
266 LibDeviceMap[
"sm_50"] = std::string(FilePath);
267 LibDeviceMap[
"sm_52"] = std::string(FilePath);
268 LibDeviceMap[
"sm_53"] = std::string(FilePath);
270 LibDeviceMap[
"sm_60"] = std::string(FilePath);
271 LibDeviceMap[
"sm_61"] = std::string(FilePath);
272 LibDeviceMap[
"sm_62"] = std::string(FilePath);
273 }
else if (GpuArch ==
"compute_35") {
274 LibDeviceMap[
"sm_35"] = std::string(FilePath);
275 LibDeviceMap[
"sm_37"] = std::string(FilePath);
276 }
else if (GpuArch ==
"compute_50") {
278 LibDeviceMap[
"sm_50"] = std::string(FilePath);
279 LibDeviceMap[
"sm_52"] = std::string(FilePath);
280 LibDeviceMap[
"sm_53"] = std::string(FilePath);
288 if (LibDeviceMap.empty() && !NoCudaLib)
297 const ArgList &DriverArgs, ArgStringList &CC1Args)
const {
298 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
302 llvm::sys::path::append(P,
"include");
303 llvm::sys::path::append(P,
"cuda_wrappers");
304 CC1Args.push_back(
"-internal-isystem");
305 CC1Args.push_back(DriverArgs.MakeArgString(P));
308 if (!DriverArgs.hasFlag(options::OPT_offload_inc, options::OPT_no_offload_inc,
313 D.Diag(diag::err_drv_no_cuda_installation);
317 CC1Args.push_back(
"-include");
318 CC1Args.push_back(
"__clang_cuda_runtime_wrapper.h");
324 ArchsWithBadVersion[(
int)
Arch])
329 if (Version < MinVersion || Version > MaxVersion) {
330 ArchsWithBadVersion[(int)
Arch] =
true;
331 D.Diag(diag::err_drv_cuda_version_unsupported)
340 OS <<
"Found CUDA installation: " << InstallPath <<
", version "
350enum DeviceDebugInfoLevel {
353 EmitSameDebugInfoAsHost,
367 const Arg *A = Args.getLastArg(options::OPT_O_Group);
368 bool IsDebugEnabled = !A || A->getOption().matches(options::OPT_O0) ||
369 Args.hasFlag(options::OPT_cuda_noopt_device_debug,
370 options::OPT_no_cuda_noopt_device_debug,
372 if (
const Arg *A = Args.getLastArg(options::OPT_g_Group)) {
373 const Option &Opt = A->getOption();
374 if (Opt.matches(options::OPT_gN_Group)) {
375 if (Opt.matches(options::OPT_g0) || Opt.matches(options::OPT_ggdb0))
376 return DisableDebugInfo;
377 if (Opt.matches(options::OPT_gline_directives_only))
378 return DebugDirectivesOnly;
380 return IsDebugEnabled ? EmitSameDebugInfoAsHost : DebugDirectivesOnly;
389 const char *LinkingOutput)
const {
392 assert(TC.getTriple().isNVPTX() &&
"Wrong platform");
394 StringRef GPUArchName;
402 GPUArchName = Args.getLastArgValue(options::OPT_march_EQ);
403 if (GPUArchName.empty()) {
404 C.getDriver().Diag(diag::err_drv_offload_missing_gpu_arch)
413 "Device action expected to have an architecture.");
416 if (!Args.hasArg(options::OPT_no_cuda_version_check)) {
417 TC.CudaInstallation.CheckCudaVersionSupportsArch(gpu_arch);
420 ArgStringList CmdArgs;
421 CmdArgs.push_back(TC.getTriple().isArch64Bit() ?
"-m64" :
"-m32");
423 if (DIKind == EmitSameDebugInfoAsHost) {
426 CmdArgs.push_back(
"-g");
427 CmdArgs.push_back(
"--dont-merge-basicblocks");
428 CmdArgs.push_back(
"--return-at-end");
429 }
else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
437 StringRef OOpt =
"3";
438 if (A->getOption().matches(options::OPT_O4) ||
439 A->getOption().matches(options::OPT_Ofast))
441 else if (A->getOption().matches(options::OPT_O0))
443 else if (A->getOption().matches(options::OPT_O)) {
445 OOpt = llvm::StringSwitch<const char *>(A->getValue())
453 CmdArgs.push_back(Args.MakeArgString(llvm::Twine(
"-O") + OOpt));
457 CmdArgs.push_back(
"-O0");
459 if (DIKind == DebugDirectivesOnly)
460 CmdArgs.push_back(
"-lineinfo");
463 if (Args.hasArg(options::OPT_v))
464 CmdArgs.push_back(
"-v");
466 CmdArgs.push_back(
"--gpu-name");
468 CmdArgs.push_back(
"--output-file");
469 std::string OutputFileName = TC.getInputFilename(Output);
472 C.addTempFile(Args.MakeArgString(OutputFileName));
474 CmdArgs.push_back(Args.MakeArgString(OutputFileName));
475 for (
const auto &II : Inputs)
476 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
478 for (
const auto &A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
479 CmdArgs.push_back(Args.MakeArgString(A));
484 Relocatable = Args.hasFlag(options::OPT_fopenmp_relocatable_target,
485 options::OPT_fnoopenmp_relocatable_target,
489 Relocatable = Args.hasFlag(options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc,
496 CmdArgs.push_back(
"-c");
499 if (Arg *A = Args.getLastArg(options::OPT_ptxas_path_EQ))
500 Exec = A->getValue();
502 Exec = Args.MakeArgString(TC.GetProgramPath(
"ptxas"));
503 C.addCommand(std::make_unique<Command>(
507 Exec, CmdArgs, Inputs, Output));
512 bool includePTX = !Args.hasFlag(options::OPT_offload_new_driver,
513 options::OPT_no_offload_new_driver,
true);
514 for (Arg *A : Args.filtered(options::OPT_cuda_include_ptx_EQ,
515 options::OPT_no_cuda_include_ptx_EQ)) {
517 const StringRef ArchStr = A->getValue();
518 if (A->getOption().matches(options::OPT_cuda_include_ptx_EQ) &&
519 (ArchStr ==
"all" || ArchStr == InputArch))
521 else if (A->getOption().matches(options::OPT_no_cuda_include_ptx_EQ) &&
522 (ArchStr ==
"all" || ArchStr == InputArch))
535 const char *LinkingOutput)
const {
538 assert(TC.getTriple().isNVPTX() &&
"Wrong platform");
540 ArgStringList CmdArgs;
542 CmdArgs.push_back(
"--cuda");
543 CmdArgs.push_back(TC.getTriple().isArch64Bit() ?
"-64" :
"-32");
544 CmdArgs.push_back(Args.MakeArgString(
"--create"));
545 CmdArgs.push_back(Args.MakeArgString(Output.
getFilename()));
547 CmdArgs.push_back(
"-g");
549 for (
const auto &II : Inputs) {
550 auto *A = II.getAction();
551 assert(A->getInputs().size() == 1 &&
552 "Device offload action is expected to have a single input");
553 StringRef GpuArch = A->getOffloadingArch();
554 assert(!GpuArch.empty() &&
555 "Device action expected to have associated a GPU architecture!");
559 StringRef Kind = (II.getType() == types::TY_PP_Asm) ?
"ptx" :
"elf";
560 CmdArgs.push_back(Args.MakeArgString(
561 "--image3=kind=" + Kind +
",sm=" + GpuArch.drop_front(3) +
565 for (
const auto &A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
566 CmdArgs.push_back(Args.MakeArgString(A));
568 const char *Exec = Args.MakeArgString(TC.GetProgramPath(
"fatbinary"));
569 C.addCommand(std::make_unique<Command>(
573 Exec, CmdArgs, Inputs, Output));
580 const char *LinkingOutput)
const {
583 ArgStringList CmdArgs;
585 assert(TC.getTriple().isNVPTX() &&
"Wrong platform");
589 CmdArgs.push_back(
"-o");
594 CmdArgs.push_back(
"-g");
596 if (Args.hasArg(options::OPT_v))
597 CmdArgs.push_back(
"-v");
599 StringRef GPUArch = Args.getLastArgValue(options::OPT_march_EQ);
600 if (GPUArch.empty() && !
C.getDriver().isUsingLTO()) {
601 C.getDriver().Diag(diag::err_drv_offload_missing_gpu_arch)
606 if (!GPUArch.empty()) {
607 CmdArgs.push_back(
"-arch");
608 CmdArgs.push_back(Args.MakeArgString(GPUArch));
611 if (Args.hasArg(options::OPT_ptxas_path_EQ))
612 CmdArgs.push_back(Args.MakeArgString(
613 "--pxtas-path=" + Args.getLastArgValue(options::OPT_ptxas_path_EQ)));
615 if (Args.hasArg(options::OPT_cuda_path_EQ) || TC.CudaInstallation.isValid()) {
616 StringRef CudaPath = Args.getLastArgValue(
617 options::OPT_cuda_path_EQ,
618 llvm::sys::path::parent_path(TC.CudaInstallation.getBinPath()));
619 CmdArgs.push_back(Args.MakeArgString(
"--cuda-path=" + CudaPath));
626 Args.AddAllArgs(CmdArgs, options::OPT_L);
630 if (
C.getDriver().isUsingLTO())
635 std::vector<StringRef> Features;
639 Args.MakeArgString(
"--plugin-opt=-mattr=" + llvm::join(Features,
",")));
643 llvm::sys::path::parent_path(TC.getDriver().Dir);
644 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
645 CmdArgs.push_back(Args.MakeArgString(Twine(
"-L") + DefaultLibPath));
649 if (Args.hasArg(options::OPT_stdlib))
650 CmdArgs.append({
"-lc",
"-lm"});
651 if (Args.hasArg(options::OPT_startfiles)) {
652 std::optional<std::string> IncludePath =
getToolChain().getStdlibPath();
654 IncludePath =
"/lib";
656 llvm::sys::path::append(P,
"crt1.o");
657 CmdArgs.push_back(Args.MakeArgString(P));
660 C.addCommand(std::make_unique<Command>(
664 Args.MakeArgString(
getToolChain().GetProgramPath(
"clang-nvlink-wrapper")),
665 CmdArgs, Inputs, Output));
669 const llvm::opt::ArgList &Args,
670 std::vector<StringRef> &Features) {
671 if (Args.hasArg(options::OPT_cuda_feature_EQ)) {
672 StringRef PtxFeature = Args.getLastArgValue(options::OPT_cuda_feature_EQ);
673 Features.push_back(Args.MakeArgString(PtxFeature));
681 const char *PtxFeature =
nullptr;
682 switch (CudaInstallation.
version()) {
683#define CASE_CUDA_VERSION(CUDA_VER, PTX_VER) \
684 case CudaVersion::CUDA_##CUDA_VER: \
685 PtxFeature = "+ptx" #PTX_VER; \
714#undef CASE_CUDA_VERSION
717 PtxFeature =
"+ptx86";
724 Features.push_back(PtxFeature);
731 const llvm::Triple &HostTriple,
733 :
ToolChain(D, Triple, Args), CudaInstallation(D, HostTriple, Args) {
734 if (CudaInstallation.isValid())
735 getProgramPaths().push_back(std::string(CudaInstallation.getBinPath()));
738 getProgramPaths().push_back(getDriver().Dir);
747llvm::opt::DerivedArgList *
753 DAL =
new DerivedArgList(Args.getBaseArgs());
755 const OptTable &Opts =
getDriver().getOpts();
758 if (!llvm::is_contained(*DAL, A))
761 if (!DAL->hasArg(options::OPT_march_EQ) && OffloadKind !=
Action::OFK_None) {
762 DAL->AddJoinedArg(
nullptr, Opts.getOption(options::OPT_march_EQ),
764 }
else if (DAL->getLastArgValue(options::OPT_march_EQ) ==
"generic" &&
766 DAL->eraseArg(options::OPT_march_EQ);
767 }
else if (DAL->getLastArgValue(options::OPT_march_EQ) ==
"native") {
770 getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
771 <<
getArchName() << llvm::toString(GPUsOrErr.takeError()) <<
"-march";
773 auto &GPUs = *GPUsOrErr;
774 if (llvm::SmallSet<std::string, 1>(GPUs.begin(), GPUs.end()).size() > 1)
775 getDriver().Diag(diag::warn_drv_multi_gpu_arch)
776 <<
getArchName() << llvm::join(GPUs,
", ") <<
"-march";
777 DAL->AddJoinedArg(
nullptr, Opts.getOption(options::OPT_march_EQ),
778 Args.MakeArgString(GPUs.front()));
786 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
790 ArgStringList &CC1Args)
const {
791 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
792 DriverArgs.hasArg(options::OPT_nostdlibinc))
800 const Option &O = A->getOption();
801 return (O.matches(options::OPT_gN_Group) &&
802 !O.matches(options::OPT_gmodules)) ||
803 O.matches(options::OPT_g_Flag) ||
804 O.matches(options::OPT_ggdbN_Group) || O.matches(options::OPT_ggdb) ||
805 O.matches(options::OPT_gdwarf) || O.matches(options::OPT_gdwarf_2) ||
806 O.matches(options::OPT_gdwarf_3) || O.matches(options::OPT_gdwarf_4) ||
807 O.matches(options::OPT_gdwarf_5) ||
808 O.matches(options::OPT_gcolumn_info);
812 llvm::codegenoptions::DebugInfoKind &DebugInfoKind,
813 const ArgList &Args)
const {
815 case DisableDebugInfo:
816 DebugInfoKind = llvm::codegenoptions::NoDebugInfo;
818 case DebugDirectivesOnly:
819 DebugInfoKind = llvm::codegenoptions::DebugDirectivesOnly;
821 case EmitSameDebugInfoAsHost:
831 if (Arg *A = Args.getLastArg(options::OPT_offload_arch_tool_EQ))
832 Program = A->getValue();
836 auto StdoutOrErr =
getDriver().executeProgram({Program});
838 return StdoutOrErr.takeError();
841 for (StringRef
Arch : llvm::split((*StdoutOrErr)->getBuffer(),
"\n"))
843 GPUArchs.push_back(
Arch.str());
845 if (GPUArchs.empty())
846 return llvm::createStringError(std::error_code(),
847 "No NVIDIA GPU detected in the system");
849 return std::move(GPUArchs);
861 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
863 HostTC.addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadingKind);
865 StringRef GpuArch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
868 "Only OpenMP or CUDA offloading kinds are supported for NVIDIA GPUs.");
870 CC1Args.append({
"-fcuda-is-device",
"-mllvm",
871 "-enable-memcpyopt-without-libcalls",
872 "-fno-threadsafe-statics"});
874 if (DriverArgs.hasFlag(options::OPT_fcuda_short_ptr,
875 options::OPT_fno_cuda_short_ptr,
false))
876 CC1Args.append({
"-mllvm",
"--nvptx-short-ptr"});
878 if (!DriverArgs.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib,
883 DriverArgs.hasArg(options::OPT_S))
887 if (LibDeviceFile.empty()) {
888 getDriver().
Diag(diag::err_drv_no_cuda_libdevice) << GpuArch;
892 CC1Args.push_back(
"-mlink-builtin-bitcode");
893 CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
898 if (DriverArgs.hasFlag(options::OPT_foffload_via_llvm,
899 options::OPT_fno_offload_via_llvm,
false))
906 DriverArgs.MakeArgString(Twine(
"-target-sdk-version=") +
912 diag::err_drv_omp_offload_target_cuda_version_not_support)
927 const llvm::opt::ArgList &DriverArgs,
const JobAction &JA,
928 const llvm::fltSemantics *FPType)
const {
930 if (FPType && FPType == &llvm::APFloat::IEEEsingle() &&
931 DriverArgs.hasFlag(options::OPT_fgpu_flush_denormals_to_zero,
932 options::OPT_fno_gpu_flush_denormals_to_zero,
false))
933 return llvm::DenormalMode::getPreserveSign();
937 return llvm::DenormalMode::getIEEE();
941 ArgStringList &CC1Args)
const {
943 if (DriverArgs.hasFlag(options::OPT_offload_inc, options::OPT_no_offload_inc,
945 !DriverArgs.hasArg(options::OPT_no_cuda_version_check)) {
946 StringRef
Arch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
947 assert(!
Arch.empty() &&
"Must have an explicit GPU arch.");
962llvm::opt::DerivedArgList *
966 DerivedArgList *DAL =
967 HostTC.TranslateArgs(Args, BoundArch, DeviceOffloadKind);
969 DAL =
new DerivedArgList(Args.getBaseArgs());
973 for (Arg *A : Args) {
975 if (!llvm::is_contained(*DAL, A)) {
980 if (!BoundArch.empty()) {
981 DAL->eraseArg(options::OPT_march_EQ);
982 DAL->AddJoinedArg(
nullptr, Opts.getOption(options::OPT_march_EQ),
1005 HostTC.addClangWarningOptions(CC1Args);
1010 return HostTC.GetCXXStdlibType(Args);
1014 ArgStringList &CC1Args)
const {
1015 HostTC.AddClangSystemIncludeArgs(DriverArgs, CC1Args);
1017 if (DriverArgs.hasFlag(options::OPT_offload_inc, options::OPT_no_offload_inc,
1021 {
"-internal-isystem",
1026 ArgStringList &CC1Args)
const {
1027 HostTC.AddClangCXXStdlibIncludeArgs(Args, CC1Args);
1031 ArgStringList &CC1Args)
const {
1032 HostTC.AddIAMCUIncludeArgs(Args, CC1Args);
1045 return HostTC.getSupportedSanitizers();
1049 const ArgList &Args)
const {
1050 return HostTC.computeMSVCVersion(D, Args);
static StringRef getTriple(const Command &Job)
const char * getOffloadingArch() const
OffloadKind getOffloadingDeviceKind() const
bool isDeviceOffloading(OffloadKind OKind) const
bool isOffloading(OffloadKind OKind) const
Compilation - A set of tasks to perform for a single driver invocation.
A class to find a viable CUDA installation.
void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const
CudaInstallationDetector(const Driver &D, const llvm::Triple &HostTriple, const llvm::opt::ArgList &Args)
CudaVersion version() const
Get the detected Cuda install's version.
void WarnIfUnsupportedVersion() const
void CheckCudaVersionSupportsArch(OffloadArch Arch) const
Emit an error if Version does not support the given Arch.
void print(raw_ostream &OS) const
Print information about the detected CUDA installation.
bool isValid() const
Check whether we detected a valid Cuda install.
Distro - Helper class for detecting and classifying Linux distributions.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
DiagnosticBuilder Diag(unsigned DiagID) const
const llvm::opt::OptTable & getOpts() const
SmallVector< InputInfo, 4 > InputInfoList
bool willEmitRemarks(const llvm::opt::ArgList &Args)
The JSON file list parser is used to communicate input to InstallAPI.
CudaVersion MaxVersionForOffloadArch(OffloadArch A)
Get the latest CudaVersion that supports the given OffloadArch.
static bool IsNVIDIAOffloadArch(OffloadArch A)
const char * CudaVersionToString(CudaVersion V)
OffloadArch StringToOffloadArch(llvm::StringRef S)
const char * OffloadArchToString(OffloadArch A)
CudaVersion MinVersionForOffloadArch(OffloadArch A)
Get the earliest CudaVersion that supports the given OffloadArch.
Diagnostic wrappers for TextAPI types for error reporting.