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)
94 if (raw_version < 13010)
96 if (raw_version < 13020)
98 if (raw_version < 13030)
100 if (raw_version < 13040)
102 if (raw_version < 13050)
110 auto StartsWithWords =
111 [](llvm::StringRef
Line,
113 for (StringRef word : words) {
114 if (!
Line.consume_front(word))
121 Input = Input.ltrim();
122 while (!Input.empty()) {
124 StartsWithWords(Input.ltrim(), {
"#",
"define",
"CUDA_VERSION"})) {
126 Line->consumeInteger(10, RawVersion);
127 return getCudaVersion(RawVersion);
130 Input = Input.drop_front(Input.find_first_of(
"\n\r")).ltrim();
139 if (!VersionString.empty())
140 VersionString.insert(0,
" ");
141 D.Diag(diag::warn_drv_new_cuda_version)
146 D.Diag(diag::warn_drv_partially_supported_cuda_version)
151 const Driver &D,
const llvm::Triple &HostTriple,
152 const llvm::opt::ArgList &Args)
158 Candidate(std::string Path,
bool StrictChecking =
false)
159 : Path(Path), StrictChecking(StrictChecking) {}
164 std::initializer_list<const char *> Versions = {
"8.0",
"7.5",
"7.0"};
165 auto &FS = D.getVFS();
167 if (Args.hasArg(options::OPT_cuda_path_EQ)) {
168 Candidates.emplace_back(
169 Args.getLastArgValue(options::OPT_cuda_path_EQ).str());
170 }
else if (HostTriple.isOSWindows()) {
171 for (
const char *Ver : Versions)
172 Candidates.emplace_back(
173 D.SysRoot +
"/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v" +
176 if (!Args.hasArg(options::OPT_cuda_path_ignore_env)) {
185 if (llvm::ErrorOr<std::string> ptxas =
186 llvm::sys::findProgramByName(
"ptxas")) {
188 llvm::sys::fs::real_path(*ptxas, ptxasAbsolutePath);
190 StringRef ptxasDir = llvm::sys::path::parent_path(ptxasAbsolutePath);
191 if (llvm::sys::path::filename(ptxasDir) ==
"bin")
192 Candidates.emplace_back(
193 std::string(llvm::sys::path::parent_path(ptxasDir)),
198 Candidates.emplace_back(D.SysRoot +
"/usr/local/cuda");
199 for (
const char *Ver : Versions)
200 Candidates.emplace_back(D.SysRoot +
"/usr/local/cuda-" + Ver);
202 Distro Dist(FS, llvm::Triple(llvm::sys::getProcessTriple()));
206 Candidates.emplace_back(D.SysRoot +
"/usr/lib/cuda");
210 !Args.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib,
true);
212 for (
const auto &Candidate : Candidates) {
213 InstallPath = Candidate.Path;
214 if (InstallPath.empty() || !FS.exists(InstallPath))
217 BinPath = InstallPath +
"/bin";
218 IncludePath = InstallPath +
"/include";
219 LibDevicePath = InstallPath +
"/nvvm/libdevice";
221 if (!(FS.exists(IncludePath) && FS.exists(BinPath)))
223 bool CheckLibDevice = (!NoCudaLib || Candidate.StrictChecking);
224 if (CheckLibDevice && !FS.exists(LibDevicePath))
228 if (
auto CudaHFile = FS.getBufferForFile(InstallPath +
"/include/cuda.h"))
229 Version = parseCudaHFile((*CudaHFile)->getBuffer());
233 Version = FS.exists(LibDevicePath +
"/libdevice.10.bc")
240 std::string FilePath = LibDevicePath +
"/libdevice.10.bc";
241 if (FS.exists(FilePath)) {
244#define NVPTX_GPU(NAME, KIND, VIRTUAL, SM_ID, MIN_VER, MAX_VER, SUFFIX) \
245 if ((SM_ID) >= 300) \
246 LibDeviceMap[NAME] = FilePath;
247#include "llvm/TargetParser/NVPTXTargetParser.def"
251 for (llvm::vfs::directory_iterator LI = FS.dir_begin(LibDevicePath, EC),
253 !EC && LI != LE; LI = LI.increment(EC)) {
254 StringRef FilePath = LI->path();
255 StringRef
FileName = llvm::sys::path::filename(FilePath);
258 const StringRef LibDeviceName =
"libdevice.";
262 LibDeviceName.size(),
FileName.find(
'.', LibDeviceName.size()));
263 LibDeviceMap[GpuArch] = FilePath.str();
267 if (GpuArch ==
"compute_20") {
268 LibDeviceMap[
"sm_20"] = std::string(FilePath);
269 LibDeviceMap[
"sm_21"] = std::string(FilePath);
270 LibDeviceMap[
"sm_32"] = std::string(FilePath);
271 }
else if (GpuArch ==
"compute_30") {
272 LibDeviceMap[
"sm_30"] = std::string(FilePath);
274 LibDeviceMap[
"sm_50"] = std::string(FilePath);
275 LibDeviceMap[
"sm_52"] = std::string(FilePath);
276 LibDeviceMap[
"sm_53"] = std::string(FilePath);
278 LibDeviceMap[
"sm_60"] = std::string(FilePath);
279 LibDeviceMap[
"sm_61"] = std::string(FilePath);
280 LibDeviceMap[
"sm_62"] = std::string(FilePath);
281 }
else if (GpuArch ==
"compute_35") {
282 LibDeviceMap[
"sm_35"] = std::string(FilePath);
283 LibDeviceMap[
"sm_37"] = std::string(FilePath);
284 }
else if (GpuArch ==
"compute_50") {
286 LibDeviceMap[
"sm_50"] = std::string(FilePath);
287 LibDeviceMap[
"sm_52"] = std::string(FilePath);
288 LibDeviceMap[
"sm_53"] = std::string(FilePath);
296 if (LibDeviceMap.empty() && !NoCudaLib)
305 const ArgList &DriverArgs, ArgStringList &CC1Args)
const {
306 if (DriverArgs.hasFlag(options::OPT_foffload_via_llvm,
307 options::OPT_fno_offload_via_llvm,
false))
310 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
314 llvm::sys::path::append(P,
"include");
315 llvm::sys::path::append(P,
"cuda_wrappers");
316 CC1Args.push_back(
"-internal-isystem");
317 CC1Args.push_back(DriverArgs.MakeArgString(P));
320 if (!DriverArgs.hasFlag(options::OPT_offload_inc, options::OPT_no_offload_inc,
325 D.Diag(diag::err_drv_no_cuda_installation);
329 CC1Args.push_back(
"-include");
330 CC1Args.push_back(
"__clang_cuda_runtime_wrapper.h");
337 ArchsWithBadVersion[
Arch.nvptxKind()])
342 if (Version < MinVersion || Version > MaxVersion) {
343 ArchsWithBadVersion[
Arch.nvptxKind()] =
true;
344 D.Diag(diag::err_drv_cuda_version_unsupported)
353 OS <<
"Found CUDA installation: " << InstallPath <<
", version "
363enum DeviceDebugInfoLevel {
366 EmitSameDebugInfoAsHost,
380 const Arg *A = Args.getLastArg(options::OPT_O_Group);
381 bool IsDebugEnabled = !A || A->getOption().matches(options::OPT_O0) ||
382 Args.hasFlag(options::OPT_cuda_noopt_device_debug,
383 options::OPT_no_cuda_noopt_device_debug,
385 if (
const Arg *A = Args.getLastArg(options::OPT_g_Group)) {
386 const Option &Opt = A->getOption();
387 if (Opt.matches(options::OPT_gN_Group)) {
388 if (Opt.matches(options::OPT_g0) || Opt.matches(options::OPT_ggdb0))
389 return DisableDebugInfo;
390 if (Opt.matches(options::OPT_gline_directives_only))
391 return DebugDirectivesOnly;
393 return IsDebugEnabled ? EmitSameDebugInfoAsHost : DebugDirectivesOnly;
402 const char *LinkingOutput)
const {
406 bool UsesLLVMOffloading = Args.hasFlag(
407 options::OPT_foffload_via_llvm, options::OPT_fno_offload_via_llvm,
false);
408 assert((TC.getTriple().isNVPTX() || UsesLLVMOffloading) &&
"Wrong platform");
418 GPUArch =
BoundArch(Args.getLastArgValue(options::OPT_march_EQ));
419 if (GPUArch.
empty()) {
420 C.getDriver().Diag(diag::err_drv_offload_missing_gpu_arch)
428 "Device action expected to have an architecture.");
431 if (!UsesLLVMOffloading && !Args.hasArg(options::OPT_no_cuda_version_check)) {
432 TC.CudaInstallation.CheckCudaVersionSupportsArch(GPUArch.
Arch);
435 ArgStringList CmdArgs;
436 CmdArgs.push_back(TC.getTriple().isArch64Bit() ?
"-m64" :
"-m32");
438 if (DIKind == EmitSameDebugInfoAsHost) {
441 CmdArgs.push_back(
"-g");
442 CmdArgs.push_back(
"--dont-merge-basicblocks");
443 CmdArgs.push_back(
"--return-at-end");
444 }
else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
452 StringRef OOpt =
"3";
453 if (A->getOption().matches(options::OPT_O4) ||
454 A->getOption().matches(options::OPT_Ofast))
456 else if (A->getOption().matches(options::OPT_O0))
458 else if (A->getOption().matches(options::OPT_O)) {
460 OOpt = llvm::StringSwitch<const char *>(A->getValue())
468 CmdArgs.push_back(Args.MakeArgString(llvm::Twine(
"-O") + OOpt));
472 CmdArgs.push_back(
"-O0");
474 if (DIKind == DebugDirectivesOnly)
475 CmdArgs.push_back(
"-lineinfo");
478 if (Args.hasArg(options::OPT_v))
479 CmdArgs.push_back(
"-v");
481 CmdArgs.push_back(
"--gpu-name");
482 CmdArgs.push_back(Args.MakeArgString(GPUArch.
ArchName));
483 CmdArgs.push_back(
"--output-file");
484 std::string OutputFileName = TC.getInputFilename(Output);
487 C.addTempFile(Args.MakeArgString(OutputFileName));
489 CmdArgs.push_back(Args.MakeArgString(OutputFileName));
490 for (
const auto &II : Inputs)
491 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
493 for (
const auto &A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
494 CmdArgs.push_back(Args.MakeArgString(A));
499 Relocatable = Args.hasFlag(options::OPT_fopenmp_relocatable_target,
500 options::OPT_fnoopenmp_relocatable_target,
504 Relocatable = UsesLLVMOffloading ||
505 Args.hasFlag(options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc,
512 CmdArgs.push_back(
"-c");
515 if (Arg *A = Args.getLastArg(options::OPT_ptxas_path_EQ))
516 Exec = A->getValue();
518 Exec = Args.MakeArgString(TC.GetProgramPath(
"ptxas"));
519 C.addCommand(std::make_unique<Command>(
523 Exec, CmdArgs, Inputs, Output));
528 bool includePTX = !Args.hasFlag(options::OPT_offload_new_driver,
529 options::OPT_no_offload_new_driver,
true);
530 for (Arg *A : Args.filtered(options::OPT_cuda_include_ptx_EQ,
531 options::OPT_no_cuda_include_ptx_EQ)) {
533 const StringRef ArchStr = A->getValue();
534 if (A->getOption().matches(options::OPT_cuda_include_ptx_EQ) &&
535 (ArchStr ==
"all" || ArchStr == InputArch))
537 else if (A->getOption().matches(options::OPT_no_cuda_include_ptx_EQ) &&
538 (ArchStr ==
"all" || ArchStr == InputArch))
551 const char *LinkingOutput)
const {
554 [[maybe_unused]]
bool UsesLLVMOffloading = Args.hasFlag(
555 options::OPT_foffload_via_llvm, options::OPT_fno_offload_via_llvm,
false);
556 assert((UsesLLVMOffloading || TC.getTriple().isNVPTX()) &&
"Wrong platform");
558 ArgStringList CmdArgs;
560 CmdArgs.push_back(
"--cuda");
561 CmdArgs.push_back(TC.getTriple().isArch64Bit() ?
"-64" :
"-32");
562 CmdArgs.push_back(Args.MakeArgString(
"--create"));
563 CmdArgs.push_back(Args.MakeArgString(Output.
getFilename()));
565 CmdArgs.push_back(
"-g");
567 for (
const auto &II : Inputs) {
568 auto *A = II.getAction();
569 assert(A->getInputs().size() == 1 &&
570 "Device offload action is expected to have a single input");
571 BoundArch GpuArch = A->getOffloadingArch();
572 assert(!GpuArch.
empty() &&
573 "Device action expected to have associated a GPU architecture!");
575 if (II.getType() == types::TY_PP_Asm &&
578 StringRef Kind = (II.getType() == types::TY_PP_Asm) ?
"ptx" :
"elf";
579 CmdArgs.push_back(Args.MakeArgString(
580 "--image3=kind=" + Kind +
",sm=" + GpuArch.
ArchName.drop_front(3) +
584 for (
const auto &A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
585 CmdArgs.push_back(Args.MakeArgString(A));
587 const char *Exec = Args.MakeArgString(TC.GetProgramPath(
"fatbinary"));
588 C.addCommand(std::make_unique<Command>(
592 Exec, CmdArgs, Inputs, Output));
599 const char *LinkingOutput)
const {
602 ArgStringList CmdArgs;
604 [[maybe_unused]]
bool UsesLLVMOffloading = Args.hasFlag(
605 options::OPT_foffload_via_llvm, options::OPT_fno_offload_via_llvm,
false);
606 assert((UsesLLVMOffloading || TC.getTriple().isNVPTX()) &&
"Wrong platform");
610 CmdArgs.push_back(
"-o");
615 CmdArgs.push_back(
"-g");
617 if (Args.hasArg(options::OPT_v))
618 CmdArgs.push_back(
"-v");
620 StringRef GPUArch = Args.getLastArgValue(options::OPT_march_EQ);
621 if (GPUArch.empty() && !
getToolChain().isUsingLTO(Args)) {
622 C.getDriver().Diag(diag::err_drv_offload_missing_gpu_arch)
627 if (!GPUArch.empty()) {
628 CmdArgs.push_back(
"-arch");
629 CmdArgs.push_back(Args.MakeArgString(GPUArch));
632 if (Args.hasArg(options::OPT_ptxas_path_EQ))
633 CmdArgs.push_back(Args.MakeArgString(
634 "--ptxas-path=" + Args.getLastArgValue(options::OPT_ptxas_path_EQ)));
637 for (
const Arg *A : Args.filtered(options::OPT_Xcuda_ptxas)) {
639 CmdArgs.append({
"-Xptxas", A->getValue()});
642 if (Args.hasArg(options::OPT_cuda_path_EQ) || TC.CudaInstallation.isValid()) {
643 StringRef CudaPath = Args.getLastArgValue(
644 options::OPT_cuda_path_EQ,
645 llvm::sys::path::parent_path(TC.CudaInstallation.getBinPath()));
646 CmdArgs.push_back(Args.MakeArgString(
"--cuda-path=" + CudaPath));
653 Args.AddAllArgs(CmdArgs, options::OPT_L);
662 std::vector<StringRef> Features;
666 Args.MakeArgString(
"--plugin-opt=-mattr=" + llvm::join(Features,
",")));
670 llvm::sys::path::parent_path(TC.getDriver().Dir);
671 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
672 CmdArgs.push_back(Args.MakeArgString(Twine(
"-L") + DefaultLibPath));
677 if (Args.hasArg(options::OPT_stdlib))
678 CmdArgs.append({
"-lc",
"-lm"});
679 if (Args.hasArg(options::OPT_startfiles)) {
680 std::optional<std::string> IncludePath =
getToolChain().getStdlibPath();
682 IncludePath =
"/lib";
684 llvm::sys::path::append(P,
"crt1.o");
685 CmdArgs.push_back(Args.MakeArgString(P));
688 C.addCommand(std::make_unique<Command>(
692 Args.MakeArgString(
getToolChain().GetProgramPath(
"clang-nvlink-wrapper")),
693 CmdArgs, Inputs, Output));
697 const llvm::opt::ArgList &Args,
698 std::vector<StringRef> &Features) {
699 if (Args.hasArg(options::OPT_cuda_feature_EQ)) {
700 StringRef PtxFeature = Args.getLastArgValue(options::OPT_cuda_feature_EQ);
701 Features.push_back(Args.MakeArgString(PtxFeature));
709 const char *PtxFeature =
nullptr;
710 switch (CudaInstallation.
version()) {
711#define CASE_CUDA_VERSION(CUDA_VER, PTX_VER) \
712 case CudaVersion::CUDA_##CUDA_VER: \
713 PtxFeature = "+ptx" #PTX_VER; \
747#undef CASE_CUDA_VERSION
750 PtxFeature =
"+ptx86";
757 Features.push_back(PtxFeature);
764 const llvm::Triple &HostTriple,
766 :
ToolChain(D, Triple, Args), CudaInstallation(D, HostTriple, Args) {
767 if (CudaInstallation.isValid())
768 getProgramPaths().push_back(std::string(CudaInstallation.getBinPath()));
771 getProgramPaths().push_back(getDriver().Dir);
779 loadMultilibsFromYAML(Args, D);
782llvm::opt::DerivedArgList *
788 DAL =
new DerivedArgList(Args.getBaseArgs());
790 const OptTable &Opts =
getDriver().getOpts();
793 if (!llvm::is_contained(*DAL, A))
796 if (!DAL->hasArg(options::OPT_march_EQ) && OffloadKind !=
Action::OFK_None) {
797 DAL->AddJoinedArg(
nullptr, Opts.getOption(options::OPT_march_EQ),
799 }
else if (DAL->getLastArgValue(options::OPT_march_EQ) ==
"generic" &&
801 DAL->eraseArg(options::OPT_march_EQ);
802 }
else if (DAL->getLastArgValue(options::OPT_march_EQ) ==
"native") {
805 getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
806 <<
getArchName() << llvm::toString(GPUsOrErr.takeError()) <<
"-march";
808 auto &GPUs = *GPUsOrErr;
809 if (llvm::SmallSet<std::string, 1>(GPUs.begin(), GPUs.end()).size() > 1)
810 getDriver().Diag(diag::warn_drv_multi_gpu_arch)
811 <<
getArchName() << llvm::join(GPUs,
", ") <<
"-march";
812 DAL->AddJoinedArg(
nullptr, Opts.getOption(options::OPT_march_EQ),
813 Args.MakeArgString(GPUs.front()));
821 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
825 ArgStringList &CC1Args)
const {
826 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
827 DriverArgs.hasArg(options::OPT_nostdlibinc))
836 llvm::sys::path::append(Dir, M.includeSuffix());
847 const Option &O = A->getOption();
848 return (O.matches(options::OPT_gN_Group) &&
849 !O.matches(options::OPT_gmodules)) ||
850 O.matches(options::OPT_g_Flag) ||
851 O.matches(options::OPT_ggdbN_Group) || O.matches(options::OPT_ggdb) ||
852 O.matches(options::OPT_gdwarf) || O.matches(options::OPT_gdwarf_2) ||
853 O.matches(options::OPT_gdwarf_3) || O.matches(options::OPT_gdwarf_4) ||
854 O.matches(options::OPT_gdwarf_5) ||
855 O.matches(options::OPT_gcolumn_info);
859 llvm::codegenoptions::DebugInfoKind &DebugInfoKind,
860 const ArgList &Args)
const {
862 case DisableDebugInfo:
863 DebugInfoKind = llvm::codegenoptions::NoDebugInfo;
865 case DebugDirectivesOnly:
866 DebugInfoKind = llvm::codegenoptions::DebugDirectivesOnly;
868 case EmitSameDebugInfoAsHost:
878 if (Arg *A = Args.getLastArg(options::OPT_offload_arch_tool_EQ))
879 Program = A->getValue();
883 auto StdoutOrErr =
getDriver().executeProgram({Program});
885 return StdoutOrErr.takeError();
888 for (StringRef
Arch : llvm::split((*StdoutOrErr)->getBuffer(),
"\n"))
890 GPUArchs.push_back(
Arch.str());
892 if (GPUArchs.empty())
893 return llvm::createStringError(std::error_code(),
894 "No NVIDIA GPU detected in the system");
896 return std::move(GPUArchs);
908 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
910 HostTC.addClangTargetOptions(DriverArgs, CC1Args, BA, DeviceOffloadingKind);
912 bool UsesLLVMOffloading = DriverArgs.hasFlag(
913 options::OPT_foffload_via_llvm, options::OPT_fno_offload_via_llvm,
false);
915 StringRef GpuArch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
918 "Only OpenMP or CUDA offloading kinds are supported for NVIDIA GPUs.");
920 CC1Args.append({
"-fcuda-is-device",
"-mllvm",
921 "-enable-memcpyopt-without-libcalls",
922 "-fno-threadsafe-statics"});
924 if (DriverArgs.hasFlag(options::OPT_fcuda_short_ptr,
925 options::OPT_fno_cuda_short_ptr,
false))
926 CC1Args.append({
"-target-abi",
"shortptr"});
928 if (!DriverArgs.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib,
933 DriverArgs.hasArg(options::OPT_S))
936 if (UsesLLVMOffloading)
940 if (LibDeviceFile.empty()) {
941 getDriver().
Diag(diag::err_drv_no_cuda_libdevice) << GpuArch;
945 CC1Args.push_back(
"-mlink-builtin-bitcode");
946 CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
952 DriverArgs.MakeArgString(Twine(
"-target-sdk-version=") +
958 diag::err_drv_omp_offload_target_cuda_version_not_support)
964 if (
isUsingLTO(DriverArgs, DeviceOffloadingKind))
973 const llvm::opt::ArgList &DriverArgs,
const JobAction &JA,
974 const llvm::fltSemantics *FPType)
const {
976 if (FPType && FPType == &llvm::APFloat::IEEEsingle() &&
977 DriverArgs.hasFlag(options::OPT_fgpu_flush_denormals_to_zero,
978 options::OPT_fno_gpu_flush_denormals_to_zero,
false))
979 return llvm::DenormalMode::getPreserveSign();
983 return llvm::DenormalMode::getIEEE();
987 ArgStringList &CC1Args)
const {
988 if (DriverArgs.hasFlag(options::OPT_foffload_via_llvm,
989 options::OPT_fno_offload_via_llvm,
false))
993 if (DriverArgs.hasFlag(options::OPT_offload_inc, options::OPT_no_offload_inc,
995 !DriverArgs.hasArg(options::OPT_no_cuda_version_check)) {
996 StringRef
Arch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
997 assert(!
Arch.empty() &&
"Must have an explicit GPU arch.");
1006 if (Input.
getType() != types::TY_Object ||
getDriver().offloadDeviceOnly())
1012llvm::opt::DerivedArgList *
1016 DerivedArgList *DAL =
HostTC.TranslateArgs(Args, BA, DeviceOffloadKind);
1018 DAL =
new DerivedArgList(Args.getBaseArgs());
1022 for (Arg *A : Args) {
1024 if (!llvm::is_contained(*DAL, A)) {
1030 DAL->eraseArg(options::OPT_march_EQ);
1031 DAL->AddJoinedArg(
nullptr, Opts.getOption(options::OPT_march_EQ),
1054 HostTC.addClangWarningOptions(CC1Args);
1059 return HostTC.GetCXXStdlibType(Args);
1063 ArgStringList &CC1Args)
const {
1064 if (DriverArgs.hasFlag(options::OPT_foffload_via_llvm,
1065 options::OPT_fno_offload_via_llvm,
false))
1068 HostTC.AddClangSystemIncludeArgs(DriverArgs, CC1Args);
1070 if (DriverArgs.hasFlag(options::OPT_offload_inc, options::OPT_no_offload_inc,
1074 {
"-internal-isystem",
1079 ArgStringList &CC1Args)
const {
1080 HostTC.AddClangCXXStdlibIncludeArgs(Args, CC1Args);
1084 ArgStringList &CC1Args)
const {
1085 HostTC.AddIAMCUIncludeArgs(Args, CC1Args);
1101 return HostTC.getSupportedSanitizers(BA, DeviceOffloadKind);
1105 const ArgList &Args)
const {
1106 return HostTC.computeMSVCVersion(D, Args);
static StringRef getTriple(const Command &Job)
A processor an offloading action can target.
static OffloadArch CudaDefault()
Default architectures used when the user does not specify one.
BoundArch 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
This corresponds to a single GCC Multilib, or a segment of one controlled by a command line flag.
SmallVector< InputInfo, 4 > InputInfoList
bool willEmitRemarks(const llvm::opt::ArgList &Args)
Top level wrappers for InstallAPI frontend operations.
CudaVersion MaxVersionForOffloadArch(OffloadArch A)
Get the latest CudaVersion that supports the given OffloadArch.
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.
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
Represents a bound architecture for offload / multiple architecture compilation.
OffloadArch Arch
The parsed offload architecture.