28#include "clang/Config/config.h"
40#include "llvm/ADT/STLExtras.h"
41#include "llvm/ADT/SmallSet.h"
42#include "llvm/ADT/SmallString.h"
43#include "llvm/ADT/StringExtras.h"
44#include "llvm/ADT/StringSwitch.h"
45#include "llvm/ADT/Twine.h"
46#include "llvm/BinaryFormat/Magic.h"
47#include "llvm/Config/llvm-config.h"
48#include "llvm/Option/Arg.h"
49#include "llvm/Option/ArgList.h"
50#include "llvm/Option/Option.h"
51#include "llvm/Support/CodeGen.h"
52#include "llvm/Support/Compression.h"
53#include "llvm/Support/ErrorHandling.h"
54#include "llvm/Support/FileSystem.h"
55#include "llvm/Support/Path.h"
56#include "llvm/Support/Process.h"
57#include "llvm/Support/Program.h"
58#include "llvm/Support/Threading.h"
59#include "llvm/Support/VirtualFileSystem.h"
60#include "llvm/Support/YAMLParser.h"
61#include "llvm/TargetParser/AMDGPUTargetParser.h"
62#include "llvm/TargetParser/Host.h"
63#include "llvm/TargetParser/PPCTargetParser.h"
72 Arg *A = Args.getLastArg(options::OPT_offload_jobs_EQ);
76 StringRef Val = A->getValue();
77 if (Val.equals_insensitive(
"jobserver"))
81 if (Val.getAsInteger(10, NumThreads) || NumThreads <= 0)
88 const llvm::Triple &Triple) {
89 if (Args.hasArg(options::OPT_pg) && !Args.hasArg(options::OPT_mfentry))
92 if (Triple.isAndroid())
95 switch (Triple.getArch()) {
96 case llvm::Triple::xcore:
97 case llvm::Triple::wasm32:
98 case llvm::Triple::wasm64:
99 case llvm::Triple::msp430:
103 case llvm::Triple::ppc:
104 case llvm::Triple::ppcle:
105 case llvm::Triple::ppc64:
106 case llvm::Triple::ppc64le:
107 case llvm::Triple::riscv32:
108 case llvm::Triple::riscv64:
109 case llvm::Triple::riscv32be:
110 case llvm::Triple::riscv64be:
111 case llvm::Triple::sparc:
112 case llvm::Triple::sparcel:
113 case llvm::Triple::sparcv9:
114 case llvm::Triple::amdgpu:
115 case llvm::Triple::r600:
116 case llvm::Triple::csky:
117 case llvm::Triple::loongarch32:
118 case llvm::Triple::loongarch64:
119 case llvm::Triple::m68k:
120 case llvm::Triple::mips64:
121 case llvm::Triple::mips64el:
122 case llvm::Triple::mips:
123 case llvm::Triple::mipsel:
129 if (Triple.isOSFuchsia() || Triple.isOSNetBSD()) {
133 if (Triple.isOSLinux() || Triple.isOSHurd()) {
134 switch (Triple.getArch()) {
136 case llvm::Triple::arm:
137 case llvm::Triple::armeb:
138 case llvm::Triple::thumb:
139 case llvm::Triple::thumbeb:
140 case llvm::Triple::systemz:
141 case llvm::Triple::x86:
142 case llvm::Triple::x86_64:
149 if (Triple.isOSWindows()) {
150 switch (Triple.getArch()) {
151 case llvm::Triple::x86:
153 case llvm::Triple::x86_64:
154 return Triple.isOSBinFormatMachO();
155 case llvm::Triple::arm:
156 case llvm::Triple::thumb:
173 if (Triple.isAArch64() || Triple.isPS() || Triple.isVE() ||
174 (Triple.isAndroid() && !Triple.isARM()))
177 if ((Triple.isARM() || Triple.isThumb()) && Triple.isOSBinFormatMachO())
184 switch (Triple.getArch()) {
187 case llvm::Triple::arm:
188 case llvm::Triple::thumb:
191 return Triple.isOSDarwin();
198 const llvm::Triple &Triple) {
199 switch (Triple.getArch()) {
202 case llvm::Triple::arm:
203 case llvm::Triple::armeb:
204 case llvm::Triple::thumb:
205 case llvm::Triple::thumbeb:
209 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
210 StringRef
V = A->getValue();
215 case llvm::Triple::aarch64:
219 return Triple.isOSWindows();
226 const llvm::Triple &Triple) {
227 if (Triple.isARM() || Triple.isThumb()) {
231 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
232 StringRef
V = A->getValue();
233 return V ==
"aapcs+leaf";
242 const llvm::Triple &Triple) {
284 Args.hasFlag(options::OPT_fno_omit_frame_pointer,
285 options::OPT_fomit_frame_pointer, DefaultFP);
291 Args.hasFlag(options::OPT_mno_omit_leaf_frame_pointer,
292 options::OPT_momit_leaf_frame_pointer, DefaultLeafFP);
294 bool FPRegReserved = Args.hasFlag(options::OPT_mreserve_frame_pointer_reg,
295 options::OPT_mno_reserve_frame_pointer_reg,
313 const StringRef PluginOptPrefix) {
314 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
315 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
316 "-pass-remarks=" + A->getValue()));
318 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
319 CmdArgs.push_back(Args.MakeArgString(
320 Twine(PluginOptPrefix) +
"-pass-remarks-missed=" + A->getValue()));
322 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
323 CmdArgs.push_back(Args.MakeArgString(
324 Twine(PluginOptPrefix) +
"-pass-remarks-analysis=" + A->getValue()));
328 const llvm::Triple &Triple,
331 const StringRef PluginOptPrefix) {
332 StringRef Format =
"yaml";
333 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
334 Format = A->getValue();
338 Args.getLastArg(options::OPT_foptimization_record_file_EQ)) {
341 }
else if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
348 assert(!F.empty() &&
"Cannot determine remarks output name.");
350 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
351 "opt-remarks-filename=" + F +
"opt.ld." +
355 Args.getLastArg(options::OPT_foptimization_record_passes_EQ))
356 CmdArgs.push_back(Args.MakeArgString(
357 Twine(PluginOptPrefix) +
"opt-remarks-passes=" + A->getValue()));
359 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
360 "opt-remarks-format=" + Format.data()));
364 ArgStringList &CmdArgs,
365 const StringRef PluginOptPrefix) {
366 if (Args.hasFlag(options::OPT_fdiagnostics_show_hotness,
367 options::OPT_fno_diagnostics_show_hotness,
false))
368 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
369 "opt-remarks-with-hotness"));
372 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ))
374 Args.MakeArgString(Twine(PluginOptPrefix) +
375 "opt-remarks-hotness-threshold=" + A->getValue()));
380 StringRef Processor) {
384 llvm::AMDGPU::GPUKind GPUKind = llvm::AMDGPU::parseArchAMDGCN(Processor);
385 unsigned GPUFeatures = llvm::AMDGPU::getArchAttrAMDGCN(GPUKind);
386 if (GPUFeatures & llvm::AMDGPU::FEATURE_WGP)
388 return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode);
393 if (D.
getVFS().exists(Path))
394 Paths.push_back(Path.str());
398 const llvm::Triple &Triple,
400 std::vector<StringRef> &Features,
401 OptSpecifier Group) {
402 std::set<StringRef> Warned;
403 for (
const Arg *A : Args.filtered(Group)) {
404 StringRef Name = A->getOption().getName();
408 assert(Name.starts_with(
"m") &&
"Invalid feature name.");
409 Name = Name.substr(1);
413 if (Warned.count(Name) == 0) {
415 clang::diag::warn_drv_unsupported_option_for_processor)
416 << A->getAsString(Args) << Proc;
422 bool IsNegative = Name.consume_front(
"no-");
424 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
432 llvm::DenseSet<StringRef> UsedFeatures;
433 for (StringRef
Feature : llvm::reverse(Features)) {
434 if (UsedFeatures.insert(
Feature.drop_front()).second)
435 UnifiedFeatures.insert(UnifiedFeatures.begin(),
Feature);
438 return UnifiedFeatures;
442 const char *ArgName,
const char *EnvVar) {
443 const char *DirList = ::getenv(EnvVar);
444 bool CombinedArg =
false;
449 StringRef Name(ArgName);
450 if (Name ==
"-I" || Name ==
"-L" || Name.empty())
453 StringRef Dirs(DirList);
457 StringRef::size_type Delim;
458 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
461 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
463 CmdArgs.push_back(ArgName);
464 CmdArgs.push_back(
".");
469 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
471 CmdArgs.push_back(ArgName);
472 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
475 Dirs = Dirs.substr(Delim + 1);
480 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
482 CmdArgs.push_back(ArgName);
483 CmdArgs.push_back(
".");
487 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
489 CmdArgs.push_back(ArgName);
490 CmdArgs.push_back(Args.MakeArgString(Dirs));
496 const ArgList &Args, ArgStringList &CmdArgs,
502 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
509 for (
const auto &II : Inputs) {
513 if (
auto *IA = II.getAction())
523 if (II.isFilename()) {
524 CmdArgs.push_back(II.getFilename());
533 const Arg &A = II.getInputArg();
536 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
538 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
541 else if (A.getOption().matches(options::OPT_rpath) &&
545 A.renderAsInput(Args, CmdArgs);
547 if (
const Arg *A = Args.getLastArg(options::OPT_fveclib)) {
548 const llvm::Triple &Triple = TC.
getTriple();
549 StringRef
V = A->getValue();
550 if (
V ==
"ArmPL" && (Triple.isOSLinux() || Triple.isOSDarwin())) {
568 if (Triple.isOSLinux()) {
569 CmdArgs.push_back(Args.MakeArgString(
"--push-state"));
570 CmdArgs.push_back(Args.MakeArgString(
"--as-needed"));
572 if (!Args.hasArg(options::OPT_nostdlib))
573 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
574 CmdArgs.push_back(Args.MakeArgString(
"-lamath"));
575 if (!Args.hasArg(options::OPT_nostdlib))
576 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
577 if (Triple.isOSLinux())
578 CmdArgs.push_back(Args.MakeArgString(
"--pop-state"));
585 switch (
T.getArch()) {
586 case llvm::Triple::x86:
590 case llvm::Triple::aarch64:
591 if (
T.isOSManagarm())
592 return "aarch64managarm";
595 return "aarch64linux";
596 case llvm::Triple::aarch64_be:
598 return "aarch64elfb";
599 return "aarch64linuxb";
600 case llvm::Triple::arm:
601 case llvm::Triple::thumb:
602 case llvm::Triple::armeb:
603 case llvm::Triple::thumbeb: {
606 return IsBigEndian ?
"armelfb" :
"armelf";
607 return IsBigEndian ?
"armelfb_linux_eabi" :
"armelf_linux_eabi";
609 case llvm::Triple::m68k:
611 case llvm::Triple::ppc:
613 return "elf32ppclinux";
615 case llvm::Triple::ppcle:
617 return "elf32lppclinux";
619 case llvm::Triple::ppc64:
621 case llvm::Triple::ppc64le:
623 case llvm::Triple::riscv32:
624 return "elf32lriscv";
625 case llvm::Triple::riscv64:
626 return "elf64lriscv";
627 case llvm::Triple::riscv32be:
628 return "elf32briscv";
629 case llvm::Triple::riscv64be:
630 return "elf64briscv";
631 case llvm::Triple::sparc:
632 case llvm::Triple::sparcel:
633 return "elf32_sparc";
634 case llvm::Triple::sparcv9:
635 return "elf64_sparc";
636 case llvm::Triple::loongarch32:
637 return "elf32loongarch";
638 case llvm::Triple::loongarch64:
639 return "elf64loongarch";
640 case llvm::Triple::mips:
641 return "elf32btsmip";
642 case llvm::Triple::mipsel:
643 return "elf32ltsmip";
644 case llvm::Triple::mips64:
646 return "elf32btsmipn32";
647 return "elf64btsmip";
648 case llvm::Triple::mips64el:
650 return "elf32ltsmipn32";
651 return "elf64ltsmip";
652 case llvm::Triple::systemz:
654 case llvm::Triple::x86_64:
656 return "elf32_x86_64";
658 case llvm::Triple::ve:
660 case llvm::Triple::csky:
661 return "cskyelf_linux";
668 const ToolChain &TC,
const llvm::opt::ArgList &Args,
669 llvm::opt::ArgStringList &CmdArgs) {
675 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
676 StringRef
V = A->getValue();
677 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
678 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
680 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
681 << A->getSpelling() <<
V;
686 std::vector<StringRef> &Features,
687 OptSpecifier OnOpt, OptSpecifier OffOpt,
688 StringRef FeatureName) {
689 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
690 if (A->getOption().matches(OnOpt))
691 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
693 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
699 const ArgList &Args) {
700 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
707 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
708 return A->getValue();
716 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
717 StringRef CPU = A->getValue();
723 return llvm::sys::getHostCPUName();
733 const llvm::Triple &
T,
bool FromAs) {
736 switch (
T.getArch()) {
740 case llvm::Triple::aarch64:
741 case llvm::Triple::aarch64_32:
742 case llvm::Triple::aarch64_be:
745 case llvm::Triple::arm:
746 case llvm::Triple::armeb:
747 case llvm::Triple::thumb:
748 case llvm::Triple::thumbeb: {
749 StringRef MArch, MCPU;
754 case llvm::Triple::avr:
755 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
756 return A->getValue();
759 case llvm::Triple::m68k:
762 case llvm::Triple::mips:
763 case llvm::Triple::mipsel:
764 case llvm::Triple::mips64:
765 case llvm::Triple::mips64el: {
769 return std::string(CPUName);
772 case llvm::Triple::nvptx:
773 case llvm::Triple::nvptx64:
774 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
775 return A->getValue();
778 case llvm::Triple::ppc:
779 case llvm::Triple::ppcle:
780 case llvm::Triple::ppc64:
781 case llvm::Triple::ppc64le:
782 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
784 llvm::PPC::getNormalizedPPCTargetCPU(
T, A->getValue()));
785 return std::string(llvm::PPC::getNormalizedPPCTargetCPU(
T));
787 case llvm::Triple::csky:
788 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
789 return A->getValue();
790 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
791 return A->getValue();
794 case llvm::Triple::riscv32:
795 case llvm::Triple::riscv64:
796 case llvm::Triple::riscv32be:
797 case llvm::Triple::riscv64be:
800 case llvm::Triple::bpfel:
801 case llvm::Triple::bpfeb:
802 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
803 return A->getValue();
806 case llvm::Triple::sparc:
807 case llvm::Triple::sparcel:
808 case llvm::Triple::sparcv9:
811 case llvm::Triple::x86:
812 case llvm::Triple::x86_64:
815 case llvm::Triple::hexagon:
819 case llvm::Triple::lanai:
822 case llvm::Triple::systemz:
825 case llvm::Triple::amdgpu:
826 case llvm::Triple::r600:
829 case llvm::Triple::wasm32:
830 case llvm::Triple::wasm64:
833 case llvm::Triple::loongarch32:
834 case llvm::Triple::loongarch64:
837 case llvm::Triple::xtensa:
838 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
839 return A->getValue();
845 const llvm::Triple &Triple,
847 std::vector<StringRef> &Features) {
849 options::OPT_m_wasm_Features_Group);
853 const ArgList &Args, ArgStringList &CmdArgs,
854 bool ForAS,
bool IsAux) {
855 std::vector<StringRef> Features;
856 switch (Triple.getArch()) {
859 case llvm::Triple::mips:
860 case llvm::Triple::mipsel:
861 case llvm::Triple::mips64:
862 case llvm::Triple::mips64el:
865 case llvm::Triple::arm:
866 case llvm::Triple::armeb:
867 case llvm::Triple::thumb:
868 case llvm::Triple::thumbeb:
871 case llvm::Triple::ppc:
872 case llvm::Triple::ppcle:
873 case llvm::Triple::ppc64:
874 case llvm::Triple::ppc64le:
877 case llvm::Triple::riscv32:
878 case llvm::Triple::riscv64:
879 case llvm::Triple::riscv32be:
880 case llvm::Triple::riscv64be:
883 case llvm::Triple::systemz:
886 case llvm::Triple::aarch64:
887 case llvm::Triple::aarch64_32:
888 case llvm::Triple::aarch64_be:
891 case llvm::Triple::x86:
892 case llvm::Triple::x86_64:
895 case llvm::Triple::hexagon:
898 case llvm::Triple::wasm32:
899 case llvm::Triple::wasm64:
902 case llvm::Triple::sparc:
903 case llvm::Triple::sparcel:
904 case llvm::Triple::sparcv9:
907 case llvm::Triple::amdgpu:
908 case llvm::Triple::r600:
911 case llvm::Triple::nvptx:
912 case llvm::Triple::nvptx64:
915 case llvm::Triple::m68k:
918 case llvm::Triple::msp430:
921 case llvm::Triple::ve:
924 case llvm::Triple::csky:
927 case llvm::Triple::loongarch32:
928 case llvm::Triple::loongarch64:
934 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
935 CmdArgs.push_back(
Feature.data());
940 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
943 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
944 D.
Diag(diag::err_drv_invalid_int_value)
945 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
946 return LtoJobsArg->getValue();
951 return Triple.isPS();
956 ArgStringList &CmdArgs) {
958 if (Args.hasFlag(options::OPT_ffunction_sections,
959 options::OPT_fno_function_sections, UseSeparateSections))
960 CmdArgs.push_back(
"-ffunction-sections");
962 bool HasDefaultDataSections = Triple.isOSBinFormatXCOFF();
963 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
964 UseSeparateSections || HasDefaultDataSections))
965 CmdArgs.push_back(
"-fdata-sections");
969 const llvm::opt::ArgList &Args) {
971 Arg *A = Args.getLastArg(options::OPT_mtls_dialect_EQ);
973 return Triple.hasDefaultTLSDESC();
974 StringRef
V = A->getValue();
975 bool SupportedArgument =
false, EnableTLSDESC =
false;
976 bool Unsupported = !Triple.isOSBinFormatELF();
977 if (Triple.isLoongArch() || Triple.isRISCV()) {
978 SupportedArgument =
V ==
"desc" ||
V ==
"trad";
979 EnableTLSDESC =
V ==
"desc";
980 }
else if (Triple.isX86()) {
981 SupportedArgument =
V ==
"gnu" ||
V ==
"gnu2";
982 EnableTLSDESC =
V ==
"gnu2";
987 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
988 << A->getSpelling() << Triple.getTriple();
989 }
else if (!SupportedArgument) {
990 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument_for_target)
991 << A->getSpelling() <<
V << Triple.getTriple();
993 return EnableTLSDESC;
997 llvm::opt::ArgStringList &CmdArgs) {
998 if (Arg *A = Args.getLastArg(options::OPT_fthinlto_distributor_EQ)) {
1000 Args.MakeArgString(
"--thinlto-distributor=" + Twine(A->getValue())));
1002 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-remote-compiler=" +
1005 CmdArgs.push_back(Args.MakeArgString(
1006 "--thinlto-remote-compiler-prepend-arg=" + Twine(PA)));
1008 for (
const auto &A :
1009 Args.getAllArgValues(options::OPT_Xthinlto_distributor_EQ))
1010 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-distributor-arg=" + A));
1015 ArgStringList &CmdArgs,
const InputInfo &Output,
1018 const bool IsOSAIX = Triple.isOSAIX();
1019 const bool IsAMDGCN = Triple.isAMDGCN();
1020 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ);
1023 const bool IsFatLTO = Args.hasFlag(options::OPT_ffat_lto_objects,
1024 options::OPT_fno_fat_lto_objects,
false);
1025 const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
1027 assert(!Inputs.empty() &&
"Must have at least one input.");
1029 auto Input = llvm::find_if(
1031 if (Input == Inputs.end()) {
1034 Input = Inputs.begin();
1037 if (Linker !=
"lld" && Linker !=
"lld-link" &&
1038 llvm::sys::path::filename(LinkerPath) !=
"ld.lld" &&
1039 llvm::sys::path::stem(LinkerPath) !=
"ld.lld" && !Triple.isOSOpenBSD()) {
1043 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
1044 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
1047 CmdArgs.push_back(
"-plugin");
1050 const char *Suffix =
".dll";
1051#elif defined(__APPLE__)
1052 const char *Suffix =
".dylib";
1054 const char *Suffix =
".so";
1058 llvm::sys::path::native(Twine(D.
Dir) +
1059 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
1060 PluginName + Suffix,
1062 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
1067 CmdArgs.push_back(
"--fat-lto-objects");
1069 if (Args.hasArg(options::OPT_flto_partitions_EQ)) {
1071 StringRef A = Args.getLastArgValue(options::OPT_flto_partitions_EQ,
"8");
1072 if (A.getAsInteger(10,
Value) || (
Value < 1)) {
1073 Arg *Arg = Args.getLastArg(options::OPT_flto_partitions_EQ);
1074 D.
Diag(diag::err_drv_invalid_int_value)
1075 << Arg->getAsString(Args) << Arg->getValue();
1077 CmdArgs.push_back(Args.MakeArgString(
"--lto-partitions=" + A));
1081 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
1082 const char *ExtraDash = IsOSAIX ?
"-" :
"";
1083 const char *ParallelismOpt = IsOSAIX ?
"-threads=" :
"jobs=";
1088 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
1089 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1090 "-generate-arange-section"));
1094 Arg *ArgVecLib = Args.getLastArg(options::OPT_fveclib);
1095 if (ArgVecLib && ArgVecLib->getNumValues() == 1) {
1098 std::optional<StringRef> OptVal =
1099 llvm::StringSwitch<std::optional<StringRef>>(ArgVecLib->getValue())
1100 .Case(
"Accelerate",
"Accelerate")
1101 .Case(
"libmvec",
"LIBMVEC")
1102 .Case(
"AMDLIBM",
"AMDLIBM")
1103 .Case(
"MASSV",
"MASSV")
1104 .Case(
"SVML",
"SVML")
1105 .Case(
"SLEEF",
"sleefgnuabi")
1106 .Case(
"Darwin_libsystem_m",
"Darwin_libsystem_m")
1107 .Case(
"ArmPL",
"ArmPL")
1108 .Case(
"none",
"none")
1109 .Default(std::nullopt);
1112 CmdArgs.push_back(Args.MakeArgString(
1113 Twine(PluginOptPrefix) +
"-vector-library=" + OptVal.value()));
1123 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
1125 if (Args.getLastArg(options::OPT_O_Group)) {
1126 unsigned OptimizationLevel =
1128 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1129 "O" + Twine(OptimizationLevel)));
1132 Args.MakeArgString(Twine(
"--lto-CGO") + Twine(OptimizationLevel)));
1135 if (Args.hasArg(options::OPT_gsplit_dwarf)) {
1137 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1144 Args.MakeArgString(Twine(PluginOptPrefix) +
"dwo_dir=" + F +
"dwo"));
1147 if (IsThinLTO && !IsOSAIX)
1148 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
1149 else if (IsThinLTO && IsOSAIX)
1150 CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
1155 if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
1156 Args.hasArg(options::OPT_fenable_matrix))
1158 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-matrix"));
1161 if (!Parallelism.empty())
1162 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1163 ParallelismOpt + Parallelism));
1168 if (Arg *A = Args.getLastArg(options::OPT_fslp_vectorize,
1169 options::OPT_fno_slp_vectorize))
1170 CmdArgs.push_back(Args.MakeArgString(
1171 Twine(PluginOptPrefix) +
"-vectorize-slp=" +
1172 (A->getOption().matches(options::OPT_fslp_vectorize) ?
"1" :
"0")));
1175 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
1176 options::OPT_fno_global_isel)) {
1179 CmdArgs.push_back(Args.MakeArgString(
1180 Twine(PluginOptPrefix) +
"-global-isel=" +
1181 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
1186 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
1187 if (A->getOption().matches(options::OPT_glldb))
1189 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
1190 else if (A->getOption().matches(options::OPT_gsce))
1192 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
1193 else if (A->getOption().matches(options::OPT_gdbx))
1195 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
1198 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
1204 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
1208 Arg *A = Args.getLastArg(options::OPT_g_Group);
1209 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
1210 !A->getOption().matches(options::OPT_ggdb0);
1211 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
1212 options::OPT_gno_strict_dwarf,
true))
1214 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
1216 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
1217 StringRef
V = A->getValue();
1218 if (
V ==
"vec-default")
1220 if (
V ==
"vec-extabi") {
1222 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
1228 bool UseSeparateSections =
1231 if (Args.hasFlag(options::OPT_ffunction_sections,
1232 options::OPT_fno_function_sections, UseSeparateSections))
1234 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
1235 else if (Args.hasArg(options::OPT_fno_function_sections))
1237 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
1239 bool DataSectionsTurnedOff =
false;
1240 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1241 UseSeparateSections)) {
1243 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
1244 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
1245 DataSectionsTurnedOff =
true;
1247 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
1250 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
1251 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
1252 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
1253 options::OPT_mno_xcoff_roptr,
false);
1254 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
1256 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1257 << OptStr << Triple.str();
1263 if (DataSectionsTurnedOff)
1264 D.
Diag(diag::err_roptr_requires_data_sections);
1267 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
1272 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
1273 options::OPT_fno_split_machine_functions)) {
1274 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
1275 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1276 "-split-machine-functions"));
1280 Args.getLastArg(options::OPT_fpartition_static_data_sections,
1281 options::OPT_fno_partition_static_data_sections)) {
1282 if (A->getOption().matches(options::OPT_fpartition_static_data_sections)) {
1283 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1284 "-partition-static-data-sections"));
1289 StringRef FName = A->getValue();
1290 if (!llvm::sys::fs::exists(FName))
1291 D.
Diag(diag::err_drv_no_such_file) << FName;
1293 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1294 "sample-profile=" + FName));
1298 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1299 "cs-profile-generate"));
1300 if (CSPGOGenerateArg->getOption().matches(
1301 options::OPT_fcs_profile_generate_EQ)) {
1303 llvm::sys::path::append(Path,
"default_%m.profraw");
1304 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1305 "cs-profile-path=" + Path));
1308 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1309 "cs-profile-path=default_%m.profraw"));
1312 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1313 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1314 llvm::sys::path::append(Path,
"default.profdata");
1315 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1316 "cs-profile-path=" + Path));
1320 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1322 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1323 "-enable-jmc-instrument"));
1325 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1328 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1329 Triple.hasDefaultEmulatedTLS())) {
1331 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1335 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1337 if (Args.hasFlag(options::OPT_fstack_size_section,
1338 options::OPT_fno_stack_size_section,
false))
1340 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1342 if (Args.hasFlag(options::OPT_fexperimental_call_graph_section,
1343 options::OPT_fno_experimental_call_graph_section,
false))
1345 Args.MakeArgString(Twine(PluginOptPrefix) +
"-call-graph-section"));
1349 if (!StatsFile.empty())
1351 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1354 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1355 CmdArgs.push_back(Args.MakeArgString(
1356 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1367 Output, PluginOptPrefix);
1373 true, PluginOptPrefix);
1375 bool IsELF = Triple.isOSBinFormatELF();
1377 bool ImplicitMapSyms =
false;
1378 for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
1379 for (StringRef
V : A->getValues()) {
1380 auto Equal =
V.split(
'=');
1381 auto checkArg = [&](
bool ValidTarget,
1382 std::initializer_list<const char *>
Set) {
1384 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1385 << (Twine(
"-Wa,") +
Equal.first +
"=").str()
1386 << Triple.getTriple();
1387 }
else if (!llvm::is_contained(
Set,
Equal.second)) {
1388 D.
Diag(diag::err_drv_unsupported_option_argument)
1389 << (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
1392 if (
Equal.first ==
"-mmapsyms") {
1393 ImplicitMapSyms =
Equal.second ==
"implicit";
1394 checkArg(IsELF && Triple.isAArch64(), {
"default",
"implicit"});
1395 }
else if (
V ==
"--crel")
1397 else if (
V ==
"--no-crel")
1405 if (IsELF && !Triple.isMIPS()) {
1406 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"-crel"));
1408 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1412 if (ImplicitMapSyms)
1414 Args.MakeArgString(Twine(PluginOptPrefix) +
"-implicit-mapsyms"));
1416 if (Args.hasArg(options::OPT_ftime_report))
1418 Args.MakeArgString(Twine(PluginOptPrefix) +
"-time-passes"));
1424 const ArgList &Args,
1425 ArgStringList &CmdArgs) {
1430 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1431 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1435 ArgStringList &CmdArgs) {
1436 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1437 options::OPT_fno_rtlib_add_rpath,
false))
1449 llvm::sys::path::append(P, M.gccSuffix());
1450 CandidateRPaths.emplace_back(std::string(P));
1452 CandidateRPaths.emplace_back(*StdlibPath);
1454 for (
const auto &CandidateRPath : CandidateRPaths) {
1455 if (TC.
getVFS().exists(CandidateRPath)) {
1456 CmdArgs.push_back(
"-rpath");
1457 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1463 const ToolChain &TC,
const ArgList &Args,
1464 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1466 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1467 options::OPT_fno_openmp,
false)) {
1469 if (Args.hasFlag(options::OPT_foffload_via_llvm,
1470 options::OPT_fno_offload_via_llvm,
false))
1471 CmdArgs.push_back(
"-lomptarget");
1481 if (ForceStaticHostRuntime)
1482 CmdArgs.push_back(
"-Bstatic");
1486 CmdArgs.push_back(
"-lomp");
1489 CmdArgs.push_back(
"-lgomp");
1492 CmdArgs.push_back(
"-liomp5");
1498 if (ForceStaticHostRuntime)
1499 CmdArgs.push_back(
"-Bdynamic");
1502 CmdArgs.push_back(
"-lrt");
1504 if (IsOffloadingHost)
1505 CmdArgs.push_back(
"-lomptarget");
1516 const llvm::opt::ArgList &Args,
1517 llvm::opt::ArgStringList &CmdArgs) {
1523 constexpr llvm::StringLiteral Targets(
"--offload-targets=");
1527 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1528 [](
auto TC) { return TC.second->getTripleString(); });
1530 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1534 ArgStringList &CmdArgs, StringRef Sanitizer,
1535 bool IsShared,
bool IsWhole) {
1538 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1541 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1551 ArgStringList &CmdArgs,
1552 StringRef Sanitizer) {
1557 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1560 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1561 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1568 const llvm::opt::ArgList &Args,
1569 llvm::opt::ArgStringList &CmdArgs,
1572 "AIX linker does not support any form of --as-needed option yet.");
1580 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1581 CmdArgs.push_back(
"-z");
1582 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1584 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1589 const llvm::opt::ArgList &Args,
1590 ArgStringList &CmdArgs) {
1595 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1597 CmdArgs.push_back(
"-lpthread");
1599 CmdArgs.push_back(
"-lrt");
1601 CmdArgs.push_back(
"-lm");
1606 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1607 CmdArgs.push_back(
"-ldl");
1611 CmdArgs.push_back(
"-lexecinfo");
1613 CmdArgs.push_back(
"-lbsd");
1619 CmdArgs.push_back(
"-lresolv");
1629 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1634 SharedRuntimes.push_back(
"asan");
1635 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1636 HelperStaticRuntimes.push_back(
"asan-preinit");
1639 SharedRuntimes.push_back(
"memprof");
1640 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1641 HelperStaticRuntimes.push_back(
"memprof-preinit");
1644 SharedRuntimes.push_back(
"nsan");
1647 SharedRuntimes.push_back(
"ubsan_minimal");
1649 SharedRuntimes.push_back(
"ubsan_standalone");
1652 SharedRuntimes.push_back(
"scudo_standalone");
1655 SharedRuntimes.push_back(
"tsan");
1657 SharedRuntimes.push_back(
"tysan");
1660 SharedRuntimes.push_back(
"hwasan_aliases");
1662 SharedRuntimes.push_back(
"hwasan");
1663 if (!Args.hasArg(options::OPT_shared))
1664 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1667 SharedRuntimes.push_back(
"rtsan");
1672 StaticRuntimes.push_back(
"stats_client");
1676 HelperStaticRuntimes.push_back(
"asan_static");
1679 if (Args.hasArg(options::OPT_shared)) {
1688 StaticRuntimes.push_back(
"asan");
1690 StaticRuntimes.push_back(
"asan_cxx");
1695 StaticRuntimes.push_back(
"rtsan");
1698 StaticRuntimes.push_back(
"memprof");
1700 StaticRuntimes.push_back(
"memprof_cxx");
1705 StaticRuntimes.push_back(
"hwasan_aliases");
1707 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1709 StaticRuntimes.push_back(
"hwasan");
1711 StaticRuntimes.push_back(
"hwasan_cxx");
1715 StaticRuntimes.push_back(
"dfsan");
1717 StaticRuntimes.push_back(
"lsan");
1719 StaticRuntimes.push_back(
"msan");
1721 StaticRuntimes.push_back(
"msan_cxx");
1724 StaticRuntimes.push_back(
"nsan");
1726 StaticRuntimes.push_back(
"tsan");
1728 StaticRuntimes.push_back(
"tsan_cxx");
1731 StaticRuntimes.push_back(
"tysan");
1734 StaticRuntimes.push_back(
"ubsan_minimal");
1736 StaticRuntimes.push_back(
"ubsan_standalone");
1740 NonWholeStaticRuntimes.push_back(
"safestack");
1741 RequiredSymbols.push_back(
"__safestack_init");
1745 StaticRuntimes.push_back(
"cfi");
1747 StaticRuntimes.push_back(
"cfi_diag");
1752 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1755 NonWholeStaticRuntimes.push_back(
"stats");
1756 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1759 StaticRuntimes.push_back(
"scudo_standalone");
1761 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1764 NonWholeStaticRuntimes.push_back(
"ubsan_loop_detect");
1770 ArgStringList &CmdArgs) {
1773 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1776 NonWholeStaticRuntimes, HelperStaticRuntimes,
1781 for (
auto S : RequiredSymbols) {
1782 CmdArgs.push_back(
"-u");
1783 CmdArgs.push_back(Args.MakeArgString(S));
1787 for (
auto RT : SharedRuntimes)
1791 bool FuzzerNeedsSanitizerDeps =
false;
1793 !Args.hasArg(options::OPT_shared)) {
1796 FuzzerNeedsSanitizerDeps =
true;
1800 if (!Args.hasArg(options::OPT_nostdlibxx)) {
1801 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1802 !Args.hasArg(options::OPT_static);
1803 if (OnlyLibstdcxxStatic)
1804 CmdArgs.push_back(
"-Bstatic");
1806 if (OnlyLibstdcxxStatic)
1807 CmdArgs.push_back(
"-Bdynamic");
1811 for (
auto RT : HelperStaticRuntimes)
1813 bool AddExportDynamic =
false;
1814 for (
auto RT : StaticRuntimes) {
1818 for (
auto RT : NonWholeStaticRuntimes) {
1824 if (AddExportDynamic && !TC.
getTriple().isNVPTX())
1825 CmdArgs.push_back(
"--export-dynamic");
1828 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1831 CmdArgs.push_back(
"-z");
1833 Args.MakeArgString(
"memtag-mode=" + SanArgs.
getMemtagMode()));
1836 CmdArgs.push_back(
"-z");
1837 CmdArgs.push_back(
"memtag-heap");
1841 CmdArgs.push_back(
"-z");
1842 CmdArgs.push_back(
"memtag-stack");
1846 CmdArgs.push_back(
"--android-memtag-note");
1849 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty() ||
1850 FuzzerNeedsSanitizerDeps;
1855 if (Args.hasArg(options::OPT_shared)) {
1857 CmdArgs.push_back(
"--whole-archive");
1859 CmdArgs.push_back(
"--no-whole-archive");
1863 CmdArgs.push_back(
"--whole-archive");
1865 for (
const auto &Mode : XRay.
modeList())
1867 CmdArgs.push_back(
"--no-whole-archive");
1875 const llvm::opt::ArgList &Args,
1876 ArgStringList &CmdArgs) {
1878 CmdArgs.push_back(
"-lpthread");
1880 CmdArgs.push_back(
"-lrt");
1881 CmdArgs.push_back(
"-lm");
1886 CmdArgs.push_back(
"-ldl");
1891 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1892 return !A->getOption().matches(options::OPT_O0);
1900 auto AddPostfix = [JA](
auto &F) {
1905 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1906 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1910 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1913 if (Args.hasArg(options::OPT_o, options::OPT__SLASH_o,
1914 options::OPT__SLASH_Fo) &&
1915 Args.hasArg(options::OPT_c) && Output.
isFilename()) {
1919 llvm::sys::path::remove_filename(
T);
1920 llvm::sys::path::append(
T, llvm::sys::path::stem(Obj));
1922 return Args.MakeArgString(
T);
1928 return Args.MakeArgString(
T);
1932 const JobAction &JA,
const ArgList &Args,
1933 const InputInfo &Output,
const char *OutFile) {
1934 ArgStringList ExtractArgs;
1935 ExtractArgs.push_back(
"--extract-dwo");
1937 ArgStringList StripArgs;
1938 StripArgs.push_back(
"--strip-dwo");
1943 ExtractArgs.push_back(OutFile);
1950 C.addCommand(std::make_unique<Command>(JA,
T,
1952 Exec, ExtractArgs, II, Output));
1955 C.addCommand(std::make_unique<Command>(
1965 Args.ClaimAllArgs(options::OPT_flto_EQ);
1966 Args.ClaimAllArgs(options::OPT_flto);
1967 Args.ClaimAllArgs(options::OPT_fno_lto);
1971 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1972 options::OPT_fcs_profile_generate_EQ,
1973 options::OPT_fno_profile_generate);
1974 if (CSPGOGenerateArg &&
1975 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1976 CSPGOGenerateArg =
nullptr;
1978 return CSPGOGenerateArg;
1982 auto *ProfileUseArg = Args.getLastArg(
1983 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1984 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1985 options::OPT_fno_profile_instr_use);
1987 if (ProfileUseArg &&
1988 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1989 ProfileUseArg =
nullptr;
1991 return ProfileUseArg;
1995 auto *ProfileSampleUseArg = Args.getLastArg(
1996 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
1998 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
1999 options::OPT_fno_profile_sample_use)))
2002 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
2007 case llvm::Reloc::Static:
2009 case llvm::Reloc::PIC_:
2011 case llvm::Reloc::DynamicNoPIC:
2012 return "dynamic-no-pic";
2013 case llvm::Reloc::ROPI:
2015 case llvm::Reloc::RWPI:
2017 case llvm::Reloc::ROPI_RWPI:
2020 llvm_unreachable(
"Unknown Reloc::Model kind");
2027std::tuple<llvm::Reloc::Model, unsigned, bool>
2035 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
2037 bool IsPICLevelTwo = PIC;
2040 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
2043 if (Triple.isAndroid()) {
2044 switch (Triple.getArch()) {
2045 case llvm::Triple::x86:
2046 case llvm::Triple::x86_64:
2048 IsPICLevelTwo =
true;
2058 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
2062 if (Triple.isOSOpenBSD()) {
2064 case llvm::Triple::arm:
2065 case llvm::Triple::aarch64:
2066 case llvm::Triple::mips64:
2067 case llvm::Triple::mips64el:
2068 case llvm::Triple::x86:
2069 case llvm::Triple::x86_64:
2070 IsPICLevelTwo =
false;
2073 case llvm::Triple::ppc:
2074 case llvm::Triple::sparcv9:
2075 IsPICLevelTwo =
true;
2087 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2088 options::OPT_fpic, options::OPT_fno_pic,
2089 options::OPT_fPIE, options::OPT_fno_PIE,
2090 options::OPT_fpie, options::OPT_fno_pie);
2091 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
2092 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
2093 options::OPT_fPIE, options::OPT_fpie)) {
2095 << LastPICArg->getSpelling() << Triple.str();
2096 if (Triple.getArch() == llvm::Triple::x86_64)
2097 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
2098 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2105 Option O = LastPICArg->getOption();
2106 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2107 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2108 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2110 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2112 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
2115 if (EffectiveTriple.isPS()) {
2116 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
2117 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
2118 if (Model !=
"kernel") {
2121 << LastPICArg->getSpelling()
2122 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
2132 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
2138 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
2139 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
2142 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2145 if (!Triple.isOSDarwin())
2147 << A->getSpelling() << Triple.str();
2156 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
2159 bool EmbeddedPISupported;
2160 switch (Triple.getArch()) {
2161 case llvm::Triple::arm:
2162 case llvm::Triple::armeb:
2163 case llvm::Triple::thumb:
2164 case llvm::Triple::thumbeb:
2165 EmbeddedPISupported =
true;
2168 EmbeddedPISupported =
false;
2172 bool ROPI =
false, RWPI =
false;
2173 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
2174 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
2175 if (!EmbeddedPISupported)
2177 << LastROPIArg->getSpelling() << Triple.str();
2180 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2181 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2182 if (!EmbeddedPISupported)
2184 << LastRWPIArg->getSpelling() << Triple.str();
2189 if ((ROPI || RWPI) && (PIC || PIE))
2192 if (Triple.isMIPS()) {
2199 if (ABIName ==
"n64")
2202 if(Args.hasArg(options::OPT_mno_abicalls))
2203 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2206 IsPICLevelTwo =
false;
2210 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2212 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2214 RelocM = llvm::Reloc::ROPI_RWPI;
2216 RelocM = llvm::Reloc::ROPI;
2218 RelocM = llvm::Reloc::RWPI;
2220 return std::make_tuple(RelocM, 0
U,
false);
2224 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
2225 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
2227 const llvm::opt::OptTable &Opts = D.
getOpts();
2228 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
2229 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
2230 D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
2232 return HasStaticPIE;
2252 const ArgList &Args) {
2253 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2254 options::OPT_falign_functions_EQ,
2255 options::OPT_fno_align_functions);
2256 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2259 if (A->getOption().matches(options::OPT_falign_functions))
2263 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2265 << A->getAsString(Args) << A->getValue();
2270 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2271 switch (DebugInfoKind) {
2272 case llvm::codegenoptions::DebugDirectivesOnly:
2273 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2275 case llvm::codegenoptions::DebugLineTablesOnly:
2276 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2278 case llvm::codegenoptions::DebugInfoConstructor:
2279 CmdArgs.push_back(
"-debug-info-kind=constructor");
2281 case llvm::codegenoptions::LimitedDebugInfo:
2282 CmdArgs.push_back(
"-debug-info-kind=limited");
2284 case llvm::codegenoptions::FullDebugInfo:
2285 CmdArgs.push_back(
"-debug-info-kind=standalone");
2287 case llvm::codegenoptions::UnusedTypeInfo:
2288 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2298 assert(A.getOption().matches(options::OPT_gN_Group) &&
2299 "Not a -g option that specifies a debug-info level");
2300 if (A.getOption().matches(options::OPT_g0) ||
2301 A.getOption().matches(options::OPT_ggdb0))
2302 return llvm::codegenoptions::NoDebugInfo;
2303 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2304 A.getOption().matches(options::OPT_ggdb1))
2305 return llvm::codegenoptions::DebugLineTablesOnly;
2306 if (A.getOption().matches(options::OPT_gline_directives_only))
2307 return llvm::codegenoptions::DebugDirectivesOnly;
2308 return llvm::codegenoptions::DebugInfoConstructor;
2312 const ArgList &Args) {
2313 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2319 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 6 ||
2322 << A->getAsString(Args) << A->getValue();
2327 return llvm::StringSwitch<unsigned>(ArgValue)
2328 .Case(
"-gdwarf-2", 2)
2329 .Case(
"-gdwarf-3", 3)
2330 .Case(
"-gdwarf-4", 4)
2331 .Case(
"-gdwarf-5", 5)
2332 .Case(
"-gdwarf-6", 6)
2337 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2338 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2339 options::OPT_gdwarf_6, options::OPT_gdwarf);
2343 const llvm::opt::ArgList &Args) {
2348 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2349 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2350 << GDwarfN->getSpelling() << TC.
getTriple().str();
2352 if (DwarfVersion == 0) {
2354 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2356 return DwarfVersion;
2360 const ArgList &Args, Arg *&Arg) {
2361 Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
2362 options::OPT_gno_split_dwarf);
2363 if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
2366 if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
2369 StringRef
Value = Arg->getValue();
2370 if (
Value ==
"split")
2372 if (
Value ==
"single")
2375 D.
Diag(diag::err_drv_unsupported_option_argument)
2376 << Arg->getSpelling() << Arg->getValue();
2382 assert(A &&
"Expected non-nullptr argument.");
2385 D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
2391 const ArgList &Args,
2392 ArgStringList &CmdArgs) {
2393 if (Args.hasFlag(options::OPT_fdebug_info_for_profiling,
2394 options::OPT_fno_debug_info_for_profiling,
false) &&
2396 Args.getLastArg(options::OPT_fdebug_info_for_profiling), Args, D, TC))
2397 CmdArgs.push_back(
"-fdebug-info-for-profiling");
2401 ArgStringList &CmdArgs) {
2402 llvm::Reloc::Model RelocationModel;
2407 if (RelocationModel != llvm::Reloc::Static)
2408 CmdArgs.push_back(
"-KPIC");
2414 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2420 const ArgList &Args) {
2421 if (Args.hasArg(options::OPT_static_libgcc) ||
2422 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2426 if (Args.hasArg(options::OPT_shared_libgcc))
2445 ArgStringList &CmdArgs,
const ArgList &Args) {
2449 CmdArgs.push_back(
"-l:libunwind.a");
2472 CmdArgs.push_back(
"-lgcc_eh");
2474 CmdArgs.push_back(
"-lgcc_s");
2482 CmdArgs.push_back(
"-lunwind");
2484 CmdArgs.push_back(
"-l:libunwind.a");
2487 CmdArgs.push_back(
"-l:libunwind.dll.a");
2489 CmdArgs.push_back(
"-l:libunwind.so");
2493 CmdArgs.push_back(
"-lunwind");
2503 ArgStringList &CmdArgs,
const ArgList &Args) {
2507 CmdArgs.push_back(
"-lgcc");
2511 CmdArgs.push_back(
"-lgcc");
2515 CmdArgs.push_back(
"--as-needed");
2517 CmdArgs.push_back(
"--no-as-needed");
2522 ArgStringList &CmdArgs,
const ArgList &Args) {
2533 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2536 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2537 if (A && A->getValue() != StringRef(
"platform")) {
2538 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2539 << A->getValue() <<
"MSVC";
2549 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2550 !Args.hasArg(options::OPT_static_pie))
2551 CmdArgs.push_back(
"-ldl");
2558 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2564 StringRef SaveStats = A->getValue();
2565 if (SaveStats ==
"obj" && Output.
isFilename()) {
2567 llvm::sys::path::remove_filename(StatsFile);
2568 }
else if (SaveStats !=
"cwd") {
2569 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2573 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2574 llvm::sys::path::append(StatsFile, BaseName);
2575 llvm::sys::path::replace_extension(StatsFile,
"stats");
2587 assert(Flag.front() ==
'-');
2589 Flags.push_back(Flag.str());
2591 Flags.push_back((
"!" + Flag.substr(1)).str());
2596 ArgStringList &CmdArgs,
bool IsLTO,
2597 const StringRef PluginOptPrefix) {
2598 auto addArg = [&, IsLTO](
const Twine &Arg) {
2600 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2601 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2603 CmdArgs.push_back(
"-mllvm");
2604 CmdArgs.push_back(Args.MakeArgString(Arg));
2608 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2609 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2611 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2612 StringRef
Value = A->getValue();
2614 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2615 !llvm::isPowerOf2_64(Boundary)) {
2616 D.
Diag(diag::err_drv_invalid_argument_to_option)
2617 <<
Value << A->getOption().getName();
2619 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2622 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2623 std::string AlignBranch;
2624 for (StringRef
T : A->getValues()) {
2625 if (
T !=
"fused" &&
T !=
"jcc" &&
T !=
"jmp" &&
T !=
"call" &&
2626 T !=
"ret" &&
T !=
"indirect")
2627 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2628 <<
T <<
"fused, jcc, jmp, call, ret, indirect";
2629 if (!AlignBranch.empty())
2633 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2635 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2636 StringRef
Value = A->getValue();
2637 unsigned PrefixSize;
2638 if (
Value.getAsInteger(10, PrefixSize)) {
2639 D.
Diag(diag::err_drv_invalid_argument_to_option)
2640 <<
Value << A->getOption().getName();
2642 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2668 llvm::opt::ArgStringList &CC1Args,
2670 StringRef Lib, StringRef
Arch, StringRef
Target,
2671 bool isBitCodeSDL) {
2674 std::string LibDeviceLoc =
"/libdevice";
2675 std::string LibBcPrefix =
"/libbc-";
2676 std::string LibPrefix =
"/lib";
2693 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2694 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2696 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2697 Twine(Lib +
"-" +
Arch).str(), Twine(Lib).str()}) {
2698 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2699 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2709 const auto *Ext =
".a";
2711 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2712 Twine(Lib +
"-" +
Arch).str()}) {
2713 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2714 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2725 bool FoundSDL =
false;
2726 for (
auto LPath : LibraryPaths) {
2727 for (
auto SDL : SDLs) {
2728 auto FullName = Twine(LPath + SDL).str();
2729 if (llvm::sys::fs::exists(FullName)) {
2730 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2747 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2748 llvm::opt::ArgStringList &CC1Args,
2750 StringRef
Arch, StringRef
Target,
bool isBitCodeSDL) {
2753 if (isBitCodeSDL &&
Arch.contains(
"nvptx"))
2756 bool FoundAOB =
false;
2757 std::string ArchiveOfBundles;
2760 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2761 auto Ext = IsMSVC ?
".lib" :
".a";
2762 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2763 if (llvm::sys::fs::exists(Lib)) {
2764 ArchiveOfBundles = Lib;
2768 Lib.consume_front(
"-l");
2769 for (
auto LPath : LibraryPaths) {
2770 ArchiveOfBundles.clear();
2771 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2772 : IsMSVC ? Lib + Ext
2773 :
"lib" + Lib + Ext)
2775 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2776 auto AOB = Twine(LPath + Prefix + LibFile).str();
2777 if (llvm::sys::fs::exists(AOB)) {
2778 ArchiveOfBundles = AOB;
2791 llvm::file_magic Magic;
2792 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2793 if (EC || Magic != llvm::file_magic::archive)
2796 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2797 std::string OutputLib =
2803 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2807 DeviceTriple +=
'-';
2808 std::string NormalizedTriple =
2809 T.getToolChain().getEffectiveTriple().normalize(
2810 llvm::Triple::CanonicalForm::FOUR_IDENT);
2811 DeviceTriple += NormalizedTriple;
2813 DeviceTriple +=
'-';
2817 std::string UnbundleArg(
"-unbundle");
2818 std::string TypeArg(
"-type=a");
2819 std::string InputArg(
"-input=" + ArchiveOfBundles);
2820 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2821 std::string OutputArg(
"-output=" + OutputLib);
2823 const char *UBProgram = DriverArgs.MakeArgString(
2824 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2826 ArgStringList UBArgs;
2827 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2828 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2829 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2830 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2831 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2835 std::string AdditionalArgs(
"-allow-missing-bundles");
2836 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2841 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2842 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2844 C.addCommand(std::make_unique<Command>(
2846 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2848 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2855 const llvm::opt::ArgList &DriverArgs,
2856 llvm::opt::ArgStringList &CC1Args,
2858 bool isBitCodeSDL) {
2889 const llvm::opt::ArgList &DriverArgs,
2890 llvm::opt::ArgStringList &CC1Args,
2892 bool isBitCodeSDL) {
2896 std::optional<std::string> LibPath =
2897 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2900 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2901 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2902 for (StringRef Path : Frags)
2903 LibraryPaths.emplace_back(Path.trim());
2907 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2908 LibraryPaths.emplace_back(Search_Dir);
2912 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2913 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2916 llvm::SmallSet<std::string, 16> SDLNames;
2917 static const StringRef HostOnlyArchives[] = {
2918 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2919 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2920 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2921 SDLNames.insert(std::string(
"-l") + SDLName);
2925 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2932 const StringRef LibFileExt =
".lib";
2933 if (!llvm::sys::path::has_extension(
FileName) ||
2935 llvm::sys::path::extension(
FileName).drop_front()) ==
2937 llvm::sys::path::extension(
FileName) == LibFileExt)
2938 SDLNames.insert(Input);
2945 for (
auto SDLName : SDLNames) {
2956static llvm::opt::Arg *
2958 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2962 const llvm::opt::ArgList &Args) {
2963 const unsigned MinCodeObjVer = 4;
2964 const unsigned MaxCodeObjVer = 6;
2967 if (CodeObjArg->getOption().getID() ==
2968 options::OPT_mcode_object_version_EQ) {
2969 unsigned CodeObjVer = MaxCodeObjVer;
2971 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2972 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2973 D.
Diag(diag::err_drv_invalid_int_value)
2974 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2980 const llvm::opt::ArgList &Args) {
2981 unsigned CodeObjVer = 6;
2983 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2988 const Driver &D,
const llvm::opt::ArgList &Args) {
2993 const llvm::opt::ArgList &Args,
2994 llvm::opt::ArgStringList &CmdArgs,
2995 const llvm::Triple &Triple,
bool IsLTO,
2996 const StringRef PluginOptPrefix) {
2997 auto addArg = [&, IsLTO](
const Twine &Arg) {
2999 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
3000 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
3002 CmdArgs.push_back(
"-mllvm");
3003 CmdArgs.push_back(Args.MakeArgString(Arg));
3007 if (Arg *A = Args.getLastArg(options::OPT_moutline,
3008 options::OPT_mno_outline)) {
3009 if (A->getOption().matches(options::OPT_moutline)) {
3013 if (Triple.isARM() || Triple.isThumb() || Triple.isAArch64() ||
3014 Triple.isRISCV() || Triple.isX86()) {
3015 addArg(Twine(
"-enable-machine-outliner"));
3017 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
3023 CmdArgs.push_back(
"-mno-outline");
3026 addArg(Twine(
"-enable-machine-outliner=never"));
3030 auto *CodeGenDataGenArg =
3031 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
3032 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
3035 if (CodeGenDataGenArg && CodeGenDataUseArg)
3036 D.
Diag(diag::err_drv_argument_not_allowed_with)
3037 << CodeGenDataGenArg->getAsString(Args)
3038 << CodeGenDataUseArg->getAsString(Args);
3042 if (CodeGenDataGenArg)
3043 addArg(Twine(
"-codegen-data-generate"));
3046 if (CodeGenDataUseArg)
3047 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
3051 const llvm::opt::ArgList &DriverArgs,
3052 llvm::opt::ArgStringList &CC1Args,
3053 StringRef BitcodeSuffix,
3054 const llvm::Triple &Triple,
3059 std::optional<std::string> LibPath =
3060 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
3063 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
3064 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
3065 for (StringRef Path : Frags)
3066 LibraryPaths.emplace_back(Path.trim());
3071 LibraryPaths.emplace_back(LibPath);
3075 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
3076 LibraryPaths.emplace_back(P);
3078 OptSpecifier LibomptargetBCPathOpt =
3079 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
3080 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
3081 : options::OPT_libomptarget_spirv_bc_path_EQ;
3083 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
3084 : Triple.isNVPTX() ?
"nvptx"
3086 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
3089 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
3091 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
3092 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
3093 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3096 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3097 CC1Args.push_back(
"-mlink-builtin-bitcode");
3098 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3100 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
3101 << LibOmpTargetFile;
3104 bool FoundBCLibrary =
false;
3106 for (StringRef LibraryPath : LibraryPaths) {
3108 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3109 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3110 CC1Args.push_back(
"-mlink-builtin-bitcode");
3111 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3112 FoundBCLibrary =
true;
3117 if (!FoundBCLibrary)
3118 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
3119 << LibOmpTargetName << ArchPrefix;
3124 const llvm::opt::ArgList &DriverArgs,
3125 llvm::opt::ArgStringList &CC1Args) {
3127 StringRef LibclcNamespec;
3128 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
3131 LibclcNamespec = A->getValue();
3133 if (!TT.isAMDGPU() || TT.getEnvironment() != llvm::Triple::LLVM)
3137 if (DriverArgs.hasArg(options::OPT_no_offloadlib,
3138 options::OPT_nodefaultlibs, options::OPT_nostdlib))
3142 bool FilenameSearch = LibclcNamespec.consume_front(
":");
3143 if (FilenameSearch) {
3145 if (D.
getVFS().exists(LibclcFile)) {
3146 CC1Args.push_back(
"-mlink-builtin-bitcode");
3147 CC1Args.push_back(DriverArgs.MakeArgString(LibclcFile));
3150 D.
Diag(diag::err_drv_libclc_not_found) << LibclcFile;
3156 llvm::sys::path::append(BasePath,
"lib");
3161 if (
const Arg *CPUArg = DriverArgs.getLastArg(options::OPT_mcpu_EQ)) {
3162 StringRef CPU = CPUArg->getValue();
3165 llvm::sys::path::append(CPUPath, CPU,
"libclc.bc");
3166 if (D.
getVFS().exists(CPUPath)) {
3167 CC1Args.push_back(
"-mlink-builtin-bitcode");
3168 CC1Args.push_back(DriverArgs.MakeArgString(CPUPath));
3176 llvm::sys::path::append(GenericPath,
"libclc.bc");
3177 if (D.
getVFS().exists(GenericPath)) {
3178 CC1Args.push_back(
"-mlink-builtin-bitcode");
3179 CC1Args.push_back(DriverArgs.MakeArgString(GenericPath));
3183 D.
Diag(diag::err_drv_libclc_not_found) <<
"libclc.bc";
3188 const llvm::opt::ArgList &Args,
3189 llvm::opt::ArgStringList &CmdArgs,
3190 const llvm::Triple &Triple) {
3191 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3192 options::OPT_mno_outline_atomics)) {
3194 if (!Triple.isAArch64()) {
3195 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3196 << Triple.getArchName() << A->getOption().getName();
3198 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3199 CmdArgs.push_back(
"-target-feature");
3200 CmdArgs.push_back(
"+outline-atomics");
3202 CmdArgs.push_back(
"-target-feature");
3203 CmdArgs.push_back(
"-outline-atomics");
3207 CmdArgs.push_back(
"-target-feature");
3208 CmdArgs.push_back(
"+outline-atomics");
3213 llvm::opt::ArgStringList &CmdArgs) {
3214 if (TCArgs.hasFlag(options::OPT_offload_compress,
3215 options::OPT_no_offload_compress,
false))
3216 CmdArgs.push_back(
"--compress");
3217 if (TCArgs.hasArg(options::OPT_v))
3218 CmdArgs.push_back(
"--verbose");
3219 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3221 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3225 const llvm::Triple &Triple,
3226 const llvm::Reloc::Model &RelocationModel,
3227 llvm::opt::ArgStringList &CmdArgs) {
3228 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3229 StringRef CM = A->getValue();
3231 if (Triple.isOSAIX() && CM ==
"medium")
3233 if (Triple.isAArch64(64)) {
3234 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3235 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3236 RelocationModel != llvm::Reloc::Static)
3237 D.
Diag(diag::err_drv_argument_only_allowed_with)
3238 << A->getAsString(Args) <<
"-fno-pic";
3239 }
else if (Triple.isLoongArch()) {
3240 if (CM ==
"extreme" &&
3241 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3242 D.
Diag(diag::err_drv_argument_not_allowed_with)
3243 << A->getAsString(Args) <<
"-fplt";
3244 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3247 CM = llvm::StringSwitch<StringRef>(CM)
3248 .Case(
"normal",
"small")
3249 .Case(
"extreme",
"large")
3251 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3252 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3253 }
else if (Triple.isRISCV()) {
3255 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3256 D.
Diag(diag::err_drv_argument_not_allowed_with)
3257 << A->getAsString(Args) <<
"-fpic";
3260 else if (CM ==
"medany")
3262 Ok = CM ==
"small" || CM ==
"medium" ||
3263 (CM ==
"large" && Triple.isRISCV64());
3264 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3265 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3266 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3270 }
else if (Triple.isSPARC64()) {
3273 else if (CM ==
"medmid")
3275 else if (CM ==
"medany")
3277 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3278 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3279 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3282 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3284 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3285 << A->getSpelling() << CM << Triple.getTriple();
3289 if (Triple.getArch() == llvm::Triple::x86_64) {
3290 bool IsMediumCM =
false;
3291 bool IsLargeCM =
false;
3292 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3293 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3294 IsLargeCM = StringRef(A->getValue()) ==
"large";
3296 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3297 if (!IsMediumCM && !IsLargeCM) {
3298 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3299 << A->getOption().getRenderName();
3301 A->render(Args, CmdArgs);
3303 }
else if (IsMediumCM) {
3304 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3305 }
else if (IsLargeCM) {
3306 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3312 ArgStringList &CmdArgs) {
3317 Args.getLastArg(options::OPT_fcolor_diagnostics,
3318 options::OPT_fno_color_diagnostics);
3319 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3320 StringRef
Value(A->getValue());
3322 D.
Diag(diag::err_drv_invalid_argument_to_option)
3323 <<
Value << A->getOption().getName();
3328 CmdArgs.push_back(
"-fcolor-diagnostics");
3331 CmdArgs.push_back(
"-fno-color-diagnostics");
3340 for (; *Arg; ++Arg) {
3346 Res.push_back(
'\\');
3349 Res.push_back(*Arg);
3354 const llvm::opt::ArgList &Args) {
3358 llvm::opt::ArgStringList OriginalArgs;
3359 for (
const auto &Arg : Args)
3360 Arg->render(Args, OriginalArgs);
3364 for (
const char *OriginalArg : OriginalArgs) {
3368 Flags += EscapedArg;
3371 return Args.MakeArgString(Flags);
3375 const llvm::opt::ArgList &Args,
3376 bool &FRecordCommandLine,
3377 bool &GRecordCommandLine,
3378 bool &DXRecordCommandLine) {
3381 const std::string &TripleStr = Triple.getTriple();
3383 FRecordCommandLine =
3384 Args.hasFlag(options::OPT_frecord_command_line,
3385 options::OPT_fno_record_command_line,
false);
3386 GRecordCommandLine =
3387 Args.hasFlag(options::OPT_grecord_command_line,
3388 options::OPT_gno_record_command_line,
false);
3389 DXRecordCommandLine = Triple.isDXIL() && Args.hasArg(options::OPT_g_Flag);
3390 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3391 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3392 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3393 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3397 DXRecordCommandLine;
3401 ArgStringList &CmdArgs,
3402 const llvm::Triple &Triple) {
3403 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
3404 options::OPT_fno_global_isel)) {
3405 CmdArgs.push_back(
"-mllvm");
3406 if (A->getOption().matches(options::OPT_fglobal_isel)) {
3407 CmdArgs.push_back(
"-global-isel=1");
3412 bool IsArchSupported = Triple.getArch() == llvm::Triple::aarch64;
3413 bool IsOptLevelSupported =
false;
3415 Arg *A = Args.getLastArg(options::OPT_O_Group);
3416 if (IsArchSupported) {
3417 if (!A || A->getOption().matches(options::OPT_O0))
3418 IsOptLevelSupported =
true;
3420 if (!IsArchSupported || !IsOptLevelSupported) {
3421 CmdArgs.push_back(
"-mllvm");
3422 CmdArgs.push_back(
"-global-isel-abort=2");
3424 if (!IsArchSupported)
3425 D.
Diag(diag::warn_drv_global_isel_incomplete) << Triple.getArchName();
3427 D.
Diag(diag::warn_drv_global_isel_incomplete_opt);
3430 CmdArgs.push_back(
"-global-isel=0");
3436 ArgStringList &CmdArgs,
3437 bool IsMSVCCompat) {
3438 bool use_fwrapv = IsMSVCCompat;
3439 bool use_fwrapv_pointer =
false;
3440 for (
const Arg *A : Args.filtered(
3441 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3442 options::OPT_fwrapv, options::OPT_fno_wrapv,
3443 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3445 switch (A->getOption().getID()) {
3446 case options::OPT_fstrict_overflow:
3448 use_fwrapv_pointer =
false;
3450 case options::OPT_fno_strict_overflow:
3452 use_fwrapv_pointer =
true;
3454 case options::OPT_fwrapv:
3457 case options::OPT_fno_wrapv:
3460 case options::OPT_fwrapv_pointer:
3461 use_fwrapv_pointer =
true;
3463 case options::OPT_fno_wrapv_pointer:
3464 use_fwrapv_pointer =
false;
3470 CmdArgs.push_back(
"-fwrapv");
3471 if (!use_fwrapv && IsMSVCCompat)
3472 CmdArgs.push_back(
"-fno-wrapv");
3473 if (use_fwrapv_pointer)
3474 CmdArgs.push_back(
"-fwrapv-pointer");
3481 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3482 if (A->getOption().matches(options::OPT_O4) ||
3483 A->getOption().matches(options::OPT_Ofast))
3486 if (A->getOption().matches(options::OPT_O0))
3489 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3492 StringRef S(A->getValue());
3500 unsigned OptLevel = 0;
3501 if (S.getAsInteger(10, OptLevel))
3504 return OptLevel > 1;
3511 ArgStringList &CmdArgs) {
3513 if (Args.hasFlag(options::OPT_fvectorize, options::OPT_fno_vectorize,
3515 CmdArgs.push_back(
"-vectorize-loops");
3519 ArgStringList &CmdArgs) {
3521 if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize,
3523 CmdArgs.push_back(
"-vectorize-slp");
3527 ArgStringList &CmdArgs) {
3528 if (Args.hasFlag(options::OPT_floop_interchange,
3529 options::OPT_fno_loop_interchange,
false))
3530 CmdArgs.push_back(
"-floop-interchange");
3551 llvm_unreachable(
"Fully covered switch above");
3557 if (!ComplexRangeStr.empty())
3558 return "-complex-range=" + ComplexRangeStr;
3559 return ComplexRangeStr;
3579 if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
3580 (LastOpt ==
"-fcx-limited-range" && NewOpt ==
"-fno-cx-limited-range") ||
3581 (LastOpt ==
"-fno-cx-limited-range" && NewOpt ==
"-fcx-limited-range") ||
3582 (LastOpt ==
"-fcx-fortran-rules" && NewOpt ==
"-fno-cx-fortran-rules") ||
3583 (LastOpt ==
"-fno-cx-fortran-rules" && NewOpt ==
"-fcx-fortran-rules") ||
3584 (LastOpt ==
"-ffast-math" && NewOpt ==
"-fno-fast-math") ||
3585 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-ffast-math") ||
3586 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-fno-fast-math") ||
3587 (LastOpt.starts_with(
"-ffp-model=") &&
3588 NewOpt.starts_with(
"-ffp-model=")) ||
3589 (LastOpt.starts_with(
"-fcomplex-arithmetic=") &&
3590 NewOpt.starts_with(
"-fcomplex-arithmetic=")))
3593 D.
Diag(clang::diag::warn_drv_overriding_complex_range)
3613 const ArgStringList &LinkerInputs,
3615 const llvm::opt::ArgList &Args,
3616 const char *OutputFilename) {
3620 assert(!LinkerInputs.empty() && !JobInputs.empty() &&
3621 "Must have at least one input.");
3623 ArgStringList LlvmLinkArgs(
3624 {
"-o", OutputFilename ? OutputFilename : Output.
getFilename()});
3626 LlvmLinkArgs.append(LinkerInputs);
3629 const char *LlvmLink = Args.MakeArgString(TC.
GetProgramPath(
"llvm-link"));
3631 LlvmLink, LlvmLinkArgs, JobInputs,
static bool useLeafFramePointerForTargetByDefault(const llvm::Triple &Triple)
static unsigned ParseDebugDefaultVersion(const ToolChain &TC, const ArgList &Args)
static void getWebAssemblyTargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, std::vector< StringRef > &Features)
static void emitComplexRangeDiag(const Driver &D, StringRef LastOpt, LangOptions::ComplexRangeKind Range, StringRef NewOpt, LangOptions::ComplexRangeKind NewRange)
static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer)
static bool mustMaintainValidFrameChain(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static llvm::opt::Arg * getAMDGPUCodeObjectArgument(const Driver &D, const llvm::opt::ArgList &Args)
static void collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, SmallVectorImpl< StringRef > &SharedRuntimes, SmallVectorImpl< StringRef > &StaticRuntimes, SmallVectorImpl< StringRef > &NonWholeStaticRuntimes, SmallVectorImpl< StringRef > &HelperStaticRuntimes, SmallVectorImpl< StringRef > &RequiredSymbols)
static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer, bool IsShared, bool IsWhole)
static void AddUnwindLibrary(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
static bool SDLSearch(const Driver &D, const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, const SmallVectorImpl< std::string > &LibraryPaths, StringRef Lib, StringRef Arch, StringRef Target, bool isBitCodeSDL)
SDLSearch: Search for Static Device Library The search for SDL bitcode files is consistent with how s...
static 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 void GetSDLFromOffloadArchive(Compilation &C, const Driver &D, const Tool &T, const JobAction &JA, const InputInfoList &Inputs, const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, const SmallVectorImpl< std::string > &LibraryPaths, StringRef Lib, StringRef Arch, StringRef Target, bool isBitCodeSDL)
Search if a user provided archive file lib<libname>.a exists in any of the library paths.
static std::string getLanaiTargetCPU(const ArgList &Args)
static void renderRemarksOptions(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple, const InputInfo &Input, const InputInfo &Output, const StringRef PluginOptPrefix)
static bool useFramePointerForTargetByDefault(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static void AddLibgcc(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
static LibGccType getLibGccType(const ToolChain &TC, const Driver &D, const ArgList &Args)
clang::CodeGenOptions::FramePointerKind getFramePointerKind(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static bool mustUseNonLeafFramePointerForTarget(const llvm::Triple &Triple)
static bool shouldIgnoreUnsupportedTargetFeature(const Arg &TargetFeatureArg, llvm::Triple T, StringRef Processor)
llvm::MachO::Target Target
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
ComplexRangeKind
Controls the various implementations for complex multiplication and.
@ CX_Full
Implementation of complex division and multiplication using a call to runtime library functions(gener...
@ CX_Basic
Implementation of complex division and multiplication using algebraic formulas at source precision.
@ CX_Promoted
Implementation of complex division using algebraic formulas at higher precision.
@ CX_None
No range rule is enabled.
@ CX_Improved
Implementation of complex division offering an improved handling for overflow in intermediate calcula...
BoundArch getOffloadingArch() const
static StringRef GetOffloadKindName(OffloadKind Kind)
Return a string containing a offload kind name.
OffloadKind getOffloadingDeviceKind() const
bool isHostOffloading(unsigned int OKind) const
Check if this action have any offload kinds.
Compilation - A set of tasks to perform for a single driver invocation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
std::string CCPrintInternalStatReportFilename
The file to log CC_PRINT_INTERNAL_STAT_FILE output to, if enabled.
DiagnosticsEngine & getDiags() const
const char * getPrependArg() const
OpenMPRuntimeKind getOpenMPRuntime(const llvm::opt::ArgList &Args) const
Compute the desired OpenMP runtime from the flags provided.
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 GetTemporaryPath(StringRef Prefix, StringRef Suffix) const
GetTemporaryPath - Return the pathname of a temporary file to use as part of compilation; the file wi...
std::string Dir
The path the driver executable was in, as invoked from the command line.
@ OMPRT_IOMP5
The legacy name for the LLVM OpenMP runtime from when it was the Intel OpenMP runtime.
@ OMPRT_OMP
The LLVM OpenMP runtime.
@ OMPRT_Unknown
An unknown OpenMP runtime.
@ OMPRT_GOMP
The GNU OpenMP runtime.
std::string getTargetTriple() const
bool IsFlangMode() const
Whether the driver should invoke flang for fortran inputs.
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
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.
ID lookupTypeForExtension(llvm::StringRef Ext)
lookupTypeForExtension - Lookup the type to use for the file extension Ext.
SmallVector< InputInfo, 4 > InputInfoList
bool willEmitRemarks(const llvm::opt::ArgList &Args)
The JSON file list parser is used to communicate input to InstallAPI.
llvm::StringRef getProcessorFromTargetID(const llvm::Triple &T, llvm::StringRef OffloadArch)
Get processor name from target ID.
unsigned getOptimizationLevel(const llvm::opt::ArgList &Args, InputKind IK, DiagnosticsEngine &Diags)
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()