;
42 if(raw_version < 7050)
43 returnCudaVersion::CUDA_70;
44 if(raw_version < 8000)
45 returnCudaVersion::CUDA_75;
46 if(raw_version < 9000)
47 returnCudaVersion::CUDA_80;
48 if(raw_version < 9010)
49 returnCudaVersion::CUDA_90;
50 if(raw_version < 9020)
51 returnCudaVersion::CUDA_91;
52 if(raw_version < 10000)
53 returnCudaVersion::CUDA_92;
54 if(raw_version < 10010)
55 returnCudaVersion::CUDA_100;
56 if(raw_version < 10020)
57 returnCudaVersion::CUDA_101;
58 if(raw_version < 11000)
59 returnCudaVersion::CUDA_102;
60 if(raw_version < 11010)
61 returnCudaVersion::CUDA_110;
62 if(raw_version < 11020)
63 returnCudaVersion::CUDA_111;
64 if(raw_version < 11030)
65 returnCudaVersion::CUDA_112;
66 if(raw_version < 11040)
67 returnCudaVersion::CUDA_113;
68 if(raw_version < 11050)
69 returnCudaVersion::CUDA_114;
70 if(raw_version < 11060)
71 returnCudaVersion::CUDA_115;
72 if(raw_version < 11070)
73 returnCudaVersion::CUDA_116;
74 if(raw_version < 11080)
75 returnCudaVersion::CUDA_117;
76 if(raw_version < 11090)
77 returnCudaVersion::CUDA_118;
78 if(raw_version < 12010)
79 returnCudaVersion::CUDA_120;
80 if(raw_version < 12020)
81 returnCudaVersion::CUDA_121;
82 if(raw_version < 12030)
83 returnCudaVersion::CUDA_122;
84 if(raw_version < 12040)
85 returnCudaVersion::CUDA_123;
86 if(raw_version < 12050)
87 returnCudaVersion::CUDA_124;
88 if(raw_version < 12060)
89 returnCudaVersion::CUDA_125;
90 if(raw_version < 12070)
91 returnCudaVersion::CUDA_126;
92 if(raw_version < 12090)
93 returnCudaVersion::CUDA_128;
94 returnCudaVersion::NEW;
100 autoStartsWithWords =
101[](llvm::StringRef Line,
103 for(StringRef word : words) {
104 if(!Line.consume_front(word))
111Input = Input.ltrim();
112 while(!Input.empty()) {
114StartsWithWords(Input.ltrim(), {
"#",
"define",
"CUDA_VERSION"})) {
116Line->consumeInteger(10, RawVersion);
117 returngetCudaVersion(RawVersion);
120Input = Input.drop_front(Input.find_first_of(
"\n\r")).ltrim();
122 returnCudaVersion::UNKNOWN;
129 if(!VersionString.empty())
130VersionString.insert(0,
" ");
131D.
Diag(diag::warn_drv_new_cuda_version)
136D.
Diag(diag::warn_drv_partially_supported_cuda_version)
141 const Driver&
D,
constllvm::Triple &HostTriple,
142 constllvm::opt::ArgList &Args)
148Candidate(std::string
Path,
boolStrictChecking =
false)
149:
Path(
Path), StrictChecking(StrictChecking) {}
154std::initializer_list<const char *> Versions = {
"8.0",
"7.5",
"7.0"};
155 auto&FS =
D.getVFS();
157 if(Args.hasArg(clang::driver::options::OPT_cuda_path_EQ)) {
158Candidates.emplace_back(
159Args.getLastArgValue(clang::driver::options::OPT_cuda_path_EQ).str());
160}
else if(HostTriple.isOSWindows()) {
161 for(
const char*Ver : Versions)
162Candidates.emplace_back(
163 D.SysRoot +
"/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v"+
166 if(!Args.hasArg(clang::driver::options::OPT_cuda_path_ignore_env)) {
175 if(llvm::ErrorOr<std::string> ptxas =
176llvm::sys::findProgramByName(
"ptxas")) {
178llvm::sys::fs::real_path(*ptxas, ptxasAbsolutePath);
180StringRef ptxasDir = llvm::sys::path::parent_path(ptxasAbsolutePath);
181 if(llvm::sys::path::filename(ptxasDir) ==
"bin")
182Candidates.emplace_back(
183std::string(llvm::sys::path::parent_path(ptxasDir)),
188Candidates.emplace_back(
D.SysRoot +
"/usr/local/cuda");
189 for(
const char*Ver : Versions)
190Candidates.emplace_back(
D.SysRoot +
"/usr/local/cuda-"+ Ver);
192 DistroDist(FS, llvm::Triple(llvm::sys::getProcessTriple()));
196Candidates.emplace_back(
D.SysRoot +
"/usr/lib/cuda");
199 boolNoCudaLib = Args.hasArg(options::OPT_nogpulib);
201 for(
const auto&Candidate : Candidates) {
202InstallPath = Candidate.Path;
203 if(InstallPath.empty() || !FS.exists(InstallPath))
206BinPath = InstallPath +
"/bin";
207IncludePath = InstallPath +
"/include";
208LibDevicePath = InstallPath +
"/nvvm/libdevice";
210 if(!(FS.exists(IncludePath) && FS.exists(BinPath)))
212 boolCheckLibDevice = (!NoCudaLib || Candidate.StrictChecking);
213 if(CheckLibDevice && !FS.exists(LibDevicePath))
217 if(
autoCudaHFile = FS.getBufferForFile(InstallPath +
"/include/cuda.h"))
218Version = parseCudaHFile((*CudaHFile)->getBuffer());
222Version = FS.exists(LibDevicePath +
"/libdevice.10.bc")
229std::string FilePath = LibDevicePath +
"/libdevice.10.bc";
230 if(FS.exists(FilePath)) {
237LibDeviceMap[OffloadArchName] = FilePath;
242 for(llvm::vfs::directory_iterator LI = FS.dir_begin(LibDevicePath, EC),
244!EC && LI != LE; LI = LI.increment(EC)) {
245StringRef FilePath = LI->path();
246StringRef
FileName= llvm::sys::path::filename(FilePath);
249 constStringRef LibDeviceName =
"libdevice.";
250 if(!(
FileName.starts_with(LibDeviceName) &&
FileName.ends_with(
".bc")))
252StringRef GpuArch =
FileName.slice(
253LibDeviceName.size(),
FileName.find(
'.', LibDeviceName.size()));
254LibDeviceMap[GpuArch] = FilePath.str();
258 if(GpuArch ==
"compute_20") {
259LibDeviceMap[
"sm_20"] = std::string(FilePath);
260LibDeviceMap[
"sm_21"] = std::string(FilePath);
261LibDeviceMap[
"sm_32"] = std::string(FilePath);
262}
else if(GpuArch ==
"compute_30") {
263LibDeviceMap[
"sm_30"] = std::string(FilePath);
265LibDeviceMap[
"sm_50"] = std::string(FilePath);
266LibDeviceMap[
"sm_52"] = std::string(FilePath);
267LibDeviceMap[
"sm_53"] = std::string(FilePath);
269LibDeviceMap[
"sm_60"] = std::string(FilePath);
270LibDeviceMap[
"sm_61"] = std::string(FilePath);
271LibDeviceMap[
"sm_62"] = std::string(FilePath);
272}
else if(GpuArch ==
"compute_35") {
273LibDeviceMap[
"sm_35"] = std::string(FilePath);
274LibDeviceMap[
"sm_37"] = std::string(FilePath);
275}
else if(GpuArch ==
"compute_50") {
277LibDeviceMap[
"sm_50"] = std::string(FilePath);
278LibDeviceMap[
"sm_52"] = std::string(FilePath);
279LibDeviceMap[
"sm_53"] = std::string(FilePath);
287 if(LibDeviceMap.empty() && !NoCudaLib)
296 constArgList &DriverArgs, ArgStringList &CC1Args)
const{
297 if(!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
301llvm::sys::path::append(
P,
"include");
302llvm::sys::path::append(
P,
"cuda_wrappers");
303CC1Args.push_back(
"-internal-isystem");
304CC1Args.push_back(DriverArgs.MakeArgString(
P));
307 if(DriverArgs.hasArg(options::OPT_nogpuinc))
311D.
Diag(diag::err_drv_no_cuda_installation);
315CC1Args.push_back(
"-include");
316CC1Args.push_back(
"__clang_cuda_runtime_wrapper.h");
322ArchsWithBadVersion[(
int)Arch])
327 if(Version < MinVersion || Version > MaxVersion) {
328ArchsWithBadVersion[(
int)Arch] =
true;
329D.
Diag(diag::err_drv_cuda_version_unsupported)
338OS <<
"Found CUDA installation: "<< InstallPath <<
", version " 348enumDeviceDebugInfoLevel {
351EmitSameDebugInfoAsHost,
365 constArg *A = Args.getLastArg(options::OPT_O_Group);
366 boolIsDebugEnabled = !A || A->getOption().matches(options::OPT_O0) ||
367Args.hasFlag(options::OPT_cuda_noopt_device_debug,
368options::OPT_no_cuda_noopt_device_debug,
370 if(
constArg *A = Args.getLastArg(options::OPT_g_Group)) {
371 constOption &Opt = A->getOption();
372 if(Opt.matches(options::OPT_gN_Group)) {
373 if(Opt.matches(options::OPT_g0) || Opt.matches(options::OPT_ggdb0))
374 returnDisableDebugInfo;
375 if(Opt.matches(options::OPT_gline_directives_only))
376 returnDebugDirectivesOnly;
378 returnIsDebugEnabled ? EmitSameDebugInfoAsHost : DebugDirectivesOnly;
380 return willEmitRemarks(Args) ? DebugDirectivesOnly : DisableDebugInfo;
387 const char*LinkingOutput)
const{
390assert(TC.getTriple().isNVPTX() &&
"Wrong platform");
392StringRef GPUArchName;
400GPUArchName = Args.getLastArgValue(options::OPT_march_EQ);
401 if(GPUArchName.empty()) {
402 C.getDriver().Diag(diag::err_drv_offload_missing_gpu_arch)
403<< getToolChain().getArchName() << getShortName();
411 "Device action expected to have an architecture.");
414 if(!Args.hasArg(options::OPT_no_cuda_version_check)) {
415TC.CudaInstallation.CheckCudaVersionSupportsArch(gpu_arch);
418ArgStringList CmdArgs;
419CmdArgs.push_back(TC.getTriple().isArch64Bit() ?
"-m64":
"-m32");
421 if(DIKind == EmitSameDebugInfoAsHost) {
424CmdArgs.push_back(
"-g");
425CmdArgs.push_back(
"--dont-merge-basicblocks");
426CmdArgs.push_back(
"--return-at-end");
427}
else if(Arg *A = Args.getLastArg(options::OPT_O_Group)) {
435StringRef OOpt =
"3";
436 if(A->getOption().matches(options::OPT_O4) ||
437A->getOption().matches(options::OPT_Ofast))
439 else if(A->getOption().matches(options::OPT_O0))
441 else if(A->getOption().matches(options::OPT_O)) {
443OOpt = llvm::StringSwitch<const char *>(A->getValue())
451CmdArgs.push_back(Args.MakeArgString(llvm::Twine(
"-O") + OOpt));
455CmdArgs.push_back(
"-O0");
457 if(DIKind == DebugDirectivesOnly)
458CmdArgs.push_back(
"-lineinfo");
461 if(Args.hasArg(options::OPT_v))
462CmdArgs.push_back(
"-v");
464CmdArgs.push_back(
"--gpu-name");
466CmdArgs.push_back(
"--output-file");
467std::string OutputFileName = TC.getInputFilename(Output);
470 C.addTempFile(Args.MakeArgString(OutputFileName));
472CmdArgs.push_back(Args.MakeArgString(OutputFileName));
473 for(
const auto&II : Inputs)
474CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
476 for(
const auto&A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
477CmdArgs.push_back(Args.MakeArgString(A));
482Relocatable = Args.hasFlag(options::OPT_fopenmp_relocatable_target,
483options::OPT_fnoopenmp_relocatable_target,
487Relocatable = Args.hasFlag(options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc,
494CmdArgs.push_back(
"-c");
497 if(Arg *A = Args.getLastArg(options::OPT_ptxas_path_EQ))
498Exec = A->getValue();
500Exec = Args.MakeArgString(TC.GetProgramPath(
"ptxas"));
501 C.addCommand(std::make_unique<Command>(
505Exec, CmdArgs, Inputs, Output));
510 boolincludePTX = !Args.hasFlag(options::OPT_offload_new_driver,
511options::OPT_no_offload_new_driver,
true);
512 for(Arg *A : Args.filtered(options::OPT_cuda_include_ptx_EQ,
513options::OPT_no_cuda_include_ptx_EQ)) {
515 constStringRef ArchStr = A->getValue();
516 if(A->getOption().matches(options::OPT_cuda_include_ptx_EQ) &&
517(ArchStr ==
"all"|| ArchStr == InputArch))
519 else if(A->getOption().matches(options::OPT_no_cuda_include_ptx_EQ) &&
520(ArchStr ==
"all"|| ArchStr == InputArch))
533 const char*LinkingOutput)
const{
536assert(TC.getTriple().isNVPTX() &&
"Wrong platform");
538ArgStringList CmdArgs;
540CmdArgs.push_back(
"--cuda");
541CmdArgs.push_back(TC.getTriple().isArch64Bit() ?
"-64":
"-32");
542CmdArgs.push_back(Args.MakeArgString(
"--create"));
543CmdArgs.push_back(Args.MakeArgString(Output.
getFilename()));
545CmdArgs.push_back(
"-g");
547 for(
const auto&II : Inputs) {
548 auto*A = II.getAction();
549assert(A->getInputs().size() == 1 &&
550 "Device offload action is expected to have a single input");
551 const char*gpu_arch_str = A->getOffloadingArch();
552assert(gpu_arch_str &&
553 "Device action expected to have associated a GPU architecture!");
556 if(II.getType() == types::TY_PP_Asm &&
561 const char*Arch = (II.getType() == types::TY_PP_Asm)
565Args.MakeArgString(llvm::Twine(
"--image=profile=") + Arch +
566 ",file="+ getToolChain().getInputFilename(II)));
569 for(
const auto&A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
570CmdArgs.push_back(Args.MakeArgString(A));
572 const char*Exec = Args.MakeArgString(TC.GetProgramPath(
"fatbinary"));
573 C.addCommand(std::make_unique<Command>(
577Exec, CmdArgs, Inputs, Output));
584 const char*LinkingOutput)
const{
587ArgStringList CmdArgs;
589assert(TC.getTriple().isNVPTX() &&
"Wrong platform");
593CmdArgs.push_back(
"-o");
598CmdArgs.push_back(
"-g");
600 if(Args.hasArg(options::OPT_v))
601CmdArgs.push_back(
"-v");
603StringRef GPUArch = Args.getLastArgValue(options::OPT_march_EQ);
604 if(GPUArch.empty() && !
C.getDriver().isUsingLTO()) {
605 C.getDriver().Diag(diag::err_drv_offload_missing_gpu_arch)
606<< getToolChain().getArchName() << getShortName();
610 if(!GPUArch.empty()) {
611CmdArgs.push_back(
"-arch");
612CmdArgs.push_back(Args.MakeArgString(GPUArch));
615 if(Args.hasArg(options::OPT_ptxas_path_EQ))
616CmdArgs.push_back(Args.MakeArgString(
617 "--pxtas-path="+ Args.getLastArgValue(options::OPT_ptxas_path_EQ)));
619 if(Args.hasArg(options::OPT_cuda_path_EQ))
620CmdArgs.push_back(Args.MakeArgString(
621 "--cuda-path="+ Args.getLastArgValue(options::OPT_cuda_path_EQ)));
627Args.AddAllArgs(CmdArgs, options::OPT_L);
628getToolChain().AddFilePathLibArgs(Args, CmdArgs);
631 if(
C.getDriver().isUsingLTO())
632 addLTOOptions(getToolChain(), Args, CmdArgs, Output, Inputs[0],
636std::vector<StringRef> Features;
640Args.MakeArgString(
"--plugin-opt=-mattr="+ llvm::join(Features,
",")));
643CmdArgs.append({
"-mllvm",
"--nvptx-lower-global-ctor-dtor"});
647llvm::sys::path::parent_path(TC.getDriver().Dir);
648llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
649CmdArgs.push_back(Args.MakeArgString(Twine(
"-L") + DefaultLibPath));
651 if(Args.hasArg(options::OPT_stdlib))
652CmdArgs.append({
"-lc",
"-lm"});
653 if(Args.hasArg(options::OPT_startfiles)) {
654std::optional<std::string> IncludePath = getToolChain().getStdlibPath();
656IncludePath =
"/lib";
658llvm::sys::path::append(
P,
"crt1.o");
659CmdArgs.push_back(Args.MakeArgString(
P));
662 C.addCommand(std::make_unique<Command>(
666Args.MakeArgString(getToolChain().GetProgramPath(
"clang-nvlink-wrapper")),
667CmdArgs, Inputs, Output));
671 constllvm::opt::ArgList &Args,
672std::vector<StringRef> &Features) {
673 if(Args.hasArg(options::OPT_cuda_feature_EQ)) {
674StringRef PtxFeature =
675Args.getLastArgValue(options::OPT_cuda_feature_EQ,
"+ptx42");
676Features.push_back(Args.MakeArgString(PtxFeature));
684 const char*PtxFeature =
nullptr;
685 switch(CudaInstallation.
version()) {
686#define CASE_CUDA_VERSION(CUDA_VER, PTX_VER) \ 687 case CudaVersion::CUDA_##CUDA_VER: \ 688 PtxFeature = "+ptx"#PTX_VER; \
713#undef CASE_CUDA_VERSION 716PtxFeature =
"+ptx86";
719PtxFeature =
"+ptx42";
721Features.push_back(PtxFeature);
728 constllvm::Triple &HostTriple,
729 constArgList &Args,
boolFreestanding =
false)
730:
ToolChain(
D, Triple, Args), CudaInstallation(
D, HostTriple, Args),
731Freestanding(Freestanding) {
732 if(CudaInstallation.isValid())
733getProgramPaths().push_back(std::string(CudaInstallation.getBinPath()));
736getProgramPaths().push_back(getDriver().Dir);
746llvm::opt::DerivedArgList *
752DAL =
newDerivedArgList(Args.getBaseArgs());
754 constOptTable &Opts = getDriver().getOpts();
757 if(!llvm::is_contained(*DAL, A))
760 if(!DAL->hasArg(options::OPT_march_EQ) && OffloadKind !=
Action::OFK_None) {
761DAL->AddJoinedArg(
nullptr, Opts.getOption(options::OPT_march_EQ),
763}
else if(DAL->getLastArgValue(options::OPT_march_EQ) ==
"generic"&&
765DAL->eraseArg(options::OPT_march_EQ);
766}
else if(DAL->getLastArgValue(options::OPT_march_EQ) ==
"native") {
767 autoGPUsOrErr = getSystemGPUArchs(Args);
769getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
770<< getArchName() << llvm::toString(GPUsOrErr.takeError()) <<
"-march";
772 if(GPUsOrErr->size() > 1)
773getDriver().Diag(diag::warn_drv_multi_gpu_arch)
774<< getArchName() << llvm::join(*GPUsOrErr,
", ") <<
"-march";
775DAL->AddJoinedArg(
nullptr, Opts.getOption(options::OPT_march_EQ),
776Args.MakeArgString(GPUsOrErr->front()));
784 constllvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
789 if(Freestanding && !getDriver().isUsingLTO())
790CC1Args.append({
"-mllvm",
"--nvptx-lower-global-ctor-dtor"});
794 constOption &O = A->getOption();
795 return(O.matches(options::OPT_gN_Group) &&
796!O.matches(options::OPT_gmodules)) ||
797O.matches(options::OPT_g_Flag) ||
798O.matches(options::OPT_ggdbN_Group) || O.matches(options::OPT_ggdb) ||
799O.matches(options::OPT_gdwarf) || O.matches(options::OPT_gdwarf_2) ||
800O.matches(options::OPT_gdwarf_3) || O.matches(options::OPT_gdwarf_4) ||
801O.matches(options::OPT_gdwarf_5) ||
802O.matches(options::OPT_gcolumn_info);
806llvm::codegenoptions::DebugInfoKind &DebugInfoKind,
807 constArgList &Args)
const{
809 caseDisableDebugInfo:
810DebugInfoKind = llvm::codegenoptions::NoDebugInfo;
812 caseDebugDirectivesOnly:
813DebugInfoKind = llvm::codegenoptions::DebugDirectivesOnly;
815 caseEmitSameDebugInfoAsHost:
825 if(Arg *A = Args.getLastArg(options::OPT_nvptx_arch_tool_EQ))
826Program = A->getValue();
828Program = GetProgramPath(
"nvptx-arch");
830 autoStdoutOrErr = executeToolChainProgram(Program);
832 returnStdoutOrErr.takeError();
835 for(StringRef Arch : llvm::split((*StdoutOrErr)->getBuffer(),
"\n"))
837GPUArchs.push_back(Arch.str());
839 if(GPUArchs.empty())
840 returnllvm::createStringError(std::error_code(),
841 "No NVIDIA GPU detected in the system");
843 returnstd::move(GPUArchs);
851 const ToolChain&HostTC,
constArgList &Args)
852:
NVPTXToolChain(
D, Triple, HostTC.getTriple(), Args), HostTC(HostTC) {}
855 constllvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
859StringRef GpuArch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
862 "Only OpenMP or CUDA offloading kinds are supported for NVIDIA GPUs.");
864CC1Args.append({
"-fcuda-is-device",
"-mllvm",
865 "-enable-memcpyopt-without-libcalls",
866 "-fno-threadsafe-statics"});
873CC1Args.push_back(
"-fcuda-allow-variadic-functions");
875 if(DriverArgs.hasFlag(options::OPT_fcuda_short_ptr,
876options::OPT_fno_cuda_short_ptr,
false))
877CC1Args.append({
"-mllvm",
"--nvptx-short-ptr"});
879 if(DriverArgs.hasArg(options::OPT_nogpulib))
883DriverArgs.hasArg(options::OPT_S))
887 if(LibDeviceFile.empty()) {
888 getDriver().
Diag(diag::err_drv_no_cuda_libdevice) << GpuArch;
892CC1Args.push_back(
"-mlink-builtin-bitcode");
893CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
898 if(DriverArgs.hasFlag(options::OPT_foffload_via_llvm,
899options::OPT_fno_offload_via_llvm,
false))
906DriverArgs.MakeArgString(Twine(
"-target-sdk-version=") +
912diag::err_drv_omp_offload_target_cuda_version_not_support)
927 constllvm::opt::ArgList &DriverArgs,
const JobAction&JA,
928 constllvm::fltSemantics *FPType)
const{
930 if(FPType && FPType == &llvm::APFloat::IEEEsingle() &&
931DriverArgs.hasFlag(options::OPT_fgpu_flush_denormals_to_zero,
932options::OPT_fno_gpu_flush_denormals_to_zero,
false))
933 returnllvm::DenormalMode::getPreserveSign();
937 returnllvm::DenormalMode::getIEEE();
941ArgStringList &CC1Args)
const{
943 if(!DriverArgs.hasArg(options::OPT_nogpuinc) &&
944!DriverArgs.hasArg(options::OPT_no_cuda_version_check)) {
945StringRef Arch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
946assert(!Arch.empty() &&
"Must have an explicit GPU arch.");
955 if(Input.
getType() != types::TY_Object ||
getDriver().offloadDeviceOnly())
961llvm::opt::DerivedArgList *
965DerivedArgList *DAL =
968DAL =
newDerivedArgList(Args.getBaseArgs());
972 for(Arg *A : Args) {
974 if(!llvm::is_contained(*DAL, A)) {
979 if(!BoundArch.empty()) {
980DAL->eraseArg(options::OPT_march_EQ);
981DAL->AddJoinedArg(
nullptr, Opts.getOption(options::OPT_march_EQ),
1013ArgStringList &CC1Args)
const{
1018{
"-internal-isystem",
1023ArgStringList &CC1Args)
const{
1028ArgStringList &CC1Args)
const{
1046 constArgList &Args)
const{
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)
void WarnIfUnsupportedVersion()
CudaVersion version() const
Get the detected Cuda install's version.
std::string getLibDeviceFile(StringRef Gpu) const
Get libdevice file for given architecture.
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.
StringRef getIncludePath() const
Get the detected Cuda Include path.
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
std::string ResourceDir
The path to the compiler resource directory.
InputInfo - Wrapper for information about an input source.
const char * getFilename() const
types::ID getType() const
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)
const char * OffloadArchToVirtualArchString(OffloadArch A)
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.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4