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"));
1257 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
1258 StringRef
V = A->getValue();
1259 if (
V ==
"vec-default")
1261 if (
V ==
"vec-extabi") {
1263 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
1269 bool UseSeparateSections =
1272 if (Args.hasFlag(options::OPT_ffunction_sections,
1273 options::OPT_fno_function_sections, UseSeparateSections))
1275 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
1276 else if (Args.hasArg(options::OPT_fno_function_sections))
1278 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
1280 bool DataSectionsTurnedOff =
false;
1281 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1282 UseSeparateSections)) {
1284 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
1285 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
1286 DataSectionsTurnedOff =
true;
1288 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
1291 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
1292 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
1293 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
1294 options::OPT_mno_xcoff_roptr,
false);
1295 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
1297 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1298 << OptStr << Triple.str();
1304 if (DataSectionsTurnedOff)
1305 D.
Diag(diag::err_roptr_requires_data_sections);
1308 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
1313 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
1314 options::OPT_fno_split_machine_functions)) {
1315 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
1316 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1317 "-split-machine-functions"));
1321 Args.getLastArg(options::OPT_fpartition_static_data_sections,
1322 options::OPT_fno_partition_static_data_sections)) {
1323 if (A->getOption().matches(options::OPT_fpartition_static_data_sections)) {
1324 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1325 "-partition-static-data-sections"));
1330 StringRef FName = A->getValue();
1331 if (!llvm::sys::fs::exists(FName))
1332 D.
Diag(diag::err_drv_no_such_file) << FName;
1334 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1335 "sample-profile=" + FName));
1339 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1340 "cs-profile-generate"));
1341 if (CSPGOGenerateArg->getOption().matches(
1342 options::OPT_fcs_profile_generate_EQ)) {
1344 llvm::sys::path::append(Path,
"default_%m.profraw");
1345 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1346 "cs-profile-path=" + Path));
1349 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1350 "cs-profile-path=default_%m.profraw"));
1353 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1354 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1355 llvm::sys::path::append(Path,
"default.profdata");
1356 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1357 "cs-profile-path=" + Path));
1361 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1363 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1364 "-enable-jmc-instrument"));
1366 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1369 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1370 Triple.hasDefaultEmulatedTLS())) {
1372 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1376 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1378 if (Args.hasFlag(options::OPT_fstack_size_section,
1379 options::OPT_fno_stack_size_section,
false))
1381 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1383 if (Args.hasFlag(options::OPT_fexperimental_call_graph_section,
1384 options::OPT_fno_experimental_call_graph_section,
false))
1386 Args.MakeArgString(Twine(PluginOptPrefix) +
"-call-graph-section"));
1390 if (!StatsFile.empty())
1392 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1395 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1396 CmdArgs.push_back(Args.MakeArgString(
1397 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1408 Output, PluginOptPrefix);
1414 true, PluginOptPrefix);
1416 bool IsELF = Triple.isOSBinFormatELF();
1418 bool ImplicitMapSyms =
false;
1419 for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
1420 for (StringRef
V : A->getValues()) {
1421 auto Equal =
V.split(
'=');
1422 auto checkArg = [&](
bool ValidTarget,
1423 std::initializer_list<const char *>
Set) {
1425 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1426 << (Twine(
"-Wa,") +
Equal.first +
"=").str()
1427 << Triple.getTriple();
1428 }
else if (!llvm::is_contained(
Set,
Equal.second)) {
1429 D.
Diag(diag::err_drv_unsupported_option_argument)
1430 << (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
1433 if (
Equal.first ==
"-mmapsyms") {
1434 ImplicitMapSyms =
Equal.second ==
"implicit";
1435 checkArg(IsELF && Triple.isAArch64(), {
"default",
"implicit"});
1436 }
else if (
V ==
"--crel")
1438 else if (
V ==
"--no-crel")
1446 if (IsELF && !Triple.isMIPS()) {
1447 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"-crel"));
1449 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1453 if (ImplicitMapSyms)
1455 Args.MakeArgString(Twine(PluginOptPrefix) +
"-implicit-mapsyms"));
1457 if (Args.hasArg(options::OPT_ftime_report))
1459 Args.MakeArgString(Twine(PluginOptPrefix) +
"-time-passes"));
1465 const ArgList &Args,
1466 ArgStringList &CmdArgs) {
1471 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1472 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1476 ArgStringList &CmdArgs) {
1477 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1478 options::OPT_fno_rtlib_add_rpath,
false))
1482 const llvm::Triple &Triple = TC.
getTriple();
1483 if ((!Triple.isOSBinFormatELF() && !Triple.isOSBinFormatMachO()))
1492 llvm::sys::path::append(P, M.gccSuffix());
1493 CandidateRPaths.emplace_back(std::string(P));
1495 CandidateRPaths.emplace_back(*StdlibPath);
1497 for (
const auto &CandidateRPath : CandidateRPaths) {
1498 if (TC.
getVFS().exists(CandidateRPath)) {
1499 CmdArgs.push_back(
"-rpath");
1500 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1506 ArgStringList &CmdArgs,
1507 const ToolChain &TC,
const ArgList &Args) {
1509 if (!Args.hasFlag(options::OPT_foffload_via_llvm,
1510 options::OPT_fno_offload_via_llvm,
false))
1513 if (
const Arg *A = Args.getLastArg(options::OPT_fgpu_default_stream_EQ);
1514 A && StringRef(A->getValue()) ==
"per-thread")
1515 CmdArgs.push_back(Args.MakeArgString(
1516 TC.
GetFilePath(
"LLVMOffloadKernelPerThreadDefaultStream.o")));
1518 CmdArgs.push_back(
"-lLLVMOffloadKernel");
1523 const ToolChain &TC,
const ArgList &Args,
1524 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1526 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1527 options::OPT_fno_openmp,
false))
1536 if (ForceStaticHostRuntime)
1537 CmdArgs.push_back(
"-Bstatic");
1541 CmdArgs.push_back(
"-lomp");
1544 CmdArgs.push_back(
"-lgomp");
1547 CmdArgs.push_back(
"-liomp5");
1553 if (ForceStaticHostRuntime)
1554 CmdArgs.push_back(
"-Bdynamic");
1557 CmdArgs.push_back(
"-lrt");
1559 if (IsOffloadingHost)
1560 CmdArgs.push_back(
"-lomptarget");
1569 const llvm::opt::ArgList &Args,
1570 llvm::opt::ArgStringList &CmdArgs) {
1576 constexpr llvm::StringLiteral Targets(
"--offload-targets=");
1580 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1581 [](
auto TC) { return TC.second->getTripleString(); });
1583 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1587 ArgStringList &CmdArgs, StringRef Sanitizer,
1588 bool IsShared,
bool IsWhole) {
1591 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1595 CmdArgs.push_back(
"--no-whole-archive");
1601 ArgStringList &CmdArgs,
1602 StringRef Sanitizer) {
1607 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1610 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1611 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1618 const llvm::opt::ArgList &Args,
1619 llvm::opt::ArgStringList &CmdArgs,
1622 "AIX linker does not support any form of --as-needed option yet.");
1630 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1631 CmdArgs.push_back(
"-z");
1632 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1634 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1639 const llvm::opt::ArgList &Args,
1640 ArgStringList &CmdArgs) {
1645 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1647 CmdArgs.push_back(
"-lpthread");
1649 CmdArgs.push_back(
"-lrt");
1651 CmdArgs.push_back(
"-lm");
1656 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1657 CmdArgs.push_back(
"-ldl");
1661 CmdArgs.push_back(
"-lexecinfo");
1663 CmdArgs.push_back(
"-lbsd");
1669 CmdArgs.push_back(
"-lresolv");
1679 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1684 SharedRuntimes.push_back(
"asan");
1685 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1686 HelperStaticRuntimes.push_back(
"asan-preinit");
1689 SharedRuntimes.push_back(
"memprof");
1690 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1691 HelperStaticRuntimes.push_back(
"memprof-preinit");
1694 SharedRuntimes.push_back(
"nsan");
1697 SharedRuntimes.push_back(
"ubsan_minimal");
1699 SharedRuntimes.push_back(
"ubsan_standalone");
1702 SharedRuntimes.push_back(
"scudo_standalone");
1705 SharedRuntimes.push_back(
"tsan");
1707 SharedRuntimes.push_back(
"tysan");
1710 SharedRuntimes.push_back(
"hwasan_aliases");
1712 SharedRuntimes.push_back(
"hwasan");
1713 if (!Args.hasArg(options::OPT_shared))
1714 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1717 SharedRuntimes.push_back(
"rtsan");
1722 StaticRuntimes.push_back(
"stats_client");
1726 HelperStaticRuntimes.push_back(
"asan_static");
1729 if (Args.hasArg(options::OPT_shared)) {
1738 StaticRuntimes.push_back(
"asan");
1740 StaticRuntimes.push_back(
"asan_cxx");
1745 StaticRuntimes.push_back(
"rtsan");
1748 StaticRuntimes.push_back(
"memprof");
1750 StaticRuntimes.push_back(
"memprof_cxx");
1755 StaticRuntimes.push_back(
"hwasan_aliases");
1757 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1759 StaticRuntimes.push_back(
"hwasan");
1761 StaticRuntimes.push_back(
"hwasan_cxx");
1765 StaticRuntimes.push_back(
"dfsan");
1767 StaticRuntimes.push_back(
"lsan");
1769 StaticRuntimes.push_back(
"msan");
1771 StaticRuntimes.push_back(
"msan_cxx");
1774 StaticRuntimes.push_back(
"nsan");
1776 StaticRuntimes.push_back(
"tsan");
1778 StaticRuntimes.push_back(
"tsan_cxx");
1781 StaticRuntimes.push_back(
"tysan");
1784 StaticRuntimes.push_back(
"ubsan_minimal");
1786 StaticRuntimes.push_back(
"ubsan_standalone");
1790 NonWholeStaticRuntimes.push_back(
"safestack");
1791 RequiredSymbols.push_back(
"__safestack_init");
1795 StaticRuntimes.push_back(
"cfi");
1797 StaticRuntimes.push_back(
"cfi_diag");
1802 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1805 NonWholeStaticRuntimes.push_back(
"stats");
1806 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1809 StaticRuntimes.push_back(
"scudo_standalone");
1811 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1814 NonWholeStaticRuntimes.push_back(
"ubsan_loop_detect");
1820 ArgStringList &CmdArgs) {
1823 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1826 NonWholeStaticRuntimes, HelperStaticRuntimes,
1831 for (
auto S : RequiredSymbols) {
1832 CmdArgs.push_back(
"-u");
1833 CmdArgs.push_back(Args.MakeArgString(S));
1837 for (
auto RT : SharedRuntimes)
1841 bool FuzzerNeedsSanitizerDeps =
false;
1843 !Args.hasArg(options::OPT_shared)) {
1846 FuzzerNeedsSanitizerDeps =
true;
1850 if (!Args.hasArg(options::OPT_nostdlibxx)) {
1851 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1852 !Args.hasArg(options::OPT_static);
1853 if (OnlyLibstdcxxStatic)
1854 CmdArgs.push_back(
"-Bstatic");
1856 if (OnlyLibstdcxxStatic)
1857 CmdArgs.push_back(
"-Bdynamic");
1861 for (
auto RT : HelperStaticRuntimes)
1863 bool AddExportDynamic =
false;
1864 for (
auto RT : StaticRuntimes) {
1868 for (
auto RT : NonWholeStaticRuntimes) {
1874 if (AddExportDynamic && !TC.
getTriple().isNVPTX())
1875 CmdArgs.push_back(
"--export-dynamic");
1878 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1881 CmdArgs.push_back(
"-z");
1883 Args.MakeArgString(
"memtag-mode=" + SanArgs.
getMemtagMode()));
1886 CmdArgs.push_back(
"-z");
1887 CmdArgs.push_back(
"memtag-heap");
1891 CmdArgs.push_back(
"-z");
1892 CmdArgs.push_back(
"memtag-stack");
1896 CmdArgs.push_back(
"--android-memtag-note");
1899 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty() ||
1900 FuzzerNeedsSanitizerDeps;
1905 if (Args.hasArg(options::OPT_shared)) {
1907 CmdArgs.push_back(
"--whole-archive");
1909 CmdArgs.push_back(
"--no-whole-archive");
1913 CmdArgs.push_back(
"--whole-archive");
1915 for (
const auto &Mode : XRay.
modeList())
1917 CmdArgs.push_back(
"--no-whole-archive");
1925 const llvm::opt::ArgList &Args,
1926 ArgStringList &CmdArgs) {
1928 CmdArgs.push_back(
"-lpthread");
1930 CmdArgs.push_back(
"-lrt");
1931 CmdArgs.push_back(
"-lm");
1936 CmdArgs.push_back(
"-ldl");
1941 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1942 return !A->getOption().matches(options::OPT_O0);
1950 auto AddPostfix = [JA](
auto &F) {
1955 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1956 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1960 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1963 if (Args.hasArg(options::OPT_o, options::OPT__SLASH_o,
1964 options::OPT__SLASH_Fo) &&
1965 Args.hasArg(options::OPT_c) && Output.
isFilename()) {
1969 llvm::sys::path::remove_filename(
T);
1970 llvm::sys::path::append(
T, llvm::sys::path::stem(Obj));
1972 return Args.MakeArgString(
T);
1978 return Args.MakeArgString(
T);
1982 const JobAction &JA,
const ArgList &Args,
1983 const InputInfo &Output,
const char *OutFile) {
1984 ArgStringList ExtractArgs;
1985 ExtractArgs.push_back(
"--extract-dwo");
1987 ArgStringList StripArgs;
1988 StripArgs.push_back(
"--strip-dwo");
1993 ExtractArgs.push_back(OutFile);
2000 C.addCommand(std::make_unique<Command>(JA,
T,
2002 Exec, ExtractArgs, II, Output));
2005 C.addCommand(std::make_unique<Command>(
2015 Args.ClaimAllArgs(options::OPT_flto_EQ);
2016 Args.ClaimAllArgs(options::OPT_flto);
2017 Args.ClaimAllArgs(options::OPT_fno_lto);
2021 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
2022 options::OPT_fcs_profile_generate_EQ,
2023 options::OPT_fno_profile_generate);
2024 if (CSPGOGenerateArg &&
2025 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
2026 CSPGOGenerateArg =
nullptr;
2028 return CSPGOGenerateArg;
2032 auto *ProfileUseArg = Args.getLastArg(
2033 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
2034 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2035 options::OPT_fno_profile_instr_use);
2037 if (ProfileUseArg &&
2038 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2039 ProfileUseArg =
nullptr;
2041 return ProfileUseArg;
2045 auto *ProfileSampleUseArg = Args.getLastArg(
2046 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
2048 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
2049 options::OPT_fno_profile_sample_use)))
2052 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
2057 case llvm::Reloc::Static:
2059 case llvm::Reloc::PIC_:
2061 case llvm::Reloc::DynamicNoPIC:
2062 return "dynamic-no-pic";
2063 case llvm::Reloc::ROPI:
2065 case llvm::Reloc::RWPI:
2067 case llvm::Reloc::ROPI_RWPI:
2070 llvm_unreachable(
"Unknown Reloc::Model kind");
2077std::tuple<llvm::Reloc::Model, unsigned, bool>
2085 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
2087 bool IsPICLevelTwo = PIC;
2090 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
2093 if (Triple.isAndroid()) {
2094 switch (Triple.getArch()) {
2095 case llvm::Triple::x86:
2096 case llvm::Triple::x86_64:
2098 IsPICLevelTwo =
true;
2108 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
2112 if (Triple.isOSOpenBSD()) {
2114 case llvm::Triple::arm:
2115 case llvm::Triple::aarch64:
2116 case llvm::Triple::mips64:
2117 case llvm::Triple::mips64el:
2118 case llvm::Triple::x86:
2119 case llvm::Triple::x86_64:
2120 IsPICLevelTwo =
false;
2123 case llvm::Triple::ppc:
2124 case llvm::Triple::sparcv9:
2125 IsPICLevelTwo =
true;
2137 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2138 options::OPT_fpic, options::OPT_fno_pic,
2139 options::OPT_fPIE, options::OPT_fno_PIE,
2140 options::OPT_fpie, options::OPT_fno_pie);
2141 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
2142 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
2143 options::OPT_fPIE, options::OPT_fpie)) {
2145 << LastPICArg->getSpelling() << Triple.str();
2146 if (Triple.getArch() == llvm::Triple::x86_64)
2147 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
2148 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2155 Option O = LastPICArg->getOption();
2156 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2157 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2158 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2160 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2162 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
2165 if (EffectiveTriple.isPS()) {
2166 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
2167 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
2168 if (Model !=
"kernel") {
2171 << LastPICArg->getSpelling()
2172 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
2182 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
2188 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
2189 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
2192 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2195 if (!Triple.isOSDarwin())
2197 << A->getSpelling() << Triple.str();
2206 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
2209 bool EmbeddedPISupported;
2210 switch (Triple.getArch()) {
2211 case llvm::Triple::arm:
2212 case llvm::Triple::armeb:
2213 case llvm::Triple::thumb:
2214 case llvm::Triple::thumbeb:
2215 EmbeddedPISupported =
true;
2218 EmbeddedPISupported =
false;
2222 bool ROPI =
false, RWPI =
false;
2223 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
2224 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
2225 if (!EmbeddedPISupported)
2227 << LastROPIArg->getSpelling() << Triple.str();
2230 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2231 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2232 if (!EmbeddedPISupported)
2234 << LastRWPIArg->getSpelling() << Triple.str();
2239 if ((ROPI || RWPI) && (PIC || PIE))
2242 if (Triple.isMIPS()) {
2249 if (ABIName ==
"n64")
2252 if(Args.hasArg(options::OPT_mno_abicalls))
2253 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2256 IsPICLevelTwo =
false;
2260 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2262 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2264 RelocM = llvm::Reloc::ROPI_RWPI;
2266 RelocM = llvm::Reloc::ROPI;
2268 RelocM = llvm::Reloc::RWPI;
2270 return std::make_tuple(RelocM, 0
U,
false);
2274 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
2275 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
2277 const llvm::opt::OptTable &Opts = D.
getOpts();
2278 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
2279 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
2280 D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
2282 return HasStaticPIE;
2302 const ArgList &Args) {
2303 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2304 options::OPT_falign_functions_EQ,
2305 options::OPT_fno_align_functions);
2306 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2309 if (A->getOption().matches(options::OPT_falign_functions))
2313 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2315 << A->getAsString(Args) << A->getValue();
2320 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2321 switch (DebugInfoKind) {
2322 case llvm::codegenoptions::DebugDirectivesOnly:
2323 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2325 case llvm::codegenoptions::DebugLineTablesOnly:
2326 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2328 case llvm::codegenoptions::DebugInfoConstructor:
2329 CmdArgs.push_back(
"-debug-info-kind=constructor");
2331 case llvm::codegenoptions::LimitedDebugInfo:
2332 CmdArgs.push_back(
"-debug-info-kind=limited");
2334 case llvm::codegenoptions::FullDebugInfo:
2335 CmdArgs.push_back(
"-debug-info-kind=standalone");
2337 case llvm::codegenoptions::UnusedTypeInfo:
2338 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2348 assert(A.getOption().matches(options::OPT_gN_Group) &&
2349 "Not a -g option that specifies a debug-info level");
2350 if (A.getOption().matches(options::OPT_g0) ||
2351 A.getOption().matches(options::OPT_ggdb0))
2352 return llvm::codegenoptions::NoDebugInfo;
2353 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2354 A.getOption().matches(options::OPT_ggdb1))
2355 return llvm::codegenoptions::DebugLineTablesOnly;
2356 if (A.getOption().matches(options::OPT_gline_directives_only))
2357 return llvm::codegenoptions::DebugDirectivesOnly;
2358 return llvm::codegenoptions::DebugInfoConstructor;
2362 const ArgList &Args) {
2363 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2369 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 6 ||
2372 << A->getAsString(Args) << A->getValue();
2377 return llvm::StringSwitch<unsigned>(ArgValue)
2378 .Case(
"-gdwarf-2", 2)
2379 .Case(
"-gdwarf-3", 3)
2380 .Case(
"-gdwarf-4", 4)
2381 .Case(
"-gdwarf-5", 5)
2382 .Case(
"-gdwarf-6", 6)
2387 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2388 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2389 options::OPT_gdwarf_6, options::OPT_gdwarf);
2393 const llvm::opt::ArgList &Args) {
2398 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2399 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2400 << GDwarfN->getSpelling() << TC.
getTriple().str();
2402 if (DwarfVersion == 0) {
2404 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2406 return DwarfVersion;
2410 const ArgList &Args, Arg *&Arg) {
2411 Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
2412 options::OPT_gno_split_dwarf);
2413 if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
2416 if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
2419 StringRef
Value = Arg->getValue();
2420 if (
Value ==
"split")
2422 if (
Value ==
"single")
2425 D.
Diag(diag::err_drv_unsupported_option_argument)
2426 << Arg->getSpelling() << Arg->getValue();
2432 assert(A &&
"Expected non-nullptr argument.");
2435 D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
2441 const ArgList &Args,
2442 ArgStringList &CmdArgs) {
2443 if (Args.hasFlag(options::OPT_fdebug_info_for_profiling,
2444 options::OPT_fno_debug_info_for_profiling,
false) &&
2446 Args.getLastArg(options::OPT_fdebug_info_for_profiling), Args, D, TC))
2447 CmdArgs.push_back(
"-fdebug-info-for-profiling");
2451 ArgStringList &CmdArgs) {
2452 llvm::Reloc::Model RelocationModel;
2457 if (RelocationModel != llvm::Reloc::Static)
2458 CmdArgs.push_back(
"-KPIC");
2464 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2470 const ArgList &Args) {
2471 if (Args.hasArg(options::OPT_static_libgcc) ||
2472 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2476 if (Args.hasArg(options::OPT_shared_libgcc))
2495 ArgStringList &CmdArgs,
const ArgList &Args) {
2499 CmdArgs.push_back(
"-l:libunwind.a");
2522 CmdArgs.push_back(
"-lgcc_eh");
2524 CmdArgs.push_back(
"-lgcc_s");
2532 CmdArgs.push_back(
"-lunwind");
2534 CmdArgs.push_back(
"-l:libunwind.a");
2537 CmdArgs.push_back(
"-l:libunwind.dll.a");
2539 CmdArgs.push_back(
"-l:libunwind.so");
2543 CmdArgs.push_back(
"-lunwind");
2553 ArgStringList &CmdArgs,
const ArgList &Args) {
2557 CmdArgs.push_back(
"-lgcc");
2561 CmdArgs.push_back(
"-lgcc");
2565 CmdArgs.push_back(
"--as-needed");
2567 CmdArgs.push_back(
"--no-as-needed");
2572 ArgStringList &CmdArgs,
const ArgList &Args) {
2583 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2586 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2587 if (A && A->getValue() != StringRef(
"platform")) {
2588 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2589 << A->getValue() <<
"MSVC";
2599 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2600 !Args.hasArg(options::OPT_static_pie))
2601 CmdArgs.push_back(
"-ldl");
2608 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2614 StringRef SaveStats = A->getValue();
2615 if (SaveStats ==
"obj" && Output.
isFilename()) {
2617 llvm::sys::path::remove_filename(StatsFile);
2618 }
else if (SaveStats !=
"cwd") {
2619 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2623 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2624 llvm::sys::path::append(StatsFile, BaseName);
2625 llvm::sys::path::replace_extension(StatsFile,
"stats");
2637 assert(Flag.front() ==
'-');
2639 Flags.push_back(Flag.str());
2641 Flags.push_back((
"!" + Flag.substr(1)).str());
2646 ArgStringList &CmdArgs,
bool IsLTO,
2647 const StringRef PluginOptPrefix) {
2648 auto addArg = [&, IsLTO](
const Twine &Arg) {
2650 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2651 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2653 CmdArgs.push_back(
"-mllvm");
2654 CmdArgs.push_back(Args.MakeArgString(Arg));
2658 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2659 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2661 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2662 StringRef
Value = A->getValue();
2664 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2665 !llvm::isPowerOf2_64(Boundary)) {
2666 D.
Diag(diag::err_drv_invalid_argument_to_option)
2667 <<
Value << A->getOption().getName();
2669 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2672 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2673 std::string AlignBranch;
2674 for (StringRef
T : A->getValues()) {
2675 if (
T !=
"fused" &&
T !=
"jcc" &&
T !=
"jmp" &&
T !=
"call" &&
2676 T !=
"ret" &&
T !=
"indirect")
2677 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2678 <<
T <<
"fused, jcc, jmp, call, ret, indirect";
2679 if (!AlignBranch.empty())
2683 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2685 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2686 StringRef
Value = A->getValue();
2687 unsigned PrefixSize;
2688 if (
Value.getAsInteger(10, PrefixSize)) {
2689 D.
Diag(diag::err_drv_invalid_argument_to_option)
2690 <<
Value << A->getOption().getName();
2692 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2697static llvm::opt::Arg *
2699 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2703 const llvm::opt::ArgList &Args) {
2704 const unsigned MinCodeObjVer = 4;
2705 const unsigned MaxCodeObjVer = 6;
2708 if (CodeObjArg->getOption().getID() ==
2709 options::OPT_mcode_object_version_EQ) {
2710 unsigned CodeObjVer = MaxCodeObjVer;
2712 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2713 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2714 D.
Diag(diag::err_drv_invalid_int_value)
2715 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2721 const llvm::opt::ArgList &Args) {
2722 unsigned CodeObjVer = 6;
2724 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2729 const Driver &D,
const llvm::opt::ArgList &Args) {
2734 const llvm::opt::ArgList &Args,
2735 llvm::opt::ArgStringList &CmdArgs,
2736 const llvm::Triple &Triple,
bool IsLTO,
2737 const StringRef PluginOptPrefix) {
2738 auto addArg = [&, IsLTO](
const Twine &Arg) {
2740 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2741 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2743 CmdArgs.push_back(
"-mllvm");
2744 CmdArgs.push_back(Args.MakeArgString(Arg));
2748 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2749 options::OPT_mno_outline)) {
2750 if (A->getOption().matches(options::OPT_moutline)) {
2754 if (Triple.isARM() || Triple.isThumb() || Triple.isAArch64() ||
2755 Triple.isRISCV() || Triple.isX86()) {
2756 addArg(Twine(
"-enable-machine-outliner"));
2758 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2764 CmdArgs.push_back(
"-mno-outline");
2767 addArg(Twine(
"-enable-machine-outliner=never"));
2771 auto *CodeGenDataGenArg =
2772 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
2773 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
2776 if (CodeGenDataGenArg && CodeGenDataUseArg)
2777 D.
Diag(diag::err_drv_argument_not_allowed_with)
2778 << CodeGenDataGenArg->getAsString(Args)
2779 << CodeGenDataUseArg->getAsString(Args);
2783 if (CodeGenDataGenArg)
2784 addArg(Twine(
"-codegen-data-generate"));
2787 if (CodeGenDataUseArg)
2788 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
2792 const llvm::opt::ArgList &Args,
2793 llvm::opt::ArgStringList &CmdArgs,
2794 const llvm::Triple &Triple) {
2795 if (Arg *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
2796 options::OPT_fno_split_machine_functions)) {
2797 if (!A->getOption().matches(options::OPT_fno_split_machine_functions)) {
2799 if ((Triple.isX86() || Triple.isAArch64()) && Triple.isOSBinFormatELF())
2800 A->render(Args, CmdArgs);
2802 D.
Diag(diag::err_drv_unsupported_opt_for_target)
2803 << A->getAsString(Args) << Triple.getTriple();
2809 const llvm::opt::ArgList &DriverArgs,
2810 llvm::opt::ArgStringList &CC1Args,
2811 StringRef BitcodeSuffix,
2812 const llvm::Triple &Triple,
2817 std::optional<std::string> LibPath =
2818 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2821 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2822 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2823 for (StringRef Path : Frags)
2824 LibraryPaths.emplace_back(Path.trim());
2829 LibraryPaths.emplace_back(LibPath);
2833 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
2834 LibraryPaths.emplace_back(P);
2836 OptSpecifier LibomptargetBCPathOpt =
2837 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
2838 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
2839 : options::OPT_libomptarget_spirv_bc_path_EQ;
2841 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
2842 : Triple.isNVPTX() ?
"nvptx"
2844 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
2847 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
2849 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
2850 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
2851 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2854 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2855 CC1Args.push_back(
"-mlink-builtin-bitcode");
2856 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2858 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
2859 << LibOmpTargetFile;
2862 bool FoundBCLibrary =
false;
2864 for (StringRef LibraryPath : LibraryPaths) {
2866 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2867 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2868 CC1Args.push_back(
"-mlink-builtin-bitcode");
2869 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2870 FoundBCLibrary =
true;
2875 if (!FoundBCLibrary)
2876 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
2877 << LibOmpTargetName << ArchPrefix;
2882 const llvm::opt::ArgList &DriverArgs,
2883 llvm::opt::ArgStringList &CC1Args) {
2885 StringRef LibclcNamespec;
2886 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
2889 LibclcNamespec = A->getValue();
2891 if (!TT.isAMDGPU() || TT.getEnvironment() != llvm::Triple::LLVM)
2895 if (DriverArgs.hasArg(options::OPT_no_offloadlib,
2896 options::OPT_nodefaultlibs, options::OPT_nostdlib))
2900 bool FilenameSearch = LibclcNamespec.consume_front(
":");
2901 if (FilenameSearch) {
2903 if (D.
getVFS().exists(LibclcFile)) {
2904 CC1Args.push_back(
"-mlink-builtin-bitcode");
2905 CC1Args.push_back(DriverArgs.MakeArgString(LibclcFile));
2908 D.
Diag(diag::err_drv_libclc_not_found) << LibclcFile;
2914 llvm::sys::path::append(ResourceLibPath,
"lib");
2917 if (
const Arg *CPUArg = DriverArgs.getLastArg(options::OPT_mcpu_EQ))
2918 CPU = CPUArg->getValue();
2921 auto TryTriplePath = [&](StringRef TripleStr) ->
bool {
2923 llvm::sys::path::append(BasePath, TripleStr);
2930 llvm::sys::path::append(CPUPath, CPU,
"libclc.bc");
2931 if (D.
getVFS().exists(CPUPath)) {
2932 CC1Args.push_back(
"-mlink-builtin-bitcode");
2933 CC1Args.push_back(DriverArgs.MakeArgString(CPUPath));
2940 llvm::sys::path::append(GenericPath,
"libclc.bc");
2941 if (D.
getVFS().exists(GenericPath)) {
2942 CC1Args.push_back(
"-mlink-builtin-bitcode");
2943 CC1Args.push_back(DriverArgs.MakeArgString(GenericPath));
2950 if (TryTriplePath(TT.str()))
2953 llvm::Triple::SubArchType SubArch = TT.getSubArch();
2954 if (TT.isAMDGCN() && SubArch != llvm::Triple::NoSubArch) {
2959 llvm::Triple::SubArchType MajorSubArch =
2960 llvm::AMDGPU::getMajorSubArch(SubArch);
2961 if (MajorSubArch != SubArch) {
2962 llvm::Triple MajorTT(TT);
2963 MajorTT.setArch(TT.getArch(), MajorSubArch);
2964 if (TryTriplePath(MajorTT.str()))
2969 llvm::Triple NoSubArchTT(TT);
2970 NoSubArchTT.setArch(TT.getArch(), llvm::Triple::NoSubArch);
2971 if (TryTriplePath(NoSubArchTT.str()))
2975 D.
Diag(diag::err_drv_libclc_not_found) <<
"libclc.bc";
2980 const llvm::opt::ArgList &Args,
2981 llvm::opt::ArgStringList &CmdArgs,
2982 const llvm::Triple &Triple) {
2983 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
2984 options::OPT_mno_outline_atomics)) {
2986 if (!Triple.isAArch64()) {
2987 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
2988 << Triple.getArchName() << A->getOption().getName();
2990 if (A->getOption().matches(options::OPT_moutline_atomics)) {
2991 CmdArgs.push_back(
"-target-feature");
2992 CmdArgs.push_back(
"+outline-atomics");
2994 CmdArgs.push_back(
"-target-feature");
2995 CmdArgs.push_back(
"-outline-atomics");
2999 CmdArgs.push_back(
"-target-feature");
3000 CmdArgs.push_back(
"+outline-atomics");
3005 llvm::opt::ArgStringList &CmdArgs) {
3006 if (TCArgs.hasFlag(options::OPT_offload_compress,
3007 options::OPT_no_offload_compress,
false))
3008 CmdArgs.push_back(
"--compress");
3009 if (TCArgs.hasArg(options::OPT_v))
3010 CmdArgs.push_back(
"--verbose");
3011 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3013 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3017 const llvm::Triple &Triple,
3018 const llvm::Reloc::Model &RelocationModel,
3019 llvm::opt::ArgStringList &CmdArgs) {
3020 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3021 StringRef CM = A->getValue();
3023 if (Triple.isOSAIX() && CM ==
"medium")
3025 if (Triple.isAArch64(64)) {
3026 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3027 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3028 RelocationModel != llvm::Reloc::Static)
3029 D.
Diag(diag::err_drv_argument_only_allowed_with)
3030 << A->getAsString(Args) <<
"-fno-pic";
3031 }
else if (Triple.isLoongArch()) {
3032 if (CM ==
"extreme" &&
3033 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3034 D.
Diag(diag::err_drv_argument_not_allowed_with)
3035 << A->getAsString(Args) <<
"-fplt";
3036 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3039 CM = llvm::StringSwitch<StringRef>(CM)
3040 .Case(
"normal",
"small")
3041 .Case(
"extreme",
"large")
3043 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3044 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3045 }
else if (Triple.isRISCV()) {
3047 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3048 D.
Diag(diag::err_drv_argument_not_allowed_with)
3049 << A->getAsString(Args) <<
"-fpic";
3052 else if (CM ==
"medany")
3054 Ok = CM ==
"small" || CM ==
"medium" ||
3055 (CM ==
"large" && Triple.isRISCV64());
3056 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3057 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3058 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3062 }
else if (Triple.isSPARC64()) {
3065 else if (CM ==
"medmid")
3067 else if (CM ==
"medany")
3069 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3070 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3071 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3074 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3076 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3077 << A->getSpelling() << CM << Triple.getTriple();
3081 if (Triple.getArch() == llvm::Triple::x86_64) {
3082 bool IsMediumCM =
false;
3083 bool IsLargeCM =
false;
3084 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3085 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3086 IsLargeCM = StringRef(A->getValue()) ==
"large";
3088 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3089 if (!IsMediumCM && !IsLargeCM) {
3090 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3091 << A->getOption().getRenderName();
3093 A->render(Args, CmdArgs);
3095 }
else if (IsMediumCM) {
3096 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3097 }
else if (IsLargeCM) {
3098 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3104 ArgStringList &CmdArgs) {
3109 Args.getLastArg(options::OPT_fcolor_diagnostics,
3110 options::OPT_fno_color_diagnostics);
3111 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3112 StringRef
Value(A->getValue());
3114 D.
Diag(diag::err_drv_invalid_argument_to_option)
3115 <<
Value << A->getOption().getName();
3120 CmdArgs.push_back(
"-fcolor-diagnostics");
3123 CmdArgs.push_back(
"-fno-color-diagnostics");
3132 for (; *Arg; ++Arg) {
3138 Res.push_back(
'\\');
3141 Res.push_back(*Arg);
3146 const llvm::opt::ArgList &Args) {
3150 llvm::opt::ArgStringList OriginalArgs;
3151 for (
const auto &Arg : Args)
3152 Arg->render(Args, OriginalArgs);
3156 for (
const char *OriginalArg : OriginalArgs) {
3160 Flags += EscapedArg;
3163 return Args.MakeArgString(Flags);
3167 const llvm::opt::ArgList &Args,
3168 bool &FRecordCommandLine,
3169 bool &GRecordCommandLine,
3170 bool &DXRecordCommandLine) {
3173 const std::string &TripleStr = Triple.getTriple();
3175 FRecordCommandLine =
3176 Args.hasFlag(options::OPT_frecord_command_line,
3177 options::OPT_fno_record_command_line,
false);
3178 GRecordCommandLine =
3179 Args.hasFlag(options::OPT_grecord_command_line,
3180 options::OPT_gno_record_command_line,
false);
3181 DXRecordCommandLine = Triple.isDXIL() && Args.hasArg(options::OPT_g_Flag);
3182 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3183 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3184 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3185 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3189 DXRecordCommandLine;
3193 ArgStringList &CmdArgs,
3194 const llvm::Triple &Triple) {
3195 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
3196 options::OPT_fno_global_isel)) {
3197 CmdArgs.push_back(
"-mllvm");
3198 if (A->getOption().matches(options::OPT_fglobal_isel)) {
3199 CmdArgs.push_back(
"-global-isel=1");
3204 bool IsArchSupported = Triple.getArch() == llvm::Triple::aarch64;
3205 bool IsOptLevelSupported =
false;
3207 Arg *A = Args.getLastArg(options::OPT_O_Group);
3208 if (IsArchSupported) {
3209 if (!A || A->getOption().matches(options::OPT_O0))
3210 IsOptLevelSupported =
true;
3212 if (!IsArchSupported || !IsOptLevelSupported) {
3213 CmdArgs.push_back(
"-mllvm");
3214 CmdArgs.push_back(
"-global-isel-abort=2");
3216 if (!IsArchSupported)
3217 D.
Diag(diag::warn_drv_global_isel_incomplete) << Triple.getArchName();
3219 D.
Diag(diag::warn_drv_global_isel_incomplete_opt);
3222 CmdArgs.push_back(
"-global-isel=0");
3228 ArgStringList &CmdArgs,
3229 bool IsMSVCCompat) {
3230 bool use_fwrapv = IsMSVCCompat;
3231 bool use_fwrapv_pointer =
false;
3232 for (
const Arg *A : Args.filtered(
3233 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3234 options::OPT_fwrapv, options::OPT_fno_wrapv,
3235 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3237 switch (A->getOption().getID()) {
3238 case options::OPT_fstrict_overflow:
3240 use_fwrapv_pointer =
false;
3242 case options::OPT_fno_strict_overflow:
3244 use_fwrapv_pointer =
true;
3246 case options::OPT_fwrapv:
3249 case options::OPT_fno_wrapv:
3252 case options::OPT_fwrapv_pointer:
3253 use_fwrapv_pointer =
true;
3255 case options::OPT_fno_wrapv_pointer:
3256 use_fwrapv_pointer =
false;
3262 CmdArgs.push_back(
"-fwrapv");
3263 if (!use_fwrapv && IsMSVCCompat)
3264 CmdArgs.push_back(
"-fno-wrapv");
3265 if (use_fwrapv_pointer)
3266 CmdArgs.push_back(
"-fwrapv-pointer");
3273 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3274 if (A->getOption().matches(options::OPT_O4) ||
3275 A->getOption().matches(options::OPT_Ofast))
3278 if (A->getOption().matches(options::OPT_O0))
3281 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3284 StringRef S(A->getValue());
3292 unsigned OptLevel = 0;
3293 if (S.getAsInteger(10, OptLevel))
3296 return OptLevel > 1;
3303 ArgStringList &CmdArgs) {
3305 if (Args.hasFlag(options::OPT_fvectorize, options::OPT_fno_vectorize,
3307 CmdArgs.push_back(
"-vectorize-loops");
3311 ArgStringList &CmdArgs) {
3313 if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize,
3315 CmdArgs.push_back(
"-vectorize-slp");
3319 ArgStringList &CmdArgs) {
3322 Args.AddLastArg(CmdArgs, options::OPT_floop_interchange,
3323 options::OPT_fno_loop_interchange);
3344 llvm_unreachable(
"Fully covered switch above");
3350 if (!ComplexRangeStr.empty())
3351 return "-complex-range=" + ComplexRangeStr;
3352 return ComplexRangeStr;
3372 if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
3373 (LastOpt ==
"-fcx-limited-range" && NewOpt ==
"-fno-cx-limited-range") ||
3374 (LastOpt ==
"-fno-cx-limited-range" && NewOpt ==
"-fcx-limited-range") ||
3375 (LastOpt ==
"-fcx-fortran-rules" && NewOpt ==
"-fno-cx-fortran-rules") ||
3376 (LastOpt ==
"-fno-cx-fortran-rules" && NewOpt ==
"-fcx-fortran-rules") ||
3377 (LastOpt ==
"-ffast-math" && NewOpt ==
"-fno-fast-math") ||
3378 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-ffast-math") ||
3379 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-fno-fast-math") ||
3380 (LastOpt.starts_with(
"-ffp-model=") &&
3381 NewOpt.starts_with(
"-ffp-model=")) ||
3382 (LastOpt.starts_with(
"-fcomplex-arithmetic=") &&
3383 NewOpt.starts_with(
"-fcomplex-arithmetic=")))
3386 D.
Diag(clang::diag::warn_drv_overriding_complex_range)
3406 const ArgStringList &LinkerInputs,
3408 const llvm::opt::ArgList &Args,
3409 const char *OutputFilename) {
3413 assert(!LinkerInputs.empty() && !JobInputs.empty() &&
3414 "Must have at least one input.");
3416 ArgStringList LlvmLinkArgs(
3417 {
"-o", OutputFilename ? OutputFilename : Output.
getFilename()});
3419 LlvmLinkArgs.append(LinkerInputs);
3422 const char *LlvmLink = Args.MakeArgString(TC.
GetProgramPath(
"llvm-link"));
3424 LlvmLink, LlvmLinkArgs, JobInputs,
static bool useLeafFramePointerForTargetByDefault(const llvm::Triple &Triple)
static unsigned ParseDebugDefaultVersion(const ToolChain &TC, const ArgList &Args)
static void getWebAssemblyTargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, std::vector< StringRef > &Features)
static void emitComplexRangeDiag(const Driver &D, StringRef LastOpt, LangOptions::ComplexRangeKind Range, StringRef NewOpt, LangOptions::ComplexRangeKind NewRange)
static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer)
static bool mustMaintainValidFrameChain(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static llvm::opt::Arg * getAMDGPUCodeObjectArgument(const Driver &D, const llvm::opt::ArgList &Args)
static void collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, SmallVectorImpl< StringRef > &SharedRuntimes, SmallVectorImpl< StringRef > &StaticRuntimes, SmallVectorImpl< StringRef > &NonWholeStaticRuntimes, SmallVectorImpl< StringRef > &HelperStaticRuntimes, SmallVectorImpl< StringRef > &RequiredSymbols)
static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer, bool IsShared, bool IsWhole)
static void AddUnwindLibrary(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
static bool 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 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)
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.
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
static constexpr ResponseFileSupport AtFileCurCP()