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.isOSWindowsOrUEFI();
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 Args.getLastArg(options::OPT_fvectorize, options::OPT_fno_vectorize))
1210 CmdArgs.push_back(Args.MakeArgString(
1211 Twine(PluginOptPrefix) +
"-vectorize-loops=" +
1212 (A->getOption().matches(options::OPT_fvectorize) ?
"1" :
"0")));
1217 if (Arg *A = Args.getLastArg(options::OPT_fslp_vectorize,
1218 options::OPT_fno_slp_vectorize))
1219 CmdArgs.push_back(Args.MakeArgString(
1220 Twine(PluginOptPrefix) +
"-vectorize-slp=" +
1221 (A->getOption().matches(options::OPT_fslp_vectorize) ?
"1" :
"0")));
1224 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
1225 options::OPT_fno_global_isel)) {
1228 CmdArgs.push_back(Args.MakeArgString(
1229 Twine(PluginOptPrefix) +
"-global-isel=" +
1230 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
1235 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
1236 if (A->getOption().matches(options::OPT_glldb))
1238 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
1239 else if (A->getOption().matches(options::OPT_gsce))
1241 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
1242 else if (A->getOption().matches(options::OPT_gdbx))
1244 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
1247 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
1253 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
1257 Arg *A = Args.getLastArg(options::OPT_g_Group);
1258 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
1259 !A->getOption().matches(options::OPT_ggdb0);
1260 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
1261 options::OPT_gno_strict_dwarf,
true))
1263 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
1266 bool UseSeparateSections =
1269 if (Args.hasFlag(options::OPT_ffunction_sections,
1270 options::OPT_fno_function_sections, UseSeparateSections))
1272 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
1273 else if (Args.hasArg(options::OPT_fno_function_sections))
1275 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
1277 bool DataSectionsTurnedOff =
false;
1278 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1279 UseSeparateSections)) {
1281 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
1282 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
1283 DataSectionsTurnedOff =
true;
1285 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
1288 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
1289 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
1290 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
1291 options::OPT_mno_xcoff_roptr,
false);
1292 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
1294 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1295 << OptStr << Triple.str();
1301 if (DataSectionsTurnedOff)
1302 D.
Diag(diag::err_roptr_requires_data_sections);
1305 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
1310 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
1311 options::OPT_fno_split_machine_functions)) {
1312 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
1313 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1314 "-function-splitting=all"));
1318 Args.getLastArg(options::OPT_fpartition_static_data_sections,
1319 options::OPT_fno_partition_static_data_sections)) {
1320 if (A->getOption().matches(options::OPT_fpartition_static_data_sections)) {
1321 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1322 "-partition-static-data-sections"));
1327 StringRef FName = A->getValue();
1328 if (!llvm::sys::fs::exists(FName))
1329 D.
Diag(diag::err_drv_no_such_file) << FName;
1331 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1332 "sample-profile=" + FName));
1336 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1337 "cs-profile-generate"));
1338 if (CSPGOGenerateArg->getOption().matches(
1339 options::OPT_fcs_profile_generate_EQ)) {
1341 llvm::sys::path::append(Path,
"default_%m.profraw");
1342 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1343 "cs-profile-path=" + Path));
1346 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1347 "cs-profile-path=default_%m.profraw"));
1350 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1351 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1352 llvm::sys::path::append(Path,
"default.profdata");
1353 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1354 "cs-profile-path=" + Path));
1358 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1360 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1361 "-enable-jmc-instrument"));
1363 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1366 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1367 Triple.hasDefaultEmulatedTLS())) {
1369 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1373 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1375 if (Args.hasFlag(options::OPT_fstack_size_section,
1376 options::OPT_fno_stack_size_section,
false))
1378 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1380 if (Args.hasFlag(options::OPT_fexperimental_call_graph_section,
1381 options::OPT_fno_experimental_call_graph_section,
false))
1383 Args.MakeArgString(Twine(PluginOptPrefix) +
"-call-graph-section"));
1387 if (!StatsFile.empty())
1389 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1392 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1393 CmdArgs.push_back(Args.MakeArgString(
1394 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1405 Output, PluginOptPrefix);
1411 true, PluginOptPrefix);
1413 bool IsELF = Triple.isOSBinFormatELF();
1415 bool ImplicitMapSyms =
false;
1416 for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
1417 for (StringRef
V : A->getValues()) {
1418 auto Equal =
V.split(
'=');
1419 auto checkArg = [&](
bool ValidTarget,
1420 std::initializer_list<const char *>
Set) {
1422 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1423 << (Twine(
"-Wa,") +
Equal.first +
"=").str()
1424 << Triple.getTriple();
1425 }
else if (!llvm::is_contained(
Set,
Equal.second)) {
1426 D.
Diag(diag::err_drv_unsupported_option_argument)
1427 << (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
1430 if (
Equal.first ==
"-mmapsyms") {
1431 ImplicitMapSyms =
Equal.second ==
"implicit";
1432 checkArg(IsELF && Triple.isAArch64(), {
"default",
"implicit"});
1433 }
else if (
V ==
"--crel")
1435 else if (
V ==
"--no-crel")
1443 if (IsELF && !Triple.isMIPS()) {
1444 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"-crel"));
1446 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1450 if (ImplicitMapSyms)
1452 Args.MakeArgString(Twine(PluginOptPrefix) +
"-implicit-mapsyms"));
1454 if (Args.hasArg(options::OPT_ftime_report))
1456 Args.MakeArgString(Twine(PluginOptPrefix) +
"-time-passes"));
1462 const ArgList &Args,
1463 ArgStringList &CmdArgs) {
1468 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1469 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1473 ArgStringList &CmdArgs) {
1474 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1475 options::OPT_fno_rtlib_add_rpath,
false))
1479 const llvm::Triple &Triple = TC.
getTriple();
1480 if ((!Triple.isOSBinFormatELF() && !Triple.isOSBinFormatMachO()))
1489 llvm::sys::path::append(P, M.gccSuffix());
1490 CandidateRPaths.emplace_back(std::string(P));
1492 CandidateRPaths.emplace_back(*StdlibPath);
1494 for (
const auto &CandidateRPath : CandidateRPaths) {
1495 if (TC.
getVFS().exists(CandidateRPath)) {
1496 CmdArgs.push_back(
"-rpath");
1497 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1503 ArgStringList &CmdArgs,
1504 const ToolChain &TC,
const ArgList &Args) {
1506 if (!Args.hasFlag(options::OPT_foffload_via_llvm,
1507 options::OPT_fno_offload_via_llvm,
false))
1510 if (
const Arg *A = Args.getLastArg(options::OPT_fgpu_default_stream_EQ);
1511 A && StringRef(A->getValue()) ==
"per-thread")
1512 CmdArgs.push_back(Args.MakeArgString(
1513 TC.
GetFilePath(
"LLVMOffloadKernelPerThreadDefaultStream.o")));
1515 CmdArgs.push_back(
"-lLLVMOffloadKernel");
1520 const ToolChain &TC,
const ArgList &Args,
1521 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1523 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1524 options::OPT_fno_openmp,
false))
1533 if (ForceStaticHostRuntime)
1534 CmdArgs.push_back(
"-Bstatic");
1538 CmdArgs.push_back(
"-lomp");
1541 CmdArgs.push_back(
"-lgomp");
1544 CmdArgs.push_back(
"-liomp5");
1550 if (ForceStaticHostRuntime)
1551 CmdArgs.push_back(
"-Bdynamic");
1554 CmdArgs.push_back(
"-lrt");
1556 if (IsOffloadingHost)
1557 CmdArgs.push_back(
"-lomptarget");
1566 const llvm::opt::ArgList &Args,
1567 llvm::opt::ArgStringList &CmdArgs) {
1573 constexpr llvm::StringLiteral Targets(
"--offload-targets=");
1577 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1578 [](
auto TC) { return TC.second->getTripleString(); });
1580 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1584 ArgStringList &CmdArgs, StringRef Sanitizer,
1585 bool IsShared,
bool IsWhole) {
1588 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1592 CmdArgs.push_back(
"--no-whole-archive");
1598 ArgStringList &CmdArgs,
1599 StringRef Sanitizer) {
1604 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1607 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1608 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1615 const llvm::opt::ArgList &Args,
1616 llvm::opt::ArgStringList &CmdArgs,
1619 "AIX linker does not support any form of --as-needed option yet.");
1627 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1628 CmdArgs.push_back(
"-z");
1629 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1631 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1636 const llvm::opt::ArgList &Args,
1637 ArgStringList &CmdArgs) {
1642 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1644 CmdArgs.push_back(
"-lpthread");
1646 CmdArgs.push_back(
"-lrt");
1648 CmdArgs.push_back(
"-lm");
1653 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1654 CmdArgs.push_back(
"-ldl");
1658 CmdArgs.push_back(
"-lexecinfo");
1660 CmdArgs.push_back(
"-lbsd");
1666 CmdArgs.push_back(
"-lresolv");
1671 llvm::function_ref<
bool(
const SanitizerArgs &)> NeedsRuntime) {
1678 for (
const auto &Entry : llvm::make_range(
C.getOffloadToolChains(Kind))) {
1681 const llvm::Triple &TT = DevTC->
getTriple();
1686 C.getDriver().getOffloadArchs(
C,
C.getArgs(), Kind, *DevTC)) {
1687 const ArgList &DevArgs =
C.getArgsForToolChain(DevTC, BA, Kind);
1689 if (NeedsRuntime(DevSan))
1710 const ArgList &Args,
1716 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1721 const bool NeedsCsanRt = SanArgs.
needsCsanRt() || NeedsCsanOffloadRt;
1725 SharedRuntimes.push_back(
"asan");
1726 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1727 HelperStaticRuntimes.push_back(
"asan-preinit");
1730 SharedRuntimes.push_back(
"memprof");
1731 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1732 HelperStaticRuntimes.push_back(
"memprof-preinit");
1735 SharedRuntimes.push_back(
"nsan");
1738 SharedRuntimes.push_back(
"ubsan_minimal");
1740 SharedRuntimes.push_back(
"ubsan_standalone");
1743 SharedRuntimes.push_back(
"scudo_standalone");
1746 SharedRuntimes.push_back(
"tsan");
1748 SharedRuntimes.push_back(
"csan");
1750 SharedRuntimes.push_back(
"tysan");
1753 SharedRuntimes.push_back(
"hwasan_aliases");
1755 SharedRuntimes.push_back(
"hwasan");
1756 if (!Args.hasArg(options::OPT_shared))
1757 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1760 SharedRuntimes.push_back(
"rtsan");
1765 StaticRuntimes.push_back(
"stats_client");
1769 HelperStaticRuntimes.push_back(
"asan_static");
1774 NonWholeStaticRuntimes.push_back(
"ubsan_offload");
1775 RequiredSymbols.push_back(
"__ubsan_offload_init");
1777 if (NeedsUbsanOffloadRt && !Args.hasArg(options::OPT_shared))
1778 HelperStaticRuntimes.push_back(
"ubsan_offload-preinit");
1780 NonWholeStaticRuntimes.push_back(
"csan_offload");
1781 RequiredSymbols.push_back(
"__csan_offload_init");
1783 if (NeedsCsanOffloadRt && !Args.hasArg(options::OPT_shared))
1784 HelperStaticRuntimes.push_back(
"csan_offload-preinit");
1787 if (Args.hasArg(options::OPT_shared)) {
1791 StaticRuntimes.push_back(
"ubsan_standalone");
1794 StaticRuntimes.push_back(
"csan");
1802 StaticRuntimes.push_back(
"asan");
1804 StaticRuntimes.push_back(
"asan_cxx");
1809 StaticRuntimes.push_back(
"rtsan");
1812 StaticRuntimes.push_back(
"memprof");
1814 StaticRuntimes.push_back(
"memprof_cxx");
1819 StaticRuntimes.push_back(
"hwasan_aliases");
1821 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1823 StaticRuntimes.push_back(
"hwasan");
1825 StaticRuntimes.push_back(
"hwasan_cxx");
1829 StaticRuntimes.push_back(
"dfsan");
1831 StaticRuntimes.push_back(
"lsan");
1833 StaticRuntimes.push_back(
"copyprof");
1835 StaticRuntimes.push_back(
"msan");
1837 StaticRuntimes.push_back(
"msan_cxx");
1840 StaticRuntimes.push_back(
"nsan");
1842 StaticRuntimes.push_back(
"tsan");
1844 StaticRuntimes.push_back(
"tsan_cxx");
1847 StaticRuntimes.push_back(
"tysan");
1850 StaticRuntimes.push_back(
"ubsan_minimal");
1852 StaticRuntimes.push_back(
"ubsan_standalone");
1856 StaticRuntimes.push_back(
"csan");
1858 NonWholeStaticRuntimes.push_back(
"safestack");
1859 RequiredSymbols.push_back(
"__safestack_init");
1863 StaticRuntimes.push_back(
"cfi");
1865 StaticRuntimes.push_back(
"cfi_diag");
1870 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1873 NonWholeStaticRuntimes.push_back(
"stats");
1874 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1877 StaticRuntimes.push_back(
"scudo_standalone");
1879 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1882 StaticRuntimes.push_back(
"ubsan_loop_detect");
1891 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1894 NonWholeStaticRuntimes, HelperStaticRuntimes,
1899 for (
auto S : RequiredSymbols) {
1900 CmdArgs.push_back(
"-u");
1901 CmdArgs.push_back(Args.MakeArgString(S));
1905 for (
auto RT : SharedRuntimes)
1909 bool FuzzerNeedsSanitizerDeps =
false;
1911 !Args.hasArg(options::OPT_shared)) {
1914 FuzzerNeedsSanitizerDeps =
true;
1918 if (!Args.hasArg(options::OPT_nostdlibxx)) {
1919 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1920 !Args.hasArg(options::OPT_static);
1921 if (OnlyLibstdcxxStatic)
1922 CmdArgs.push_back(
"-Bstatic");
1924 if (OnlyLibstdcxxStatic)
1925 CmdArgs.push_back(
"-Bdynamic");
1929 for (
auto RT : HelperStaticRuntimes)
1931 bool AddExportDynamic =
false;
1932 for (
auto RT : StaticRuntimes) {
1936 for (
auto RT : NonWholeStaticRuntimes) {
1942 if (AddExportDynamic && !TC.
getTriple().isNVPTX())
1943 CmdArgs.push_back(
"--export-dynamic");
1946 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1949 CmdArgs.push_back(
"-z");
1951 Args.MakeArgString(
"memtag-mode=" + SanArgs.
getMemtagMode()));
1954 CmdArgs.push_back(
"-z");
1955 CmdArgs.push_back(
"memtag-heap");
1959 CmdArgs.push_back(
"-z");
1960 CmdArgs.push_back(
"memtag-stack");
1964 CmdArgs.push_back(
"--android-memtag-note");
1967 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty() ||
1968 FuzzerNeedsSanitizerDeps;
1973 if (Args.hasArg(options::OPT_shared)) {
1975 CmdArgs.push_back(
"--whole-archive");
1977 CmdArgs.push_back(
"--no-whole-archive");
1981 CmdArgs.push_back(
"--whole-archive");
1983 for (
const auto &Mode : XRay.
modeList())
1985 CmdArgs.push_back(
"--no-whole-archive");
1993 const llvm::opt::ArgList &Args,
1994 ArgStringList &CmdArgs) {
1996 CmdArgs.push_back(
"-lpthread");
1998 CmdArgs.push_back(
"-lrt");
1999 CmdArgs.push_back(
"-lm");
2004 CmdArgs.push_back(
"-ldl");
2009 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2010 return !A->getOption().matches(options::OPT_O0);
2018 auto AddPostfix = [JA](
auto &F) {
2023 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
2024 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
2028 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
2031 if (Args.hasArg(options::OPT_o, options::OPT__SLASH_o,
2032 options::OPT__SLASH_Fo) &&
2033 Args.hasArg(options::OPT_c) && Output.
isFilename()) {
2037 llvm::sys::path::remove_filename(
T);
2038 llvm::sys::path::append(
T, llvm::sys::path::stem(Obj));
2040 return Args.MakeArgString(
T);
2046 return Args.MakeArgString(
T);
2050 const JobAction &JA,
const ArgList &Args,
2051 const InputInfo &Output,
const char *OutFile) {
2052 ArgStringList ExtractArgs;
2053 ExtractArgs.push_back(
"--extract-dwo");
2055 ArgStringList StripArgs;
2056 StripArgs.push_back(
"--strip-dwo");
2061 ExtractArgs.push_back(OutFile);
2068 C.addCommand(std::make_unique<Command>(JA,
T,
2070 Exec, ExtractArgs, II, Output));
2073 C.addCommand(std::make_unique<Command>(
2083 Args.ClaimAllArgs(options::OPT_flto_EQ);
2084 Args.ClaimAllArgs(options::OPT_flto);
2085 Args.ClaimAllArgs(options::OPT_fno_lto);
2089 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
2090 options::OPT_fcs_profile_generate_EQ,
2091 options::OPT_fno_profile_generate);
2092 if (CSPGOGenerateArg &&
2093 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
2094 CSPGOGenerateArg =
nullptr;
2096 return CSPGOGenerateArg;
2100 auto *ProfileUseArg = Args.getLastArg(
2101 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
2102 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2103 options::OPT_fno_profile_instr_use);
2105 if (ProfileUseArg &&
2106 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2107 ProfileUseArg =
nullptr;
2109 return ProfileUseArg;
2113 auto *ProfileSampleUseArg = Args.getLastArg(
2114 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
2116 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
2117 options::OPT_fno_profile_sample_use)))
2120 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
2125 case llvm::Reloc::Static:
2127 case llvm::Reloc::PIC_:
2129 case llvm::Reloc::DynamicNoPIC:
2130 return "dynamic-no-pic";
2131 case llvm::Reloc::ROPI:
2133 case llvm::Reloc::RWPI:
2135 case llvm::Reloc::ROPI_RWPI:
2138 llvm_unreachable(
"Unknown Reloc::Model kind");
2145std::tuple<llvm::Reloc::Model, unsigned, bool>
2153 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
2155 bool IsPICLevelTwo = PIC;
2158 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
2161 if (Triple.isAndroid()) {
2162 switch (Triple.getArch()) {
2163 case llvm::Triple::x86:
2164 case llvm::Triple::x86_64:
2166 IsPICLevelTwo =
true;
2176 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
2180 if (Triple.isOSOpenBSD()) {
2182 case llvm::Triple::arm:
2183 case llvm::Triple::aarch64:
2184 case llvm::Triple::mips64:
2185 case llvm::Triple::mips64el:
2186 case llvm::Triple::x86:
2187 case llvm::Triple::x86_64:
2188 IsPICLevelTwo =
false;
2191 case llvm::Triple::ppc:
2192 case llvm::Triple::sparcv9:
2193 IsPICLevelTwo =
true;
2205 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2206 options::OPT_fpic, options::OPT_fno_pic,
2207 options::OPT_fPIE, options::OPT_fno_PIE,
2208 options::OPT_fpie, options::OPT_fno_pie);
2209 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
2210 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
2211 options::OPT_fPIE, options::OPT_fpie)) {
2213 << LastPICArg->getSpelling() << Triple.str();
2214 if (Triple.getArch() == llvm::Triple::x86_64)
2215 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
2216 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2223 Option O = LastPICArg->getOption();
2224 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2225 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2226 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2228 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2230 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
2233 if (EffectiveTriple.isPS()) {
2234 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
2235 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
2236 if (Model !=
"kernel") {
2239 << LastPICArg->getSpelling()
2240 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
2250 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
2256 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
2257 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
2260 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2263 if (!Triple.isOSDarwin())
2265 << A->getSpelling() << Triple.str();
2274 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
2277 bool EmbeddedPISupported;
2278 switch (Triple.getArch()) {
2279 case llvm::Triple::arm:
2280 case llvm::Triple::armeb:
2281 case llvm::Triple::thumb:
2282 case llvm::Triple::thumbeb:
2283 EmbeddedPISupported =
true;
2286 EmbeddedPISupported =
false;
2290 bool ROPI =
false, RWPI =
false;
2291 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
2292 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
2293 if (!EmbeddedPISupported)
2295 << LastROPIArg->getSpelling() << Triple.str();
2298 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2299 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2300 if (!EmbeddedPISupported)
2302 << LastRWPIArg->getSpelling() << Triple.str();
2307 if ((ROPI || RWPI) && (PIC || PIE))
2310 if (Triple.isMIPS()) {
2317 if (ABIName ==
"n64")
2320 if(Args.hasArg(options::OPT_mno_abicalls))
2321 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2324 IsPICLevelTwo =
false;
2328 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2330 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2332 RelocM = llvm::Reloc::ROPI_RWPI;
2334 RelocM = llvm::Reloc::ROPI;
2336 RelocM = llvm::Reloc::RWPI;
2338 return std::make_tuple(RelocM, 0
U,
false);
2342 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
2343 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
2345 const llvm::opt::OptTable &Opts = D.
getOpts();
2346 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
2347 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
2348 D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
2350 return HasStaticPIE;
2370 const ArgList &Args) {
2371 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2372 options::OPT_falign_functions_EQ,
2373 options::OPT_fno_align_functions);
2374 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2377 if (A->getOption().matches(options::OPT_falign_functions))
2381 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2383 << A->getAsString(Args) << A->getValue();
2388 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2389 switch (DebugInfoKind) {
2390 case llvm::codegenoptions::DebugDirectivesOnly:
2391 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2393 case llvm::codegenoptions::DebugLineTablesOnly:
2394 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2396 case llvm::codegenoptions::DebugInfoConstructor:
2397 CmdArgs.push_back(
"-debug-info-kind=constructor");
2399 case llvm::codegenoptions::LimitedDebugInfo:
2400 CmdArgs.push_back(
"-debug-info-kind=limited");
2402 case llvm::codegenoptions::FullDebugInfo:
2403 CmdArgs.push_back(
"-debug-info-kind=standalone");
2405 case llvm::codegenoptions::UnusedTypeInfo:
2406 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2416 assert(A.getOption().matches(options::OPT_gN_Group) &&
2417 "Not a -g option that specifies a debug-info level");
2418 if (A.getOption().matches(options::OPT_g0) ||
2419 A.getOption().matches(options::OPT_ggdb0))
2420 return llvm::codegenoptions::NoDebugInfo;
2421 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2422 A.getOption().matches(options::OPT_ggdb1))
2423 return llvm::codegenoptions::DebugLineTablesOnly;
2424 if (A.getOption().matches(options::OPT_gline_directives_only))
2425 return llvm::codegenoptions::DebugDirectivesOnly;
2426 return llvm::codegenoptions::DebugInfoConstructor;
2430 const ArgList &Args) {
2431 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2437 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 6 ||
2440 << A->getAsString(Args) << A->getValue();
2445 return llvm::StringSwitch<unsigned>(ArgValue)
2446 .Case(
"-gdwarf-2", 2)
2447 .Case(
"-gdwarf-3", 3)
2448 .Case(
"-gdwarf-4", 4)
2449 .Case(
"-gdwarf-5", 5)
2450 .Case(
"-gdwarf-6", 6)
2455 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2456 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2457 options::OPT_gdwarf_6, options::OPT_gdwarf);
2461 const llvm::opt::ArgList &Args) {
2466 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2467 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2468 << GDwarfN->getSpelling() << TC.
getTriple().str();
2470 if (DwarfVersion == 0) {
2472 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2474 return DwarfVersion;
2478 const ArgList &Args, Arg *&Arg) {
2479 Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
2480 options::OPT_gno_split_dwarf);
2481 if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
2484 if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
2487 StringRef
Value = Arg->getValue();
2488 if (
Value ==
"split")
2490 if (
Value ==
"single")
2493 D.
Diag(diag::err_drv_unsupported_option_argument)
2494 << Arg->getSpelling() << Arg->getValue();
2500 assert(A &&
"Expected non-nullptr argument.");
2503 D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
2509 const ArgList &Args,
2510 ArgStringList &CmdArgs) {
2511 if (Args.hasFlag(options::OPT_fdebug_info_for_profiling,
2512 options::OPT_fno_debug_info_for_profiling,
false) &&
2514 Args.getLastArg(options::OPT_fdebug_info_for_profiling), Args, D, TC))
2515 CmdArgs.push_back(
"-fdebug-info-for-profiling");
2519 ArgStringList &CmdArgs) {
2520 llvm::Reloc::Model RelocationModel;
2525 if (RelocationModel != llvm::Reloc::Static)
2526 CmdArgs.push_back(
"-KPIC");
2532 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2538 const ArgList &Args) {
2539 if (Args.hasArg(options::OPT_static_libgcc) ||
2540 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2544 if (Args.hasArg(options::OPT_shared_libgcc))
2563 ArgStringList &CmdArgs,
const ArgList &Args) {
2567 CmdArgs.push_back(
"-l:libunwind.a");
2590 CmdArgs.push_back(
"-lgcc_eh");
2592 CmdArgs.push_back(
"-lgcc_s");
2600 CmdArgs.push_back(
"-lunwind");
2602 CmdArgs.push_back(
"-l:libunwind.a");
2605 CmdArgs.push_back(
"-l:libunwind.dll.a");
2607 CmdArgs.push_back(
"-l:libunwind.so");
2611 CmdArgs.push_back(
"-lunwind");
2621 ArgStringList &CmdArgs,
const ArgList &Args) {
2625 CmdArgs.push_back(
"-lgcc");
2629 CmdArgs.push_back(
"-lgcc");
2633 CmdArgs.push_back(
"--as-needed");
2635 CmdArgs.push_back(
"--no-as-needed");
2640 ArgStringList &CmdArgs,
const ArgList &Args) {
2651 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2654 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2655 if (A && A->getValue() != StringRef(
"platform")) {
2656 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2657 << A->getValue() <<
"MSVC";
2667 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2668 !Args.hasArg(options::OPT_static_pie))
2669 CmdArgs.push_back(
"-ldl");
2676 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2682 StringRef SaveStats = A->getValue();
2683 if (SaveStats ==
"obj" && Output.
isFilename()) {
2685 llvm::sys::path::remove_filename(StatsFile);
2686 }
else if (SaveStats !=
"cwd") {
2687 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2691 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2692 llvm::sys::path::append(StatsFile, BaseName);
2693 llvm::sys::path::replace_extension(StatsFile,
"stats");
2705 assert(Flag.front() ==
'-');
2707 Flags.push_back(Flag.str());
2709 Flags.push_back((
"!" + Flag.substr(1)).str());
2714 ArgStringList &CmdArgs,
bool IsLTO,
2715 const StringRef PluginOptPrefix) {
2716 auto addArg = [&, IsLTO](
const Twine &Arg) {
2718 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2719 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2721 CmdArgs.push_back(
"-mllvm");
2722 CmdArgs.push_back(Args.MakeArgString(Arg));
2726 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2727 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2729 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2730 StringRef
Value = A->getValue();
2732 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2733 !llvm::isPowerOf2_64(Boundary)) {
2734 D.
Diag(diag::err_drv_invalid_argument_to_option)
2735 <<
Value << A->getOption().getName();
2737 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2740 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2741 std::string AlignBranch;
2742 for (StringRef
T : A->getValues()) {
2743 if (
T !=
"fused" &&
T !=
"jcc" &&
T !=
"jmp" &&
T !=
"call" &&
2744 T !=
"ret" &&
T !=
"indirect")
2745 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2746 <<
T <<
"fused, jcc, jmp, call, ret, indirect";
2747 if (!AlignBranch.empty())
2751 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2753 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2754 StringRef
Value = A->getValue();
2755 unsigned PrefixSize;
2756 if (
Value.getAsInteger(10, PrefixSize)) {
2757 D.
Diag(diag::err_drv_invalid_argument_to_option)
2758 <<
Value << A->getOption().getName();
2760 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2765static llvm::opt::Arg *
2767 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2771 const llvm::opt::ArgList &Args) {
2772 const unsigned MinCodeObjVer = 4;
2773 const unsigned MaxCodeObjVer = 6;
2776 if (CodeObjArg->getOption().getID() ==
2777 options::OPT_mcode_object_version_EQ) {
2778 unsigned CodeObjVer = MaxCodeObjVer;
2780 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2781 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2782 D.
Diag(diag::err_drv_invalid_int_value)
2783 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2789 const llvm::opt::ArgList &Args) {
2790 unsigned CodeObjVer = 6;
2792 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2797 const Driver &D,
const llvm::opt::ArgList &Args) {
2802 const llvm::opt::ArgList &Args,
2803 llvm::opt::ArgStringList &CmdArgs,
2804 const llvm::Triple &Triple,
bool IsLTO,
2805 const StringRef PluginOptPrefix) {
2806 auto addArg = [&, IsLTO](
const Twine &Arg) {
2808 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2809 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2811 CmdArgs.push_back(
"-mllvm");
2812 CmdArgs.push_back(Args.MakeArgString(Arg));
2816 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2817 options::OPT_mno_outline)) {
2818 if (A->getOption().matches(options::OPT_moutline)) {
2822 if (Triple.isARM() || Triple.isThumb() || Triple.isAArch64() ||
2823 Triple.isRISCV() || Triple.isX86()) {
2824 addArg(Twine(
"-enable-machine-outliner"));
2826 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2832 CmdArgs.push_back(
"-mno-outline");
2835 addArg(Twine(
"-enable-machine-outliner=never"));
2839 auto *CodeGenDataGenArg =
2840 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
2841 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
2844 if (CodeGenDataGenArg && CodeGenDataUseArg)
2845 D.
Diag(diag::err_drv_argument_not_allowed_with)
2846 << CodeGenDataGenArg->getAsString(Args)
2847 << CodeGenDataUseArg->getAsString(Args);
2851 if (CodeGenDataGenArg)
2852 addArg(Twine(
"-codegen-data-generate"));
2855 if (CodeGenDataUseArg)
2856 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
2860 const llvm::opt::ArgList &Args,
2861 llvm::opt::ArgStringList &CmdArgs,
2862 const llvm::Triple &Triple) {
2863 if (Arg *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
2864 options::OPT_fno_split_machine_functions)) {
2865 if (!A->getOption().matches(options::OPT_fno_split_machine_functions)) {
2867 if ((Triple.isX86() || Triple.isAArch64()) && Triple.isOSBinFormatELF())
2868 A->render(Args, CmdArgs);
2870 D.
Diag(diag::err_drv_unsupported_opt_for_target)
2871 << A->getAsString(Args) << Triple.getTriple();
2877 const llvm::opt::ArgList &DriverArgs,
2878 llvm::opt::ArgStringList &CC1Args,
2879 StringRef BitcodeSuffix,
2880 const llvm::Triple &Triple,
2885 std::optional<std::string> LibPath =
2886 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2889 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2890 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2891 for (StringRef Path : Frags)
2892 LibraryPaths.emplace_back(Path.trim());
2897 LibraryPaths.emplace_back(LibPath);
2901 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
2902 LibraryPaths.emplace_back(P);
2904 OptSpecifier LibomptargetBCPathOpt =
2905 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
2906 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
2907 : options::OPT_libomptarget_spirv_bc_path_EQ;
2909 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
2910 : Triple.isNVPTX() ?
"nvptx"
2912 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
2915 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
2917 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
2918 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
2919 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2922 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2923 CC1Args.push_back(
"-mlink-builtin-bitcode");
2924 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2926 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
2927 << LibOmpTargetFile;
2930 bool FoundBCLibrary =
false;
2932 for (StringRef LibraryPath : LibraryPaths) {
2934 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2935 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2936 CC1Args.push_back(
"-mlink-builtin-bitcode");
2937 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2938 FoundBCLibrary =
true;
2943 if (!FoundBCLibrary)
2944 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
2945 << LibOmpTargetName << ArchPrefix;
2950 const llvm::opt::ArgList &DriverArgs,
2951 llvm::opt::ArgStringList &CC1Args) {
2953 StringRef LibclcNamespec;
2954 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
2957 LibclcNamespec = A->getValue();
2959 if (!TT.isAMDGPU() || TT.getEnvironment() != llvm::Triple::LLVM)
2963 if (DriverArgs.hasArg(options::OPT_no_offloadlib,
2964 options::OPT_nodefaultlibs, options::OPT_nostdlib))
2968 bool FilenameSearch = LibclcNamespec.consume_front(
":");
2969 if (FilenameSearch) {
2971 if (D.
getVFS().exists(LibclcFile)) {
2972 CC1Args.push_back(
"-mlink-builtin-bitcode");
2973 CC1Args.push_back(DriverArgs.MakeArgString(LibclcFile));
2976 D.
Diag(diag::err_drv_device_lib_not_found) <<
"libclc" << LibclcFile;
2982 llvm::sys::path::append(ResourceLibPath,
"lib");
2985 if (
const Arg *CPUArg = DriverArgs.getLastArg(options::OPT_mcpu_EQ))
2986 CPU = CPUArg->getValue();
2989 auto TryTriplePath = [&](StringRef TripleStr) ->
bool {
2991 llvm::sys::path::append(BasePath, TripleStr);
2998 llvm::sys::path::append(CPUPath, CPU,
"libclc.bc");
2999 if (D.
getVFS().exists(CPUPath)) {
3000 CC1Args.push_back(
"-mlink-builtin-bitcode");
3001 CC1Args.push_back(DriverArgs.MakeArgString(CPUPath));
3008 llvm::sys::path::append(GenericPath,
"libclc.bc");
3009 if (D.
getVFS().exists(GenericPath)) {
3010 CC1Args.push_back(
"-mlink-builtin-bitcode");
3011 CC1Args.push_back(DriverArgs.MakeArgString(GenericPath));
3018 if (TryTriplePath(TT.str()))
3021 llvm::Triple::SubArchType SubArch = TT.getSubArch();
3022 if (TT.isAMDGCN() && SubArch != llvm::Triple::NoSubArch) {
3027 llvm::Triple::SubArchType MajorSubArch =
3028 llvm::AMDGPU::getMajorSubArch(SubArch);
3029 if (MajorSubArch != SubArch) {
3030 llvm::Triple MajorTT(TT);
3031 MajorTT.setArch(TT.getArch(), MajorSubArch);
3032 if (TryTriplePath(MajorTT.str()))
3037 llvm::Triple NoSubArchTT(TT);
3038 NoSubArchTT.setArch(TT.getArch(), llvm::Triple::NoSubArch);
3039 if (TryTriplePath(NoSubArchTT.str()))
3043 D.
Diag(diag::err_drv_device_lib_not_found) <<
"libclc" <<
"libclc.bc";
3048 const llvm::opt::ArgList &Args,
3049 llvm::opt::ArgStringList &CmdArgs,
3050 const llvm::Triple &Triple) {
3051 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3052 options::OPT_mno_outline_atomics)) {
3054 if (!Triple.isAArch64()) {
3055 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3056 << Triple.getArchName() << A->getOption().getName();
3058 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3059 CmdArgs.push_back(
"-target-feature");
3060 CmdArgs.push_back(
"+outline-atomics");
3062 CmdArgs.push_back(
"-target-feature");
3063 CmdArgs.push_back(
"-outline-atomics");
3067 CmdArgs.push_back(
"-target-feature");
3068 CmdArgs.push_back(
"+outline-atomics");
3073 llvm::opt::ArgStringList &CmdArgs,
3074 bool EmitCompressionFormat) {
3075 if (TCArgs.hasFlag(options::OPT_offload_compress,
3076 options::OPT_no_offload_compress,
false))
3077 CmdArgs.push_back(
"--compress");
3079 TCArgs.getLastArg(options::OPT_offload_compression_level_EQ)) {
3082 if (EmitCompressionFormat) {
3083 const char *Format =
3084 llvm::compression::zstd::isAvailable() ?
"zstd" :
"zlib";
3086 TCArgs.MakeArgString(Twine(
"--compression-format=") + Format));
3089 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3094 const llvm::Triple &Triple,
3095 const llvm::Reloc::Model &RelocationModel,
3096 llvm::opt::ArgStringList &CmdArgs) {
3097 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3098 StringRef CM = A->getValue();
3100 if (Triple.isOSAIX() && CM ==
"medium")
3102 if (Triple.isAArch64(64)) {
3103 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3104 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3105 RelocationModel != llvm::Reloc::Static)
3106 D.
Diag(diag::err_drv_argument_only_allowed_with)
3107 << A->getAsString(Args) <<
"-fno-pic";
3108 }
else if (Triple.isLoongArch()) {
3109 if (CM ==
"extreme" &&
3110 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3111 D.
Diag(diag::err_drv_argument_not_allowed_with)
3112 << A->getAsString(Args) <<
"-fplt";
3113 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3116 CM = llvm::StringSwitch<StringRef>(CM)
3117 .Case(
"normal",
"small")
3118 .Case(
"extreme",
"large")
3120 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3121 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3122 }
else if (Triple.isRISCV()) {
3124 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3125 D.
Diag(diag::err_drv_argument_not_allowed_with)
3126 << A->getAsString(Args) <<
"-fpic";
3129 else if (CM ==
"medany")
3131 Ok = CM ==
"small" || CM ==
"medium" ||
3132 (CM ==
"large" && Triple.isRISCV64());
3133 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3134 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3135 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3139 }
else if (Triple.isSPARC64()) {
3142 else if (CM ==
"medmid")
3144 else if (CM ==
"medany")
3146 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3147 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3148 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3151 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3153 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3154 << A->getSpelling() << CM << Triple.getTriple();
3158 if (Triple.getArch() == llvm::Triple::x86_64) {
3159 bool IsMediumCM =
false;
3160 bool IsLargeCM =
false;
3161 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3162 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3163 IsLargeCM = StringRef(A->getValue()) ==
"large";
3165 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3166 if (!IsMediumCM && !IsLargeCM) {
3167 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3168 << A->getOption().getRenderName();
3170 A->render(Args, CmdArgs);
3172 }
else if (IsMediumCM) {
3173 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3174 }
else if (IsLargeCM) {
3175 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3181 ArgStringList &CmdArgs) {
3186 Args.getLastArg(options::OPT_fcolor_diagnostics,
3187 options::OPT_fno_color_diagnostics);
3188 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3189 StringRef
Value(A->getValue());
3191 D.
Diag(diag::err_drv_invalid_argument_to_option)
3192 <<
Value << A->getOption().getName();
3197 CmdArgs.push_back(
"-fcolor-diagnostics");
3200 CmdArgs.push_back(
"-fno-color-diagnostics");
3209 for (; *Arg; ++Arg) {
3215 Res.push_back(
'\\');
3218 Res.push_back(*Arg);
3223 const llvm::opt::ArgList &Args) {
3227 llvm::opt::ArgStringList OriginalArgs;
3228 for (
const auto &Arg : Args)
3229 Arg->render(Args, OriginalArgs);
3233 for (
const char *OriginalArg : OriginalArgs) {
3237 Flags += EscapedArg;
3240 return Args.MakeArgString(Flags);
3244 const llvm::opt::ArgList &Args,
3245 bool &FRecordCommandLine,
3246 bool &GRecordCommandLine,
3247 bool &DXRecordCommandLine) {
3250 const std::string &TripleStr = Triple.getTriple();
3252 FRecordCommandLine =
3253 Args.hasFlag(options::OPT_frecord_command_line,
3254 options::OPT_fno_record_command_line,
false);
3255 GRecordCommandLine =
3256 Args.hasFlag(options::OPT_grecord_command_line,
3257 options::OPT_gno_record_command_line,
false);
3258 DXRecordCommandLine = Triple.isDXIL() && Args.hasArg(options::OPT_g_Flag);
3259 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3260 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3261 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3262 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3266 DXRecordCommandLine;
3270 ArgStringList &CmdArgs,
3271 const llvm::Triple &Triple) {
3272 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
3273 options::OPT_fno_global_isel)) {
3274 CmdArgs.push_back(
"-mllvm");
3275 if (A->getOption().matches(options::OPT_fglobal_isel)) {
3276 CmdArgs.push_back(
"-global-isel=1");
3281 bool IsArchSupported = Triple.getArch() == llvm::Triple::aarch64;
3282 bool IsOptLevelSupported =
false;
3284 Arg *A = Args.getLastArg(options::OPT_O_Group);
3285 if (IsArchSupported) {
3286 if (!A || A->getOption().matches(options::OPT_O0))
3287 IsOptLevelSupported =
true;
3289 if (!IsArchSupported || !IsOptLevelSupported) {
3290 CmdArgs.push_back(
"-mllvm");
3291 CmdArgs.push_back(
"-global-isel-abort=2");
3293 if (!IsArchSupported)
3294 D.
Diag(diag::warn_drv_global_isel_incomplete) << Triple.getArchName();
3296 D.
Diag(diag::warn_drv_global_isel_incomplete_opt);
3299 CmdArgs.push_back(
"-global-isel=0");
3305 ArgStringList &CmdArgs,
3306 bool IsMSVCCompat) {
3307 bool use_fwrapv = IsMSVCCompat;
3308 bool use_fwrapv_pointer =
false;
3309 for (
const Arg *A : Args.filtered(
3310 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3311 options::OPT_fwrapv, options::OPT_fno_wrapv,
3312 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3314 switch (A->getOption().getID()) {
3315 case options::OPT_fstrict_overflow:
3317 use_fwrapv_pointer =
false;
3319 case options::OPT_fno_strict_overflow:
3321 use_fwrapv_pointer =
true;
3323 case options::OPT_fwrapv:
3326 case options::OPT_fno_wrapv:
3329 case options::OPT_fwrapv_pointer:
3330 use_fwrapv_pointer =
true;
3332 case options::OPT_fno_wrapv_pointer:
3333 use_fwrapv_pointer =
false;
3339 CmdArgs.push_back(
"-fwrapv");
3340 if (!use_fwrapv && IsMSVCCompat)
3341 CmdArgs.push_back(
"-fno-wrapv");
3342 if (use_fwrapv_pointer)
3343 CmdArgs.push_back(
"-fwrapv-pointer");
3350 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3351 if (A->getOption().matches(options::OPT_O4) ||
3352 A->getOption().matches(options::OPT_Ofast))
3355 if (A->getOption().matches(options::OPT_O0))
3358 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3361 StringRef S(A->getValue());
3369 unsigned OptLevel = 0;
3370 if (S.getAsInteger(10, OptLevel))
3373 return OptLevel > 1;
3380 ArgStringList &CmdArgs) {
3382 if (Args.hasFlag(options::OPT_fvectorize, options::OPT_fno_vectorize,
3384 CmdArgs.push_back(
"-vectorize-loops");
3388 ArgStringList &CmdArgs) {
3390 if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize,
3392 CmdArgs.push_back(
"-vectorize-slp");
3396 ArgStringList &CmdArgs) {
3399 Args.AddLastArg(CmdArgs, options::OPT_floop_interchange,
3400 options::OPT_fno_loop_interchange);
3421 llvm_unreachable(
"Fully covered switch above");
3427 if (!ComplexRangeStr.empty())
3428 return "-complex-range=" + ComplexRangeStr;
3429 return ComplexRangeStr;
3449 if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
3450 (LastOpt ==
"-fcx-limited-range" && NewOpt ==
"-fno-cx-limited-range") ||
3451 (LastOpt ==
"-fno-cx-limited-range" && NewOpt ==
"-fcx-limited-range") ||
3452 (LastOpt ==
"-fcx-fortran-rules" && NewOpt ==
"-fno-cx-fortran-rules") ||
3453 (LastOpt ==
"-fno-cx-fortran-rules" && NewOpt ==
"-fcx-fortran-rules") ||
3454 (LastOpt ==
"-ffast-math" && NewOpt ==
"-fno-fast-math") ||
3455 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-ffast-math") ||
3456 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-fno-fast-math") ||
3457 (LastOpt.starts_with(
"-ffp-model=") &&
3458 NewOpt.starts_with(
"-ffp-model=")) ||
3459 (LastOpt.starts_with(
"-fcomplex-arithmetic=") &&
3460 NewOpt.starts_with(
"-fcomplex-arithmetic=")))
3463 D.
Diag(clang::diag::warn_drv_overriding_complex_range)
3483 const ArgStringList &LinkerInputs,
3485 const llvm::opt::ArgList &Args,
3486 const char *OutputFilename) {
3490 assert(!LinkerInputs.empty() && !JobInputs.empty() &&
3491 "Must have at least one input.");
3493 ArgStringList LlvmLinkArgs(
3494 {
"-o", OutputFilename ? OutputFilename : Output.
getFilename()});
3496 LlvmLinkArgs.append(LinkerInputs);
3499 const char *LlvmLink = Args.MakeArgString(TC.
GetProgramPath(
"llvm-link"));
3501 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 bool hostNeedsCsanOffloadRt(Compilation &C, const ToolChain &HostTC)
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 hostNeedsOffloadRt(Compilation &C, const ToolChain &HostTC, llvm::function_ref< bool(const SanitizerArgs &)> NeedsRuntime)
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 needsCopyProfRt() 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()