28#include "clang/Config/config.h"
40#include "llvm/ADT/STLExtras.h"
41#include "llvm/ADT/SmallString.h"
42#include "llvm/ADT/StringExtras.h"
43#include "llvm/ADT/StringSwitch.h"
44#include "llvm/ADT/Twine.h"
45#include "llvm/Config/llvm-config.h"
46#include "llvm/Option/Arg.h"
47#include "llvm/Option/ArgList.h"
48#include "llvm/Option/Option.h"
49#include "llvm/Support/CodeGen.h"
50#include "llvm/Support/Compression.h"
51#include "llvm/Support/ErrorHandling.h"
52#include "llvm/Support/FileSystem.h"
53#include "llvm/Support/Path.h"
54#include "llvm/Support/Process.h"
55#include "llvm/Support/Program.h"
56#include "llvm/Support/Threading.h"
57#include "llvm/Support/VirtualFileSystem.h"
58#include "llvm/Support/YAMLParser.h"
59#include "llvm/TargetParser/AMDGPUTargetParser.h"
60#include "llvm/TargetParser/Host.h"
61#include "llvm/TargetParser/PPCTargetParser.h"
70 Arg *A = Args.getLastArg(options::OPT_offload_jobs_EQ);
74 StringRef Val = A->getValue();
75 if (Val.equals_insensitive(
"jobserver"))
79 if (Val.getAsInteger(10, NumThreads) || NumThreads <= 0)
86 const llvm::Triple &Triple) {
87 if (Args.hasArg(options::OPT_pg) && !Args.hasArg(options::OPT_mfentry))
90 if (Triple.isAndroid())
93 switch (Triple.getArch()) {
94 case llvm::Triple::xcore:
95 case llvm::Triple::wasm32:
96 case llvm::Triple::wasm64:
97 case llvm::Triple::msp430:
101 case llvm::Triple::ppc:
102 case llvm::Triple::ppcle:
103 case llvm::Triple::ppc64:
104 case llvm::Triple::ppc64le:
105 case llvm::Triple::riscv32:
106 case llvm::Triple::riscv64:
107 case llvm::Triple::riscv32be:
108 case llvm::Triple::riscv64be:
109 case llvm::Triple::sparc:
110 case llvm::Triple::sparcel:
111 case llvm::Triple::sparcv9:
112 case llvm::Triple::amdgpu:
113 case llvm::Triple::r600:
114 case llvm::Triple::csky:
115 case llvm::Triple::loongarch32:
116 case llvm::Triple::loongarch64:
117 case llvm::Triple::m68k:
118 case llvm::Triple::mips64:
119 case llvm::Triple::mips64el:
120 case llvm::Triple::mips:
121 case llvm::Triple::mipsel:
127 if (Triple.isOSFuchsia() || Triple.isOSNetBSD()) {
131 if (Triple.isOSLinux() || Triple.isOSHurd()) {
132 switch (Triple.getArch()) {
134 case llvm::Triple::arm:
135 case llvm::Triple::armeb:
136 case llvm::Triple::thumb:
137 case llvm::Triple::thumbeb:
138 case llvm::Triple::systemz:
139 case llvm::Triple::x86:
140 case llvm::Triple::x86_64:
147 if (Triple.isOSWindows()) {
148 switch (Triple.getArch()) {
149 case llvm::Triple::x86:
151 case llvm::Triple::x86_64:
152 return Triple.isOSBinFormatMachO();
153 case llvm::Triple::arm:
154 case llvm::Triple::thumb:
171 if (Triple.isAArch64() || Triple.isPS() || Triple.isVE() ||
172 (Triple.isAndroid() && !Triple.isARM()))
175 if ((Triple.isARM() || Triple.isThumb()) && Triple.isOSBinFormatMachO())
182 switch (Triple.getArch()) {
185 case llvm::Triple::arm:
186 case llvm::Triple::thumb:
189 return Triple.isOSDarwin();
196 const llvm::Triple &Triple) {
197 switch (Triple.getArch()) {
200 case llvm::Triple::arm:
201 case llvm::Triple::armeb:
202 case llvm::Triple::thumb:
203 case llvm::Triple::thumbeb:
207 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
208 StringRef
V = A->getValue();
213 case llvm::Triple::aarch64:
217 return Triple.isOSWindows();
224 const llvm::Triple &Triple) {
225 if (Triple.isARM() || Triple.isThumb()) {
229 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
230 StringRef
V = A->getValue();
231 return V ==
"aapcs+leaf";
240 const llvm::Triple &Triple) {
282 Args.hasFlag(options::OPT_fno_omit_frame_pointer,
283 options::OPT_fomit_frame_pointer, DefaultFP);
289 Args.hasFlag(options::OPT_mno_omit_leaf_frame_pointer,
290 options::OPT_momit_leaf_frame_pointer, DefaultLeafFP);
292 bool FPRegReserved = Args.hasFlag(options::OPT_mreserve_frame_pointer_reg,
293 options::OPT_mno_reserve_frame_pointer_reg,
311 const StringRef PluginOptPrefix) {
312 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
313 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
314 "-pass-remarks=" + A->getValue()));
316 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
317 CmdArgs.push_back(Args.MakeArgString(
318 Twine(PluginOptPrefix) +
"-pass-remarks-missed=" + A->getValue()));
320 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
321 CmdArgs.push_back(Args.MakeArgString(
322 Twine(PluginOptPrefix) +
"-pass-remarks-analysis=" + A->getValue()));
326 const llvm::Triple &Triple,
329 const StringRef PluginOptPrefix) {
330 StringRef Format =
"yaml";
331 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
332 Format = A->getValue();
336 Args.getLastArg(options::OPT_foptimization_record_file_EQ)) {
339 }
else if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
346 assert(!F.empty() &&
"Cannot determine remarks output name.");
348 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
349 "opt-remarks-filename=" + F +
"opt.ld." +
353 Args.getLastArg(options::OPT_foptimization_record_passes_EQ))
354 CmdArgs.push_back(Args.MakeArgString(
355 Twine(PluginOptPrefix) +
"opt-remarks-passes=" + A->getValue()));
357 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
358 "opt-remarks-format=" + Format.data()));
362 ArgStringList &CmdArgs,
363 const StringRef PluginOptPrefix) {
364 if (Args.hasFlag(options::OPT_fdiagnostics_show_hotness,
365 options::OPT_fno_diagnostics_show_hotness,
false))
366 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
367 "opt-remarks-with-hotness"));
370 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ))
372 Args.MakeArgString(Twine(PluginOptPrefix) +
373 "opt-remarks-hotness-threshold=" + A->getValue()));
377 const llvm::Triple &
T) {
382 llvm::AMDGPU::GPUKind GK =
383 llvm::AMDGPU::getGPUKindFromSubArch(
T.getSubArch());
384 if (llvm::AMDGPU::getFeatureBitset(GK).test(llvm::AMDGPU::FEAT_SUPPORTS_WGP))
386 return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode);
391 if (D.
getVFS().exists(Path))
392 Paths.push_back(Path.str());
396 const llvm::Triple &Triple,
398 std::vector<StringRef> &Features,
399 OptSpecifier Group) {
400 std::set<StringRef> Warned;
401 for (
const Arg *A : Args.filtered(Group)) {
402 StringRef Name = A->getOption().getName();
406 assert(Name.starts_with(
"m") &&
"Invalid feature name.");
407 Name = Name.substr(1);
410 if (Warned.count(Name) == 0) {
412 clang::diag::warn_drv_unsupported_option_for_processor)
413 << A->getAsString(Args) << Triple.getArchName();
419 bool IsNegative = Name.consume_front(
"no-");
421 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
429 llvm::DenseSet<StringRef> UsedFeatures;
430 for (StringRef
Feature : llvm::reverse(Features)) {
431 if (UsedFeatures.insert(
Feature.drop_front()).second)
432 UnifiedFeatures.insert(UnifiedFeatures.begin(),
Feature);
435 return UnifiedFeatures;
439 const char *ArgName,
const char *EnvVar) {
440 const char *DirList = ::getenv(EnvVar);
441 bool CombinedArg =
false;
446 StringRef Name(ArgName);
447 if (Name ==
"-I" || Name ==
"-L" || Name.empty())
450 StringRef Dirs(DirList);
454 StringRef::size_type Delim;
455 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
458 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
460 CmdArgs.push_back(ArgName);
461 CmdArgs.push_back(
".");
466 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
468 CmdArgs.push_back(ArgName);
469 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
472 Dirs = Dirs.substr(Delim + 1);
477 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
479 CmdArgs.push_back(ArgName);
480 CmdArgs.push_back(
".");
484 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
486 CmdArgs.push_back(ArgName);
487 CmdArgs.push_back(Args.MakeArgString(Dirs));
493 const ArgList &Args, ArgStringList &CmdArgs,
499 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
506 for (
const auto &II : Inputs) {
510 if (
auto *IA = II.getAction())
520 if (II.isFilename()) {
521 CmdArgs.push_back(II.getFilename());
530 const Arg &A = II.getInputArg();
533 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
535 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
538 else if (A.getOption().matches(options::OPT_rpath) &&
542 A.renderAsInput(Args, CmdArgs);
544 if (
const Arg *A = Args.getLastArg(options::OPT_fveclib)) {
545 const llvm::Triple &Triple = TC.
getTriple();
546 StringRef
V = A->getValue();
547 if (
V ==
"ArmPL" && (Triple.isOSLinux() || Triple.isOSDarwin())) {
565 if (Triple.isOSLinux()) {
566 CmdArgs.push_back(Args.MakeArgString(
"--push-state"));
567 CmdArgs.push_back(Args.MakeArgString(
"--as-needed"));
569 if (!Args.hasArg(options::OPT_nostdlib))
570 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
571 CmdArgs.push_back(Args.MakeArgString(
"-lamath"));
572 if (!Args.hasArg(options::OPT_nostdlib))
573 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
574 if (Triple.isOSLinux())
575 CmdArgs.push_back(Args.MakeArgString(
"--pop-state"));
583 switch (
T.getArch()) {
584 case llvm::Triple::x86:
588 case llvm::Triple::aarch64:
589 if (
T.isOSManagarm())
590 return "aarch64managarm";
593 return "aarch64linux";
594 case llvm::Triple::aarch64_be:
596 return "aarch64elfb";
597 return "aarch64linuxb";
598 case llvm::Triple::arm:
599 case llvm::Triple::thumb:
600 case llvm::Triple::armeb:
601 case llvm::Triple::thumbeb: {
604 return IsBigEndian ?
"armelfb" :
"armelf";
605 return IsBigEndian ?
"armelfb_linux_eabi" :
"armelf_linux_eabi";
607 case llvm::Triple::m68k:
609 case llvm::Triple::ppc:
611 return "elf32ppclinux";
613 case llvm::Triple::ppcle:
615 return "elf32lppclinux";
617 case llvm::Triple::ppc64:
619 case llvm::Triple::ppc64le:
621 case llvm::Triple::riscv32:
622 return "elf32lriscv";
623 case llvm::Triple::riscv64:
624 return "elf64lriscv";
625 case llvm::Triple::riscv32be:
626 return "elf32briscv";
627 case llvm::Triple::riscv64be:
628 return "elf64briscv";
629 case llvm::Triple::sparc:
630 case llvm::Triple::sparcel:
631 return "elf32_sparc";
632 case llvm::Triple::sparcv9:
633 return "elf64_sparc";
634 case llvm::Triple::loongarch32:
635 return "elf32loongarch";
636 case llvm::Triple::loongarch64:
637 return "elf64loongarch";
638 case llvm::Triple::mips:
639 return "elf32btsmip";
640 case llvm::Triple::mipsel:
641 return "elf32ltsmip";
642 case llvm::Triple::mips64:
644 return "elf32btsmipn32";
645 return "elf64btsmip";
646 case llvm::Triple::mips64el:
648 return "elf32ltsmipn32";
649 return "elf64ltsmip";
650 case llvm::Triple::systemz:
652 case llvm::Triple::x86_64:
654 return "elf32_x86_64";
656 case llvm::Triple::ve:
658 case llvm::Triple::csky:
659 return "cskyelf_linux";
666 const ToolChain &TC,
const llvm::opt::ArgList &Args,
667 llvm::opt::ArgStringList &CmdArgs) {
673 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
674 StringRef
V = A->getValue();
675 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
676 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
678 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
679 << A->getSpelling() <<
V;
684 ArgStringList &CmdArgs,
687 const Arg *A = Args.getLastArg(options::OPT_gz_EQ);
691 StringRef
Value = A->getValue();
692 if (
Value ==
"none") {
693 CmdArgs.push_back(
"--compress-debug-sections=none");
694 }
else if (
Value ==
"zlib") {
695 if (llvm::compression::zlib::isAvailable()) {
697 Args.MakeArgString(
"--compress-debug-sections=" + Twine(
Value)));
699 D.
Diag(diag::warn_debug_compression_unavailable) <<
"zlib";
701 }
else if (
Value ==
"zstd") {
702 if (llvm::compression::zstd::isAvailable()) {
704 Args.MakeArgString(
"--compress-debug-sections=" + Twine(
Value)));
706 D.
Diag(diag::warn_debug_compression_unavailable) <<
"zstd";
709 D.
Diag(diag::err_drv_unsupported_option_argument)
710 << A->getSpelling() <<
Value;
716 std::vector<StringRef> &Features,
717 OptSpecifier OnOpt, OptSpecifier OffOpt,
718 StringRef FeatureName) {
719 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
720 if (A->getOption().matches(OnOpt))
721 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
723 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
729 const ArgList &Args) {
735 llvm::Triple::SubArchType SubArch =
T.getSubArch();
736 if (SubArch != llvm::Triple::NoSubArch &&
737 SubArch != llvm::AMDGPU::getMajorSubArch(SubArch))
741 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
748 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
749 return A->getValue();
757 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
758 StringRef CPU = A->getValue();
764 return llvm::sys::getHostCPUName();
774 const llvm::Triple &
T,
bool FromAs) {
777 switch (
T.getArch()) {
781 case llvm::Triple::aarch64:
782 case llvm::Triple::aarch64_32:
783 case llvm::Triple::aarch64_be:
786 case llvm::Triple::arm:
787 case llvm::Triple::armeb:
788 case llvm::Triple::thumb:
789 case llvm::Triple::thumbeb: {
790 StringRef MArch, MCPU;
795 case llvm::Triple::avr:
796 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
797 return A->getValue();
800 case llvm::Triple::m68k:
803 case llvm::Triple::mips:
804 case llvm::Triple::mipsel:
805 case llvm::Triple::mips64:
806 case llvm::Triple::mips64el: {
810 return std::string(CPUName);
813 case llvm::Triple::nvptx:
814 case llvm::Triple::nvptx64:
815 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
816 return A->getValue();
819 case llvm::Triple::ppc:
820 case llvm::Triple::ppcle:
821 case llvm::Triple::ppc64:
822 case llvm::Triple::ppc64le:
823 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
825 llvm::PPC::getNormalizedPPCTargetCPU(
T, A->getValue()));
826 return std::string(llvm::PPC::getNormalizedPPCTargetCPU(
T));
828 case llvm::Triple::csky:
829 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
830 return A->getValue();
831 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
832 return A->getValue();
835 case llvm::Triple::riscv32:
836 case llvm::Triple::riscv64:
837 case llvm::Triple::riscv32be:
838 case llvm::Triple::riscv64be:
841 case llvm::Triple::bpfel:
842 case llvm::Triple::bpfeb:
843 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
844 return A->getValue();
847 case llvm::Triple::sparc:
848 case llvm::Triple::sparcel:
849 case llvm::Triple::sparcv9:
852 case llvm::Triple::x86:
853 case llvm::Triple::x86_64:
856 case llvm::Triple::hexagon:
860 case llvm::Triple::lanai:
863 case llvm::Triple::systemz:
866 case llvm::Triple::amdgpu:
867 case llvm::Triple::r600:
870 case llvm::Triple::wasm32:
871 case llvm::Triple::wasm64:
874 case llvm::Triple::loongarch32:
875 case llvm::Triple::loongarch64:
878 case llvm::Triple::xtensa:
879 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
880 return A->getValue();
886 const llvm::Triple &Triple,
888 std::vector<StringRef> &Features) {
890 options::OPT_m_wasm_Features_Group);
894 const ArgList &Args, ArgStringList &CmdArgs,
895 bool ForAS,
bool IsAux) {
896 std::vector<StringRef> Features;
897 switch (Triple.getArch()) {
900 case llvm::Triple::mips:
901 case llvm::Triple::mipsel:
902 case llvm::Triple::mips64:
903 case llvm::Triple::mips64el:
906 case llvm::Triple::arm:
907 case llvm::Triple::armeb:
908 case llvm::Triple::thumb:
909 case llvm::Triple::thumbeb:
912 case llvm::Triple::ppc:
913 case llvm::Triple::ppcle:
914 case llvm::Triple::ppc64:
915 case llvm::Triple::ppc64le:
918 case llvm::Triple::riscv32:
919 case llvm::Triple::riscv64:
920 case llvm::Triple::riscv32be:
921 case llvm::Triple::riscv64be:
924 case llvm::Triple::systemz:
927 case llvm::Triple::aarch64:
928 case llvm::Triple::aarch64_32:
929 case llvm::Triple::aarch64_be:
932 case llvm::Triple::x86:
933 case llvm::Triple::x86_64:
936 case llvm::Triple::hexagon:
939 case llvm::Triple::wasm32:
940 case llvm::Triple::wasm64:
943 case llvm::Triple::sparc:
944 case llvm::Triple::sparcel:
945 case llvm::Triple::sparcv9:
948 case llvm::Triple::amdgpu:
949 case llvm::Triple::r600:
952 case llvm::Triple::nvptx:
953 case llvm::Triple::nvptx64:
956 case llvm::Triple::m68k:
959 case llvm::Triple::msp430:
962 case llvm::Triple::ve:
965 case llvm::Triple::csky:
968 case llvm::Triple::loongarch32:
969 case llvm::Triple::loongarch64:
975 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
976 CmdArgs.push_back(
Feature.data());
981 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
984 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
985 D.
Diag(diag::err_drv_invalid_int_value)
986 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
987 return LtoJobsArg->getValue();
992 return Triple.isPS();
997 ArgStringList &CmdArgs) {
999 if (Args.hasFlag(options::OPT_ffunction_sections,
1000 options::OPT_fno_function_sections, UseSeparateSections))
1001 CmdArgs.push_back(
"-ffunction-sections");
1003 bool HasDefaultDataSections = Triple.isOSBinFormatXCOFF();
1004 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1005 UseSeparateSections || HasDefaultDataSections))
1006 CmdArgs.push_back(
"-fdata-sections");
1010 const llvm::opt::ArgList &Args) {
1012 Arg *A = Args.getLastArg(options::OPT_mtls_dialect_EQ);
1014 return Triple.hasDefaultTLSDESC();
1015 StringRef
V = A->getValue();
1016 bool SupportedArgument =
false, EnableTLSDESC =
false;
1017 bool Unsupported = !Triple.isOSBinFormatELF();
1018 if (Triple.isLoongArch() || Triple.isRISCV()) {
1019 SupportedArgument =
V ==
"desc" ||
V ==
"trad";
1020 EnableTLSDESC =
V ==
"desc";
1021 }
else if (Triple.isX86()) {
1022 SupportedArgument =
V ==
"gnu" ||
V ==
"gnu2";
1023 EnableTLSDESC =
V ==
"gnu2";
1028 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1029 << A->getSpelling() << Triple.getTriple();
1030 }
else if (!SupportedArgument) {
1031 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument_for_target)
1032 << A->getSpelling() <<
V << Triple.getTriple();
1034 return EnableTLSDESC;
1038 llvm::opt::ArgStringList &CmdArgs) {
1039 if (Arg *A = Args.getLastArg(options::OPT_fthinlto_distributor_EQ)) {
1041 Args.MakeArgString(
"--thinlto-distributor=" + Twine(A->getValue())));
1043 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-remote-compiler=" +
1046 CmdArgs.push_back(Args.MakeArgString(
1047 "--thinlto-remote-compiler-prepend-arg=" + Twine(PA)));
1049 for (
const auto &A :
1050 Args.getAllArgValues(options::OPT_Xthinlto_distributor_EQ))
1051 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-distributor-arg=" + A));
1056 ArgStringList &CmdArgs,
const InputInfo &Output,
1059 const bool IsOSAIX = Triple.isOSAIX();
1060 const bool IsAMDGCN = Triple.isAMDGCN();
1061 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ);
1064 const bool IsFatLTO = Args.hasFlag(options::OPT_ffat_lto_objects,
1065 options::OPT_fno_fat_lto_objects,
false);
1066 const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
1068 assert(!Inputs.empty() &&
"Must have at least one input.");
1070 auto Input = llvm::find_if(
1072 if (Input == Inputs.end()) {
1075 Input = Inputs.begin();
1078 if (Linker !=
"lld" && Linker !=
"lld-link" &&
1079 llvm::sys::path::filename(LinkerPath) !=
"ld.lld" &&
1080 llvm::sys::path::stem(LinkerPath) !=
"ld.lld" && !Triple.isOSOpenBSD()) {
1084 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
1085 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
1088 CmdArgs.push_back(
"-plugin");
1091 const char *Suffix =
".dll";
1092#elif defined(__APPLE__)
1093 const char *Suffix =
".dylib";
1095 const char *Suffix =
".so";
1099 llvm::sys::path::native(Twine(D.
Dir) +
1100 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
1101 PluginName + Suffix,
1103 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
1108 CmdArgs.push_back(
"--fat-lto-objects");
1110 if (Args.hasArg(options::OPT_flto_partitions_EQ)) {
1112 StringRef A = Args.getLastArgValue(options::OPT_flto_partitions_EQ,
"8");
1113 if (A.getAsInteger(10,
Value) || (
Value < 1)) {
1114 Arg *Arg = Args.getLastArg(options::OPT_flto_partitions_EQ);
1115 D.
Diag(diag::err_drv_invalid_int_value)
1116 << Arg->getAsString(Args) << Arg->getValue();
1118 CmdArgs.push_back(Args.MakeArgString(
"--lto-partitions=" + A));
1122 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
1123 const char *ExtraDash = IsOSAIX ?
"-" :
"";
1124 const char *ParallelismOpt = IsOSAIX ?
"-threads=" :
"jobs=";
1129 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
1130 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1131 "-generate-arange-section"));
1135 Arg *ArgVecLib = Args.getLastArg(options::OPT_fveclib);
1136 if (ArgVecLib && ArgVecLib->getNumValues() == 1) {
1139 std::optional<StringRef> OptVal =
1140 llvm::StringSwitch<std::optional<StringRef>>(ArgVecLib->getValue())
1141 .Case(
"Accelerate",
"Accelerate")
1142 .Case(
"libmvec",
"LIBMVEC")
1143 .Case(
"AMDLIBM",
"AMDLIBM")
1144 .Case(
"MASSV",
"MASSV")
1145 .Case(
"SVML",
"SVML")
1146 .Case(
"SLEEF",
"sleefgnuabi")
1147 .Case(
"Darwin_libsystem_m",
"Darwin_libsystem_m")
1148 .Case(
"ArmPL",
"ArmPL")
1149 .Case(
"none",
"none")
1150 .Default(std::nullopt);
1153 CmdArgs.push_back(Args.MakeArgString(
1154 Twine(PluginOptPrefix) +
"-vector-library=" + OptVal.value()));
1164 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
1166 if (Args.getLastArg(options::OPT_O_Group)) {
1167 unsigned OptimizationLevel =
1169 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1170 "O" + Twine(OptimizationLevel)));
1173 Args.MakeArgString(Twine(
"--lto-CGO") + Twine(OptimizationLevel)));
1176 if (Args.hasArg(options::OPT_gsplit_dwarf)) {
1178 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1185 Args.MakeArgString(Twine(PluginOptPrefix) +
"dwo_dir=" + F +
"dwo"));
1188 if (IsThinLTO && !IsOSAIX)
1189 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
1190 else if (IsThinLTO && IsOSAIX)
1191 CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
1196 if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
1197 Args.hasArg(options::OPT_fenable_matrix))
1199 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-matrix"));
1202 if (!Parallelism.empty())
1203 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1204 ParallelismOpt + Parallelism));
1209 if (Arg *A = Args.getLastArg(options::OPT_fslp_vectorize,
1210 options::OPT_fno_slp_vectorize))
1211 CmdArgs.push_back(Args.MakeArgString(
1212 Twine(PluginOptPrefix) +
"-vectorize-slp=" +
1213 (A->getOption().matches(options::OPT_fslp_vectorize) ?
"1" :
"0")));
1216 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
1217 options::OPT_fno_global_isel)) {
1220 CmdArgs.push_back(Args.MakeArgString(
1221 Twine(PluginOptPrefix) +
"-global-isel=" +
1222 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
1227 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
1228 if (A->getOption().matches(options::OPT_glldb))
1230 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
1231 else if (A->getOption().matches(options::OPT_gsce))
1233 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
1234 else if (A->getOption().matches(options::OPT_gdbx))
1236 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
1239 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
1245 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
1249 Arg *A = Args.getLastArg(options::OPT_g_Group);
1250 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
1251 !A->getOption().matches(options::OPT_ggdb0);
1252 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
1253 options::OPT_gno_strict_dwarf,
true))
1255 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
1258 bool UseSeparateSections =
1261 if (Args.hasFlag(options::OPT_ffunction_sections,
1262 options::OPT_fno_function_sections, UseSeparateSections))
1264 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
1265 else if (Args.hasArg(options::OPT_fno_function_sections))
1267 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
1269 bool DataSectionsTurnedOff =
false;
1270 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1271 UseSeparateSections)) {
1273 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
1274 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
1275 DataSectionsTurnedOff =
true;
1277 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
1280 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
1281 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
1282 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
1283 options::OPT_mno_xcoff_roptr,
false);
1284 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
1286 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1287 << OptStr << Triple.str();
1293 if (DataSectionsTurnedOff)
1294 D.
Diag(diag::err_roptr_requires_data_sections);
1297 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
1302 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
1303 options::OPT_fno_split_machine_functions)) {
1304 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
1305 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1306 "-split-machine-functions"));
1310 Args.getLastArg(options::OPT_fpartition_static_data_sections,
1311 options::OPT_fno_partition_static_data_sections)) {
1312 if (A->getOption().matches(options::OPT_fpartition_static_data_sections)) {
1313 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1314 "-partition-static-data-sections"));
1319 StringRef FName = A->getValue();
1320 if (!llvm::sys::fs::exists(FName))
1321 D.
Diag(diag::err_drv_no_such_file) << FName;
1323 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1324 "sample-profile=" + FName));
1328 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1329 "cs-profile-generate"));
1330 if (CSPGOGenerateArg->getOption().matches(
1331 options::OPT_fcs_profile_generate_EQ)) {
1333 llvm::sys::path::append(Path,
"default_%m.profraw");
1334 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1335 "cs-profile-path=" + Path));
1338 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1339 "cs-profile-path=default_%m.profraw"));
1342 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1343 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1344 llvm::sys::path::append(Path,
"default.profdata");
1345 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1346 "cs-profile-path=" + Path));
1350 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1352 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1353 "-enable-jmc-instrument"));
1355 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1358 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1359 Triple.hasDefaultEmulatedTLS())) {
1361 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1365 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1367 if (Args.hasFlag(options::OPT_fstack_size_section,
1368 options::OPT_fno_stack_size_section,
false))
1370 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1372 if (Args.hasFlag(options::OPT_fexperimental_call_graph_section,
1373 options::OPT_fno_experimental_call_graph_section,
false))
1375 Args.MakeArgString(Twine(PluginOptPrefix) +
"-call-graph-section"));
1379 if (!StatsFile.empty())
1381 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1384 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1385 CmdArgs.push_back(Args.MakeArgString(
1386 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1397 Output, PluginOptPrefix);
1403 true, PluginOptPrefix);
1405 bool IsELF = Triple.isOSBinFormatELF();
1407 bool ImplicitMapSyms =
false;
1408 for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
1409 for (StringRef
V : A->getValues()) {
1410 auto Equal =
V.split(
'=');
1411 auto checkArg = [&](
bool ValidTarget,
1412 std::initializer_list<const char *>
Set) {
1414 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1415 << (Twine(
"-Wa,") +
Equal.first +
"=").str()
1416 << Triple.getTriple();
1417 }
else if (!llvm::is_contained(
Set,
Equal.second)) {
1418 D.
Diag(diag::err_drv_unsupported_option_argument)
1419 << (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
1422 if (
Equal.first ==
"-mmapsyms") {
1423 ImplicitMapSyms =
Equal.second ==
"implicit";
1424 checkArg(IsELF && Triple.isAArch64(), {
"default",
"implicit"});
1425 }
else if (
V ==
"--crel")
1427 else if (
V ==
"--no-crel")
1435 if (IsELF && !Triple.isMIPS()) {
1436 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"-crel"));
1438 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1442 if (ImplicitMapSyms)
1444 Args.MakeArgString(Twine(PluginOptPrefix) +
"-implicit-mapsyms"));
1446 if (Args.hasArg(options::OPT_ftime_report))
1448 Args.MakeArgString(Twine(PluginOptPrefix) +
"-time-passes"));
1454 const ArgList &Args,
1455 ArgStringList &CmdArgs) {
1460 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1461 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1465 ArgStringList &CmdArgs) {
1466 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1467 options::OPT_fno_rtlib_add_rpath,
false))
1471 const llvm::Triple &Triple = TC.
getTriple();
1472 if ((!Triple.isOSBinFormatELF() && !Triple.isOSBinFormatMachO()))
1481 llvm::sys::path::append(P, M.gccSuffix());
1482 CandidateRPaths.emplace_back(std::string(P));
1484 CandidateRPaths.emplace_back(*StdlibPath);
1486 for (
const auto &CandidateRPath : CandidateRPaths) {
1487 if (TC.
getVFS().exists(CandidateRPath)) {
1488 CmdArgs.push_back(
"-rpath");
1489 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1495 ArgStringList &CmdArgs,
1496 const ToolChain &TC,
const ArgList &Args) {
1498 if (!Args.hasFlag(options::OPT_foffload_via_llvm,
1499 options::OPT_fno_offload_via_llvm,
false))
1502 if (
const Arg *A = Args.getLastArg(options::OPT_fgpu_default_stream_EQ);
1503 A && StringRef(A->getValue()) ==
"per-thread")
1504 CmdArgs.push_back(Args.MakeArgString(
1505 TC.
GetFilePath(
"LLVMOffloadKernelPerThreadDefaultStream.o")));
1507 CmdArgs.push_back(
"-lLLVMOffloadKernel");
1512 const ToolChain &TC,
const ArgList &Args,
1513 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1515 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1516 options::OPT_fno_openmp,
false))
1525 if (ForceStaticHostRuntime)
1526 CmdArgs.push_back(
"-Bstatic");
1530 CmdArgs.push_back(
"-lomp");
1533 CmdArgs.push_back(
"-lgomp");
1536 CmdArgs.push_back(
"-liomp5");
1542 if (ForceStaticHostRuntime)
1543 CmdArgs.push_back(
"-Bdynamic");
1546 CmdArgs.push_back(
"-lrt");
1548 if (IsOffloadingHost)
1549 CmdArgs.push_back(
"-lomptarget");
1558 const llvm::opt::ArgList &Args,
1559 llvm::opt::ArgStringList &CmdArgs) {
1565 constexpr llvm::StringLiteral Targets(
"--offload-targets=");
1569 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1570 [](
auto TC) { return TC.second->getTripleString(); });
1572 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1576 ArgStringList &CmdArgs, StringRef Sanitizer,
1577 bool IsShared,
bool IsWhole) {
1580 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1584 CmdArgs.push_back(
"--no-whole-archive");
1590 ArgStringList &CmdArgs,
1591 StringRef Sanitizer) {
1596 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1599 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1600 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1607 const llvm::opt::ArgList &Args,
1608 llvm::opt::ArgStringList &CmdArgs,
1611 "AIX linker does not support any form of --as-needed option yet.");
1619 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1620 CmdArgs.push_back(
"-z");
1621 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1623 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1628 const llvm::opt::ArgList &Args,
1629 ArgStringList &CmdArgs) {
1634 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1636 CmdArgs.push_back(
"-lpthread");
1638 CmdArgs.push_back(
"-lrt");
1640 CmdArgs.push_back(
"-lm");
1645 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1646 CmdArgs.push_back(
"-ldl");
1650 CmdArgs.push_back(
"-lexecinfo");
1652 CmdArgs.push_back(
"-lbsd");
1658 CmdArgs.push_back(
"-lresolv");
1669 for (
const auto &Entry : llvm::make_range(
C.getOffloadToolChains(Kind))) {
1672 const llvm::Triple &TT = DevTC->
getTriple();
1677 C.getDriver().getOffloadArchs(
C,
C.getArgs(), Kind, *DevTC)) {
1678 const ArgList &DevArgs =
C.getArgsForToolChain(DevTC, BA, Kind);
1690 const ArgList &Args,
1696 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1703 SharedRuntimes.push_back(
"asan");
1704 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1705 HelperStaticRuntimes.push_back(
"asan-preinit");
1708 SharedRuntimes.push_back(
"memprof");
1709 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1710 HelperStaticRuntimes.push_back(
"memprof-preinit");
1713 SharedRuntimes.push_back(
"nsan");
1716 SharedRuntimes.push_back(
"ubsan_minimal");
1718 SharedRuntimes.push_back(
"ubsan_standalone");
1721 SharedRuntimes.push_back(
"scudo_standalone");
1724 SharedRuntimes.push_back(
"tsan");
1726 SharedRuntimes.push_back(
"tysan");
1729 SharedRuntimes.push_back(
"hwasan_aliases");
1731 SharedRuntimes.push_back(
"hwasan");
1732 if (!Args.hasArg(options::OPT_shared))
1733 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1736 SharedRuntimes.push_back(
"rtsan");
1741 StaticRuntimes.push_back(
"stats_client");
1745 HelperStaticRuntimes.push_back(
"asan_static");
1748 if (NeedsOffloadRt) {
1749 NonWholeStaticRuntimes.push_back(
"ubsan_offload");
1750 RequiredSymbols.push_back(
"__ubsan_offload_init");
1754 if (Args.hasArg(options::OPT_shared)) {
1757 StaticRuntimes.push_back(
"ubsan_standalone");
1765 StaticRuntimes.push_back(
"asan");
1767 StaticRuntimes.push_back(
"asan_cxx");
1772 StaticRuntimes.push_back(
"rtsan");
1775 StaticRuntimes.push_back(
"memprof");
1777 StaticRuntimes.push_back(
"memprof_cxx");
1782 StaticRuntimes.push_back(
"hwasan_aliases");
1784 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1786 StaticRuntimes.push_back(
"hwasan");
1788 StaticRuntimes.push_back(
"hwasan_cxx");
1792 StaticRuntimes.push_back(
"dfsan");
1794 StaticRuntimes.push_back(
"lsan");
1796 StaticRuntimes.push_back(
"msan");
1798 StaticRuntimes.push_back(
"msan_cxx");
1801 StaticRuntimes.push_back(
"nsan");
1803 StaticRuntimes.push_back(
"tsan");
1805 StaticRuntimes.push_back(
"tsan_cxx");
1808 StaticRuntimes.push_back(
"tysan");
1811 StaticRuntimes.push_back(
"ubsan_minimal");
1813 StaticRuntimes.push_back(
"ubsan_standalone");
1817 NonWholeStaticRuntimes.push_back(
"safestack");
1818 RequiredSymbols.push_back(
"__safestack_init");
1822 StaticRuntimes.push_back(
"cfi");
1824 StaticRuntimes.push_back(
"cfi_diag");
1829 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1832 NonWholeStaticRuntimes.push_back(
"stats");
1833 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1836 StaticRuntimes.push_back(
"scudo_standalone");
1838 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1841 StaticRuntimes.push_back(
"ubsan_loop_detect");
1850 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1853 NonWholeStaticRuntimes, HelperStaticRuntimes,
1858 for (
auto S : RequiredSymbols) {
1859 CmdArgs.push_back(
"-u");
1860 CmdArgs.push_back(Args.MakeArgString(S));
1864 for (
auto RT : SharedRuntimes)
1868 bool FuzzerNeedsSanitizerDeps =
false;
1870 !Args.hasArg(options::OPT_shared)) {
1873 FuzzerNeedsSanitizerDeps =
true;
1877 if (!Args.hasArg(options::OPT_nostdlibxx)) {
1878 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1879 !Args.hasArg(options::OPT_static);
1880 if (OnlyLibstdcxxStatic)
1881 CmdArgs.push_back(
"-Bstatic");
1883 if (OnlyLibstdcxxStatic)
1884 CmdArgs.push_back(
"-Bdynamic");
1888 for (
auto RT : HelperStaticRuntimes)
1890 bool AddExportDynamic =
false;
1891 for (
auto RT : StaticRuntimes) {
1895 for (
auto RT : NonWholeStaticRuntimes) {
1901 if (AddExportDynamic && !TC.
getTriple().isNVPTX())
1902 CmdArgs.push_back(
"--export-dynamic");
1905 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1908 CmdArgs.push_back(
"-z");
1910 Args.MakeArgString(
"memtag-mode=" + SanArgs.
getMemtagMode()));
1913 CmdArgs.push_back(
"-z");
1914 CmdArgs.push_back(
"memtag-heap");
1918 CmdArgs.push_back(
"-z");
1919 CmdArgs.push_back(
"memtag-stack");
1923 CmdArgs.push_back(
"--android-memtag-note");
1926 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty() ||
1927 FuzzerNeedsSanitizerDeps;
1932 if (Args.hasArg(options::OPT_shared)) {
1934 CmdArgs.push_back(
"--whole-archive");
1936 CmdArgs.push_back(
"--no-whole-archive");
1940 CmdArgs.push_back(
"--whole-archive");
1942 for (
const auto &Mode : XRay.
modeList())
1944 CmdArgs.push_back(
"--no-whole-archive");
1952 const llvm::opt::ArgList &Args,
1953 ArgStringList &CmdArgs) {
1955 CmdArgs.push_back(
"-lpthread");
1957 CmdArgs.push_back(
"-lrt");
1958 CmdArgs.push_back(
"-lm");
1963 CmdArgs.push_back(
"-ldl");
1968 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1969 return !A->getOption().matches(options::OPT_O0);
1977 auto AddPostfix = [JA](
auto &F) {
1982 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1983 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1987 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1990 if (Args.hasArg(options::OPT_o, options::OPT__SLASH_o,
1991 options::OPT__SLASH_Fo) &&
1992 Args.hasArg(options::OPT_c) && Output.
isFilename()) {
1996 llvm::sys::path::remove_filename(
T);
1997 llvm::sys::path::append(
T, llvm::sys::path::stem(Obj));
1999 return Args.MakeArgString(
T);
2005 return Args.MakeArgString(
T);
2009 const JobAction &JA,
const ArgList &Args,
2010 const InputInfo &Output,
const char *OutFile) {
2011 ArgStringList ExtractArgs;
2012 ExtractArgs.push_back(
"--extract-dwo");
2014 ArgStringList StripArgs;
2015 StripArgs.push_back(
"--strip-dwo");
2020 ExtractArgs.push_back(OutFile);
2027 C.addCommand(std::make_unique<Command>(JA,
T,
2029 Exec, ExtractArgs, II, Output));
2032 C.addCommand(std::make_unique<Command>(
2042 Args.ClaimAllArgs(options::OPT_flto_EQ);
2043 Args.ClaimAllArgs(options::OPT_flto);
2044 Args.ClaimAllArgs(options::OPT_fno_lto);
2048 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
2049 options::OPT_fcs_profile_generate_EQ,
2050 options::OPT_fno_profile_generate);
2051 if (CSPGOGenerateArg &&
2052 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
2053 CSPGOGenerateArg =
nullptr;
2055 return CSPGOGenerateArg;
2059 auto *ProfileUseArg = Args.getLastArg(
2060 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
2061 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2062 options::OPT_fno_profile_instr_use);
2064 if (ProfileUseArg &&
2065 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2066 ProfileUseArg =
nullptr;
2068 return ProfileUseArg;
2072 auto *ProfileSampleUseArg = Args.getLastArg(
2073 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
2075 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
2076 options::OPT_fno_profile_sample_use)))
2079 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
2084 case llvm::Reloc::Static:
2086 case llvm::Reloc::PIC_:
2088 case llvm::Reloc::DynamicNoPIC:
2089 return "dynamic-no-pic";
2090 case llvm::Reloc::ROPI:
2092 case llvm::Reloc::RWPI:
2094 case llvm::Reloc::ROPI_RWPI:
2097 llvm_unreachable(
"Unknown Reloc::Model kind");
2104std::tuple<llvm::Reloc::Model, unsigned, bool>
2112 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
2114 bool IsPICLevelTwo = PIC;
2117 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
2120 if (Triple.isAndroid()) {
2121 switch (Triple.getArch()) {
2122 case llvm::Triple::x86:
2123 case llvm::Triple::x86_64:
2125 IsPICLevelTwo =
true;
2135 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
2139 if (Triple.isOSOpenBSD()) {
2141 case llvm::Triple::arm:
2142 case llvm::Triple::aarch64:
2143 case llvm::Triple::mips64:
2144 case llvm::Triple::mips64el:
2145 case llvm::Triple::x86:
2146 case llvm::Triple::x86_64:
2147 IsPICLevelTwo =
false;
2150 case llvm::Triple::ppc:
2151 case llvm::Triple::sparcv9:
2152 IsPICLevelTwo =
true;
2164 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2165 options::OPT_fpic, options::OPT_fno_pic,
2166 options::OPT_fPIE, options::OPT_fno_PIE,
2167 options::OPT_fpie, options::OPT_fno_pie);
2168 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
2169 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
2170 options::OPT_fPIE, options::OPT_fpie)) {
2172 << LastPICArg->getSpelling() << Triple.str();
2173 if (Triple.getArch() == llvm::Triple::x86_64)
2174 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
2175 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2182 Option O = LastPICArg->getOption();
2183 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2184 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2185 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2187 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2189 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
2192 if (EffectiveTriple.isPS()) {
2193 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
2194 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
2195 if (Model !=
"kernel") {
2198 << LastPICArg->getSpelling()
2199 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
2209 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
2215 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
2216 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
2219 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2222 if (!Triple.isOSDarwin())
2224 << A->getSpelling() << Triple.str();
2233 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
2236 bool EmbeddedPISupported;
2237 switch (Triple.getArch()) {
2238 case llvm::Triple::arm:
2239 case llvm::Triple::armeb:
2240 case llvm::Triple::thumb:
2241 case llvm::Triple::thumbeb:
2242 EmbeddedPISupported =
true;
2245 EmbeddedPISupported =
false;
2249 bool ROPI =
false, RWPI =
false;
2250 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
2251 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
2252 if (!EmbeddedPISupported)
2254 << LastROPIArg->getSpelling() << Triple.str();
2257 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2258 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2259 if (!EmbeddedPISupported)
2261 << LastRWPIArg->getSpelling() << Triple.str();
2266 if ((ROPI || RWPI) && (PIC || PIE))
2269 if (Triple.isMIPS()) {
2276 if (ABIName ==
"n64")
2279 if(Args.hasArg(options::OPT_mno_abicalls))
2280 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2283 IsPICLevelTwo =
false;
2287 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2289 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2291 RelocM = llvm::Reloc::ROPI_RWPI;
2293 RelocM = llvm::Reloc::ROPI;
2295 RelocM = llvm::Reloc::RWPI;
2297 return std::make_tuple(RelocM, 0
U,
false);
2301 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
2302 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
2304 const llvm::opt::OptTable &Opts = D.
getOpts();
2305 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
2306 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
2307 D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
2309 return HasStaticPIE;
2329 const ArgList &Args) {
2330 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2331 options::OPT_falign_functions_EQ,
2332 options::OPT_fno_align_functions);
2333 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2336 if (A->getOption().matches(options::OPT_falign_functions))
2340 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2342 << A->getAsString(Args) << A->getValue();
2347 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2348 switch (DebugInfoKind) {
2349 case llvm::codegenoptions::DebugDirectivesOnly:
2350 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2352 case llvm::codegenoptions::DebugLineTablesOnly:
2353 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2355 case llvm::codegenoptions::DebugInfoConstructor:
2356 CmdArgs.push_back(
"-debug-info-kind=constructor");
2358 case llvm::codegenoptions::LimitedDebugInfo:
2359 CmdArgs.push_back(
"-debug-info-kind=limited");
2361 case llvm::codegenoptions::FullDebugInfo:
2362 CmdArgs.push_back(
"-debug-info-kind=standalone");
2364 case llvm::codegenoptions::UnusedTypeInfo:
2365 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2375 assert(A.getOption().matches(options::OPT_gN_Group) &&
2376 "Not a -g option that specifies a debug-info level");
2377 if (A.getOption().matches(options::OPT_g0) ||
2378 A.getOption().matches(options::OPT_ggdb0))
2379 return llvm::codegenoptions::NoDebugInfo;
2380 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2381 A.getOption().matches(options::OPT_ggdb1))
2382 return llvm::codegenoptions::DebugLineTablesOnly;
2383 if (A.getOption().matches(options::OPT_gline_directives_only))
2384 return llvm::codegenoptions::DebugDirectivesOnly;
2385 return llvm::codegenoptions::DebugInfoConstructor;
2389 const ArgList &Args) {
2390 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2396 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 6 ||
2399 << A->getAsString(Args) << A->getValue();
2404 return llvm::StringSwitch<unsigned>(ArgValue)
2405 .Case(
"-gdwarf-2", 2)
2406 .Case(
"-gdwarf-3", 3)
2407 .Case(
"-gdwarf-4", 4)
2408 .Case(
"-gdwarf-5", 5)
2409 .Case(
"-gdwarf-6", 6)
2414 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2415 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2416 options::OPT_gdwarf_6, options::OPT_gdwarf);
2420 const llvm::opt::ArgList &Args) {
2425 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2426 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2427 << GDwarfN->getSpelling() << TC.
getTriple().str();
2429 if (DwarfVersion == 0) {
2431 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2433 return DwarfVersion;
2437 const ArgList &Args, Arg *&Arg) {
2438 Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
2439 options::OPT_gno_split_dwarf);
2440 if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
2443 if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
2446 StringRef
Value = Arg->getValue();
2447 if (
Value ==
"split")
2449 if (
Value ==
"single")
2452 D.
Diag(diag::err_drv_unsupported_option_argument)
2453 << Arg->getSpelling() << Arg->getValue();
2459 assert(A &&
"Expected non-nullptr argument.");
2462 D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
2468 const ArgList &Args,
2469 ArgStringList &CmdArgs) {
2470 if (Args.hasFlag(options::OPT_fdebug_info_for_profiling,
2471 options::OPT_fno_debug_info_for_profiling,
false) &&
2473 Args.getLastArg(options::OPT_fdebug_info_for_profiling), Args, D, TC))
2474 CmdArgs.push_back(
"-fdebug-info-for-profiling");
2478 ArgStringList &CmdArgs) {
2479 llvm::Reloc::Model RelocationModel;
2484 if (RelocationModel != llvm::Reloc::Static)
2485 CmdArgs.push_back(
"-KPIC");
2491 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2497 const ArgList &Args) {
2498 if (Args.hasArg(options::OPT_static_libgcc) ||
2499 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2503 if (Args.hasArg(options::OPT_shared_libgcc))
2522 ArgStringList &CmdArgs,
const ArgList &Args) {
2526 CmdArgs.push_back(
"-l:libunwind.a");
2549 CmdArgs.push_back(
"-lgcc_eh");
2551 CmdArgs.push_back(
"-lgcc_s");
2559 CmdArgs.push_back(
"-lunwind");
2561 CmdArgs.push_back(
"-l:libunwind.a");
2564 CmdArgs.push_back(
"-l:libunwind.dll.a");
2566 CmdArgs.push_back(
"-l:libunwind.so");
2570 CmdArgs.push_back(
"-lunwind");
2580 ArgStringList &CmdArgs,
const ArgList &Args) {
2584 CmdArgs.push_back(
"-lgcc");
2588 CmdArgs.push_back(
"-lgcc");
2592 CmdArgs.push_back(
"--as-needed");
2594 CmdArgs.push_back(
"--no-as-needed");
2599 ArgStringList &CmdArgs,
const ArgList &Args) {
2610 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2613 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2614 if (A && A->getValue() != StringRef(
"platform")) {
2615 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2616 << A->getValue() <<
"MSVC";
2626 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2627 !Args.hasArg(options::OPT_static_pie))
2628 CmdArgs.push_back(
"-ldl");
2635 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2641 StringRef SaveStats = A->getValue();
2642 if (SaveStats ==
"obj" && Output.
isFilename()) {
2644 llvm::sys::path::remove_filename(StatsFile);
2645 }
else if (SaveStats !=
"cwd") {
2646 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2650 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2651 llvm::sys::path::append(StatsFile, BaseName);
2652 llvm::sys::path::replace_extension(StatsFile,
"stats");
2664 assert(Flag.front() ==
'-');
2666 Flags.push_back(Flag.str());
2668 Flags.push_back((
"!" + Flag.substr(1)).str());
2673 ArgStringList &CmdArgs,
bool IsLTO,
2674 const StringRef PluginOptPrefix) {
2675 auto addArg = [&, IsLTO](
const Twine &Arg) {
2677 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2678 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2680 CmdArgs.push_back(
"-mllvm");
2681 CmdArgs.push_back(Args.MakeArgString(Arg));
2685 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2686 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2688 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2689 StringRef
Value = A->getValue();
2691 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2692 !llvm::isPowerOf2_64(Boundary)) {
2693 D.
Diag(diag::err_drv_invalid_argument_to_option)
2694 <<
Value << A->getOption().getName();
2696 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2699 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2700 std::string AlignBranch;
2701 for (StringRef
T : A->getValues()) {
2702 if (
T !=
"fused" &&
T !=
"jcc" &&
T !=
"jmp" &&
T !=
"call" &&
2703 T !=
"ret" &&
T !=
"indirect")
2704 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2705 <<
T <<
"fused, jcc, jmp, call, ret, indirect";
2706 if (!AlignBranch.empty())
2710 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2712 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2713 StringRef
Value = A->getValue();
2714 unsigned PrefixSize;
2715 if (
Value.getAsInteger(10, PrefixSize)) {
2716 D.
Diag(diag::err_drv_invalid_argument_to_option)
2717 <<
Value << A->getOption().getName();
2719 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2724static llvm::opt::Arg *
2726 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2730 const llvm::opt::ArgList &Args) {
2731 const unsigned MinCodeObjVer = 4;
2732 const unsigned MaxCodeObjVer = 6;
2735 if (CodeObjArg->getOption().getID() ==
2736 options::OPT_mcode_object_version_EQ) {
2737 unsigned CodeObjVer = MaxCodeObjVer;
2739 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2740 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2741 D.
Diag(diag::err_drv_invalid_int_value)
2742 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2748 const llvm::opt::ArgList &Args) {
2749 unsigned CodeObjVer = 6;
2751 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2756 const Driver &D,
const llvm::opt::ArgList &Args) {
2761 const llvm::opt::ArgList &Args,
2762 llvm::opt::ArgStringList &CmdArgs,
2763 const llvm::Triple &Triple,
bool IsLTO,
2764 const StringRef PluginOptPrefix) {
2765 auto addArg = [&, IsLTO](
const Twine &Arg) {
2767 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2768 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2770 CmdArgs.push_back(
"-mllvm");
2771 CmdArgs.push_back(Args.MakeArgString(Arg));
2775 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2776 options::OPT_mno_outline)) {
2777 if (A->getOption().matches(options::OPT_moutline)) {
2781 if (Triple.isARM() || Triple.isThumb() || Triple.isAArch64() ||
2782 Triple.isRISCV() || Triple.isX86()) {
2783 addArg(Twine(
"-enable-machine-outliner"));
2785 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2791 CmdArgs.push_back(
"-mno-outline");
2794 addArg(Twine(
"-enable-machine-outliner=never"));
2798 auto *CodeGenDataGenArg =
2799 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
2800 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
2803 if (CodeGenDataGenArg && CodeGenDataUseArg)
2804 D.
Diag(diag::err_drv_argument_not_allowed_with)
2805 << CodeGenDataGenArg->getAsString(Args)
2806 << CodeGenDataUseArg->getAsString(Args);
2810 if (CodeGenDataGenArg)
2811 addArg(Twine(
"-codegen-data-generate"));
2814 if (CodeGenDataUseArg)
2815 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
2819 const llvm::opt::ArgList &Args,
2820 llvm::opt::ArgStringList &CmdArgs,
2821 const llvm::Triple &Triple) {
2822 if (Arg *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
2823 options::OPT_fno_split_machine_functions)) {
2824 if (!A->getOption().matches(options::OPT_fno_split_machine_functions)) {
2826 if ((Triple.isX86() || Triple.isAArch64()) && Triple.isOSBinFormatELF())
2827 A->render(Args, CmdArgs);
2829 D.
Diag(diag::err_drv_unsupported_opt_for_target)
2830 << A->getAsString(Args) << Triple.getTriple();
2836 const llvm::opt::ArgList &DriverArgs,
2837 llvm::opt::ArgStringList &CC1Args,
2838 StringRef BitcodeSuffix,
2839 const llvm::Triple &Triple,
2844 std::optional<std::string> LibPath =
2845 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2848 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2849 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2850 for (StringRef Path : Frags)
2851 LibraryPaths.emplace_back(Path.trim());
2856 LibraryPaths.emplace_back(LibPath);
2860 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
2861 LibraryPaths.emplace_back(P);
2863 OptSpecifier LibomptargetBCPathOpt =
2864 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
2865 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
2866 : options::OPT_libomptarget_spirv_bc_path_EQ;
2868 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
2869 : Triple.isNVPTX() ?
"nvptx"
2871 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
2874 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
2876 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
2877 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
2878 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2881 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2882 CC1Args.push_back(
"-mlink-builtin-bitcode");
2883 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2885 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
2886 << LibOmpTargetFile;
2889 bool FoundBCLibrary =
false;
2891 for (StringRef LibraryPath : LibraryPaths) {
2893 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2894 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2895 CC1Args.push_back(
"-mlink-builtin-bitcode");
2896 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2897 FoundBCLibrary =
true;
2902 if (!FoundBCLibrary)
2903 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
2904 << LibOmpTargetName << ArchPrefix;
2909 const llvm::opt::ArgList &DriverArgs,
2910 llvm::opt::ArgStringList &CC1Args) {
2912 StringRef LibclcNamespec;
2913 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
2916 LibclcNamespec = A->getValue();
2918 if (!TT.isAMDGPU() || TT.getEnvironment() != llvm::Triple::LLVM)
2922 if (DriverArgs.hasArg(options::OPT_no_offloadlib,
2923 options::OPT_nodefaultlibs, options::OPT_nostdlib))
2927 bool FilenameSearch = LibclcNamespec.consume_front(
":");
2928 if (FilenameSearch) {
2930 if (D.
getVFS().exists(LibclcFile)) {
2931 CC1Args.push_back(
"-mlink-builtin-bitcode");
2932 CC1Args.push_back(DriverArgs.MakeArgString(LibclcFile));
2935 D.
Diag(diag::err_drv_libclc_not_found) << LibclcFile;
2941 llvm::sys::path::append(ResourceLibPath,
"lib");
2944 if (
const Arg *CPUArg = DriverArgs.getLastArg(options::OPT_mcpu_EQ))
2945 CPU = CPUArg->getValue();
2948 auto TryTriplePath = [&](StringRef TripleStr) ->
bool {
2950 llvm::sys::path::append(BasePath, TripleStr);
2957 llvm::sys::path::append(CPUPath, CPU,
"libclc.bc");
2958 if (D.
getVFS().exists(CPUPath)) {
2959 CC1Args.push_back(
"-mlink-builtin-bitcode");
2960 CC1Args.push_back(DriverArgs.MakeArgString(CPUPath));
2967 llvm::sys::path::append(GenericPath,
"libclc.bc");
2968 if (D.
getVFS().exists(GenericPath)) {
2969 CC1Args.push_back(
"-mlink-builtin-bitcode");
2970 CC1Args.push_back(DriverArgs.MakeArgString(GenericPath));
2977 if (TryTriplePath(TT.str()))
2980 llvm::Triple::SubArchType SubArch = TT.getSubArch();
2981 if (TT.isAMDGCN() && SubArch != llvm::Triple::NoSubArch) {
2986 llvm::Triple::SubArchType MajorSubArch =
2987 llvm::AMDGPU::getMajorSubArch(SubArch);
2988 if (MajorSubArch != SubArch) {
2989 llvm::Triple MajorTT(TT);
2990 MajorTT.setArch(TT.getArch(), MajorSubArch);
2991 if (TryTriplePath(MajorTT.str()))
2996 llvm::Triple NoSubArchTT(TT);
2997 NoSubArchTT.setArch(TT.getArch(), llvm::Triple::NoSubArch);
2998 if (TryTriplePath(NoSubArchTT.str()))
3002 D.
Diag(diag::err_drv_libclc_not_found) <<
"libclc.bc";
3007 const llvm::opt::ArgList &Args,
3008 llvm::opt::ArgStringList &CmdArgs,
3009 const llvm::Triple &Triple) {
3010 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3011 options::OPT_mno_outline_atomics)) {
3013 if (!Triple.isAArch64()) {
3014 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3015 << Triple.getArchName() << A->getOption().getName();
3017 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3018 CmdArgs.push_back(
"-target-feature");
3019 CmdArgs.push_back(
"+outline-atomics");
3021 CmdArgs.push_back(
"-target-feature");
3022 CmdArgs.push_back(
"-outline-atomics");
3026 CmdArgs.push_back(
"-target-feature");
3027 CmdArgs.push_back(
"+outline-atomics");
3032 llvm::opt::ArgStringList &CmdArgs) {
3033 if (TCArgs.hasFlag(options::OPT_offload_compress,
3034 options::OPT_no_offload_compress,
false))
3035 CmdArgs.push_back(
"--compress");
3036 if (TCArgs.hasArg(options::OPT_v))
3037 CmdArgs.push_back(
"--verbose");
3038 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3040 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3044 const llvm::Triple &Triple,
3045 const llvm::Reloc::Model &RelocationModel,
3046 llvm::opt::ArgStringList &CmdArgs) {
3047 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3048 StringRef CM = A->getValue();
3050 if (Triple.isOSAIX() && CM ==
"medium")
3052 if (Triple.isAArch64(64)) {
3053 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3054 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3055 RelocationModel != llvm::Reloc::Static)
3056 D.
Diag(diag::err_drv_argument_only_allowed_with)
3057 << A->getAsString(Args) <<
"-fno-pic";
3058 }
else if (Triple.isLoongArch()) {
3059 if (CM ==
"extreme" &&
3060 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3061 D.
Diag(diag::err_drv_argument_not_allowed_with)
3062 << A->getAsString(Args) <<
"-fplt";
3063 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3066 CM = llvm::StringSwitch<StringRef>(CM)
3067 .Case(
"normal",
"small")
3068 .Case(
"extreme",
"large")
3070 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3071 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3072 }
else if (Triple.isRISCV()) {
3074 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3075 D.
Diag(diag::err_drv_argument_not_allowed_with)
3076 << A->getAsString(Args) <<
"-fpic";
3079 else if (CM ==
"medany")
3081 Ok = CM ==
"small" || CM ==
"medium" ||
3082 (CM ==
"large" && Triple.isRISCV64());
3083 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3084 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3085 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3089 }
else if (Triple.isSPARC64()) {
3092 else if (CM ==
"medmid")
3094 else if (CM ==
"medany")
3096 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3097 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3098 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3101 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3103 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3104 << A->getSpelling() << CM << Triple.getTriple();
3108 if (Triple.getArch() == llvm::Triple::x86_64) {
3109 bool IsMediumCM =
false;
3110 bool IsLargeCM =
false;
3111 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3112 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3113 IsLargeCM = StringRef(A->getValue()) ==
"large";
3115 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3116 if (!IsMediumCM && !IsLargeCM) {
3117 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3118 << A->getOption().getRenderName();
3120 A->render(Args, CmdArgs);
3122 }
else if (IsMediumCM) {
3123 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3124 }
else if (IsLargeCM) {
3125 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3131 ArgStringList &CmdArgs) {
3136 Args.getLastArg(options::OPT_fcolor_diagnostics,
3137 options::OPT_fno_color_diagnostics);
3138 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3139 StringRef
Value(A->getValue());
3141 D.
Diag(diag::err_drv_invalid_argument_to_option)
3142 <<
Value << A->getOption().getName();
3147 CmdArgs.push_back(
"-fcolor-diagnostics");
3150 CmdArgs.push_back(
"-fno-color-diagnostics");
3159 for (; *Arg; ++Arg) {
3165 Res.push_back(
'\\');
3168 Res.push_back(*Arg);
3173 const llvm::opt::ArgList &Args) {
3177 llvm::opt::ArgStringList OriginalArgs;
3178 for (
const auto &Arg : Args)
3179 Arg->render(Args, OriginalArgs);
3183 for (
const char *OriginalArg : OriginalArgs) {
3187 Flags += EscapedArg;
3190 return Args.MakeArgString(Flags);
3194 const llvm::opt::ArgList &Args,
3195 bool &FRecordCommandLine,
3196 bool &GRecordCommandLine,
3197 bool &DXRecordCommandLine) {
3200 const std::string &TripleStr = Triple.getTriple();
3202 FRecordCommandLine =
3203 Args.hasFlag(options::OPT_frecord_command_line,
3204 options::OPT_fno_record_command_line,
false);
3205 GRecordCommandLine =
3206 Args.hasFlag(options::OPT_grecord_command_line,
3207 options::OPT_gno_record_command_line,
false);
3208 DXRecordCommandLine = Triple.isDXIL() && Args.hasArg(options::OPT_g_Flag);
3209 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3210 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3211 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3212 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3216 DXRecordCommandLine;
3220 ArgStringList &CmdArgs,
3221 const llvm::Triple &Triple) {
3222 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
3223 options::OPT_fno_global_isel)) {
3224 CmdArgs.push_back(
"-mllvm");
3225 if (A->getOption().matches(options::OPT_fglobal_isel)) {
3226 CmdArgs.push_back(
"-global-isel=1");
3231 bool IsArchSupported = Triple.getArch() == llvm::Triple::aarch64;
3232 bool IsOptLevelSupported =
false;
3234 Arg *A = Args.getLastArg(options::OPT_O_Group);
3235 if (IsArchSupported) {
3236 if (!A || A->getOption().matches(options::OPT_O0))
3237 IsOptLevelSupported =
true;
3239 if (!IsArchSupported || !IsOptLevelSupported) {
3240 CmdArgs.push_back(
"-mllvm");
3241 CmdArgs.push_back(
"-global-isel-abort=2");
3243 if (!IsArchSupported)
3244 D.
Diag(diag::warn_drv_global_isel_incomplete) << Triple.getArchName();
3246 D.
Diag(diag::warn_drv_global_isel_incomplete_opt);
3249 CmdArgs.push_back(
"-global-isel=0");
3255 ArgStringList &CmdArgs,
3256 bool IsMSVCCompat) {
3257 bool use_fwrapv = IsMSVCCompat;
3258 bool use_fwrapv_pointer =
false;
3259 for (
const Arg *A : Args.filtered(
3260 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3261 options::OPT_fwrapv, options::OPT_fno_wrapv,
3262 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3264 switch (A->getOption().getID()) {
3265 case options::OPT_fstrict_overflow:
3267 use_fwrapv_pointer =
false;
3269 case options::OPT_fno_strict_overflow:
3271 use_fwrapv_pointer =
true;
3273 case options::OPT_fwrapv:
3276 case options::OPT_fno_wrapv:
3279 case options::OPT_fwrapv_pointer:
3280 use_fwrapv_pointer =
true;
3282 case options::OPT_fno_wrapv_pointer:
3283 use_fwrapv_pointer =
false;
3289 CmdArgs.push_back(
"-fwrapv");
3290 if (!use_fwrapv && IsMSVCCompat)
3291 CmdArgs.push_back(
"-fno-wrapv");
3292 if (use_fwrapv_pointer)
3293 CmdArgs.push_back(
"-fwrapv-pointer");
3300 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3301 if (A->getOption().matches(options::OPT_O4) ||
3302 A->getOption().matches(options::OPT_Ofast))
3305 if (A->getOption().matches(options::OPT_O0))
3308 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3311 StringRef S(A->getValue());
3319 unsigned OptLevel = 0;
3320 if (S.getAsInteger(10, OptLevel))
3323 return OptLevel > 1;
3330 ArgStringList &CmdArgs) {
3332 if (Args.hasFlag(options::OPT_fvectorize, options::OPT_fno_vectorize,
3334 CmdArgs.push_back(
"-vectorize-loops");
3338 ArgStringList &CmdArgs) {
3340 if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize,
3342 CmdArgs.push_back(
"-vectorize-slp");
3346 ArgStringList &CmdArgs) {
3349 Args.AddLastArg(CmdArgs, options::OPT_floop_interchange,
3350 options::OPT_fno_loop_interchange);
3371 llvm_unreachable(
"Fully covered switch above");
3377 if (!ComplexRangeStr.empty())
3378 return "-complex-range=" + ComplexRangeStr;
3379 return ComplexRangeStr;
3399 if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
3400 (LastOpt ==
"-fcx-limited-range" && NewOpt ==
"-fno-cx-limited-range") ||
3401 (LastOpt ==
"-fno-cx-limited-range" && NewOpt ==
"-fcx-limited-range") ||
3402 (LastOpt ==
"-fcx-fortran-rules" && NewOpt ==
"-fno-cx-fortran-rules") ||
3403 (LastOpt ==
"-fno-cx-fortran-rules" && NewOpt ==
"-fcx-fortran-rules") ||
3404 (LastOpt ==
"-ffast-math" && NewOpt ==
"-fno-fast-math") ||
3405 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-ffast-math") ||
3406 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-fno-fast-math") ||
3407 (LastOpt.starts_with(
"-ffp-model=") &&
3408 NewOpt.starts_with(
"-ffp-model=")) ||
3409 (LastOpt.starts_with(
"-fcomplex-arithmetic=") &&
3410 NewOpt.starts_with(
"-fcomplex-arithmetic=")))
3413 D.
Diag(clang::diag::warn_drv_overriding_complex_range)
3433 const ArgStringList &LinkerInputs,
3435 const llvm::opt::ArgList &Args,
3436 const char *OutputFilename) {
3440 assert(!LinkerInputs.empty() && !JobInputs.empty() &&
3441 "Must have at least one input.");
3443 ArgStringList LlvmLinkArgs(
3444 {
"-o", OutputFilename ? OutputFilename : Output.
getFilename()});
3446 LlvmLinkArgs.append(LinkerInputs);
3449 const char *LlvmLink = Args.MakeArgString(TC.
GetProgramPath(
"llvm-link"));
3451 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 addSanitizerRuntime(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer, bool IsShared, bool IsWhole)
static void collectSanitizerRuntimes(Compilation &C, const ToolChain &TC, const ArgList &Args, SmallVectorImpl< StringRef > &SharedRuntimes, SmallVectorImpl< StringRef > &StaticRuntimes, SmallVectorImpl< StringRef > &NonWholeStaticRuntimes, SmallVectorImpl< StringRef > &HelperStaticRuntimes, SmallVectorImpl< StringRef > &RequiredSymbols)
static void AddUnwindLibrary(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
static bool shouldIgnoreUnsupportedTargetFeature(const Arg &TargetFeatureArg, const llvm::Triple &T)
static StringRef getAMDGPUTargetGPU(const llvm::Triple &T, const ArgList &Args)
Get the (LLVM) name of the AMDGPU gpu we are targeting.
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 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 bool hostNeedsUbsanOffloadRt(Compilation &C, const ToolChain &HostTC)
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 bool mustUseNonLeafFramePointerForTarget(const llvm::Triple &Triple)
static const SanitizerMask NeedsUbsanRt
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...
BoundArch getOffloadingArch() const
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.
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
const char * getDriverProgramPath() const
Get the path to the main driver executable.
std::string ResourceDir
The path to the compiler resource directory.
llvm::vfs::FileSystem & getVFS() const
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.
This corresponds to a single GCC Multilib, or a segment of one controlled by a command line flag.
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.
SmallVector< InputInfo, 4 > InputInfoList
bool willEmitRemarks(const llvm::opt::ArgList &Args)
Top level wrappers for InstallAPI frontend operations.
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)
const FunctionProtoType * T
@ Auto
Emit colors only if the output stream is detected to support them.
@ On
Always emit colors regardless of the output stream.
@ Off
Never emit colors regardless of the output stream.
Represents a bound architecture for offload / multiple architecture compilation.
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
static constexpr ResponseFileSupport AtFileCurCP()