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));
527 bool includePTX =
false;
528 for (Arg *A : Args.filtered(options::OPT_cuda_include_ptx_EQ,
529 options::OPT_no_cuda_include_ptx_EQ)) {
531 const StringRef ArchStr = A->getValue();
532 if (A->getOption().matches(options::OPT_cuda_include_ptx_EQ) &&
533 (ArchStr ==
"all" || ArchStr == InputArch))
535 else if (A->getOption().matches(options::OPT_no_cuda_include_ptx_EQ) &&
536 (ArchStr ==
"all" || ArchStr == InputArch))
549 const char *LinkingOutput)
const {
552 [[maybe_unused]]
bool UsesLLVMOffloading = Args.hasFlag(
553 options::OPT_foffload_via_llvm, options::OPT_fno_offload_via_llvm,
false);
554 assert((UsesLLVMOffloading || TC.getTriple().isNVPTX()) &&
"Wrong platform");
556 ArgStringList CmdArgs;
558 CmdArgs.push_back(
"--cuda");
559 CmdArgs.push_back(TC.getTriple().isArch64Bit() ?
"-64" :
"-32");
560 CmdArgs.push_back(Args.MakeArgString(
"--create"));
561 CmdArgs.push_back(Args.MakeArgString(Output.
getFilename()));
563 CmdArgs.push_back(
"-g");
565 for (
const auto &II : Inputs) {
566 auto *A = II.getAction();
567 assert(A->getInputs().size() == 1 &&
568 "Device offload action is expected to have a single input");
569 BoundArch GpuArch = A->getOffloadingArch();
570 assert(!GpuArch.
empty() &&
571 "Device action expected to have associated a GPU architecture!");
573 if (II.getType() == types::TY_PP_Asm &&
576 StringRef Kind = (II.getType() == types::TY_PP_Asm) ?
"ptx" :
"elf";
577 CmdArgs.push_back(Args.MakeArgString(
578 "--image3=kind=" + Kind +
",sm=" + GpuArch.
ArchName.drop_front(3) +
582 for (
const auto &A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
583 CmdArgs.push_back(Args.MakeArgString(A));
585 const char *Exec = Args.MakeArgString(TC.GetProgramPath(
"fatbinary"));
586 C.addCommand(std::make_unique<Command>(
590 Exec, CmdArgs, Inputs, Output));
597 const char *LinkingOutput)
const {
600 ArgStringList CmdArgs;
602 [[maybe_unused]]
bool UsesLLVMOffloading = Args.hasFlag(
603 options::OPT_foffload_via_llvm, options::OPT_fno_offload_via_llvm,
false);
604 assert((UsesLLVMOffloading || TC.getTriple().isNVPTX()) &&
"Wrong platform");
608 CmdArgs.push_back(
"-o");
613 CmdArgs.push_back(
"-g");
615 if (Args.hasArg(options::OPT_v))
616 CmdArgs.push_back(
"-v");
618 StringRef GPUArch = Args.getLastArgValue(options::OPT_march_EQ);
619 if (GPUArch.empty() && !
getToolChain().isUsingLTO(Args)) {
620 C.getDriver().Diag(diag::err_drv_offload_missing_gpu_arch)
625 if (!GPUArch.empty()) {
626 CmdArgs.push_back(
"-arch");
627 CmdArgs.push_back(Args.MakeArgString(GPUArch));
630 if (Args.hasArg(options::OPT_ptxas_path_EQ))
631 CmdArgs.push_back(Args.MakeArgString(
632 "--ptxas-path=" + Args.getLastArgValue(options::OPT_ptxas_path_EQ)));
635 for (
const Arg *A : Args.filtered(options::OPT_Xcuda_ptxas)) {
637 CmdArgs.append({
"-Xptxas", A->getValue()});
640 if (Args.hasArg(options::OPT_cuda_path_EQ) || TC.CudaInstallation.isValid()) {
641 StringRef CudaPath = Args.getLastArgValue(
642 options::OPT_cuda_path_EQ,
643 llvm::sys::path::parent_path(TC.CudaInstallation.getBinPath()));
644 CmdArgs.push_back(Args.MakeArgString(
"--cuda-path=" + CudaPath));
651 Args.AddAllArgs(CmdArgs, options::OPT_L);
660 std::vector<StringRef> Features;
664 Args.MakeArgString(
"--plugin-opt=-mattr=" + llvm::join(Features,
",")));
668 llvm::sys::path::parent_path(TC.getDriver().Dir);
669 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
670 CmdArgs.push_back(Args.MakeArgString(Twine(
"-L") + DefaultLibPath));
675 if (Args.hasArg(options::OPT_stdlib))
676 CmdArgs.append({
"-lc",
"-lm"});
677 if (Args.hasArg(options::OPT_startfiles)) {
678 std::optional<std::string> IncludePath =
getToolChain().getStdlibPath();
680 IncludePath =
"/lib";
682 llvm::sys::path::append(P,
"crt1.o");
683 CmdArgs.push_back(Args.MakeArgString(P));
686 C.addCommand(std::make_unique<Command>(
690 Args.MakeArgString(
getToolChain().GetProgramPath(
"clang-nvlink-wrapper")),
691 CmdArgs, Inputs, Output));
695 const llvm::opt::ArgList &Args,
696 std::vector<StringRef> &Features) {
697 if (Args.hasArg(options::OPT_cuda_feature_EQ)) {
698 StringRef PtxFeature = Args.getLastArgValue(options::OPT_cuda_feature_EQ);
699 Features.push_back(Args.MakeArgString(PtxFeature));
707 const char *PtxFeature =
nullptr;
708 switch (CudaInstallation.
version()) {
709#define CASE_CUDA_VERSION(CUDA_VER, PTX_VER) \
710 case CudaVersion::CUDA_##CUDA_VER: \
711 PtxFeature = "+ptx" #PTX_VER; \
745#undef CASE_CUDA_VERSION
748 PtxFeature =
"+ptx86";
755 Features.push_back(PtxFeature);
762 const llvm::Triple &HostTriple,
764 :
ToolChain(D, Triple, Args), CudaInstallation(D, HostTriple, Args) {
765 if (CudaInstallation.isValid())
766 getProgramPaths().push_back(std::string(CudaInstallation.getBinPath()));
769 getProgramPaths().push_back(getDriver().Dir);
777 loadMultilibsFromYAML(Args, D);
780llvm::opt::DerivedArgList *
786 DAL =
new DerivedArgList(Args.getBaseArgs());
788 const OptTable &Opts =
getDriver().getOpts();
791 if (!llvm::is_contained(*DAL, A))
794 if (!DAL->hasArg(options::OPT_march_EQ) && OffloadKind !=
Action::OFK_None) {
795 DAL->AddJoinedArg(
nullptr, Opts.getOption(options::OPT_march_EQ),
797 }
else if (DAL->getLastArgValue(options::OPT_march_EQ) ==
"generic" &&
799 DAL->eraseArg(options::OPT_march_EQ);
800 }
else if (DAL->getLastArgValue(options::OPT_march_EQ) ==
"native") {
803 getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
804 <<
getArchName() << llvm::toString(GPUsOrErr.takeError()) <<
"-march";
806 auto &GPUs = *GPUsOrErr;
807 if (llvm::SmallSet<std::string, 1>(GPUs.begin(), GPUs.end()).size() > 1)
808 getDriver().Diag(diag::warn_drv_multi_gpu_arch)
809 <<
getArchName() << llvm::join(GPUs,
", ") <<
"-march";
810 DAL->AddJoinedArg(
nullptr, Opts.getOption(options::OPT_march_EQ),
811 Args.MakeArgString(GPUs.front()));
819 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
823 ArgStringList &CC1Args)
const {
824 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
825 DriverArgs.hasArg(options::OPT_nostdlibinc))
834 llvm::sys::path::append(Dir, M.includeSuffix());
845 const Option &O = A->getOption();
846 return (O.matches(options::OPT_gN_Group) &&
847 !O.matches(options::OPT_gmodules)) ||
848 O.matches(options::OPT_g_Flag) ||
849 O.matches(options::OPT_ggdbN_Group) || O.matches(options::OPT_ggdb) ||
850 O.matches(options::OPT_gdwarf) || O.matches(options::OPT_gdwarf_2) ||
851 O.matches(options::OPT_gdwarf_3) || O.matches(options::OPT_gdwarf_4) ||
852 O.matches(options::OPT_gdwarf_5) ||
853 O.matches(options::OPT_gcolumn_info);
857 llvm::codegenoptions::DebugInfoKind &DebugInfoKind,
858 const ArgList &Args)
const {
860 case DisableDebugInfo:
861 DebugInfoKind = llvm::codegenoptions::NoDebugInfo;
863 case DebugDirectivesOnly:
864 DebugInfoKind = llvm::codegenoptions::DebugDirectivesOnly;
866 case EmitSameDebugInfoAsHost:
876 if (Arg *A = Args.getLastArg(options::OPT_offload_arch_tool_EQ))
877 Program = A->getValue();
881 auto StdoutOrErr =
getDriver().executeProgram({Program});
883 return StdoutOrErr.takeError();
886 for (StringRef
Arch : llvm::split((*StdoutOrErr)->getBuffer(),
"\n"))
888 GPUArchs.push_back(
Arch.str());
890 if (GPUArchs.empty())
891 return llvm::createStringError(std::error_code(),
892 "No NVIDIA GPU detected in the system");
894 return std::move(GPUArchs);
906 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
908 HostTC.addClangTargetOptions(DriverArgs, CC1Args, BA, DeviceOffloadingKind);
910 bool UsesLLVMOffloading = DriverArgs.hasFlag(
911 options::OPT_foffload_via_llvm, options::OPT_fno_offload_via_llvm,
false);
913 StringRef GpuArch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
916 "Only OpenMP or CUDA offloading kinds are supported for NVIDIA GPUs.");
918 CC1Args.append({
"-fcuda-is-device",
"-mllvm",
919 "-enable-memcpyopt-without-libcalls",
920 "-fno-threadsafe-statics"});
922 if (DriverArgs.hasFlag(options::OPT_fcuda_short_ptr,
923 options::OPT_fno_cuda_short_ptr,
false))
924 CC1Args.append({
"-target-abi",
"shortptr"});
926 if (!DriverArgs.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib,
931 DriverArgs.hasArg(options::OPT_S))
934 if (UsesLLVMOffloading)
938 if (LibDeviceFile.empty()) {
939 getDriver().
Diag(diag::err_drv_no_cuda_libdevice) << GpuArch;
943 CC1Args.push_back(
"-mlink-builtin-bitcode");
944 CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
950 DriverArgs.MakeArgString(Twine(
"-target-sdk-version=") +
956 diag::err_drv_omp_offload_target_cuda_version_not_support)
962 if (
isUsingLTO(DriverArgs, DeviceOffloadingKind))
971 const llvm::opt::ArgList &DriverArgs,
const JobAction &JA,
972 const llvm::fltSemantics *FPType)
const {
974 if (FPType && FPType == &llvm::APFloat::IEEEsingle() &&
975 DriverArgs.hasFlag(options::OPT_fgpu_flush_denormals_to_zero,
976 options::OPT_fno_gpu_flush_denormals_to_zero,
false))
977 return llvm::DenormalMode::getPreserveSign();
981 return llvm::DenormalMode::getIEEE();
985 ArgStringList &CC1Args)
const {
986 if (DriverArgs.hasFlag(options::OPT_foffload_via_llvm,
987 options::OPT_fno_offload_via_llvm,
false))
991 if (DriverArgs.hasFlag(options::OPT_offload_inc, options::OPT_no_offload_inc,
993 !DriverArgs.hasArg(options::OPT_no_cuda_version_check)) {
994 StringRef
Arch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
995 assert(!
Arch.empty() &&
"Must have an explicit GPU arch.");
1004 if (Input.
getType() != types::TY_Object ||
getDriver().offloadDeviceOnly())
1010llvm::opt::DerivedArgList *
1014 DerivedArgList *DAL =
HostTC.TranslateArgs(Args, BA, DeviceOffloadKind);
1016 DAL =
new DerivedArgList(Args.getBaseArgs());
1020 for (Arg *A : Args) {
1022 if (!llvm::is_contained(*DAL, A)) {
1028 DAL->eraseArg(options::OPT_march_EQ);
1029 DAL->AddJoinedArg(
nullptr, Opts.getOption(options::OPT_march_EQ),
1052 HostTC.addClangWarningOptions(CC1Args);
1057 return HostTC.GetCXXStdlibType(Args);
1061 ArgStringList &CC1Args)
const {
1062 if (DriverArgs.hasFlag(options::OPT_foffload_via_llvm,
1063 options::OPT_fno_offload_via_llvm,
false))
1066 HostTC.AddClangSystemIncludeArgs(DriverArgs, CC1Args);
1068 if (DriverArgs.hasFlag(options::OPT_offload_inc, options::OPT_no_offload_inc,
1072 {
"-internal-isystem",
1077 ArgStringList &CC1Args)
const {
1078 HostTC.AddClangCXXStdlibIncludeArgs(Args, CC1Args);
1082 ArgStringList &CC1Args)
const {
1083 HostTC.AddIAMCUIncludeArgs(Args, CC1Args);
1099 return HostTC.getSupportedSanitizers(BA, DeviceOffloadKind);
1103 const ArgList &Args)
const {
1104 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.