28#include "clang/Config/config.h"
40#include "llvm/ADT/STLExtras.h"
41#include "llvm/ADT/SmallSet.h"
42#include "llvm/ADT/SmallString.h"
43#include "llvm/ADT/StringExtras.h"
44#include "llvm/ADT/StringSwitch.h"
45#include "llvm/ADT/Twine.h"
46#include "llvm/BinaryFormat/Magic.h"
47#include "llvm/Config/llvm-config.h"
48#include "llvm/Option/Arg.h"
49#include "llvm/Option/ArgList.h"
50#include "llvm/Option/Option.h"
51#include "llvm/Support/CodeGen.h"
52#include "llvm/Support/Compression.h"
53#include "llvm/Support/ErrorHandling.h"
54#include "llvm/Support/FileSystem.h"
55#include "llvm/Support/Path.h"
56#include "llvm/Support/Process.h"
57#include "llvm/Support/Program.h"
58#include "llvm/Support/Threading.h"
59#include "llvm/Support/VirtualFileSystem.h"
60#include "llvm/Support/YAMLParser.h"
61#include "llvm/TargetParser/Host.h"
62#include "llvm/TargetParser/PPCTargetParser.h"
63#include "llvm/TargetParser/TargetParser.h"
72 const llvm::Triple &Triple) {
73 if (Args.hasArg(options::OPT_pg) && !Args.hasArg(options::OPT_mfentry))
76 if (Triple.isAndroid())
79 switch (Triple.getArch()) {
80 case llvm::Triple::xcore:
81 case llvm::Triple::wasm32:
82 case llvm::Triple::wasm64:
83 case llvm::Triple::msp430:
87 case llvm::Triple::ppc:
88 case llvm::Triple::ppcle:
89 case llvm::Triple::ppc64:
90 case llvm::Triple::ppc64le:
91 case llvm::Triple::riscv32:
92 case llvm::Triple::riscv64:
93 case llvm::Triple::riscv32be:
94 case llvm::Triple::riscv64be:
95 case llvm::Triple::sparc:
96 case llvm::Triple::sparcel:
97 case llvm::Triple::sparcv9:
98 case llvm::Triple::amdgcn:
99 case llvm::Triple::r600:
100 case llvm::Triple::csky:
101 case llvm::Triple::loongarch32:
102 case llvm::Triple::loongarch64:
103 case llvm::Triple::m68k:
109 if (Triple.isOSFuchsia() || Triple.isOSNetBSD()) {
113 if (Triple.isOSLinux() || Triple.isOSHurd()) {
114 switch (Triple.getArch()) {
116 case llvm::Triple::arm:
117 case llvm::Triple::armeb:
118 case llvm::Triple::thumb:
119 case llvm::Triple::thumbeb:
120 case llvm::Triple::mips64:
121 case llvm::Triple::mips64el:
122 case llvm::Triple::mips:
123 case llvm::Triple::mipsel:
124 case llvm::Triple::systemz:
125 case llvm::Triple::x86:
126 case llvm::Triple::x86_64:
133 if (Triple.isOSWindows()) {
134 switch (Triple.getArch()) {
135 case llvm::Triple::x86:
137 case llvm::Triple::x86_64:
138 return Triple.isOSBinFormatMachO();
139 case llvm::Triple::arm:
140 case llvm::Triple::thumb:
157 if (Triple.isAArch64() || Triple.isPS() || Triple.isVE() ||
158 (Triple.isAndroid() && !Triple.isARM()))
161 if ((Triple.isARM() || Triple.isThumb()) && Triple.isOSBinFormatMachO())
168 switch (Triple.getArch()) {
171 case llvm::Triple::arm:
172 case llvm::Triple::thumb:
175 return Triple.isOSDarwin();
182 const llvm::Triple &Triple) {
183 switch (Triple.getArch()) {
186 case llvm::Triple::arm:
187 case llvm::Triple::armeb:
188 case llvm::Triple::thumb:
189 case llvm::Triple::thumbeb:
193 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
194 StringRef
V = A->getValue();
199 case llvm::Triple::aarch64:
203 return Triple.isOSWindows();
210 const llvm::Triple &Triple) {
211 if (Triple.isARM() || Triple.isThumb()) {
215 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
216 StringRef
V = A->getValue();
217 return V ==
"aapcs+leaf";
226 const llvm::Triple &Triple) {
268 Args.hasFlag(options::OPT_fno_omit_frame_pointer,
269 options::OPT_fomit_frame_pointer, DefaultFP);
275 Args.hasFlag(options::OPT_mno_omit_leaf_frame_pointer,
276 options::OPT_momit_leaf_frame_pointer, DefaultLeafFP);
278 bool FPRegReserved = Args.hasFlag(options::OPT_mreserve_frame_pointer_reg,
279 options::OPT_mno_reserve_frame_pointer_reg,
297 const StringRef PluginOptPrefix) {
298 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
299 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
300 "-pass-remarks=" + A->getValue()));
302 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
303 CmdArgs.push_back(Args.MakeArgString(
304 Twine(PluginOptPrefix) +
"-pass-remarks-missed=" + A->getValue()));
306 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
307 CmdArgs.push_back(Args.MakeArgString(
308 Twine(PluginOptPrefix) +
"-pass-remarks-analysis=" + A->getValue()));
312 const llvm::Triple &Triple,
315 const StringRef PluginOptPrefix) {
316 StringRef Format =
"yaml";
317 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
318 Format = A->getValue();
322 Args.getLastArg(options::OPT_foptimization_record_file_EQ)) {
325 }
else if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
332 assert(!F.empty() &&
"Cannot determine remarks output name.");
334 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
335 "opt-remarks-filename=" + F +
"opt.ld." +
339 Args.getLastArg(options::OPT_foptimization_record_passes_EQ))
340 CmdArgs.push_back(Args.MakeArgString(
341 Twine(PluginOptPrefix) +
"opt-remarks-passes=" + A->getValue()));
343 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
344 "opt-remarks-format=" + Format.data()));
348 ArgStringList &CmdArgs,
349 const StringRef PluginOptPrefix) {
350 if (Args.hasFlag(options::OPT_fdiagnostics_show_hotness,
351 options::OPT_fno_diagnostics_show_hotness,
false))
352 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
353 "opt-remarks-with-hotness"));
356 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ))
358 Args.MakeArgString(Twine(PluginOptPrefix) +
359 "opt-remarks-hotness-threshold=" + A->getValue()));
364 StringRef Processor) {
368 auto GPUKind = T.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Processor)
369 : llvm::AMDGPU::parseArchR600(Processor);
370 auto GPUFeatures = T.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind)
371 : llvm::AMDGPU::getArchAttrR600(GPUKind);
372 if (GPUFeatures & llvm::AMDGPU::FEATURE_WGP)
374 return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode);
379 if (D.
getVFS().exists(Path))
380 Paths.push_back(Path.str());
384 const llvm::Triple &Triple,
386 std::vector<StringRef> &Features,
387 OptSpecifier Group) {
388 std::set<StringRef> Warned;
389 for (
const Arg *A : Args.filtered(Group)) {
390 StringRef Name = A->getOption().getName();
394 assert(Name.starts_with(
"m") &&
"Invalid feature name.");
395 Name = Name.substr(1);
399 if (Warned.count(Name) == 0) {
401 clang::diag::warn_drv_unsupported_option_for_processor)
402 << A->getAsString(Args) << Proc;
408 bool IsNegative = Name.consume_front(
"no-");
410 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
418 llvm::DenseSet<StringRef> UsedFeatures;
419 for (StringRef
Feature : llvm::reverse(Features)) {
420 if (UsedFeatures.insert(
Feature.drop_front()).second)
421 UnifiedFeatures.insert(UnifiedFeatures.begin(),
Feature);
424 return UnifiedFeatures;
428 const char *ArgName,
const char *EnvVar) {
429 const char *DirList = ::getenv(EnvVar);
430 bool CombinedArg =
false;
435 StringRef Name(ArgName);
436 if (Name ==
"-I" || Name ==
"-L" || Name.empty())
439 StringRef Dirs(DirList);
443 StringRef::size_type Delim;
444 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
447 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
449 CmdArgs.push_back(ArgName);
450 CmdArgs.push_back(
".");
455 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
457 CmdArgs.push_back(ArgName);
458 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
461 Dirs = Dirs.substr(Delim + 1);
466 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
468 CmdArgs.push_back(ArgName);
469 CmdArgs.push_back(
".");
473 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
475 CmdArgs.push_back(ArgName);
476 CmdArgs.push_back(Args.MakeArgString(Dirs));
482 const ArgList &Args, ArgStringList &CmdArgs,
488 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
495 for (
const auto &II : Inputs) {
499 if (
auto *IA = II.getAction())
509 if (II.isFilename()) {
510 CmdArgs.push_back(II.getFilename());
519 const Arg &A = II.getInputArg();
522 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
524 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
527 else if (A.getOption().matches(options::OPT_rpath) &&
531 A.renderAsInput(Args, CmdArgs);
533 if (
const Arg *A = Args.getLastArg(options::OPT_fveclib)) {
534 const llvm::Triple &Triple = TC.
getTriple();
535 StringRef
V = A->getValue();
536 if (
V ==
"ArmPL" && (Triple.isOSLinux() || Triple.isOSDarwin())) {
554 if (Triple.isOSLinux()) {
555 CmdArgs.push_back(Args.MakeArgString(
"--push-state"));
556 CmdArgs.push_back(Args.MakeArgString(
"--as-needed"));
558 if (!Args.hasArg(options::OPT_nostdlib))
559 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
560 CmdArgs.push_back(Args.MakeArgString(
"-lamath"));
561 if (!Args.hasArg(options::OPT_nostdlib))
562 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
563 if (Triple.isOSLinux())
564 CmdArgs.push_back(Args.MakeArgString(
"--pop-state"));
571 switch (T.getArch()) {
572 case llvm::Triple::x86:
576 case llvm::Triple::aarch64:
577 if (T.isOSManagarm())
578 return "aarch64managarm";
581 return "aarch64linux";
582 case llvm::Triple::aarch64_be:
584 return "aarch64elfb";
585 return "aarch64linuxb";
586 case llvm::Triple::arm:
587 case llvm::Triple::thumb:
588 case llvm::Triple::armeb:
589 case llvm::Triple::thumbeb: {
592 return IsBigEndian ?
"armelfb" :
"armelf";
593 return IsBigEndian ?
"armelfb_linux_eabi" :
"armelf_linux_eabi";
595 case llvm::Triple::m68k:
597 case llvm::Triple::ppc:
599 return "elf32ppclinux";
601 case llvm::Triple::ppcle:
603 return "elf32lppclinux";
605 case llvm::Triple::ppc64:
607 case llvm::Triple::ppc64le:
609 case llvm::Triple::riscv32:
610 return "elf32lriscv";
611 case llvm::Triple::riscv64:
612 return "elf64lriscv";
613 case llvm::Triple::riscv32be:
614 return "elf32briscv";
615 case llvm::Triple::riscv64be:
616 return "elf64briscv";
617 case llvm::Triple::sparc:
618 case llvm::Triple::sparcel:
619 return "elf32_sparc";
620 case llvm::Triple::sparcv9:
621 return "elf64_sparc";
622 case llvm::Triple::loongarch32:
623 return "elf32loongarch";
624 case llvm::Triple::loongarch64:
625 return "elf64loongarch";
626 case llvm::Triple::mips:
627 return "elf32btsmip";
628 case llvm::Triple::mipsel:
629 return "elf32ltsmip";
630 case llvm::Triple::mips64:
632 return "elf32btsmipn32";
633 return "elf64btsmip";
634 case llvm::Triple::mips64el:
636 return "elf32ltsmipn32";
637 return "elf64ltsmip";
638 case llvm::Triple::systemz:
640 case llvm::Triple::x86_64:
642 return "elf32_x86_64";
644 case llvm::Triple::ve:
646 case llvm::Triple::csky:
647 return "cskyelf_linux";
654 const ToolChain &TC,
const llvm::opt::ArgList &Args,
655 llvm::opt::ArgStringList &CmdArgs) {
661 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
662 StringRef
V = A->getValue();
663 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
664 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
666 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
667 << A->getSpelling() <<
V;
672 std::vector<StringRef> &Features,
673 OptSpecifier OnOpt, OptSpecifier OffOpt,
674 StringRef FeatureName) {
675 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
676 if (A->getOption().matches(OnOpt))
677 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
679 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
685 const ArgList &Args) {
686 Arg *MArch = Args.getLastArg(options::OPT_march_EQ);
687 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
689 return llvm::StringSwitch<std::string>(GPUName)
690 .Cases({
"rv630",
"rv635"},
"r600")
691 .Cases({
"rv610",
"rv620",
"rs780"},
"rs880")
692 .Case(
"rv740",
"rv770")
693 .Case(
"palm",
"cedar")
694 .Cases({
"sumo",
"sumo2"},
"sumo")
695 .Case(
"hemlock",
"cypress")
696 .Case(
"aruba",
"cayman")
697 .Default(GPUName.str());
705 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
706 return A->getValue();
714 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
715 StringRef CPU = A->getValue();
721 return llvm::sys::getHostCPUName();
731 const llvm::Triple &T,
bool FromAs) {
734 switch (T.getArch()) {
738 case llvm::Triple::aarch64:
739 case llvm::Triple::aarch64_32:
740 case llvm::Triple::aarch64_be:
743 case llvm::Triple::arm:
744 case llvm::Triple::armeb:
745 case llvm::Triple::thumb:
746 case llvm::Triple::thumbeb: {
747 StringRef MArch, MCPU;
752 case llvm::Triple::avr:
753 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
754 return A->getValue();
757 case llvm::Triple::m68k:
760 case llvm::Triple::mips:
761 case llvm::Triple::mipsel:
762 case llvm::Triple::mips64:
763 case llvm::Triple::mips64el: {
767 return std::string(CPUName);
770 case llvm::Triple::nvptx:
771 case llvm::Triple::nvptx64:
772 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
773 return A->getValue();
776 case llvm::Triple::ppc:
777 case llvm::Triple::ppcle:
778 case llvm::Triple::ppc64:
779 case llvm::Triple::ppc64le:
780 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
782 llvm::PPC::getNormalizedPPCTargetCPU(T, A->getValue()));
783 return std::string(llvm::PPC::getNormalizedPPCTargetCPU(T));
785 case llvm::Triple::csky:
786 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
787 return A->getValue();
788 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
789 return A->getValue();
792 case llvm::Triple::riscv32:
793 case llvm::Triple::riscv64:
794 case llvm::Triple::riscv32be:
795 case llvm::Triple::riscv64be:
798 case llvm::Triple::bpfel:
799 case llvm::Triple::bpfeb:
800 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
801 return A->getValue();
804 case llvm::Triple::sparc:
805 case llvm::Triple::sparcel:
806 case llvm::Triple::sparcv9:
809 case llvm::Triple::x86:
810 case llvm::Triple::x86_64:
813 case llvm::Triple::hexagon:
817 case llvm::Triple::lanai:
820 case llvm::Triple::systemz:
823 case llvm::Triple::r600:
824 case llvm::Triple::amdgcn:
827 case llvm::Triple::wasm32:
828 case llvm::Triple::wasm64:
831 case llvm::Triple::loongarch32:
832 case llvm::Triple::loongarch64:
835 case llvm::Triple::xtensa:
836 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
837 return A->getValue();
843 const llvm::Triple &Triple,
845 std::vector<StringRef> &Features) {
847 options::OPT_m_wasm_Features_Group);
851 const ArgList &Args, ArgStringList &CmdArgs,
852 bool ForAS,
bool IsAux) {
853 std::vector<StringRef> Features;
854 switch (Triple.getArch()) {
857 case llvm::Triple::mips:
858 case llvm::Triple::mipsel:
859 case llvm::Triple::mips64:
860 case llvm::Triple::mips64el:
863 case llvm::Triple::arm:
864 case llvm::Triple::armeb:
865 case llvm::Triple::thumb:
866 case llvm::Triple::thumbeb:
869 case llvm::Triple::ppc:
870 case llvm::Triple::ppcle:
871 case llvm::Triple::ppc64:
872 case llvm::Triple::ppc64le:
875 case llvm::Triple::riscv32:
876 case llvm::Triple::riscv64:
877 case llvm::Triple::riscv32be:
878 case llvm::Triple::riscv64be:
881 case llvm::Triple::systemz:
884 case llvm::Triple::aarch64:
885 case llvm::Triple::aarch64_32:
886 case llvm::Triple::aarch64_be:
889 case llvm::Triple::x86:
890 case llvm::Triple::x86_64:
893 case llvm::Triple::hexagon:
896 case llvm::Triple::wasm32:
897 case llvm::Triple::wasm64:
900 case llvm::Triple::sparc:
901 case llvm::Triple::sparcel:
902 case llvm::Triple::sparcv9:
905 case llvm::Triple::r600:
906 case llvm::Triple::amdgcn:
909 case llvm::Triple::nvptx:
910 case llvm::Triple::nvptx64:
913 case llvm::Triple::m68k:
916 case llvm::Triple::msp430:
919 case llvm::Triple::ve:
922 case llvm::Triple::csky:
925 case llvm::Triple::loongarch32:
926 case llvm::Triple::loongarch64:
932 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
933 CmdArgs.push_back(
Feature.data());
938 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
941 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
942 D.
Diag(diag::err_drv_invalid_int_value)
943 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
944 return LtoJobsArg->getValue();
949 return Triple.isPS();
953 const llvm::opt::ArgList &Args) {
955 Arg *A = Args.getLastArg(options::OPT_mtls_dialect_EQ);
957 return Triple.hasDefaultTLSDESC();
958 StringRef
V = A->getValue();
959 bool SupportedArgument =
false, EnableTLSDESC =
false;
960 bool Unsupported = !Triple.isOSBinFormatELF();
961 if (Triple.isLoongArch() || Triple.isRISCV()) {
962 SupportedArgument =
V ==
"desc" ||
V ==
"trad";
963 EnableTLSDESC =
V ==
"desc";
964 }
else if (Triple.isX86()) {
965 SupportedArgument =
V ==
"gnu" ||
V ==
"gnu2";
966 EnableTLSDESC =
V ==
"gnu2";
971 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
972 << A->getSpelling() << Triple.getTriple();
973 }
else if (!SupportedArgument) {
974 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument_for_target)
975 << A->getSpelling() <<
V << Triple.getTriple();
977 return EnableTLSDESC;
981 llvm::opt::ArgStringList &CmdArgs) {
982 if (Arg *A = Args.getLastArg(options::OPT_fthinlto_distributor_EQ)) {
984 Args.MakeArgString(
"--thinlto-distributor=" + Twine(A->getValue())));
986 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-remote-compiler=" +
989 CmdArgs.push_back(Args.MakeArgString(
990 "--thinlto-remote-compiler-prepend-arg=" + Twine(PA)));
993 Args.getAllArgValues(options::OPT_Xthinlto_distributor_EQ))
994 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-distributor-arg=" + A));
999 ArgStringList &CmdArgs,
const InputInfo &Output,
1002 const bool IsOSAIX = Triple.isOSAIX();
1003 const bool IsAMDGCN = Triple.isAMDGCN();
1004 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ);
1007 const bool IsFatLTO = Args.hasFlag(options::OPT_ffat_lto_objects,
1008 options::OPT_fno_fat_lto_objects,
false);
1009 const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
1011 assert(!Inputs.empty() &&
"Must have at least one input.");
1013 auto Input = llvm::find_if(
1015 if (Input == Inputs.end()) {
1018 Input = Inputs.begin();
1021 if (Linker !=
"lld" && Linker !=
"lld-link" &&
1022 llvm::sys::path::filename(LinkerPath) !=
"ld.lld" &&
1023 llvm::sys::path::stem(LinkerPath) !=
"ld.lld" && !Triple.isOSOpenBSD()) {
1027 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
1028 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
1031 CmdArgs.push_back(
"-plugin");
1034 const char *Suffix =
".dll";
1035#elif defined(__APPLE__)
1036 const char *Suffix =
".dylib";
1038 const char *Suffix =
".so";
1042 llvm::sys::path::native(Twine(D.
Dir) +
1043 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
1044 PluginName + Suffix,
1046 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
1051 CmdArgs.push_back(
"--fat-lto-objects");
1053 if (Args.hasArg(options::OPT_flto_partitions_EQ)) {
1055 StringRef A = Args.getLastArgValue(options::OPT_flto_partitions_EQ,
"8");
1056 if (A.getAsInteger(10,
Value) || (
Value < 1)) {
1057 Arg *Arg = Args.getLastArg(options::OPT_flto_partitions_EQ);
1058 D.
Diag(diag::err_drv_invalid_int_value)
1059 << Arg->getAsString(Args) << Arg->getValue();
1061 CmdArgs.push_back(Args.MakeArgString(
"--lto-partitions=" + A));
1065 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
1066 const char *ExtraDash = IsOSAIX ?
"-" :
"";
1067 const char *ParallelismOpt = IsOSAIX ?
"-threads=" :
"jobs=";
1072 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
1073 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1074 "-generate-arange-section"));
1078 Arg *ArgVecLib = Args.getLastArg(options::OPT_fveclib);
1079 if (ArgVecLib && ArgVecLib->getNumValues() == 1) {
1082 std::optional<StringRef> OptVal =
1083 llvm::StringSwitch<std::optional<StringRef>>(ArgVecLib->getValue())
1084 .Case(
"Accelerate",
"Accelerate")
1085 .Case(
"libmvec",
"LIBMVEC")
1086 .Case(
"AMDLIBM",
"AMDLIBM")
1087 .Case(
"MASSV",
"MASSV")
1088 .Case(
"SVML",
"SVML")
1089 .Case(
"SLEEF",
"sleefgnuabi")
1090 .Case(
"Darwin_libsystem_m",
"Darwin_libsystem_m")
1091 .Case(
"ArmPL",
"ArmPL")
1092 .Case(
"none",
"none")
1093 .Default(std::nullopt);
1096 CmdArgs.push_back(Args.MakeArgString(
1097 Twine(PluginOptPrefix) +
"-vector-library=" + OptVal.value()));
1107 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
1109 if (Args.getLastArg(options::OPT_O_Group)) {
1110 unsigned OptimizationLevel =
1112 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1113 "O" + Twine(OptimizationLevel)));
1116 Args.MakeArgString(Twine(
"--lto-CGO") + Twine(OptimizationLevel)));
1119 if (Args.hasArg(options::OPT_gsplit_dwarf)) {
1121 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1128 Args.MakeArgString(Twine(PluginOptPrefix) +
"dwo_dir=" + F +
"dwo"));
1131 if (IsThinLTO && !IsOSAIX)
1132 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
1133 else if (IsThinLTO && IsOSAIX)
1134 CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
1139 if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
1140 Args.hasArg(options::OPT_fenable_matrix))
1142 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-matrix"));
1145 if (!Parallelism.empty())
1146 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1147 ParallelismOpt + Parallelism));
1150 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
1151 options::OPT_fno_global_isel)) {
1154 CmdArgs.push_back(Args.MakeArgString(
1155 Twine(PluginOptPrefix) +
"-global-isel=" +
1156 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
1161 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
1162 if (A->getOption().matches(options::OPT_glldb))
1164 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
1165 else if (A->getOption().matches(options::OPT_gsce))
1167 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
1168 else if (A->getOption().matches(options::OPT_gdbx))
1170 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
1173 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
1179 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
1183 Arg *A = Args.getLastArg(options::OPT_g_Group);
1184 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
1185 !A->getOption().matches(options::OPT_ggdb0);
1186 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
1187 options::OPT_gno_strict_dwarf,
true))
1189 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
1191 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
1192 StringRef
V = A->getValue();
1193 if (
V ==
"vec-default")
1195 if (
V ==
"vec-extabi") {
1197 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
1203 bool UseSeparateSections =
1206 if (Args.hasFlag(options::OPT_ffunction_sections,
1207 options::OPT_fno_function_sections, UseSeparateSections))
1209 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
1210 else if (Args.hasArg(options::OPT_fno_function_sections))
1212 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
1214 bool DataSectionsTurnedOff =
false;
1215 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1216 UseSeparateSections)) {
1218 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
1219 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
1220 DataSectionsTurnedOff =
true;
1222 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
1225 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
1226 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
1227 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
1228 options::OPT_mno_xcoff_roptr,
false);
1229 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
1231 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1232 << OptStr << Triple.str();
1238 if (DataSectionsTurnedOff)
1239 D.
Diag(diag::err_roptr_requires_data_sections);
1242 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
1247 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
1248 options::OPT_fno_split_machine_functions)) {
1249 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
1250 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1251 "-split-machine-functions"));
1255 Args.getLastArg(options::OPT_fpartition_static_data_sections,
1256 options::OPT_fno_partition_static_data_sections)) {
1257 if (A->getOption().matches(options::OPT_fpartition_static_data_sections)) {
1258 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1259 "-partition-static-data-sections"));
1264 StringRef FName = A->getValue();
1265 if (!llvm::sys::fs::exists(FName))
1266 D.
Diag(diag::err_drv_no_such_file) << FName;
1268 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1269 "sample-profile=" + FName));
1273 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1274 "cs-profile-generate"));
1275 if (CSPGOGenerateArg->getOption().matches(
1276 options::OPT_fcs_profile_generate_EQ)) {
1278 llvm::sys::path::append(Path,
"default_%m.profraw");
1279 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1280 "cs-profile-path=" + Path));
1283 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1284 "cs-profile-path=default_%m.profraw"));
1287 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1288 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1289 llvm::sys::path::append(Path,
"default.profdata");
1290 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1291 "cs-profile-path=" + Path));
1295 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1297 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1298 "-enable-jmc-instrument"));
1300 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1303 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1304 Triple.hasDefaultEmulatedTLS())) {
1306 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1310 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1312 if (Args.hasFlag(options::OPT_fstack_size_section,
1313 options::OPT_fno_stack_size_section,
false))
1315 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1317 if (Args.hasFlag(options::OPT_fexperimental_call_graph_section,
1318 options::OPT_fno_experimental_call_graph_section,
false))
1320 Args.MakeArgString(Twine(PluginOptPrefix) +
"-call-graph-section"));
1324 if (!StatsFile.empty())
1326 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1329 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1330 CmdArgs.push_back(Args.MakeArgString(
1331 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1342 Output, PluginOptPrefix);
1348 true, PluginOptPrefix);
1350 bool IsELF = Triple.isOSBinFormatELF();
1352 bool ImplicitMapSyms =
false;
1353 for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
1354 for (StringRef
V : A->getValues()) {
1355 auto Equal =
V.split(
'=');
1356 auto checkArg = [&](
bool ValidTarget,
1357 std::initializer_list<const char *>
Set) {
1359 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1360 << (Twine(
"-Wa,") +
Equal.first +
"=").str()
1361 << Triple.getTriple();
1362 }
else if (!llvm::is_contained(
Set,
Equal.second)) {
1363 D.
Diag(diag::err_drv_unsupported_option_argument)
1364 << (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
1367 if (
Equal.first ==
"-mmapsyms") {
1368 ImplicitMapSyms =
Equal.second ==
"implicit";
1369 checkArg(IsELF && Triple.isAArch64(), {
"default",
"implicit"});
1370 }
else if (
V ==
"--crel")
1372 else if (
V ==
"--no-crel")
1380 if (IsELF && !Triple.isMIPS()) {
1381 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"-crel"));
1383 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1387 if (ImplicitMapSyms)
1389 Args.MakeArgString(Twine(PluginOptPrefix) +
"-implicit-mapsyms"));
1391 if (Args.hasArg(options::OPT_ftime_report))
1393 Args.MakeArgString(Twine(PluginOptPrefix) +
"-time-passes"));
1399 const ArgList &Args,
1400 ArgStringList &CmdArgs) {
1405 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1406 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1410 ArgStringList &CmdArgs) {
1411 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1412 options::OPT_fno_rtlib_add_rpath,
false))
1420 CandidateRPaths.emplace_back(*CandidateRPath);
1422 for (
const auto &CandidateRPath : CandidateRPaths) {
1423 if (TC.
getVFS().exists(CandidateRPath)) {
1424 CmdArgs.push_back(
"-rpath");
1425 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1431 const ToolChain &TC,
const ArgList &Args,
1432 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1434 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1435 options::OPT_fno_openmp,
false)) {
1437 if (Args.hasFlag(options::OPT_foffload_via_llvm,
1438 options::OPT_fno_offload_via_llvm,
false))
1439 CmdArgs.push_back(
"-lomptarget");
1449 if (ForceStaticHostRuntime)
1450 CmdArgs.push_back(
"-Bstatic");
1454 CmdArgs.push_back(
"-lomp");
1457 CmdArgs.push_back(
"-lgomp");
1460 CmdArgs.push_back(
"-liomp5");
1466 if (ForceStaticHostRuntime)
1467 CmdArgs.push_back(
"-Bdynamic");
1470 CmdArgs.push_back(
"-lrt");
1472 if (IsOffloadingHost)
1473 CmdArgs.push_back(
"-lomptarget");
1484 const llvm::opt::ArgList &Args,
1485 llvm::opt::ArgStringList &CmdArgs) {
1491 constexpr llvm::StringLiteral Targets(
"--offload-targets=");
1495 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1496 [](
auto TC) { return TC.second->getTripleString(); });
1498 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1502 ArgStringList &CmdArgs, StringRef Sanitizer,
1503 bool IsShared,
bool IsWhole) {
1506 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1509 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1519 ArgStringList &CmdArgs,
1520 StringRef Sanitizer) {
1525 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1528 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1529 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1536 const llvm::opt::ArgList &Args,
1537 llvm::opt::ArgStringList &CmdArgs,
1540 "AIX linker does not support any form of --as-needed option yet.");
1548 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1549 CmdArgs.push_back(
"-z");
1550 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1552 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1557 const llvm::opt::ArgList &Args,
1558 ArgStringList &CmdArgs) {
1563 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1565 CmdArgs.push_back(
"-lpthread");
1567 CmdArgs.push_back(
"-lrt");
1569 CmdArgs.push_back(
"-lm");
1574 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1575 CmdArgs.push_back(
"-ldl");
1579 CmdArgs.push_back(
"-lexecinfo");
1581 CmdArgs.push_back(
"-lbsd");
1587 CmdArgs.push_back(
"-lresolv");
1597 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1602 SharedRuntimes.push_back(
"asan");
1603 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1604 HelperStaticRuntimes.push_back(
"asan-preinit");
1607 SharedRuntimes.push_back(
"memprof");
1608 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1609 HelperStaticRuntimes.push_back(
"memprof-preinit");
1612 SharedRuntimes.push_back(
"nsan");
1615 SharedRuntimes.push_back(
"ubsan_minimal");
1617 SharedRuntimes.push_back(
"ubsan_standalone");
1620 SharedRuntimes.push_back(
"scudo_standalone");
1623 SharedRuntimes.push_back(
"tsan");
1625 SharedRuntimes.push_back(
"tysan");
1628 SharedRuntimes.push_back(
"hwasan_aliases");
1630 SharedRuntimes.push_back(
"hwasan");
1631 if (!Args.hasArg(options::OPT_shared))
1632 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1635 SharedRuntimes.push_back(
"rtsan");
1640 StaticRuntimes.push_back(
"stats_client");
1644 HelperStaticRuntimes.push_back(
"asan_static");
1647 if (Args.hasArg(options::OPT_shared)) {
1656 StaticRuntimes.push_back(
"asan");
1658 StaticRuntimes.push_back(
"asan_cxx");
1663 StaticRuntimes.push_back(
"rtsan");
1666 StaticRuntimes.push_back(
"memprof");
1668 StaticRuntimes.push_back(
"memprof_cxx");
1673 StaticRuntimes.push_back(
"hwasan_aliases");
1675 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1677 StaticRuntimes.push_back(
"hwasan");
1679 StaticRuntimes.push_back(
"hwasan_cxx");
1683 StaticRuntimes.push_back(
"dfsan");
1685 StaticRuntimes.push_back(
"lsan");
1687 StaticRuntimes.push_back(
"msan");
1689 StaticRuntimes.push_back(
"msan_cxx");
1692 StaticRuntimes.push_back(
"nsan");
1694 StaticRuntimes.push_back(
"tsan");
1696 StaticRuntimes.push_back(
"tsan_cxx");
1699 StaticRuntimes.push_back(
"tysan");
1702 StaticRuntimes.push_back(
"ubsan_minimal");
1704 StaticRuntimes.push_back(
"ubsan_standalone");
1708 NonWholeStaticRuntimes.push_back(
"safestack");
1709 RequiredSymbols.push_back(
"__safestack_init");
1713 StaticRuntimes.push_back(
"cfi");
1715 StaticRuntimes.push_back(
"cfi_diag");
1720 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1723 NonWholeStaticRuntimes.push_back(
"stats");
1724 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1727 StaticRuntimes.push_back(
"scudo_standalone");
1729 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1732 NonWholeStaticRuntimes.push_back(
"ubsan_loop_detect");
1738 ArgStringList &CmdArgs) {
1741 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1744 NonWholeStaticRuntimes, HelperStaticRuntimes,
1749 for (
auto S : RequiredSymbols) {
1750 CmdArgs.push_back(
"-u");
1751 CmdArgs.push_back(Args.MakeArgString(S));
1755 for (
auto RT : SharedRuntimes)
1759 bool FuzzerNeedsSanitizerDeps =
false;
1761 !Args.hasArg(options::OPT_shared)) {
1764 FuzzerNeedsSanitizerDeps =
true;
1768 if (!Args.hasArg(options::OPT_nostdlibxx)) {
1769 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1770 !Args.hasArg(options::OPT_static);
1771 if (OnlyLibstdcxxStatic)
1772 CmdArgs.push_back(
"-Bstatic");
1774 if (OnlyLibstdcxxStatic)
1775 CmdArgs.push_back(
"-Bdynamic");
1779 for (
auto RT : HelperStaticRuntimes)
1781 bool AddExportDynamic =
false;
1782 for (
auto RT : StaticRuntimes) {
1786 for (
auto RT : NonWholeStaticRuntimes) {
1792 if (AddExportDynamic)
1793 CmdArgs.push_back(
"--export-dynamic");
1796 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1799 CmdArgs.push_back(
"-z");
1801 Args.MakeArgString(
"memtag-mode=" + SanArgs.
getMemtagMode()));
1804 CmdArgs.push_back(
"-z");
1805 CmdArgs.push_back(
"memtag-heap");
1809 CmdArgs.push_back(
"-z");
1810 CmdArgs.push_back(
"memtag-stack");
1814 CmdArgs.push_back(
"--android-memtag-note");
1817 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty() ||
1818 FuzzerNeedsSanitizerDeps;
1823 if (Args.hasArg(options::OPT_shared)) {
1825 CmdArgs.push_back(
"--whole-archive");
1827 CmdArgs.push_back(
"--no-whole-archive");
1831 CmdArgs.push_back(
"--whole-archive");
1833 for (
const auto &Mode : XRay.
modeList())
1835 CmdArgs.push_back(
"--no-whole-archive");
1843 const llvm::opt::ArgList &Args,
1844 ArgStringList &CmdArgs) {
1846 CmdArgs.push_back(
"-lpthread");
1848 CmdArgs.push_back(
"-lrt");
1849 CmdArgs.push_back(
"-lm");
1854 CmdArgs.push_back(
"-ldl");
1859 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1860 return !A->getOption().matches(options::OPT_O0);
1868 auto AddPostfix = [JA](
auto &F) {
1873 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1874 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1878 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1881 Arg *FinalOutput = Args.getLastArg(options::OPT_o, options::OPT__SLASH_o);
1882 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1883 T = FinalOutput->getValue();
1884 llvm::sys::path::remove_filename(T);
1885 llvm::sys::path::append(T,
1886 llvm::sys::path::stem(FinalOutput->getValue()));
1888 return Args.MakeArgString(T);
1894 return Args.MakeArgString(T);
1898 const JobAction &JA,
const ArgList &Args,
1899 const InputInfo &Output,
const char *OutFile) {
1900 ArgStringList ExtractArgs;
1901 ExtractArgs.push_back(
"--extract-dwo");
1903 ArgStringList StripArgs;
1904 StripArgs.push_back(
"--strip-dwo");
1909 ExtractArgs.push_back(OutFile);
1916 C.addCommand(std::make_unique<Command>(JA, T,
1918 Exec, ExtractArgs, II, Output));
1921 C.addCommand(std::make_unique<Command>(
1931 Args.ClaimAllArgs(options::OPT_flto_EQ);
1932 Args.ClaimAllArgs(options::OPT_flto);
1933 Args.ClaimAllArgs(options::OPT_fno_lto);
1937 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1938 options::OPT_fcs_profile_generate_EQ,
1939 options::OPT_fno_profile_generate);
1940 if (CSPGOGenerateArg &&
1941 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1942 CSPGOGenerateArg =
nullptr;
1944 return CSPGOGenerateArg;
1948 auto *ProfileUseArg = Args.getLastArg(
1949 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1950 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1951 options::OPT_fno_profile_instr_use);
1953 if (ProfileUseArg &&
1954 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1955 ProfileUseArg =
nullptr;
1957 return ProfileUseArg;
1961 auto *ProfileSampleUseArg = Args.getLastArg(
1962 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
1964 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
1965 options::OPT_fno_profile_sample_use)))
1968 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
1973 case llvm::Reloc::Static:
1975 case llvm::Reloc::PIC_:
1977 case llvm::Reloc::DynamicNoPIC:
1978 return "dynamic-no-pic";
1979 case llvm::Reloc::ROPI:
1981 case llvm::Reloc::RWPI:
1983 case llvm::Reloc::ROPI_RWPI:
1986 llvm_unreachable(
"Unknown Reloc::Model kind");
1993std::tuple<llvm::Reloc::Model, unsigned, bool>
2001 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
2003 bool IsPICLevelTwo = PIC;
2006 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
2009 if (Triple.isAndroid()) {
2010 switch (Triple.getArch()) {
2011 case llvm::Triple::x86:
2012 case llvm::Triple::x86_64:
2014 IsPICLevelTwo =
true;
2024 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
2028 if (Triple.isOSOpenBSD()) {
2030 case llvm::Triple::arm:
2031 case llvm::Triple::aarch64:
2032 case llvm::Triple::mips64:
2033 case llvm::Triple::mips64el:
2034 case llvm::Triple::x86:
2035 case llvm::Triple::x86_64:
2036 IsPICLevelTwo =
false;
2039 case llvm::Triple::ppc:
2040 case llvm::Triple::sparcv9:
2041 IsPICLevelTwo =
true;
2053 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2054 options::OPT_fpic, options::OPT_fno_pic,
2055 options::OPT_fPIE, options::OPT_fno_PIE,
2056 options::OPT_fpie, options::OPT_fno_pie);
2057 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
2058 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
2059 options::OPT_fPIE, options::OPT_fpie)) {
2061 << LastPICArg->getSpelling() << Triple.str();
2062 if (Triple.getArch() == llvm::Triple::x86_64)
2063 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
2064 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2071 Option O = LastPICArg->getOption();
2072 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2073 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2074 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2076 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2078 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
2081 if (EffectiveTriple.isPS()) {
2082 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
2083 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
2084 if (Model !=
"kernel") {
2087 << LastPICArg->getSpelling()
2088 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
2098 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
2104 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
2105 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
2108 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2111 if (!Triple.isOSDarwin())
2113 << A->getSpelling() << Triple.str();
2122 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
2125 bool EmbeddedPISupported;
2126 switch (Triple.getArch()) {
2127 case llvm::Triple::arm:
2128 case llvm::Triple::armeb:
2129 case llvm::Triple::thumb:
2130 case llvm::Triple::thumbeb:
2131 EmbeddedPISupported =
true;
2134 EmbeddedPISupported =
false;
2138 bool ROPI =
false, RWPI =
false;
2139 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
2140 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
2141 if (!EmbeddedPISupported)
2143 << LastROPIArg->getSpelling() << Triple.str();
2146 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2147 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2148 if (!EmbeddedPISupported)
2150 << LastRWPIArg->getSpelling() << Triple.str();
2155 if ((ROPI || RWPI) && (PIC || PIE))
2158 if (Triple.isMIPS()) {
2165 if (ABIName ==
"n64")
2168 if(Args.hasArg(options::OPT_mno_abicalls))
2169 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2172 IsPICLevelTwo =
false;
2176 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2178 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2180 RelocM = llvm::Reloc::ROPI_RWPI;
2182 RelocM = llvm::Reloc::ROPI;
2184 RelocM = llvm::Reloc::RWPI;
2186 return std::make_tuple(RelocM, 0
U,
false);
2190 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
2191 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
2193 const llvm::opt::OptTable &Opts = D.
getOpts();
2194 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
2195 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
2196 D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
2198 return HasStaticPIE;
2218 const ArgList &Args) {
2219 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2220 options::OPT_falign_functions_EQ,
2221 options::OPT_fno_align_functions);
2222 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2225 if (A->getOption().matches(options::OPT_falign_functions))
2229 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2231 << A->getAsString(Args) << A->getValue();
2236 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2237 switch (DebugInfoKind) {
2238 case llvm::codegenoptions::DebugDirectivesOnly:
2239 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2241 case llvm::codegenoptions::DebugLineTablesOnly:
2242 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2244 case llvm::codegenoptions::DebugInfoConstructor:
2245 CmdArgs.push_back(
"-debug-info-kind=constructor");
2247 case llvm::codegenoptions::LimitedDebugInfo:
2248 CmdArgs.push_back(
"-debug-info-kind=limited");
2250 case llvm::codegenoptions::FullDebugInfo:
2251 CmdArgs.push_back(
"-debug-info-kind=standalone");
2253 case llvm::codegenoptions::UnusedTypeInfo:
2254 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2264 assert(A.getOption().matches(options::OPT_gN_Group) &&
2265 "Not a -g option that specifies a debug-info level");
2266 if (A.getOption().matches(options::OPT_g0) ||
2267 A.getOption().matches(options::OPT_ggdb0))
2268 return llvm::codegenoptions::NoDebugInfo;
2269 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2270 A.getOption().matches(options::OPT_ggdb1))
2271 return llvm::codegenoptions::DebugLineTablesOnly;
2272 if (A.getOption().matches(options::OPT_gline_directives_only))
2273 return llvm::codegenoptions::DebugDirectivesOnly;
2274 return llvm::codegenoptions::DebugInfoConstructor;
2278 const ArgList &Args) {
2279 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2285 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 6 ||
2288 << A->getAsString(Args) << A->getValue();
2293 return llvm::StringSwitch<unsigned>(ArgValue)
2294 .Case(
"-gdwarf-2", 2)
2295 .Case(
"-gdwarf-3", 3)
2296 .Case(
"-gdwarf-4", 4)
2297 .Case(
"-gdwarf-5", 5)
2298 .Case(
"-gdwarf-6", 6)
2303 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2304 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2305 options::OPT_gdwarf_6, options::OPT_gdwarf);
2309 const llvm::opt::ArgList &Args) {
2314 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2315 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2316 << GDwarfN->getSpelling() << TC.
getTriple().str();
2318 if (DwarfVersion == 0) {
2320 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2322 return DwarfVersion;
2326 const ArgList &Args, Arg *&Arg) {
2327 Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
2328 options::OPT_gno_split_dwarf);
2329 if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
2332 if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
2335 StringRef
Value = Arg->getValue();
2336 if (
Value ==
"split")
2338 if (
Value ==
"single")
2341 D.
Diag(diag::err_drv_unsupported_option_argument)
2342 << Arg->getSpelling() << Arg->getValue();
2348 assert(A &&
"Expected non-nullptr argument.");
2351 D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
2357 const ArgList &Args,
2358 ArgStringList &CmdArgs) {
2359 if (Args.hasFlag(options::OPT_fdebug_info_for_profiling,
2360 options::OPT_fno_debug_info_for_profiling,
false) &&
2362 Args.getLastArg(options::OPT_fdebug_info_for_profiling), Args, D, TC))
2363 CmdArgs.push_back(
"-fdebug-info-for-profiling");
2367 ArgStringList &CmdArgs) {
2368 llvm::Reloc::Model RelocationModel;
2373 if (RelocationModel != llvm::Reloc::Static)
2374 CmdArgs.push_back(
"-KPIC");
2380 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2386 const ArgList &Args) {
2387 if (Args.hasArg(options::OPT_static_libgcc) ||
2388 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2392 if (Args.hasArg(options::OPT_shared_libgcc))
2411 ArgStringList &CmdArgs,
const ArgList &Args) {
2415 CmdArgs.push_back(
"-l:libunwind.a");
2438 CmdArgs.push_back(
"-lgcc_eh");
2440 CmdArgs.push_back(
"-lgcc_s");
2448 CmdArgs.push_back(
"-lunwind");
2450 CmdArgs.push_back(
"-l:libunwind.a");
2453 CmdArgs.push_back(
"-l:libunwind.dll.a");
2455 CmdArgs.push_back(
"-l:libunwind.so");
2459 CmdArgs.push_back(
"-lunwind");
2469 ArgStringList &CmdArgs,
const ArgList &Args) {
2473 CmdArgs.push_back(
"-lgcc");
2477 CmdArgs.push_back(
"-lgcc");
2481 CmdArgs.push_back(
"--as-needed");
2483 CmdArgs.push_back(
"--no-as-needed");
2488 ArgStringList &CmdArgs,
const ArgList &Args) {
2499 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2502 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2503 if (A && A->getValue() != StringRef(
"platform")) {
2504 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2505 << A->getValue() <<
"MSVC";
2515 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2516 !Args.hasArg(options::OPT_static_pie))
2517 CmdArgs.push_back(
"-ldl");
2524 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2530 StringRef SaveStats = A->getValue();
2531 if (SaveStats ==
"obj" && Output.
isFilename()) {
2533 llvm::sys::path::remove_filename(StatsFile);
2534 }
else if (SaveStats !=
"cwd") {
2535 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2539 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2540 llvm::sys::path::append(StatsFile, BaseName);
2541 llvm::sys::path::replace_extension(StatsFile,
"stats");
2553 assert(Flag.front() ==
'-');
2555 Flags.push_back(Flag.str());
2557 Flags.push_back((
"!" + Flag.substr(1)).str());
2562 ArgStringList &CmdArgs,
bool IsLTO,
2563 const StringRef PluginOptPrefix) {
2564 auto addArg = [&, IsLTO](
const Twine &Arg) {
2566 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2567 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2569 CmdArgs.push_back(
"-mllvm");
2570 CmdArgs.push_back(Args.MakeArgString(Arg));
2574 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2575 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2577 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2578 StringRef
Value = A->getValue();
2580 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2581 !llvm::isPowerOf2_64(Boundary)) {
2582 D.
Diag(diag::err_drv_invalid_argument_to_option)
2583 <<
Value << A->getOption().getName();
2585 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2588 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2589 std::string AlignBranch;
2590 for (StringRef T : A->getValues()) {
2591 if (T !=
"fused" && T !=
"jcc" && T !=
"jmp" && T !=
"call" &&
2592 T !=
"ret" && T !=
"indirect")
2593 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2594 << T <<
"fused, jcc, jmp, call, ret, indirect";
2595 if (!AlignBranch.empty())
2599 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2601 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2602 StringRef
Value = A->getValue();
2603 unsigned PrefixSize;
2604 if (
Value.getAsInteger(10, PrefixSize)) {
2605 D.
Diag(diag::err_drv_invalid_argument_to_option)
2606 <<
Value << A->getOption().getName();
2608 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2634 llvm::opt::ArgStringList &CC1Args,
2636 StringRef Lib, StringRef
Arch, StringRef
Target,
2637 bool isBitCodeSDL) {
2640 std::string LibDeviceLoc =
"/libdevice";
2641 std::string LibBcPrefix =
"/libbc-";
2642 std::string LibPrefix =
"/lib";
2659 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2660 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2662 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2663 Twine(Lib +
"-" +
Arch).str(), Twine(Lib).str()}) {
2664 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2665 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2675 const auto *Ext =
".a";
2677 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2678 Twine(Lib +
"-" +
Arch).str()}) {
2679 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2680 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2691 bool FoundSDL =
false;
2692 for (
auto LPath : LibraryPaths) {
2693 for (
auto SDL : SDLs) {
2694 auto FullName = Twine(LPath + SDL).str();
2695 if (llvm::sys::fs::exists(FullName)) {
2696 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2713 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2714 llvm::opt::ArgStringList &CC1Args,
2716 StringRef
Arch, StringRef
Target,
bool isBitCodeSDL) {
2719 if (isBitCodeSDL &&
Arch.contains(
"nvptx"))
2722 bool FoundAOB =
false;
2723 std::string ArchiveOfBundles;
2726 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2727 auto Ext = IsMSVC ?
".lib" :
".a";
2728 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2729 if (llvm::sys::fs::exists(Lib)) {
2730 ArchiveOfBundles = Lib;
2734 Lib.consume_front(
"-l");
2735 for (
auto LPath : LibraryPaths) {
2736 ArchiveOfBundles.clear();
2737 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2738 : IsMSVC ? Lib + Ext
2739 :
"lib" + Lib + Ext)
2741 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2742 auto AOB = Twine(LPath + Prefix + LibFile).str();
2743 if (llvm::sys::fs::exists(AOB)) {
2744 ArchiveOfBundles = AOB;
2757 llvm::file_magic Magic;
2758 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2759 if (EC || Magic != llvm::file_magic::archive)
2762 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2763 std::string OutputLib =
2769 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2773 DeviceTriple +=
'-';
2774 std::string NormalizedTriple = T.getToolChain().getTriple().normalize(
2775 llvm::Triple::CanonicalForm::FOUR_IDENT);
2776 DeviceTriple += NormalizedTriple;
2778 DeviceTriple +=
'-';
2782 std::string UnbundleArg(
"-unbundle");
2783 std::string TypeArg(
"-type=a");
2784 std::string InputArg(
"-input=" + ArchiveOfBundles);
2785 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2786 std::string OutputArg(
"-output=" + OutputLib);
2788 const char *UBProgram = DriverArgs.MakeArgString(
2789 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2791 ArgStringList UBArgs;
2792 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2793 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2794 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2795 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2796 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2800 std::string AdditionalArgs(
"-allow-missing-bundles");
2801 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2806 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2807 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2809 C.addCommand(std::make_unique<Command>(
2811 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2813 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2820 const llvm::opt::ArgList &DriverArgs,
2821 llvm::opt::ArgStringList &CC1Args,
2823 bool isBitCodeSDL) {
2854 const llvm::opt::ArgList &DriverArgs,
2855 llvm::opt::ArgStringList &CC1Args,
2857 bool isBitCodeSDL) {
2861 std::optional<std::string> LibPath =
2862 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2865 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2866 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2867 for (StringRef Path : Frags)
2868 LibraryPaths.emplace_back(Path.trim());
2872 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2873 LibraryPaths.emplace_back(Search_Dir);
2877 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2878 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2881 llvm::SmallSet<std::string, 16> SDLNames;
2882 static const StringRef HostOnlyArchives[] = {
2883 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2884 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2885 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2886 SDLNames.insert(std::string(
"-l") + SDLName);
2890 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2897 const StringRef LibFileExt =
".lib";
2898 if (!llvm::sys::path::has_extension(
FileName) ||
2900 llvm::sys::path::extension(
FileName).drop_front()) ==
2902 llvm::sys::path::extension(
FileName) == LibFileExt)
2903 SDLNames.insert(Input);
2910 for (
auto SDLName : SDLNames) {
2921static llvm::opt::Arg *
2923 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2927 const llvm::opt::ArgList &Args) {
2928 const unsigned MinCodeObjVer = 4;
2929 const unsigned MaxCodeObjVer = 6;
2932 if (CodeObjArg->getOption().getID() ==
2933 options::OPT_mcode_object_version_EQ) {
2934 unsigned CodeObjVer = MaxCodeObjVer;
2936 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2937 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2938 D.
Diag(diag::err_drv_invalid_int_value)
2939 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2945 const llvm::opt::ArgList &Args) {
2946 unsigned CodeObjVer = 6;
2948 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2953 const Driver &D,
const llvm::opt::ArgList &Args) {
2958 const llvm::opt::ArgList &Args,
2959 llvm::opt::ArgStringList &CmdArgs,
2960 const llvm::Triple &Triple,
bool IsLTO,
2961 const StringRef PluginOptPrefix) {
2962 auto addArg = [&, IsLTO](
const Twine &Arg) {
2964 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2965 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2967 CmdArgs.push_back(
"-mllvm");
2968 CmdArgs.push_back(Args.MakeArgString(Arg));
2972 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2973 options::OPT_mno_outline)) {
2974 if (A->getOption().matches(options::OPT_moutline)) {
2978 if (Triple.isARM() || Triple.isThumb() || Triple.isAArch64() ||
2979 Triple.isRISCV() || Triple.isX86()) {
2980 addArg(Twine(
"-enable-machine-outliner"));
2982 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2988 CmdArgs.push_back(
"-mno-outline");
2991 addArg(Twine(
"-enable-machine-outliner=never"));
2995 auto *CodeGenDataGenArg =
2996 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
2997 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
3000 if (CodeGenDataGenArg && CodeGenDataUseArg)
3001 D.
Diag(diag::err_drv_argument_not_allowed_with)
3002 << CodeGenDataGenArg->getAsString(Args)
3003 << CodeGenDataUseArg->getAsString(Args);
3007 if (CodeGenDataGenArg)
3008 addArg(Twine(
"-codegen-data-generate"));
3011 if (CodeGenDataUseArg)
3012 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
3016 const llvm::opt::ArgList &DriverArgs,
3017 llvm::opt::ArgStringList &CC1Args,
3018 StringRef BitcodeSuffix,
3019 const llvm::Triple &Triple,
3024 std::optional<std::string> LibPath =
3025 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
3028 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
3029 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
3030 for (StringRef Path : Frags)
3031 LibraryPaths.emplace_back(Path.trim());
3036 LibraryPaths.emplace_back(LibPath);
3040 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
3041 LibraryPaths.emplace_back(P);
3043 OptSpecifier LibomptargetBCPathOpt =
3044 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
3045 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
3046 : options::OPT_libomptarget_spirv_bc_path_EQ;
3048 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
3049 : Triple.isNVPTX() ?
"nvptx"
3051 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
3054 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
3056 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
3057 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
3058 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3061 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3062 CC1Args.push_back(
"-mlink-builtin-bitcode");
3063 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3065 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
3066 << LibOmpTargetFile;
3069 bool FoundBCLibrary =
false;
3071 for (StringRef LibraryPath : LibraryPaths) {
3073 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3074 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3075 CC1Args.push_back(
"-mlink-builtin-bitcode");
3076 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3077 FoundBCLibrary =
true;
3082 if (!FoundBCLibrary)
3083 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
3084 << LibOmpTargetName << ArchPrefix;
3089 const llvm::opt::ArgList &DriverArgs,
3090 llvm::opt::ArgStringList &CC1Args) {
3092 StringRef LibclcNamespec;
3093 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
3096 LibclcNamespec = A->getValue();
3098 if (!TT.isAMDGPU() || TT.getEnvironment() != llvm::Triple::LLVM)
3102 if (DriverArgs.hasArg(options::OPT_no_offloadlib,
3103 options::OPT_nodefaultlibs, options::OPT_nostdlib))
3107 bool FilenameSearch = LibclcNamespec.consume_front(
":");
3108 if (FilenameSearch) {
3110 if (D.
getVFS().exists(LibclcFile)) {
3111 CC1Args.push_back(
"-mlink-builtin-bitcode");
3112 CC1Args.push_back(DriverArgs.MakeArgString(LibclcFile));
3115 D.
Diag(diag::err_drv_libclc_not_found) << LibclcFile;
3121 llvm::sys::path::append(BasePath,
"lib");
3126 if (
const Arg *CPUArg =
3127 DriverArgs.getLastArg(options::OPT_mcpu_EQ, options::OPT_march_EQ)) {
3128 StringRef CPU = CPUArg->getValue();
3131 llvm::sys::path::append(CPUPath, CPU,
"libclc.bc");
3132 if (D.
getVFS().exists(CPUPath)) {
3133 CC1Args.push_back(
"-mlink-builtin-bitcode");
3134 CC1Args.push_back(DriverArgs.MakeArgString(CPUPath));
3142 llvm::sys::path::append(GenericPath,
"libclc.bc");
3143 if (D.
getVFS().exists(GenericPath)) {
3144 CC1Args.push_back(
"-mlink-builtin-bitcode");
3145 CC1Args.push_back(DriverArgs.MakeArgString(GenericPath));
3149 D.
Diag(diag::err_drv_libclc_not_found) <<
"libclc.bc";
3153 const llvm::opt::ArgList &Args,
3154 llvm::opt::ArgStringList &CmdArgs,
3155 const llvm::Triple &Triple) {
3156 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3157 options::OPT_mno_outline_atomics)) {
3159 if (!Triple.isAArch64()) {
3160 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3161 << Triple.getArchName() << A->getOption().getName();
3163 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3164 CmdArgs.push_back(
"-target-feature");
3165 CmdArgs.push_back(
"+outline-atomics");
3167 CmdArgs.push_back(
"-target-feature");
3168 CmdArgs.push_back(
"-outline-atomics");
3172 CmdArgs.push_back(
"-target-feature");
3173 CmdArgs.push_back(
"+outline-atomics");
3178 llvm::opt::ArgStringList &CmdArgs) {
3179 if (TCArgs.hasFlag(options::OPT_offload_compress,
3180 options::OPT_no_offload_compress,
false))
3181 CmdArgs.push_back(
"--compress");
3182 if (TCArgs.hasArg(options::OPT_v))
3183 CmdArgs.push_back(
"--verbose");
3184 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3186 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3190 const llvm::Triple &Triple,
3191 const llvm::Reloc::Model &RelocationModel,
3192 llvm::opt::ArgStringList &CmdArgs) {
3193 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3194 StringRef CM = A->getValue();
3196 if (Triple.isOSAIX() && CM ==
"medium")
3198 if (Triple.isAArch64(64)) {
3199 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3200 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3201 RelocationModel != llvm::Reloc::Static)
3202 D.
Diag(diag::err_drv_argument_only_allowed_with)
3203 << A->getAsString(Args) <<
"-fno-pic";
3204 }
else if (Triple.isLoongArch()) {
3205 if (CM ==
"extreme" &&
3206 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3207 D.
Diag(diag::err_drv_argument_not_allowed_with)
3208 << A->getAsString(Args) <<
"-fplt";
3209 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3212 CM = llvm::StringSwitch<StringRef>(CM)
3213 .Case(
"normal",
"small")
3214 .Case(
"extreme",
"large")
3216 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3217 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3218 }
else if (Triple.isRISCV()) {
3220 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3221 D.
Diag(diag::err_drv_argument_not_allowed_with)
3222 << A->getAsString(Args) <<
"-fpic";
3225 else if (CM ==
"medany")
3227 Ok = CM ==
"small" || CM ==
"medium" ||
3228 (CM ==
"large" && Triple.isRISCV64());
3229 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3230 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3231 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3235 }
else if (Triple.isSPARC64()) {
3238 else if (CM ==
"medmid")
3240 else if (CM ==
"medany")
3242 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3243 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3244 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3247 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3249 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3250 << A->getSpelling() << CM << Triple.getTriple();
3254 if (Triple.getArch() == llvm::Triple::x86_64) {
3255 bool IsMediumCM =
false;
3256 bool IsLargeCM =
false;
3257 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3258 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3259 IsLargeCM = StringRef(A->getValue()) ==
"large";
3261 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3262 if (!IsMediumCM && !IsLargeCM) {
3263 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3264 << A->getOption().getRenderName();
3266 A->render(Args, CmdArgs);
3268 }
else if (IsMediumCM) {
3269 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3270 }
else if (IsLargeCM) {
3271 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3277 ArgStringList &CmdArgs) {
3282 Args.getLastArg(options::OPT_fcolor_diagnostics,
3283 options::OPT_fno_color_diagnostics);
3284 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3285 StringRef
Value(A->getValue());
3287 D.
Diag(diag::err_drv_invalid_argument_to_option)
3288 <<
Value << A->getOption().getName();
3292 CmdArgs.push_back(
"-fcolor-diagnostics");
3297 for (; *Arg; ++Arg) {
3303 Res.push_back(
'\\');
3306 Res.push_back(*Arg);
3311 const llvm::opt::ArgList &Args) {
3315 llvm::opt::ArgStringList OriginalArgs;
3316 for (
const auto &Arg : Args)
3317 Arg->render(Args, OriginalArgs);
3321 for (
const char *OriginalArg : OriginalArgs) {
3325 Flags += EscapedArg;
3328 return Args.MakeArgString(Flags);
3332 const llvm::opt::ArgList &Args,
3333 bool &FRecordCommandLine,
3334 bool &GRecordCommandLine) {
3337 const std::string &TripleStr = Triple.getTriple();
3339 FRecordCommandLine =
3340 Args.hasFlag(options::OPT_frecord_command_line,
3341 options::OPT_fno_record_command_line,
false);
3342 GRecordCommandLine =
3343 Args.hasFlag(options::OPT_grecord_command_line,
3344 options::OPT_gno_record_command_line,
false);
3345 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3346 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3347 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3348 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3355 ArgStringList &CmdArgs,
3356 const llvm::Triple &Triple) {
3357 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
3358 options::OPT_fno_global_isel)) {
3359 CmdArgs.push_back(
"-mllvm");
3360 if (A->getOption().matches(options::OPT_fglobal_isel)) {
3361 CmdArgs.push_back(
"-global-isel=1");
3366 bool IsArchSupported = Triple.getArch() == llvm::Triple::aarch64;
3367 bool IsOptLevelSupported =
false;
3369 Arg *A = Args.getLastArg(options::OPT_O_Group);
3370 if (IsArchSupported) {
3371 if (!A || A->getOption().matches(options::OPT_O0))
3372 IsOptLevelSupported =
true;
3374 if (!IsArchSupported || !IsOptLevelSupported) {
3375 CmdArgs.push_back(
"-mllvm");
3376 CmdArgs.push_back(
"-global-isel-abort=2");
3378 if (!IsArchSupported)
3379 D.
Diag(diag::warn_drv_global_isel_incomplete) << Triple.getArchName();
3381 D.
Diag(diag::warn_drv_global_isel_incomplete_opt);
3384 CmdArgs.push_back(
"-global-isel=0");
3390 ArgStringList &CmdArgs) {
3391 bool use_fwrapv =
false;
3392 bool use_fwrapv_pointer =
false;
3393 for (
const Arg *A : Args.filtered(
3394 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3395 options::OPT_fwrapv, options::OPT_fno_wrapv,
3396 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3398 switch (A->getOption().getID()) {
3399 case options::OPT_fstrict_overflow:
3401 use_fwrapv_pointer =
false;
3403 case options::OPT_fno_strict_overflow:
3405 use_fwrapv_pointer =
true;
3407 case options::OPT_fwrapv:
3410 case options::OPT_fno_wrapv:
3413 case options::OPT_fwrapv_pointer:
3414 use_fwrapv_pointer =
true;
3416 case options::OPT_fno_wrapv_pointer:
3417 use_fwrapv_pointer =
false;
3423 CmdArgs.push_back(
"-fwrapv");
3424 if (use_fwrapv_pointer)
3425 CmdArgs.push_back(
"-fwrapv-pointer");
3432 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3433 if (A->getOption().matches(options::OPT_O4) ||
3434 A->getOption().matches(options::OPT_Ofast))
3437 if (A->getOption().matches(options::OPT_O0))
3440 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3443 StringRef S(A->getValue());
3451 unsigned OptLevel = 0;
3452 if (S.getAsInteger(10, OptLevel))
3455 return OptLevel > 1;
3462 ArgStringList &CmdArgs) {
3464 if (Args.hasFlag(options::OPT_fvectorize, options::OPT_fno_vectorize,
3466 CmdArgs.push_back(
"-vectorize-loops");
3470 ArgStringList &CmdArgs) {
3472 if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize,
3474 CmdArgs.push_back(
"-vectorize-slp");
3478 ArgStringList &CmdArgs) {
3479 if (Args.hasFlag(options::OPT_floop_interchange,
3480 options::OPT_fno_loop_interchange,
false))
3481 CmdArgs.push_back(
"-floop-interchange");
3502 llvm_unreachable(
"Fully covered switch above");
3508 if (!ComplexRangeStr.empty())
3509 return "-complex-range=" + ComplexRangeStr;
3510 return ComplexRangeStr;
3530 if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
3531 (LastOpt ==
"-fcx-limited-range" && NewOpt ==
"-fno-cx-limited-range") ||
3532 (LastOpt ==
"-fno-cx-limited-range" && NewOpt ==
"-fcx-limited-range") ||
3533 (LastOpt ==
"-fcx-fortran-rules" && NewOpt ==
"-fno-cx-fortran-rules") ||
3534 (LastOpt ==
"-fno-cx-fortran-rules" && NewOpt ==
"-fcx-fortran-rules") ||
3535 (LastOpt ==
"-ffast-math" && NewOpt ==
"-fno-fast-math") ||
3536 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-ffast-math") ||
3537 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-fno-fast-math") ||
3538 (LastOpt.starts_with(
"-ffp-model=") &&
3539 NewOpt.starts_with(
"-ffp-model=")) ||
3540 (LastOpt.starts_with(
"-fcomplex-arithmetic=") &&
3541 NewOpt.starts_with(
"-fcomplex-arithmetic=")))
3544 D.
Diag(clang::diag::warn_drv_overriding_complex_range)
3564 const ArgStringList &LinkerInputs,
3566 const llvm::opt::ArgList &Args,
3567 const char *OutputFilename) {
3571 assert(!LinkerInputs.empty() && !JobInputs.empty() &&
3572 "Must have at least one input.");
3574 ArgStringList LlvmLinkArgs(
3575 {
"-o", OutputFilename ? OutputFilename : Output.
getFilename()});
3577 LlvmLinkArgs.append(LinkerInputs);
3580 const char *LlvmLink = Args.MakeArgString(TC.
GetProgramPath(
"llvm-link"));
3582 LlvmLink, LlvmLinkArgs, JobInputs,
static bool useLeafFramePointerForTargetByDefault(const llvm::Triple &Triple)
static unsigned ParseDebugDefaultVersion(const ToolChain &TC, const ArgList &Args)
static void getWebAssemblyTargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, std::vector< StringRef > &Features)
static void emitComplexRangeDiag(const Driver &D, StringRef LastOpt, LangOptions::ComplexRangeKind Range, StringRef NewOpt, LangOptions::ComplexRangeKind NewRange)
static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer)
static bool mustMaintainValidFrameChain(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static llvm::opt::Arg * getAMDGPUCodeObjectArgument(const Driver &D, const llvm::opt::ArgList &Args)
static void collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, SmallVectorImpl< StringRef > &SharedRuntimes, SmallVectorImpl< StringRef > &StaticRuntimes, SmallVectorImpl< StringRef > &NonWholeStaticRuntimes, SmallVectorImpl< StringRef > &HelperStaticRuntimes, SmallVectorImpl< StringRef > &RequiredSymbols)
static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer, bool IsShared, bool IsWhole)
static void AddUnwindLibrary(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
static bool SDLSearch(const Driver &D, const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, const SmallVectorImpl< std::string > &LibraryPaths, StringRef Lib, StringRef Arch, StringRef Target, bool isBitCodeSDL)
SDLSearch: Search for Static Device Library The search for SDL bitcode files is consistent with how s...
static void renderRpassOptions(const ArgList &Args, ArgStringList &CmdArgs, const StringRef PluginOptPrefix)
static StringRef getWebAssemblyTargetCPU(const ArgList &Args)
Get the (LLVM) name of the WebAssembly cpu we are targeting.
static bool framePointerImpliesLeafFramePointer(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static void renderRemarksHotnessOptions(const ArgList &Args, ArgStringList &CmdArgs, const StringRef PluginOptPrefix)
static void GetSDLFromOffloadArchive(Compilation &C, const Driver &D, const Tool &T, const JobAction &JA, const InputInfoList &Inputs, const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, const SmallVectorImpl< std::string > &LibraryPaths, StringRef Lib, StringRef Arch, StringRef Target, bool isBitCodeSDL)
Search if a user provided archive file lib<libname>.a exists in any of the library paths.
static std::string getLanaiTargetCPU(const ArgList &Args)
static void renderRemarksOptions(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple, const InputInfo &Input, const InputInfo &Output, const StringRef PluginOptPrefix)
static bool useFramePointerForTargetByDefault(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static void AddLibgcc(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
static LibGccType getLibGccType(const ToolChain &TC, const Driver &D, const ArgList &Args)
clang::CodeGenOptions::FramePointerKind getFramePointerKind(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static std::string getAMDGPUTargetGPU(const llvm::Triple &T, const ArgList &Args)
Get the (LLVM) name of the AMDGPU gpu we are targeting.
static bool mustUseNonLeafFramePointerForTarget(const llvm::Triple &Triple)
static bool shouldIgnoreUnsupportedTargetFeature(const Arg &TargetFeatureArg, llvm::Triple T, StringRef Processor)
llvm::MachO::Target Target
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
ComplexRangeKind
Controls the various implementations for complex multiplication and.
@ CX_Full
Implementation of complex division and multiplication using a call to runtime library functions(gener...
@ CX_Basic
Implementation of complex division and multiplication using algebraic formulas at source precision.
@ CX_Promoted
Implementation of complex division using algebraic formulas at higher precision.
@ CX_None
No range rule is enabled.
@ CX_Improved
Implementation of complex division offering an improved handling for overflow in intermediate calcula...
const char * getOffloadingArch() const
static StringRef GetOffloadKindName(OffloadKind Kind)
Return a string containing a offload kind name.
OffloadKind getOffloadingDeviceKind() const
bool isHostOffloading(unsigned int OKind) const
Check if this action have any offload kinds.
Compilation - A set of tasks to perform for a single driver invocation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
std::string CCPrintInternalStatReportFilename
The file to log CC_PRINT_INTERNAL_STAT_FILE output to, if enabled.
DiagnosticsEngine & getDiags() const
const char * getPrependArg() const
OpenMPRuntimeKind getOpenMPRuntime(const llvm::opt::ArgList &Args) const
Compute the desired OpenMP runtime from the flags provided.
const char * getClangProgramPath() const
Get the path to the main clang executable.
DiagnosticBuilder Diag(unsigned DiagID) const
unsigned CCPrintInternalStats
Set CC_PRINT_INTERNAL_STAT mode, which causes the driver to dump internal performance report to CC_PR...
const llvm::opt::OptTable & getOpts() const
std::string ResourceDir
The path to the compiler resource directory.
llvm::vfs::FileSystem & getVFS() const
std::string GetTemporaryPath(StringRef Prefix, StringRef Suffix) const
GetTemporaryPath - Return the pathname of a temporary file to use as part of compilation; the file wi...
std::string Dir
The path the driver executable was in, as invoked from the command line.
@ OMPRT_IOMP5
The legacy name for the LLVM OpenMP runtime from when it was the Intel OpenMP runtime.
@ OMPRT_OMP
The LLVM OpenMP runtime.
@ OMPRT_Unknown
An unknown OpenMP runtime.
@ OMPRT_GOMP
The GNU OpenMP runtime.
std::string getTargetTriple() const
bool IsFlangMode() const
Whether the driver should invoke flang for fortran inputs.
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
std::vector< std::string > flags_list
bool needsFuzzerInterceptors() const
bool needsHwasanAliasesRt() const
bool needsStatsRt() const
bool needsMemProfRt() const
bool linkRuntimes() const
bool needsUbsanLoopDetectRt() const
bool needsUbsanRt() const
bool needsHwasanRt() const
bool hasCrossDsoCfi() const
bool needsCfiCrossDsoDiagRt() const
bool hasMemtagHeap() const
bool needsSafeStackRt() const
bool needsRtsanRt() const
bool requiresMinimalRuntime() const
bool hasMemtagStack() const
bool needsDfsanRt() const
bool needsScudoRt() const
bool needsUbsanCXXRt() const
bool needsCfiCrossDsoRt() const
const std::string & getMemtagMode() const
bool needsSharedRt() const
bool needsTysanRt() const
bool linkCXXRuntimes() const
bool needsXRayDSORt() const
llvm::ArrayRef< std::string > modeList() const
bool isLLVMIR(ID Id)
Is this LLVM IR.
ID lookupTypeForExtension(llvm::StringRef Ext)
lookupTypeForExtension - Lookup the type to use for the file extension Ext.
SmallVector< InputInfo, 4 > InputInfoList
bool willEmitRemarks(const llvm::opt::ArgList &Args)
The JSON file list parser is used to communicate input to InstallAPI.
llvm::StringRef getProcessorFromTargetID(const llvm::Triple &T, llvm::StringRef OffloadArch)
Get processor name from target ID.
unsigned getOptimizationLevel(const llvm::opt::ArgList &Args, InputKind IK, DiagnosticsEngine &Diags)
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
static constexpr ResponseFileSupport AtFileCurCP()