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 auto GPUKind = T.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Processor)
385 : llvm::AMDGPU::parseArchR600(Processor);
386 auto GPUFeatures = T.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind)
387 : llvm::AMDGPU::getArchAttrR600(GPUKind);
388 if (GPUFeatures & llvm::AMDGPU::FEATURE_WGP)
390 return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode);
395 if (D.
getVFS().exists(Path))
396 Paths.push_back(Path.str());
400 const llvm::Triple &Triple,
402 std::vector<StringRef> &Features,
403 OptSpecifier Group) {
404 std::set<StringRef> Warned;
405 for (
const Arg *A : Args.filtered(Group)) {
406 StringRef Name = A->getOption().getName();
410 assert(Name.starts_with(
"m") &&
"Invalid feature name.");
411 Name = Name.substr(1);
415 if (Warned.count(Name) == 0) {
417 clang::diag::warn_drv_unsupported_option_for_processor)
418 << A->getAsString(Args) << Proc;
424 bool IsNegative = Name.consume_front(
"no-");
426 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
434 llvm::DenseSet<StringRef> UsedFeatures;
435 for (StringRef
Feature : llvm::reverse(Features)) {
436 if (UsedFeatures.insert(
Feature.drop_front()).second)
437 UnifiedFeatures.insert(UnifiedFeatures.begin(),
Feature);
440 return UnifiedFeatures;
444 const char *ArgName,
const char *EnvVar) {
445 const char *DirList = ::getenv(EnvVar);
446 bool CombinedArg =
false;
451 StringRef Name(ArgName);
452 if (Name ==
"-I" || Name ==
"-L" || Name.empty())
455 StringRef Dirs(DirList);
459 StringRef::size_type Delim;
460 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
463 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
465 CmdArgs.push_back(ArgName);
466 CmdArgs.push_back(
".");
471 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
473 CmdArgs.push_back(ArgName);
474 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
477 Dirs = Dirs.substr(Delim + 1);
482 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
484 CmdArgs.push_back(ArgName);
485 CmdArgs.push_back(
".");
489 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
491 CmdArgs.push_back(ArgName);
492 CmdArgs.push_back(Args.MakeArgString(Dirs));
498 const ArgList &Args, ArgStringList &CmdArgs,
504 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
511 for (
const auto &II : Inputs) {
515 if (
auto *IA = II.getAction())
525 if (II.isFilename()) {
526 CmdArgs.push_back(II.getFilename());
535 const Arg &A = II.getInputArg();
538 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
540 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
543 else if (A.getOption().matches(options::OPT_rpath) &&
547 A.renderAsInput(Args, CmdArgs);
549 if (
const Arg *A = Args.getLastArg(options::OPT_fveclib)) {
550 const llvm::Triple &Triple = TC.
getTriple();
551 StringRef
V = A->getValue();
552 if (
V ==
"ArmPL" && (Triple.isOSLinux() || Triple.isOSDarwin())) {
570 if (Triple.isOSLinux()) {
571 CmdArgs.push_back(Args.MakeArgString(
"--push-state"));
572 CmdArgs.push_back(Args.MakeArgString(
"--as-needed"));
574 if (!Args.hasArg(options::OPT_nostdlib))
575 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
576 CmdArgs.push_back(Args.MakeArgString(
"-lamath"));
577 if (!Args.hasArg(options::OPT_nostdlib))
578 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
579 if (Triple.isOSLinux())
580 CmdArgs.push_back(Args.MakeArgString(
"--pop-state"));
587 switch (T.getArch()) {
588 case llvm::Triple::x86:
592 case llvm::Triple::aarch64:
593 if (T.isOSManagarm())
594 return "aarch64managarm";
597 return "aarch64linux";
598 case llvm::Triple::aarch64_be:
600 return "aarch64elfb";
601 return "aarch64linuxb";
602 case llvm::Triple::arm:
603 case llvm::Triple::thumb:
604 case llvm::Triple::armeb:
605 case llvm::Triple::thumbeb: {
608 return IsBigEndian ?
"armelfb" :
"armelf";
609 return IsBigEndian ?
"armelfb_linux_eabi" :
"armelf_linux_eabi";
611 case llvm::Triple::m68k:
613 case llvm::Triple::ppc:
615 return "elf32ppclinux";
617 case llvm::Triple::ppcle:
619 return "elf32lppclinux";
621 case llvm::Triple::ppc64:
623 case llvm::Triple::ppc64le:
625 case llvm::Triple::riscv32:
626 return "elf32lriscv";
627 case llvm::Triple::riscv64:
628 return "elf64lriscv";
629 case llvm::Triple::riscv32be:
630 return "elf32briscv";
631 case llvm::Triple::riscv64be:
632 return "elf64briscv";
633 case llvm::Triple::sparc:
634 case llvm::Triple::sparcel:
635 return "elf32_sparc";
636 case llvm::Triple::sparcv9:
637 return "elf64_sparc";
638 case llvm::Triple::loongarch32:
639 return "elf32loongarch";
640 case llvm::Triple::loongarch64:
641 return "elf64loongarch";
642 case llvm::Triple::mips:
643 return "elf32btsmip";
644 case llvm::Triple::mipsel:
645 return "elf32ltsmip";
646 case llvm::Triple::mips64:
648 return "elf32btsmipn32";
649 return "elf64btsmip";
650 case llvm::Triple::mips64el:
652 return "elf32ltsmipn32";
653 return "elf64ltsmip";
654 case llvm::Triple::systemz:
656 case llvm::Triple::x86_64:
658 return "elf32_x86_64";
660 case llvm::Triple::ve:
662 case llvm::Triple::csky:
663 return "cskyelf_linux";
670 const ToolChain &TC,
const llvm::opt::ArgList &Args,
671 llvm::opt::ArgStringList &CmdArgs) {
677 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
678 StringRef
V = A->getValue();
679 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
680 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
682 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
683 << A->getSpelling() <<
V;
688 std::vector<StringRef> &Features,
689 OptSpecifier OnOpt, OptSpecifier OffOpt,
690 StringRef FeatureName) {
691 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
692 if (A->getOption().matches(OnOpt))
693 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
695 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
701 const ArgList &Args) {
702 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
709 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
710 return A->getValue();
718 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
719 StringRef CPU = A->getValue();
725 return llvm::sys::getHostCPUName();
735 const llvm::Triple &T,
bool FromAs) {
738 switch (T.getArch()) {
742 case llvm::Triple::aarch64:
743 case llvm::Triple::aarch64_32:
744 case llvm::Triple::aarch64_be:
747 case llvm::Triple::arm:
748 case llvm::Triple::armeb:
749 case llvm::Triple::thumb:
750 case llvm::Triple::thumbeb: {
751 StringRef MArch, MCPU;
756 case llvm::Triple::avr:
757 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
758 return A->getValue();
761 case llvm::Triple::m68k:
764 case llvm::Triple::mips:
765 case llvm::Triple::mipsel:
766 case llvm::Triple::mips64:
767 case llvm::Triple::mips64el: {
771 return std::string(CPUName);
774 case llvm::Triple::nvptx:
775 case llvm::Triple::nvptx64:
776 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
777 return A->getValue();
780 case llvm::Triple::ppc:
781 case llvm::Triple::ppcle:
782 case llvm::Triple::ppc64:
783 case llvm::Triple::ppc64le:
784 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
786 llvm::PPC::getNormalizedPPCTargetCPU(T, A->getValue()));
787 return std::string(llvm::PPC::getNormalizedPPCTargetCPU(T));
789 case llvm::Triple::csky:
790 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
791 return A->getValue();
792 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
793 return A->getValue();
796 case llvm::Triple::riscv32:
797 case llvm::Triple::riscv64:
798 case llvm::Triple::riscv32be:
799 case llvm::Triple::riscv64be:
802 case llvm::Triple::bpfel:
803 case llvm::Triple::bpfeb:
804 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
805 return A->getValue();
808 case llvm::Triple::sparc:
809 case llvm::Triple::sparcel:
810 case llvm::Triple::sparcv9:
813 case llvm::Triple::x86:
814 case llvm::Triple::x86_64:
817 case llvm::Triple::hexagon:
821 case llvm::Triple::lanai:
824 case llvm::Triple::systemz:
827 case llvm::Triple::amdgpu:
828 case llvm::Triple::r600:
831 case llvm::Triple::wasm32:
832 case llvm::Triple::wasm64:
835 case llvm::Triple::loongarch32:
836 case llvm::Triple::loongarch64:
839 case llvm::Triple::xtensa:
840 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
841 return A->getValue();
847 const llvm::Triple &Triple,
849 std::vector<StringRef> &Features) {
851 options::OPT_m_wasm_Features_Group);
855 const ArgList &Args, ArgStringList &CmdArgs,
856 bool ForAS,
bool IsAux) {
857 std::vector<StringRef> Features;
858 switch (Triple.getArch()) {
861 case llvm::Triple::mips:
862 case llvm::Triple::mipsel:
863 case llvm::Triple::mips64:
864 case llvm::Triple::mips64el:
867 case llvm::Triple::arm:
868 case llvm::Triple::armeb:
869 case llvm::Triple::thumb:
870 case llvm::Triple::thumbeb:
873 case llvm::Triple::ppc:
874 case llvm::Triple::ppcle:
875 case llvm::Triple::ppc64:
876 case llvm::Triple::ppc64le:
879 case llvm::Triple::riscv32:
880 case llvm::Triple::riscv64:
881 case llvm::Triple::riscv32be:
882 case llvm::Triple::riscv64be:
885 case llvm::Triple::systemz:
888 case llvm::Triple::aarch64:
889 case llvm::Triple::aarch64_32:
890 case llvm::Triple::aarch64_be:
893 case llvm::Triple::x86:
894 case llvm::Triple::x86_64:
897 case llvm::Triple::hexagon:
900 case llvm::Triple::wasm32:
901 case llvm::Triple::wasm64:
904 case llvm::Triple::sparc:
905 case llvm::Triple::sparcel:
906 case llvm::Triple::sparcv9:
909 case llvm::Triple::amdgpu:
910 case llvm::Triple::r600:
913 case llvm::Triple::nvptx:
914 case llvm::Triple::nvptx64:
917 case llvm::Triple::m68k:
920 case llvm::Triple::msp430:
923 case llvm::Triple::ve:
926 case llvm::Triple::csky:
929 case llvm::Triple::loongarch32:
930 case llvm::Triple::loongarch64:
936 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
937 CmdArgs.push_back(
Feature.data());
942 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
945 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
946 D.
Diag(diag::err_drv_invalid_int_value)
947 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
948 return LtoJobsArg->getValue();
953 return Triple.isPS();
958 ArgStringList &CmdArgs) {
960 if (Args.hasFlag(options::OPT_ffunction_sections,
961 options::OPT_fno_function_sections, UseSeparateSections))
962 CmdArgs.push_back(
"-ffunction-sections");
964 bool HasDefaultDataSections = Triple.isOSBinFormatXCOFF();
965 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
966 UseSeparateSections || HasDefaultDataSections))
967 CmdArgs.push_back(
"-fdata-sections");
971 const llvm::opt::ArgList &Args) {
973 Arg *A = Args.getLastArg(options::OPT_mtls_dialect_EQ);
975 return Triple.hasDefaultTLSDESC();
976 StringRef
V = A->getValue();
977 bool SupportedArgument =
false, EnableTLSDESC =
false;
978 bool Unsupported = !Triple.isOSBinFormatELF();
979 if (Triple.isLoongArch() || Triple.isRISCV()) {
980 SupportedArgument =
V ==
"desc" ||
V ==
"trad";
981 EnableTLSDESC =
V ==
"desc";
982 }
else if (Triple.isX86()) {
983 SupportedArgument =
V ==
"gnu" ||
V ==
"gnu2";
984 EnableTLSDESC =
V ==
"gnu2";
989 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
990 << A->getSpelling() << Triple.getTriple();
991 }
else if (!SupportedArgument) {
992 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument_for_target)
993 << A->getSpelling() <<
V << Triple.getTriple();
995 return EnableTLSDESC;
999 llvm::opt::ArgStringList &CmdArgs) {
1000 if (Arg *A = Args.getLastArg(options::OPT_fthinlto_distributor_EQ)) {
1002 Args.MakeArgString(
"--thinlto-distributor=" + Twine(A->getValue())));
1004 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-remote-compiler=" +
1007 CmdArgs.push_back(Args.MakeArgString(
1008 "--thinlto-remote-compiler-prepend-arg=" + Twine(PA)));
1010 for (
const auto &A :
1011 Args.getAllArgValues(options::OPT_Xthinlto_distributor_EQ))
1012 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-distributor-arg=" + A));
1017 ArgStringList &CmdArgs,
const InputInfo &Output,
1020 const bool IsOSAIX = Triple.isOSAIX();
1021 const bool IsAMDGCN = Triple.isAMDGCN();
1022 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ);
1025 const bool IsFatLTO = Args.hasFlag(options::OPT_ffat_lto_objects,
1026 options::OPT_fno_fat_lto_objects,
false);
1027 const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
1029 assert(!Inputs.empty() &&
"Must have at least one input.");
1031 auto Input = llvm::find_if(
1033 if (Input == Inputs.end()) {
1036 Input = Inputs.begin();
1039 if (Linker !=
"lld" && Linker !=
"lld-link" &&
1040 llvm::sys::path::filename(LinkerPath) !=
"ld.lld" &&
1041 llvm::sys::path::stem(LinkerPath) !=
"ld.lld" && !Triple.isOSOpenBSD()) {
1045 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
1046 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
1049 CmdArgs.push_back(
"-plugin");
1052 const char *Suffix =
".dll";
1053#elif defined(__APPLE__)
1054 const char *Suffix =
".dylib";
1056 const char *Suffix =
".so";
1060 llvm::sys::path::native(Twine(D.
Dir) +
1061 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
1062 PluginName + Suffix,
1064 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
1069 CmdArgs.push_back(
"--fat-lto-objects");
1071 if (Args.hasArg(options::OPT_flto_partitions_EQ)) {
1073 StringRef A = Args.getLastArgValue(options::OPT_flto_partitions_EQ,
"8");
1074 if (A.getAsInteger(10,
Value) || (
Value < 1)) {
1075 Arg *Arg = Args.getLastArg(options::OPT_flto_partitions_EQ);
1076 D.
Diag(diag::err_drv_invalid_int_value)
1077 << Arg->getAsString(Args) << Arg->getValue();
1079 CmdArgs.push_back(Args.MakeArgString(
"--lto-partitions=" + A));
1083 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
1084 const char *ExtraDash = IsOSAIX ?
"-" :
"";
1085 const char *ParallelismOpt = IsOSAIX ?
"-threads=" :
"jobs=";
1090 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
1091 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1092 "-generate-arange-section"));
1096 Arg *ArgVecLib = Args.getLastArg(options::OPT_fveclib);
1097 if (ArgVecLib && ArgVecLib->getNumValues() == 1) {
1100 std::optional<StringRef> OptVal =
1101 llvm::StringSwitch<std::optional<StringRef>>(ArgVecLib->getValue())
1102 .Case(
"Accelerate",
"Accelerate")
1103 .Case(
"libmvec",
"LIBMVEC")
1104 .Case(
"AMDLIBM",
"AMDLIBM")
1105 .Case(
"MASSV",
"MASSV")
1106 .Case(
"SVML",
"SVML")
1107 .Case(
"SLEEF",
"sleefgnuabi")
1108 .Case(
"Darwin_libsystem_m",
"Darwin_libsystem_m")
1109 .Case(
"ArmPL",
"ArmPL")
1110 .Case(
"none",
"none")
1111 .Default(std::nullopt);
1114 CmdArgs.push_back(Args.MakeArgString(
1115 Twine(PluginOptPrefix) +
"-vector-library=" + OptVal.value()));
1125 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
1127 if (Args.getLastArg(options::OPT_O_Group)) {
1128 unsigned OptimizationLevel =
1130 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1131 "O" + Twine(OptimizationLevel)));
1134 Args.MakeArgString(Twine(
"--lto-CGO") + Twine(OptimizationLevel)));
1137 if (Args.hasArg(options::OPT_gsplit_dwarf)) {
1139 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1146 Args.MakeArgString(Twine(PluginOptPrefix) +
"dwo_dir=" + F +
"dwo"));
1149 if (IsThinLTO && !IsOSAIX)
1150 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
1151 else if (IsThinLTO && IsOSAIX)
1152 CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
1157 if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
1158 Args.hasArg(options::OPT_fenable_matrix))
1160 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-matrix"));
1163 if (!Parallelism.empty())
1164 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1165 ParallelismOpt + Parallelism));
1170 if (Arg *A = Args.getLastArg(options::OPT_fslp_vectorize,
1171 options::OPT_fno_slp_vectorize))
1172 CmdArgs.push_back(Args.MakeArgString(
1173 Twine(PluginOptPrefix) +
"-vectorize-slp=" +
1174 (A->getOption().matches(options::OPT_fslp_vectorize) ?
"1" :
"0")));
1177 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
1178 options::OPT_fno_global_isel)) {
1181 CmdArgs.push_back(Args.MakeArgString(
1182 Twine(PluginOptPrefix) +
"-global-isel=" +
1183 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
1188 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
1189 if (A->getOption().matches(options::OPT_glldb))
1191 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
1192 else if (A->getOption().matches(options::OPT_gsce))
1194 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
1195 else if (A->getOption().matches(options::OPT_gdbx))
1197 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
1200 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
1206 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
1210 Arg *A = Args.getLastArg(options::OPT_g_Group);
1211 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
1212 !A->getOption().matches(options::OPT_ggdb0);
1213 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
1214 options::OPT_gno_strict_dwarf,
true))
1216 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
1218 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
1219 StringRef
V = A->getValue();
1220 if (
V ==
"vec-default")
1222 if (
V ==
"vec-extabi") {
1224 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
1230 bool UseSeparateSections =
1233 if (Args.hasFlag(options::OPT_ffunction_sections,
1234 options::OPT_fno_function_sections, UseSeparateSections))
1236 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
1237 else if (Args.hasArg(options::OPT_fno_function_sections))
1239 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
1241 bool DataSectionsTurnedOff =
false;
1242 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1243 UseSeparateSections)) {
1245 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
1246 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
1247 DataSectionsTurnedOff =
true;
1249 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
1252 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
1253 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
1254 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
1255 options::OPT_mno_xcoff_roptr,
false);
1256 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
1258 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1259 << OptStr << Triple.str();
1265 if (DataSectionsTurnedOff)
1266 D.
Diag(diag::err_roptr_requires_data_sections);
1269 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
1274 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
1275 options::OPT_fno_split_machine_functions)) {
1276 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
1277 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1278 "-split-machine-functions"));
1282 Args.getLastArg(options::OPT_fpartition_static_data_sections,
1283 options::OPT_fno_partition_static_data_sections)) {
1284 if (A->getOption().matches(options::OPT_fpartition_static_data_sections)) {
1285 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1286 "-partition-static-data-sections"));
1291 StringRef FName = A->getValue();
1292 if (!llvm::sys::fs::exists(FName))
1293 D.
Diag(diag::err_drv_no_such_file) << FName;
1295 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1296 "sample-profile=" + FName));
1300 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1301 "cs-profile-generate"));
1302 if (CSPGOGenerateArg->getOption().matches(
1303 options::OPT_fcs_profile_generate_EQ)) {
1305 llvm::sys::path::append(Path,
"default_%m.profraw");
1306 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1307 "cs-profile-path=" + Path));
1310 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1311 "cs-profile-path=default_%m.profraw"));
1314 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1315 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1316 llvm::sys::path::append(Path,
"default.profdata");
1317 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1318 "cs-profile-path=" + Path));
1322 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1324 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1325 "-enable-jmc-instrument"));
1327 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1330 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1331 Triple.hasDefaultEmulatedTLS())) {
1333 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1337 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1339 if (Args.hasFlag(options::OPT_fstack_size_section,
1340 options::OPT_fno_stack_size_section,
false))
1342 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1344 if (Args.hasFlag(options::OPT_fexperimental_call_graph_section,
1345 options::OPT_fno_experimental_call_graph_section,
false))
1347 Args.MakeArgString(Twine(PluginOptPrefix) +
"-call-graph-section"));
1351 if (!StatsFile.empty())
1353 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1356 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1357 CmdArgs.push_back(Args.MakeArgString(
1358 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1369 Output, PluginOptPrefix);
1375 true, PluginOptPrefix);
1377 bool IsELF = Triple.isOSBinFormatELF();
1379 bool ImplicitMapSyms =
false;
1380 for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
1381 for (StringRef
V : A->getValues()) {
1382 auto Equal =
V.split(
'=');
1383 auto checkArg = [&](
bool ValidTarget,
1384 std::initializer_list<const char *>
Set) {
1386 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1387 << (Twine(
"-Wa,") +
Equal.first +
"=").str()
1388 << Triple.getTriple();
1389 }
else if (!llvm::is_contained(
Set,
Equal.second)) {
1390 D.
Diag(diag::err_drv_unsupported_option_argument)
1391 << (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
1394 if (
Equal.first ==
"-mmapsyms") {
1395 ImplicitMapSyms =
Equal.second ==
"implicit";
1396 checkArg(IsELF && Triple.isAArch64(), {
"default",
"implicit"});
1397 }
else if (
V ==
"--crel")
1399 else if (
V ==
"--no-crel")
1407 if (IsELF && !Triple.isMIPS()) {
1408 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"-crel"));
1410 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1414 if (ImplicitMapSyms)
1416 Args.MakeArgString(Twine(PluginOptPrefix) +
"-implicit-mapsyms"));
1418 if (Args.hasArg(options::OPT_ftime_report))
1420 Args.MakeArgString(Twine(PluginOptPrefix) +
"-time-passes"));
1426 const ArgList &Args,
1427 ArgStringList &CmdArgs) {
1432 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1433 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1437 ArgStringList &CmdArgs) {
1438 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1439 options::OPT_fno_rtlib_add_rpath,
false))
1451 llvm::sys::path::append(P, M.gccSuffix());
1452 CandidateRPaths.emplace_back(std::string(P));
1454 CandidateRPaths.emplace_back(*StdlibPath);
1456 for (
const auto &CandidateRPath : CandidateRPaths) {
1457 if (TC.
getVFS().exists(CandidateRPath)) {
1458 CmdArgs.push_back(
"-rpath");
1459 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1465 const ToolChain &TC,
const ArgList &Args,
1466 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1468 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1469 options::OPT_fno_openmp,
false)) {
1471 if (Args.hasFlag(options::OPT_foffload_via_llvm,
1472 options::OPT_fno_offload_via_llvm,
false))
1473 CmdArgs.push_back(
"-lomptarget");
1483 if (ForceStaticHostRuntime)
1484 CmdArgs.push_back(
"-Bstatic");
1488 CmdArgs.push_back(
"-lomp");
1491 CmdArgs.push_back(
"-lgomp");
1494 CmdArgs.push_back(
"-liomp5");
1500 if (ForceStaticHostRuntime)
1501 CmdArgs.push_back(
"-Bdynamic");
1504 CmdArgs.push_back(
"-lrt");
1506 if (IsOffloadingHost)
1507 CmdArgs.push_back(
"-lomptarget");
1518 const llvm::opt::ArgList &Args,
1519 llvm::opt::ArgStringList &CmdArgs) {
1525 constexpr llvm::StringLiteral Targets(
"--offload-targets=");
1529 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1530 [](
auto TC) { return TC.second->getTripleString(); });
1532 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1536 ArgStringList &CmdArgs, StringRef Sanitizer,
1537 bool IsShared,
bool IsWhole) {
1540 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1543 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1553 ArgStringList &CmdArgs,
1554 StringRef Sanitizer) {
1559 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1562 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1563 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1570 const llvm::opt::ArgList &Args,
1571 llvm::opt::ArgStringList &CmdArgs,
1574 "AIX linker does not support any form of --as-needed option yet.");
1582 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1583 CmdArgs.push_back(
"-z");
1584 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1586 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1591 const llvm::opt::ArgList &Args,
1592 ArgStringList &CmdArgs) {
1597 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1599 CmdArgs.push_back(
"-lpthread");
1601 CmdArgs.push_back(
"-lrt");
1603 CmdArgs.push_back(
"-lm");
1608 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1609 CmdArgs.push_back(
"-ldl");
1613 CmdArgs.push_back(
"-lexecinfo");
1615 CmdArgs.push_back(
"-lbsd");
1621 CmdArgs.push_back(
"-lresolv");
1631 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1636 SharedRuntimes.push_back(
"asan");
1637 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1638 HelperStaticRuntimes.push_back(
"asan-preinit");
1641 SharedRuntimes.push_back(
"memprof");
1642 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1643 HelperStaticRuntimes.push_back(
"memprof-preinit");
1646 SharedRuntimes.push_back(
"nsan");
1649 SharedRuntimes.push_back(
"ubsan_minimal");
1651 SharedRuntimes.push_back(
"ubsan_standalone");
1654 SharedRuntimes.push_back(
"scudo_standalone");
1657 SharedRuntimes.push_back(
"tsan");
1659 SharedRuntimes.push_back(
"tysan");
1662 SharedRuntimes.push_back(
"hwasan_aliases");
1664 SharedRuntimes.push_back(
"hwasan");
1665 if (!Args.hasArg(options::OPT_shared))
1666 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1669 SharedRuntimes.push_back(
"rtsan");
1674 StaticRuntimes.push_back(
"stats_client");
1678 HelperStaticRuntimes.push_back(
"asan_static");
1681 if (Args.hasArg(options::OPT_shared)) {
1690 StaticRuntimes.push_back(
"asan");
1692 StaticRuntimes.push_back(
"asan_cxx");
1697 StaticRuntimes.push_back(
"rtsan");
1700 StaticRuntimes.push_back(
"memprof");
1702 StaticRuntimes.push_back(
"memprof_cxx");
1707 StaticRuntimes.push_back(
"hwasan_aliases");
1709 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1711 StaticRuntimes.push_back(
"hwasan");
1713 StaticRuntimes.push_back(
"hwasan_cxx");
1717 StaticRuntimes.push_back(
"dfsan");
1719 StaticRuntimes.push_back(
"lsan");
1721 StaticRuntimes.push_back(
"msan");
1723 StaticRuntimes.push_back(
"msan_cxx");
1726 StaticRuntimes.push_back(
"nsan");
1728 StaticRuntimes.push_back(
"tsan");
1730 StaticRuntimes.push_back(
"tsan_cxx");
1733 StaticRuntimes.push_back(
"tysan");
1736 StaticRuntimes.push_back(
"ubsan_minimal");
1738 StaticRuntimes.push_back(
"ubsan_standalone");
1742 NonWholeStaticRuntimes.push_back(
"safestack");
1743 RequiredSymbols.push_back(
"__safestack_init");
1747 StaticRuntimes.push_back(
"cfi");
1749 StaticRuntimes.push_back(
"cfi_diag");
1754 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1757 NonWholeStaticRuntimes.push_back(
"stats");
1758 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1761 StaticRuntimes.push_back(
"scudo_standalone");
1763 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1766 NonWholeStaticRuntimes.push_back(
"ubsan_loop_detect");
1772 ArgStringList &CmdArgs) {
1775 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1778 NonWholeStaticRuntimes, HelperStaticRuntimes,
1783 for (
auto S : RequiredSymbols) {
1784 CmdArgs.push_back(
"-u");
1785 CmdArgs.push_back(Args.MakeArgString(S));
1789 for (
auto RT : SharedRuntimes)
1793 bool FuzzerNeedsSanitizerDeps =
false;
1795 !Args.hasArg(options::OPT_shared)) {
1798 FuzzerNeedsSanitizerDeps =
true;
1802 if (!Args.hasArg(options::OPT_nostdlibxx)) {
1803 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1804 !Args.hasArg(options::OPT_static);
1805 if (OnlyLibstdcxxStatic)
1806 CmdArgs.push_back(
"-Bstatic");
1808 if (OnlyLibstdcxxStatic)
1809 CmdArgs.push_back(
"-Bdynamic");
1813 for (
auto RT : HelperStaticRuntimes)
1815 bool AddExportDynamic =
false;
1816 for (
auto RT : StaticRuntimes) {
1820 for (
auto RT : NonWholeStaticRuntimes) {
1826 if (AddExportDynamic && !TC.
getTriple().isNVPTX())
1827 CmdArgs.push_back(
"--export-dynamic");
1830 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1833 CmdArgs.push_back(
"-z");
1835 Args.MakeArgString(
"memtag-mode=" + SanArgs.
getMemtagMode()));
1838 CmdArgs.push_back(
"-z");
1839 CmdArgs.push_back(
"memtag-heap");
1843 CmdArgs.push_back(
"-z");
1844 CmdArgs.push_back(
"memtag-stack");
1848 CmdArgs.push_back(
"--android-memtag-note");
1851 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty() ||
1852 FuzzerNeedsSanitizerDeps;
1857 if (Args.hasArg(options::OPT_shared)) {
1859 CmdArgs.push_back(
"--whole-archive");
1861 CmdArgs.push_back(
"--no-whole-archive");
1865 CmdArgs.push_back(
"--whole-archive");
1867 for (
const auto &Mode : XRay.
modeList())
1869 CmdArgs.push_back(
"--no-whole-archive");
1877 const llvm::opt::ArgList &Args,
1878 ArgStringList &CmdArgs) {
1880 CmdArgs.push_back(
"-lpthread");
1882 CmdArgs.push_back(
"-lrt");
1883 CmdArgs.push_back(
"-lm");
1888 CmdArgs.push_back(
"-ldl");
1893 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1894 return !A->getOption().matches(options::OPT_O0);
1902 auto AddPostfix = [JA](
auto &F) {
1907 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1908 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1912 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1915 if (Args.hasArg(options::OPT_o, options::OPT__SLASH_o,
1916 options::OPT__SLASH_Fo) &&
1917 Args.hasArg(options::OPT_c) && Output.
isFilename()) {
1921 llvm::sys::path::remove_filename(T);
1922 llvm::sys::path::append(T, llvm::sys::path::stem(Obj));
1924 return Args.MakeArgString(T);
1930 return Args.MakeArgString(T);
1934 const JobAction &JA,
const ArgList &Args,
1935 const InputInfo &Output,
const char *OutFile) {
1936 ArgStringList ExtractArgs;
1937 ExtractArgs.push_back(
"--extract-dwo");
1939 ArgStringList StripArgs;
1940 StripArgs.push_back(
"--strip-dwo");
1945 ExtractArgs.push_back(OutFile);
1952 C.addCommand(std::make_unique<Command>(JA, T,
1954 Exec, ExtractArgs, II, Output));
1957 C.addCommand(std::make_unique<Command>(
1967 Args.ClaimAllArgs(options::OPT_flto_EQ);
1968 Args.ClaimAllArgs(options::OPT_flto);
1969 Args.ClaimAllArgs(options::OPT_fno_lto);
1973 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1974 options::OPT_fcs_profile_generate_EQ,
1975 options::OPT_fno_profile_generate);
1976 if (CSPGOGenerateArg &&
1977 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1978 CSPGOGenerateArg =
nullptr;
1980 return CSPGOGenerateArg;
1984 auto *ProfileUseArg = Args.getLastArg(
1985 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1986 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1987 options::OPT_fno_profile_instr_use);
1989 if (ProfileUseArg &&
1990 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1991 ProfileUseArg =
nullptr;
1993 return ProfileUseArg;
1997 auto *ProfileSampleUseArg = Args.getLastArg(
1998 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
2000 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
2001 options::OPT_fno_profile_sample_use)))
2004 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
2009 case llvm::Reloc::Static:
2011 case llvm::Reloc::PIC_:
2013 case llvm::Reloc::DynamicNoPIC:
2014 return "dynamic-no-pic";
2015 case llvm::Reloc::ROPI:
2017 case llvm::Reloc::RWPI:
2019 case llvm::Reloc::ROPI_RWPI:
2022 llvm_unreachable(
"Unknown Reloc::Model kind");
2029std::tuple<llvm::Reloc::Model, unsigned, bool>
2037 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
2039 bool IsPICLevelTwo = PIC;
2042 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
2045 if (Triple.isAndroid()) {
2046 switch (Triple.getArch()) {
2047 case llvm::Triple::x86:
2048 case llvm::Triple::x86_64:
2050 IsPICLevelTwo =
true;
2060 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
2064 if (Triple.isOSOpenBSD()) {
2066 case llvm::Triple::arm:
2067 case llvm::Triple::aarch64:
2068 case llvm::Triple::mips64:
2069 case llvm::Triple::mips64el:
2070 case llvm::Triple::x86:
2071 case llvm::Triple::x86_64:
2072 IsPICLevelTwo =
false;
2075 case llvm::Triple::ppc:
2076 case llvm::Triple::sparcv9:
2077 IsPICLevelTwo =
true;
2089 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2090 options::OPT_fpic, options::OPT_fno_pic,
2091 options::OPT_fPIE, options::OPT_fno_PIE,
2092 options::OPT_fpie, options::OPT_fno_pie);
2093 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
2094 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
2095 options::OPT_fPIE, options::OPT_fpie)) {
2097 << LastPICArg->getSpelling() << Triple.str();
2098 if (Triple.getArch() == llvm::Triple::x86_64)
2099 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
2100 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2107 Option O = LastPICArg->getOption();
2108 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2109 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2110 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2112 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2114 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
2117 if (EffectiveTriple.isPS()) {
2118 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
2119 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
2120 if (Model !=
"kernel") {
2123 << LastPICArg->getSpelling()
2124 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
2134 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
2140 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
2141 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
2144 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2147 if (!Triple.isOSDarwin())
2149 << A->getSpelling() << Triple.str();
2158 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
2161 bool EmbeddedPISupported;
2162 switch (Triple.getArch()) {
2163 case llvm::Triple::arm:
2164 case llvm::Triple::armeb:
2165 case llvm::Triple::thumb:
2166 case llvm::Triple::thumbeb:
2167 EmbeddedPISupported =
true;
2170 EmbeddedPISupported =
false;
2174 bool ROPI =
false, RWPI =
false;
2175 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
2176 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
2177 if (!EmbeddedPISupported)
2179 << LastROPIArg->getSpelling() << Triple.str();
2182 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2183 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2184 if (!EmbeddedPISupported)
2186 << LastRWPIArg->getSpelling() << Triple.str();
2191 if ((ROPI || RWPI) && (PIC || PIE))
2194 if (Triple.isMIPS()) {
2201 if (ABIName ==
"n64")
2204 if(Args.hasArg(options::OPT_mno_abicalls))
2205 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2208 IsPICLevelTwo =
false;
2212 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2214 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2216 RelocM = llvm::Reloc::ROPI_RWPI;
2218 RelocM = llvm::Reloc::ROPI;
2220 RelocM = llvm::Reloc::RWPI;
2222 return std::make_tuple(RelocM, 0
U,
false);
2226 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
2227 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
2229 const llvm::opt::OptTable &Opts = D.
getOpts();
2230 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
2231 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
2232 D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
2234 return HasStaticPIE;
2254 const ArgList &Args) {
2255 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2256 options::OPT_falign_functions_EQ,
2257 options::OPT_fno_align_functions);
2258 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2261 if (A->getOption().matches(options::OPT_falign_functions))
2265 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2267 << A->getAsString(Args) << A->getValue();
2272 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2273 switch (DebugInfoKind) {
2274 case llvm::codegenoptions::DebugDirectivesOnly:
2275 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2277 case llvm::codegenoptions::DebugLineTablesOnly:
2278 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2280 case llvm::codegenoptions::DebugInfoConstructor:
2281 CmdArgs.push_back(
"-debug-info-kind=constructor");
2283 case llvm::codegenoptions::LimitedDebugInfo:
2284 CmdArgs.push_back(
"-debug-info-kind=limited");
2286 case llvm::codegenoptions::FullDebugInfo:
2287 CmdArgs.push_back(
"-debug-info-kind=standalone");
2289 case llvm::codegenoptions::UnusedTypeInfo:
2290 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2300 assert(A.getOption().matches(options::OPT_gN_Group) &&
2301 "Not a -g option that specifies a debug-info level");
2302 if (A.getOption().matches(options::OPT_g0) ||
2303 A.getOption().matches(options::OPT_ggdb0))
2304 return llvm::codegenoptions::NoDebugInfo;
2305 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2306 A.getOption().matches(options::OPT_ggdb1))
2307 return llvm::codegenoptions::DebugLineTablesOnly;
2308 if (A.getOption().matches(options::OPT_gline_directives_only))
2309 return llvm::codegenoptions::DebugDirectivesOnly;
2310 return llvm::codegenoptions::DebugInfoConstructor;
2314 const ArgList &Args) {
2315 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2321 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 6 ||
2324 << A->getAsString(Args) << A->getValue();
2329 return llvm::StringSwitch<unsigned>(ArgValue)
2330 .Case(
"-gdwarf-2", 2)
2331 .Case(
"-gdwarf-3", 3)
2332 .Case(
"-gdwarf-4", 4)
2333 .Case(
"-gdwarf-5", 5)
2334 .Case(
"-gdwarf-6", 6)
2339 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2340 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2341 options::OPT_gdwarf_6, options::OPT_gdwarf);
2345 const llvm::opt::ArgList &Args) {
2350 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2351 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2352 << GDwarfN->getSpelling() << TC.
getTriple().str();
2354 if (DwarfVersion == 0) {
2356 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2358 return DwarfVersion;
2362 const ArgList &Args, Arg *&Arg) {
2363 Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
2364 options::OPT_gno_split_dwarf);
2365 if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
2368 if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
2371 StringRef
Value = Arg->getValue();
2372 if (
Value ==
"split")
2374 if (
Value ==
"single")
2377 D.
Diag(diag::err_drv_unsupported_option_argument)
2378 << Arg->getSpelling() << Arg->getValue();
2384 assert(A &&
"Expected non-nullptr argument.");
2387 D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
2393 const ArgList &Args,
2394 ArgStringList &CmdArgs) {
2395 if (Args.hasFlag(options::OPT_fdebug_info_for_profiling,
2396 options::OPT_fno_debug_info_for_profiling,
false) &&
2398 Args.getLastArg(options::OPT_fdebug_info_for_profiling), Args, D, TC))
2399 CmdArgs.push_back(
"-fdebug-info-for-profiling");
2403 ArgStringList &CmdArgs) {
2404 llvm::Reloc::Model RelocationModel;
2409 if (RelocationModel != llvm::Reloc::Static)
2410 CmdArgs.push_back(
"-KPIC");
2416 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2422 const ArgList &Args) {
2423 if (Args.hasArg(options::OPT_static_libgcc) ||
2424 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2428 if (Args.hasArg(options::OPT_shared_libgcc))
2447 ArgStringList &CmdArgs,
const ArgList &Args) {
2451 CmdArgs.push_back(
"-l:libunwind.a");
2474 CmdArgs.push_back(
"-lgcc_eh");
2476 CmdArgs.push_back(
"-lgcc_s");
2484 CmdArgs.push_back(
"-lunwind");
2486 CmdArgs.push_back(
"-l:libunwind.a");
2489 CmdArgs.push_back(
"-l:libunwind.dll.a");
2491 CmdArgs.push_back(
"-l:libunwind.so");
2495 CmdArgs.push_back(
"-lunwind");
2505 ArgStringList &CmdArgs,
const ArgList &Args) {
2509 CmdArgs.push_back(
"-lgcc");
2513 CmdArgs.push_back(
"-lgcc");
2517 CmdArgs.push_back(
"--as-needed");
2519 CmdArgs.push_back(
"--no-as-needed");
2524 ArgStringList &CmdArgs,
const ArgList &Args) {
2535 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2538 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2539 if (A && A->getValue() != StringRef(
"platform")) {
2540 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2541 << A->getValue() <<
"MSVC";
2551 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2552 !Args.hasArg(options::OPT_static_pie))
2553 CmdArgs.push_back(
"-ldl");
2560 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2566 StringRef SaveStats = A->getValue();
2567 if (SaveStats ==
"obj" && Output.
isFilename()) {
2569 llvm::sys::path::remove_filename(StatsFile);
2570 }
else if (SaveStats !=
"cwd") {
2571 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2575 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2576 llvm::sys::path::append(StatsFile, BaseName);
2577 llvm::sys::path::replace_extension(StatsFile,
"stats");
2589 assert(Flag.front() ==
'-');
2591 Flags.push_back(Flag.str());
2593 Flags.push_back((
"!" + Flag.substr(1)).str());
2598 ArgStringList &CmdArgs,
bool IsLTO,
2599 const StringRef PluginOptPrefix) {
2600 auto addArg = [&, IsLTO](
const Twine &Arg) {
2602 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2603 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2605 CmdArgs.push_back(
"-mllvm");
2606 CmdArgs.push_back(Args.MakeArgString(Arg));
2610 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2611 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2613 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2614 StringRef
Value = A->getValue();
2616 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2617 !llvm::isPowerOf2_64(Boundary)) {
2618 D.
Diag(diag::err_drv_invalid_argument_to_option)
2619 <<
Value << A->getOption().getName();
2621 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2624 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2625 std::string AlignBranch;
2626 for (StringRef T : A->getValues()) {
2627 if (T !=
"fused" && T !=
"jcc" && T !=
"jmp" && T !=
"call" &&
2628 T !=
"ret" && T !=
"indirect")
2629 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2630 << T <<
"fused, jcc, jmp, call, ret, indirect";
2631 if (!AlignBranch.empty())
2635 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2637 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2638 StringRef
Value = A->getValue();
2639 unsigned PrefixSize;
2640 if (
Value.getAsInteger(10, PrefixSize)) {
2641 D.
Diag(diag::err_drv_invalid_argument_to_option)
2642 <<
Value << A->getOption().getName();
2644 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2670 llvm::opt::ArgStringList &CC1Args,
2672 StringRef Lib, StringRef
Arch, StringRef
Target,
2673 bool isBitCodeSDL) {
2676 std::string LibDeviceLoc =
"/libdevice";
2677 std::string LibBcPrefix =
"/libbc-";
2678 std::string LibPrefix =
"/lib";
2695 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2696 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2698 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2699 Twine(Lib +
"-" +
Arch).str(), Twine(Lib).str()}) {
2700 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2701 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2711 const auto *Ext =
".a";
2713 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2714 Twine(Lib +
"-" +
Arch).str()}) {
2715 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2716 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2727 bool FoundSDL =
false;
2728 for (
auto LPath : LibraryPaths) {
2729 for (
auto SDL : SDLs) {
2730 auto FullName = Twine(LPath + SDL).str();
2731 if (llvm::sys::fs::exists(FullName)) {
2732 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2749 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2750 llvm::opt::ArgStringList &CC1Args,
2752 StringRef
Arch, StringRef
Target,
bool isBitCodeSDL) {
2755 if (isBitCodeSDL &&
Arch.contains(
"nvptx"))
2758 bool FoundAOB =
false;
2759 std::string ArchiveOfBundles;
2762 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2763 auto Ext = IsMSVC ?
".lib" :
".a";
2764 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2765 if (llvm::sys::fs::exists(Lib)) {
2766 ArchiveOfBundles = Lib;
2770 Lib.consume_front(
"-l");
2771 for (
auto LPath : LibraryPaths) {
2772 ArchiveOfBundles.clear();
2773 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2774 : IsMSVC ? Lib + Ext
2775 :
"lib" + Lib + Ext)
2777 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2778 auto AOB = Twine(LPath + Prefix + LibFile).str();
2779 if (llvm::sys::fs::exists(AOB)) {
2780 ArchiveOfBundles = AOB;
2793 llvm::file_magic Magic;
2794 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2795 if (EC || Magic != llvm::file_magic::archive)
2798 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2799 std::string OutputLib =
2805 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2809 DeviceTriple +=
'-';
2810 std::string NormalizedTriple =
2811 T.getToolChain().getEffectiveTriple().normalize(
2812 llvm::Triple::CanonicalForm::FOUR_IDENT);
2813 DeviceTriple += NormalizedTriple;
2815 DeviceTriple +=
'-';
2819 std::string UnbundleArg(
"-unbundle");
2820 std::string TypeArg(
"-type=a");
2821 std::string InputArg(
"-input=" + ArchiveOfBundles);
2822 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2823 std::string OutputArg(
"-output=" + OutputLib);
2825 const char *UBProgram = DriverArgs.MakeArgString(
2826 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2828 ArgStringList UBArgs;
2829 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2830 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2831 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2832 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2833 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2837 std::string AdditionalArgs(
"-allow-missing-bundles");
2838 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2843 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2844 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2846 C.addCommand(std::make_unique<Command>(
2848 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2850 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2857 const llvm::opt::ArgList &DriverArgs,
2858 llvm::opt::ArgStringList &CC1Args,
2860 bool isBitCodeSDL) {
2891 const llvm::opt::ArgList &DriverArgs,
2892 llvm::opt::ArgStringList &CC1Args,
2894 bool isBitCodeSDL) {
2898 std::optional<std::string> LibPath =
2899 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2902 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2903 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2904 for (StringRef Path : Frags)
2905 LibraryPaths.emplace_back(Path.trim());
2909 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2910 LibraryPaths.emplace_back(Search_Dir);
2914 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2915 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2918 llvm::SmallSet<std::string, 16> SDLNames;
2919 static const StringRef HostOnlyArchives[] = {
2920 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2921 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2922 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2923 SDLNames.insert(std::string(
"-l") + SDLName);
2927 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2934 const StringRef LibFileExt =
".lib";
2935 if (!llvm::sys::path::has_extension(
FileName) ||
2937 llvm::sys::path::extension(
FileName).drop_front()) ==
2939 llvm::sys::path::extension(
FileName) == LibFileExt)
2940 SDLNames.insert(Input);
2947 for (
auto SDLName : SDLNames) {
2958static llvm::opt::Arg *
2960 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2964 const llvm::opt::ArgList &Args) {
2965 const unsigned MinCodeObjVer = 4;
2966 const unsigned MaxCodeObjVer = 6;
2969 if (CodeObjArg->getOption().getID() ==
2970 options::OPT_mcode_object_version_EQ) {
2971 unsigned CodeObjVer = MaxCodeObjVer;
2973 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2974 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2975 D.
Diag(diag::err_drv_invalid_int_value)
2976 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2982 const llvm::opt::ArgList &Args) {
2983 unsigned CodeObjVer = 6;
2985 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2990 const Driver &D,
const llvm::opt::ArgList &Args) {
2995 const llvm::opt::ArgList &Args,
2996 llvm::opt::ArgStringList &CmdArgs,
2997 const llvm::Triple &Triple,
bool IsLTO,
2998 const StringRef PluginOptPrefix) {
2999 auto addArg = [&, IsLTO](
const Twine &Arg) {
3001 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
3002 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
3004 CmdArgs.push_back(
"-mllvm");
3005 CmdArgs.push_back(Args.MakeArgString(Arg));
3009 if (Arg *A = Args.getLastArg(options::OPT_moutline,
3010 options::OPT_mno_outline)) {
3011 if (A->getOption().matches(options::OPT_moutline)) {
3015 if (Triple.isARM() || Triple.isThumb() || Triple.isAArch64() ||
3016 Triple.isRISCV() || Triple.isX86()) {
3017 addArg(Twine(
"-enable-machine-outliner"));
3019 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
3025 CmdArgs.push_back(
"-mno-outline");
3028 addArg(Twine(
"-enable-machine-outliner=never"));
3032 auto *CodeGenDataGenArg =
3033 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
3034 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
3037 if (CodeGenDataGenArg && CodeGenDataUseArg)
3038 D.
Diag(diag::err_drv_argument_not_allowed_with)
3039 << CodeGenDataGenArg->getAsString(Args)
3040 << CodeGenDataUseArg->getAsString(Args);
3044 if (CodeGenDataGenArg)
3045 addArg(Twine(
"-codegen-data-generate"));
3048 if (CodeGenDataUseArg)
3049 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
3053 const llvm::opt::ArgList &DriverArgs,
3054 llvm::opt::ArgStringList &CC1Args,
3055 StringRef BitcodeSuffix,
3056 const llvm::Triple &Triple,
3061 std::optional<std::string> LibPath =
3062 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
3065 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
3066 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
3067 for (StringRef Path : Frags)
3068 LibraryPaths.emplace_back(Path.trim());
3073 LibraryPaths.emplace_back(LibPath);
3077 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
3078 LibraryPaths.emplace_back(P);
3080 OptSpecifier LibomptargetBCPathOpt =
3081 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
3082 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
3083 : options::OPT_libomptarget_spirv_bc_path_EQ;
3085 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
3086 : Triple.isNVPTX() ?
"nvptx"
3088 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
3091 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
3093 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
3094 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
3095 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3098 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3099 CC1Args.push_back(
"-mlink-builtin-bitcode");
3100 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3102 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
3103 << LibOmpTargetFile;
3106 bool FoundBCLibrary =
false;
3108 for (StringRef LibraryPath : LibraryPaths) {
3110 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3111 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3112 CC1Args.push_back(
"-mlink-builtin-bitcode");
3113 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3114 FoundBCLibrary =
true;
3119 if (!FoundBCLibrary)
3120 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
3121 << LibOmpTargetName << ArchPrefix;
3126 const llvm::opt::ArgList &DriverArgs,
3127 llvm::opt::ArgStringList &CC1Args) {
3129 StringRef LibclcNamespec;
3130 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
3133 LibclcNamespec = A->getValue();
3135 if (!TT.isAMDGPU() || TT.getEnvironment() != llvm::Triple::LLVM)
3139 if (DriverArgs.hasArg(options::OPT_no_offloadlib,
3140 options::OPT_nodefaultlibs, options::OPT_nostdlib))
3144 bool FilenameSearch = LibclcNamespec.consume_front(
":");
3145 if (FilenameSearch) {
3147 if (D.
getVFS().exists(LibclcFile)) {
3148 CC1Args.push_back(
"-mlink-builtin-bitcode");
3149 CC1Args.push_back(DriverArgs.MakeArgString(LibclcFile));
3152 D.
Diag(diag::err_drv_libclc_not_found) << LibclcFile;
3158 llvm::sys::path::append(BasePath,
"lib");
3163 if (
const Arg *CPUArg = DriverArgs.getLastArg(options::OPT_mcpu_EQ)) {
3164 StringRef CPU = CPUArg->getValue();
3167 llvm::sys::path::append(CPUPath, CPU,
"libclc.bc");
3168 if (D.
getVFS().exists(CPUPath)) {
3169 CC1Args.push_back(
"-mlink-builtin-bitcode");
3170 CC1Args.push_back(DriverArgs.MakeArgString(CPUPath));
3178 llvm::sys::path::append(GenericPath,
"libclc.bc");
3179 if (D.
getVFS().exists(GenericPath)) {
3180 CC1Args.push_back(
"-mlink-builtin-bitcode");
3181 CC1Args.push_back(DriverArgs.MakeArgString(GenericPath));
3185 D.
Diag(diag::err_drv_libclc_not_found) <<
"libclc.bc";
3190 const llvm::opt::ArgList &Args,
3191 llvm::opt::ArgStringList &CmdArgs,
3192 const llvm::Triple &Triple) {
3193 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3194 options::OPT_mno_outline_atomics)) {
3196 if (!Triple.isAArch64()) {
3197 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3198 << Triple.getArchName() << A->getOption().getName();
3200 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3201 CmdArgs.push_back(
"-target-feature");
3202 CmdArgs.push_back(
"+outline-atomics");
3204 CmdArgs.push_back(
"-target-feature");
3205 CmdArgs.push_back(
"-outline-atomics");
3209 CmdArgs.push_back(
"-target-feature");
3210 CmdArgs.push_back(
"+outline-atomics");
3215 llvm::opt::ArgStringList &CmdArgs) {
3216 if (TCArgs.hasFlag(options::OPT_offload_compress,
3217 options::OPT_no_offload_compress,
false))
3218 CmdArgs.push_back(
"--compress");
3219 if (TCArgs.hasArg(options::OPT_v))
3220 CmdArgs.push_back(
"--verbose");
3221 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3223 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3227 const llvm::Triple &Triple,
3228 const llvm::Reloc::Model &RelocationModel,
3229 llvm::opt::ArgStringList &CmdArgs) {
3230 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3231 StringRef CM = A->getValue();
3233 if (Triple.isOSAIX() && CM ==
"medium")
3235 if (Triple.isAArch64(64)) {
3236 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3237 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3238 RelocationModel != llvm::Reloc::Static)
3239 D.
Diag(diag::err_drv_argument_only_allowed_with)
3240 << A->getAsString(Args) <<
"-fno-pic";
3241 }
else if (Triple.isLoongArch()) {
3242 if (CM ==
"extreme" &&
3243 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3244 D.
Diag(diag::err_drv_argument_not_allowed_with)
3245 << A->getAsString(Args) <<
"-fplt";
3246 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3249 CM = llvm::StringSwitch<StringRef>(CM)
3250 .Case(
"normal",
"small")
3251 .Case(
"extreme",
"large")
3253 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3254 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3255 }
else if (Triple.isRISCV()) {
3257 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3258 D.
Diag(diag::err_drv_argument_not_allowed_with)
3259 << A->getAsString(Args) <<
"-fpic";
3262 else if (CM ==
"medany")
3264 Ok = CM ==
"small" || CM ==
"medium" ||
3265 (CM ==
"large" && Triple.isRISCV64());
3266 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3267 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3268 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3272 }
else if (Triple.isSPARC64()) {
3275 else if (CM ==
"medmid")
3277 else if (CM ==
"medany")
3279 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3280 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3281 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3284 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3286 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3287 << A->getSpelling() << CM << Triple.getTriple();
3291 if (Triple.getArch() == llvm::Triple::x86_64) {
3292 bool IsMediumCM =
false;
3293 bool IsLargeCM =
false;
3294 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3295 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3296 IsLargeCM = StringRef(A->getValue()) ==
"large";
3298 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3299 if (!IsMediumCM && !IsLargeCM) {
3300 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3301 << A->getOption().getRenderName();
3303 A->render(Args, CmdArgs);
3305 }
else if (IsMediumCM) {
3306 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3307 }
else if (IsLargeCM) {
3308 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3314 ArgStringList &CmdArgs) {
3319 Args.getLastArg(options::OPT_fcolor_diagnostics,
3320 options::OPT_fno_color_diagnostics);
3321 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3322 StringRef
Value(A->getValue());
3324 D.
Diag(diag::err_drv_invalid_argument_to_option)
3325 <<
Value << A->getOption().getName();
3330 CmdArgs.push_back(
"-fcolor-diagnostics");
3333 CmdArgs.push_back(
"-fno-color-diagnostics");
3342 for (; *Arg; ++Arg) {
3348 Res.push_back(
'\\');
3351 Res.push_back(*Arg);
3356 const llvm::opt::ArgList &Args) {
3360 llvm::opt::ArgStringList OriginalArgs;
3361 for (
const auto &Arg : Args)
3362 Arg->render(Args, OriginalArgs);
3366 for (
const char *OriginalArg : OriginalArgs) {
3370 Flags += EscapedArg;
3373 return Args.MakeArgString(Flags);
3377 const llvm::opt::ArgList &Args,
3378 bool &FRecordCommandLine,
3379 bool &GRecordCommandLine,
3380 bool &DXRecordCommandLine) {
3383 const std::string &TripleStr = Triple.getTriple();
3385 FRecordCommandLine =
3386 Args.hasFlag(options::OPT_frecord_command_line,
3387 options::OPT_fno_record_command_line,
false);
3388 GRecordCommandLine =
3389 Args.hasFlag(options::OPT_grecord_command_line,
3390 options::OPT_gno_record_command_line,
false);
3391 DXRecordCommandLine = Triple.isDXIL() && Args.hasArg(options::OPT_g_Flag);
3392 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3393 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3394 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3395 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3399 DXRecordCommandLine;
3403 ArgStringList &CmdArgs,
3404 const llvm::Triple &Triple) {
3405 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
3406 options::OPT_fno_global_isel)) {
3407 CmdArgs.push_back(
"-mllvm");
3408 if (A->getOption().matches(options::OPT_fglobal_isel)) {
3409 CmdArgs.push_back(
"-global-isel=1");
3414 bool IsArchSupported = Triple.getArch() == llvm::Triple::aarch64;
3415 bool IsOptLevelSupported =
false;
3417 Arg *A = Args.getLastArg(options::OPT_O_Group);
3418 if (IsArchSupported) {
3419 if (!A || A->getOption().matches(options::OPT_O0))
3420 IsOptLevelSupported =
true;
3422 if (!IsArchSupported || !IsOptLevelSupported) {
3423 CmdArgs.push_back(
"-mllvm");
3424 CmdArgs.push_back(
"-global-isel-abort=2");
3426 if (!IsArchSupported)
3427 D.
Diag(diag::warn_drv_global_isel_incomplete) << Triple.getArchName();
3429 D.
Diag(diag::warn_drv_global_isel_incomplete_opt);
3432 CmdArgs.push_back(
"-global-isel=0");
3438 ArgStringList &CmdArgs,
3439 bool IsMSVCCompat) {
3440 bool use_fwrapv = IsMSVCCompat;
3441 bool use_fwrapv_pointer =
false;
3442 for (
const Arg *A : Args.filtered(
3443 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3444 options::OPT_fwrapv, options::OPT_fno_wrapv,
3445 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3447 switch (A->getOption().getID()) {
3448 case options::OPT_fstrict_overflow:
3450 use_fwrapv_pointer =
false;
3452 case options::OPT_fno_strict_overflow:
3454 use_fwrapv_pointer =
true;
3456 case options::OPT_fwrapv:
3459 case options::OPT_fno_wrapv:
3462 case options::OPT_fwrapv_pointer:
3463 use_fwrapv_pointer =
true;
3465 case options::OPT_fno_wrapv_pointer:
3466 use_fwrapv_pointer =
false;
3472 CmdArgs.push_back(
"-fwrapv");
3473 if (!use_fwrapv && IsMSVCCompat)
3474 CmdArgs.push_back(
"-fno-wrapv");
3475 if (use_fwrapv_pointer)
3476 CmdArgs.push_back(
"-fwrapv-pointer");
3483 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3484 if (A->getOption().matches(options::OPT_O4) ||
3485 A->getOption().matches(options::OPT_Ofast))
3488 if (A->getOption().matches(options::OPT_O0))
3491 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3494 StringRef S(A->getValue());
3502 unsigned OptLevel = 0;
3503 if (S.getAsInteger(10, OptLevel))
3506 return OptLevel > 1;
3513 ArgStringList &CmdArgs) {
3515 if (Args.hasFlag(options::OPT_fvectorize, options::OPT_fno_vectorize,
3517 CmdArgs.push_back(
"-vectorize-loops");
3521 ArgStringList &CmdArgs) {
3523 if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize,
3525 CmdArgs.push_back(
"-vectorize-slp");
3529 ArgStringList &CmdArgs) {
3530 if (Args.hasFlag(options::OPT_floop_interchange,
3531 options::OPT_fno_loop_interchange,
false))
3532 CmdArgs.push_back(
"-floop-interchange");
3553 llvm_unreachable(
"Fully covered switch above");
3559 if (!ComplexRangeStr.empty())
3560 return "-complex-range=" + ComplexRangeStr;
3561 return ComplexRangeStr;
3581 if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
3582 (LastOpt ==
"-fcx-limited-range" && NewOpt ==
"-fno-cx-limited-range") ||
3583 (LastOpt ==
"-fno-cx-limited-range" && NewOpt ==
"-fcx-limited-range") ||
3584 (LastOpt ==
"-fcx-fortran-rules" && NewOpt ==
"-fno-cx-fortran-rules") ||
3585 (LastOpt ==
"-fno-cx-fortran-rules" && NewOpt ==
"-fcx-fortran-rules") ||
3586 (LastOpt ==
"-ffast-math" && NewOpt ==
"-fno-fast-math") ||
3587 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-ffast-math") ||
3588 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-fno-fast-math") ||
3589 (LastOpt.starts_with(
"-ffp-model=") &&
3590 NewOpt.starts_with(
"-ffp-model=")) ||
3591 (LastOpt.starts_with(
"-fcomplex-arithmetic=") &&
3592 NewOpt.starts_with(
"-fcomplex-arithmetic=")))
3595 D.
Diag(clang::diag::warn_drv_overriding_complex_range)
3615 const ArgStringList &LinkerInputs,
3617 const llvm::opt::ArgList &Args,
3618 const char *OutputFilename) {
3622 assert(!LinkerInputs.empty() && !JobInputs.empty() &&
3623 "Must have at least one input.");
3625 ArgStringList LlvmLinkArgs(
3626 {
"-o", OutputFilename ? OutputFilename : Output.
getFilename()});
3628 LlvmLinkArgs.append(LinkerInputs);
3631 const char *LlvmLink = Args.MakeArgString(TC.
GetProgramPath(
"llvm-link"));
3633 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)
@ 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()