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 const llvm::Triple &Triple) {
73 if (Args.hasArg(options::OPT_pg) && !Args.hasArg(options::OPT_mfentry))
76 if (Triple.isAndroid())
79 switch (Triple.getArch()) {
80 case llvm::Triple::xcore:
81 case llvm::Triple::wasm32:
82 case llvm::Triple::wasm64:
83 case llvm::Triple::msp430:
87 case llvm::Triple::ppc:
88 case llvm::Triple::ppcle:
89 case llvm::Triple::ppc64:
90 case llvm::Triple::ppc64le:
91 case llvm::Triple::riscv32:
92 case llvm::Triple::riscv64:
93 case llvm::Triple::riscv32be:
94 case llvm::Triple::riscv64be:
95 case llvm::Triple::sparc:
96 case llvm::Triple::sparcel:
97 case llvm::Triple::sparcv9:
98 case llvm::Triple::amdgpu:
99 case llvm::Triple::r600:
100 case llvm::Triple::csky:
101 case llvm::Triple::loongarch32:
102 case llvm::Triple::loongarch64:
103 case llvm::Triple::m68k:
104 case llvm::Triple::mips64:
105 case llvm::Triple::mips64el:
106 case llvm::Triple::mips:
107 case llvm::Triple::mipsel:
113 if (Triple.isOSFuchsia() || Triple.isOSNetBSD()) {
117 if (Triple.isOSLinux() || Triple.isOSHurd()) {
118 switch (Triple.getArch()) {
120 case llvm::Triple::arm:
121 case llvm::Triple::armeb:
122 case llvm::Triple::thumb:
123 case llvm::Triple::thumbeb:
124 case llvm::Triple::systemz:
125 case llvm::Triple::x86:
126 case llvm::Triple::x86_64:
133 if (Triple.isOSWindows()) {
134 switch (Triple.getArch()) {
135 case llvm::Triple::x86:
137 case llvm::Triple::x86_64:
138 return Triple.isOSBinFormatMachO();
139 case llvm::Triple::arm:
140 case llvm::Triple::thumb:
157 if (Triple.isAArch64() || Triple.isPS() || Triple.isVE() ||
158 (Triple.isAndroid() && !Triple.isARM()))
161 if ((Triple.isARM() || Triple.isThumb()) && Triple.isOSBinFormatMachO())
168 switch (Triple.getArch()) {
171 case llvm::Triple::arm:
172 case llvm::Triple::thumb:
175 return Triple.isOSDarwin();
182 const llvm::Triple &Triple) {
183 switch (Triple.getArch()) {
186 case llvm::Triple::arm:
187 case llvm::Triple::armeb:
188 case llvm::Triple::thumb:
189 case llvm::Triple::thumbeb:
193 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
194 StringRef
V = A->getValue();
199 case llvm::Triple::aarch64:
203 return Triple.isOSWindows();
210 const llvm::Triple &Triple) {
211 if (Triple.isARM() || Triple.isThumb()) {
215 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
216 StringRef
V = A->getValue();
217 return V ==
"aapcs+leaf";
226 const llvm::Triple &Triple) {
268 Args.hasFlag(options::OPT_fno_omit_frame_pointer,
269 options::OPT_fomit_frame_pointer, DefaultFP);
275 Args.hasFlag(options::OPT_mno_omit_leaf_frame_pointer,
276 options::OPT_momit_leaf_frame_pointer, DefaultLeafFP);
278 bool FPRegReserved = Args.hasFlag(options::OPT_mreserve_frame_pointer_reg,
279 options::OPT_mno_reserve_frame_pointer_reg,
297 const StringRef PluginOptPrefix) {
298 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
299 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
300 "-pass-remarks=" + A->getValue()));
302 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
303 CmdArgs.push_back(Args.MakeArgString(
304 Twine(PluginOptPrefix) +
"-pass-remarks-missed=" + A->getValue()));
306 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
307 CmdArgs.push_back(Args.MakeArgString(
308 Twine(PluginOptPrefix) +
"-pass-remarks-analysis=" + A->getValue()));
312 const llvm::Triple &Triple,
315 const StringRef PluginOptPrefix) {
316 StringRef Format =
"yaml";
317 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
318 Format = A->getValue();
322 Args.getLastArg(options::OPT_foptimization_record_file_EQ)) {
325 }
else if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
332 assert(!F.empty() &&
"Cannot determine remarks output name.");
334 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
335 "opt-remarks-filename=" + F +
"opt.ld." +
339 Args.getLastArg(options::OPT_foptimization_record_passes_EQ))
340 CmdArgs.push_back(Args.MakeArgString(
341 Twine(PluginOptPrefix) +
"opt-remarks-passes=" + A->getValue()));
343 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
344 "opt-remarks-format=" + Format.data()));
348 ArgStringList &CmdArgs,
349 const StringRef PluginOptPrefix) {
350 if (Args.hasFlag(options::OPT_fdiagnostics_show_hotness,
351 options::OPT_fno_diagnostics_show_hotness,
false))
352 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
353 "opt-remarks-with-hotness"));
356 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ))
358 Args.MakeArgString(Twine(PluginOptPrefix) +
359 "opt-remarks-hotness-threshold=" + A->getValue()));
364 StringRef Processor) {
368 auto GPUKind = T.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Processor)
369 : llvm::AMDGPU::parseArchR600(Processor);
370 auto GPUFeatures = T.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind)
371 : llvm::AMDGPU::getArchAttrR600(GPUKind);
372 if (GPUFeatures & llvm::AMDGPU::FEATURE_WGP)
374 return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode);
379 if (D.
getVFS().exists(Path))
380 Paths.push_back(Path.str());
384 const llvm::Triple &Triple,
386 std::vector<StringRef> &Features,
387 OptSpecifier Group) {
388 std::set<StringRef> Warned;
389 for (
const Arg *A : Args.filtered(Group)) {
390 StringRef Name = A->getOption().getName();
394 assert(Name.starts_with(
"m") &&
"Invalid feature name.");
395 Name = Name.substr(1);
399 if (Warned.count(Name) == 0) {
401 clang::diag::warn_drv_unsupported_option_for_processor)
402 << A->getAsString(Args) << Proc;
408 bool IsNegative = Name.consume_front(
"no-");
410 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
418 llvm::DenseSet<StringRef> UsedFeatures;
419 for (StringRef
Feature : llvm::reverse(Features)) {
420 if (UsedFeatures.insert(
Feature.drop_front()).second)
421 UnifiedFeatures.insert(UnifiedFeatures.begin(),
Feature);
424 return UnifiedFeatures;
428 const char *ArgName,
const char *EnvVar) {
429 const char *DirList = ::getenv(EnvVar);
430 bool CombinedArg =
false;
435 StringRef Name(ArgName);
436 if (Name ==
"-I" || Name ==
"-L" || Name.empty())
439 StringRef Dirs(DirList);
443 StringRef::size_type Delim;
444 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
447 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
449 CmdArgs.push_back(ArgName);
450 CmdArgs.push_back(
".");
455 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
457 CmdArgs.push_back(ArgName);
458 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
461 Dirs = Dirs.substr(Delim + 1);
466 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
468 CmdArgs.push_back(ArgName);
469 CmdArgs.push_back(
".");
473 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
475 CmdArgs.push_back(ArgName);
476 CmdArgs.push_back(Args.MakeArgString(Dirs));
482 const ArgList &Args, ArgStringList &CmdArgs,
488 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
495 for (
const auto &II : Inputs) {
499 if (
auto *IA = II.getAction())
509 if (II.isFilename()) {
510 CmdArgs.push_back(II.getFilename());
519 const Arg &A = II.getInputArg();
522 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
524 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
527 else if (A.getOption().matches(options::OPT_rpath) &&
531 A.renderAsInput(Args, CmdArgs);
533 if (
const Arg *A = Args.getLastArg(options::OPT_fveclib)) {
534 const llvm::Triple &Triple = TC.
getTriple();
535 StringRef
V = A->getValue();
536 if (
V ==
"ArmPL" && (Triple.isOSLinux() || Triple.isOSDarwin())) {
554 if (Triple.isOSLinux()) {
555 CmdArgs.push_back(Args.MakeArgString(
"--push-state"));
556 CmdArgs.push_back(Args.MakeArgString(
"--as-needed"));
558 if (!Args.hasArg(options::OPT_nostdlib))
559 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
560 CmdArgs.push_back(Args.MakeArgString(
"-lamath"));
561 if (!Args.hasArg(options::OPT_nostdlib))
562 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
563 if (Triple.isOSLinux())
564 CmdArgs.push_back(Args.MakeArgString(
"--pop-state"));
571 switch (T.getArch()) {
572 case llvm::Triple::x86:
576 case llvm::Triple::aarch64:
577 if (T.isOSManagarm())
578 return "aarch64managarm";
581 return "aarch64linux";
582 case llvm::Triple::aarch64_be:
584 return "aarch64elfb";
585 return "aarch64linuxb";
586 case llvm::Triple::arm:
587 case llvm::Triple::thumb:
588 case llvm::Triple::armeb:
589 case llvm::Triple::thumbeb: {
592 return IsBigEndian ?
"armelfb" :
"armelf";
593 return IsBigEndian ?
"armelfb_linux_eabi" :
"armelf_linux_eabi";
595 case llvm::Triple::m68k:
597 case llvm::Triple::ppc:
599 return "elf32ppclinux";
601 case llvm::Triple::ppcle:
603 return "elf32lppclinux";
605 case llvm::Triple::ppc64:
607 case llvm::Triple::ppc64le:
609 case llvm::Triple::riscv32:
610 return "elf32lriscv";
611 case llvm::Triple::riscv64:
612 return "elf64lriscv";
613 case llvm::Triple::riscv32be:
614 return "elf32briscv";
615 case llvm::Triple::riscv64be:
616 return "elf64briscv";
617 case llvm::Triple::sparc:
618 case llvm::Triple::sparcel:
619 return "elf32_sparc";
620 case llvm::Triple::sparcv9:
621 return "elf64_sparc";
622 case llvm::Triple::loongarch32:
623 return "elf32loongarch";
624 case llvm::Triple::loongarch64:
625 return "elf64loongarch";
626 case llvm::Triple::mips:
627 return "elf32btsmip";
628 case llvm::Triple::mipsel:
629 return "elf32ltsmip";
630 case llvm::Triple::mips64:
632 return "elf32btsmipn32";
633 return "elf64btsmip";
634 case llvm::Triple::mips64el:
636 return "elf32ltsmipn32";
637 return "elf64ltsmip";
638 case llvm::Triple::systemz:
640 case llvm::Triple::x86_64:
642 return "elf32_x86_64";
644 case llvm::Triple::ve:
646 case llvm::Triple::csky:
647 return "cskyelf_linux";
654 const ToolChain &TC,
const llvm::opt::ArgList &Args,
655 llvm::opt::ArgStringList &CmdArgs) {
661 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
662 StringRef
V = A->getValue();
663 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
664 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
666 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
667 << A->getSpelling() <<
V;
672 std::vector<StringRef> &Features,
673 OptSpecifier OnOpt, OptSpecifier OffOpt,
674 StringRef FeatureName) {
675 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
676 if (A->getOption().matches(OnOpt))
677 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
679 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
685 const ArgList &Args) {
686 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
688 return llvm::StringSwitch<std::string>(GPUName)
689 .Cases({
"rv630",
"rv635"},
"r600")
690 .Cases({
"rv610",
"rv620",
"rs780"},
"rs880")
691 .Case(
"rv740",
"rv770")
692 .Case(
"palm",
"cedar")
693 .Cases({
"sumo",
"sumo2"},
"sumo")
694 .Case(
"hemlock",
"cypress")
695 .Case(
"aruba",
"cayman")
696 .Default(GPUName.str());
702 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
703 return A->getValue();
711 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
712 StringRef CPU = A->getValue();
718 return llvm::sys::getHostCPUName();
728 const llvm::Triple &T,
bool FromAs) {
731 switch (T.getArch()) {
735 case llvm::Triple::aarch64:
736 case llvm::Triple::aarch64_32:
737 case llvm::Triple::aarch64_be:
740 case llvm::Triple::arm:
741 case llvm::Triple::armeb:
742 case llvm::Triple::thumb:
743 case llvm::Triple::thumbeb: {
744 StringRef MArch, MCPU;
749 case llvm::Triple::avr:
750 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
751 return A->getValue();
754 case llvm::Triple::m68k:
757 case llvm::Triple::mips:
758 case llvm::Triple::mipsel:
759 case llvm::Triple::mips64:
760 case llvm::Triple::mips64el: {
764 return std::string(CPUName);
767 case llvm::Triple::nvptx:
768 case llvm::Triple::nvptx64:
769 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
770 return A->getValue();
773 case llvm::Triple::ppc:
774 case llvm::Triple::ppcle:
775 case llvm::Triple::ppc64:
776 case llvm::Triple::ppc64le:
777 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
779 llvm::PPC::getNormalizedPPCTargetCPU(T, A->getValue()));
780 return std::string(llvm::PPC::getNormalizedPPCTargetCPU(T));
782 case llvm::Triple::csky:
783 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
784 return A->getValue();
785 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
786 return A->getValue();
789 case llvm::Triple::riscv32:
790 case llvm::Triple::riscv64:
791 case llvm::Triple::riscv32be:
792 case llvm::Triple::riscv64be:
795 case llvm::Triple::bpfel:
796 case llvm::Triple::bpfeb:
797 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
798 return A->getValue();
801 case llvm::Triple::sparc:
802 case llvm::Triple::sparcel:
803 case llvm::Triple::sparcv9:
806 case llvm::Triple::x86:
807 case llvm::Triple::x86_64:
810 case llvm::Triple::hexagon:
814 case llvm::Triple::lanai:
817 case llvm::Triple::systemz:
820 case llvm::Triple::amdgpu:
821 case llvm::Triple::r600:
824 case llvm::Triple::wasm32:
825 case llvm::Triple::wasm64:
828 case llvm::Triple::loongarch32:
829 case llvm::Triple::loongarch64:
832 case llvm::Triple::xtensa:
833 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
834 return A->getValue();
840 const llvm::Triple &Triple,
842 std::vector<StringRef> &Features) {
844 options::OPT_m_wasm_Features_Group);
848 const ArgList &Args, ArgStringList &CmdArgs,
849 bool ForAS,
bool IsAux) {
850 std::vector<StringRef> Features;
851 switch (Triple.getArch()) {
854 case llvm::Triple::mips:
855 case llvm::Triple::mipsel:
856 case llvm::Triple::mips64:
857 case llvm::Triple::mips64el:
860 case llvm::Triple::arm:
861 case llvm::Triple::armeb:
862 case llvm::Triple::thumb:
863 case llvm::Triple::thumbeb:
866 case llvm::Triple::ppc:
867 case llvm::Triple::ppcle:
868 case llvm::Triple::ppc64:
869 case llvm::Triple::ppc64le:
872 case llvm::Triple::riscv32:
873 case llvm::Triple::riscv64:
874 case llvm::Triple::riscv32be:
875 case llvm::Triple::riscv64be:
878 case llvm::Triple::systemz:
881 case llvm::Triple::aarch64:
882 case llvm::Triple::aarch64_32:
883 case llvm::Triple::aarch64_be:
886 case llvm::Triple::x86:
887 case llvm::Triple::x86_64:
890 case llvm::Triple::hexagon:
893 case llvm::Triple::wasm32:
894 case llvm::Triple::wasm64:
897 case llvm::Triple::sparc:
898 case llvm::Triple::sparcel:
899 case llvm::Triple::sparcv9:
902 case llvm::Triple::amdgpu:
903 case llvm::Triple::r600:
906 case llvm::Triple::nvptx:
907 case llvm::Triple::nvptx64:
910 case llvm::Triple::m68k:
913 case llvm::Triple::msp430:
916 case llvm::Triple::ve:
919 case llvm::Triple::csky:
922 case llvm::Triple::loongarch32:
923 case llvm::Triple::loongarch64:
929 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
930 CmdArgs.push_back(
Feature.data());
935 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
938 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
939 D.
Diag(diag::err_drv_invalid_int_value)
940 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
941 return LtoJobsArg->getValue();
946 return Triple.isPS();
951 ArgStringList &CmdArgs) {
953 if (Args.hasFlag(options::OPT_ffunction_sections,
954 options::OPT_fno_function_sections, UseSeparateSections))
955 CmdArgs.push_back(
"-ffunction-sections");
957 bool HasDefaultDataSections = Triple.isOSBinFormatXCOFF();
958 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
959 UseSeparateSections || HasDefaultDataSections))
960 CmdArgs.push_back(
"-fdata-sections");
964 const llvm::opt::ArgList &Args) {
966 Arg *A = Args.getLastArg(options::OPT_mtls_dialect_EQ);
968 return Triple.hasDefaultTLSDESC();
969 StringRef
V = A->getValue();
970 bool SupportedArgument =
false, EnableTLSDESC =
false;
971 bool Unsupported = !Triple.isOSBinFormatELF();
972 if (Triple.isLoongArch() || Triple.isRISCV()) {
973 SupportedArgument =
V ==
"desc" ||
V ==
"trad";
974 EnableTLSDESC =
V ==
"desc";
975 }
else if (Triple.isX86()) {
976 SupportedArgument =
V ==
"gnu" ||
V ==
"gnu2";
977 EnableTLSDESC =
V ==
"gnu2";
982 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
983 << A->getSpelling() << Triple.getTriple();
984 }
else if (!SupportedArgument) {
985 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument_for_target)
986 << A->getSpelling() <<
V << Triple.getTriple();
988 return EnableTLSDESC;
992 llvm::opt::ArgStringList &CmdArgs) {
993 if (Arg *A = Args.getLastArg(options::OPT_fthinlto_distributor_EQ)) {
995 Args.MakeArgString(
"--thinlto-distributor=" + Twine(A->getValue())));
997 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-remote-compiler=" +
1000 CmdArgs.push_back(Args.MakeArgString(
1001 "--thinlto-remote-compiler-prepend-arg=" + Twine(PA)));
1003 for (
const auto &A :
1004 Args.getAllArgValues(options::OPT_Xthinlto_distributor_EQ))
1005 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-distributor-arg=" + A));
1010 ArgStringList &CmdArgs,
const InputInfo &Output,
1013 const bool IsOSAIX = Triple.isOSAIX();
1014 const bool IsAMDGCN = Triple.isAMDGCN();
1015 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ);
1018 const bool IsFatLTO = Args.hasFlag(options::OPT_ffat_lto_objects,
1019 options::OPT_fno_fat_lto_objects,
false);
1020 const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
1022 assert(!Inputs.empty() &&
"Must have at least one input.");
1024 auto Input = llvm::find_if(
1026 if (Input == Inputs.end()) {
1029 Input = Inputs.begin();
1032 if (Linker !=
"lld" && Linker !=
"lld-link" &&
1033 llvm::sys::path::filename(LinkerPath) !=
"ld.lld" &&
1034 llvm::sys::path::stem(LinkerPath) !=
"ld.lld" && !Triple.isOSOpenBSD()) {
1038 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
1039 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
1042 CmdArgs.push_back(
"-plugin");
1045 const char *Suffix =
".dll";
1046#elif defined(__APPLE__)
1047 const char *Suffix =
".dylib";
1049 const char *Suffix =
".so";
1053 llvm::sys::path::native(Twine(D.
Dir) +
1054 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
1055 PluginName + Suffix,
1057 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
1062 CmdArgs.push_back(
"--fat-lto-objects");
1064 if (Args.hasArg(options::OPT_flto_partitions_EQ)) {
1066 StringRef A = Args.getLastArgValue(options::OPT_flto_partitions_EQ,
"8");
1067 if (A.getAsInteger(10,
Value) || (
Value < 1)) {
1068 Arg *Arg = Args.getLastArg(options::OPT_flto_partitions_EQ);
1069 D.
Diag(diag::err_drv_invalid_int_value)
1070 << Arg->getAsString(Args) << Arg->getValue();
1072 CmdArgs.push_back(Args.MakeArgString(
"--lto-partitions=" + A));
1076 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
1077 const char *ExtraDash = IsOSAIX ?
"-" :
"";
1078 const char *ParallelismOpt = IsOSAIX ?
"-threads=" :
"jobs=";
1083 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
1084 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1085 "-generate-arange-section"));
1089 Arg *ArgVecLib = Args.getLastArg(options::OPT_fveclib);
1090 if (ArgVecLib && ArgVecLib->getNumValues() == 1) {
1093 std::optional<StringRef> OptVal =
1094 llvm::StringSwitch<std::optional<StringRef>>(ArgVecLib->getValue())
1095 .Case(
"Accelerate",
"Accelerate")
1096 .Case(
"libmvec",
"LIBMVEC")
1097 .Case(
"AMDLIBM",
"AMDLIBM")
1098 .Case(
"MASSV",
"MASSV")
1099 .Case(
"SVML",
"SVML")
1100 .Case(
"SLEEF",
"sleefgnuabi")
1101 .Case(
"Darwin_libsystem_m",
"Darwin_libsystem_m")
1102 .Case(
"ArmPL",
"ArmPL")
1103 .Case(
"none",
"none")
1104 .Default(std::nullopt);
1107 CmdArgs.push_back(Args.MakeArgString(
1108 Twine(PluginOptPrefix) +
"-vector-library=" + OptVal.value()));
1118 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
1120 if (Args.getLastArg(options::OPT_O_Group)) {
1121 unsigned OptimizationLevel =
1123 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1124 "O" + Twine(OptimizationLevel)));
1127 Args.MakeArgString(Twine(
"--lto-CGO") + Twine(OptimizationLevel)));
1130 if (Args.hasArg(options::OPT_gsplit_dwarf)) {
1132 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1139 Args.MakeArgString(Twine(PluginOptPrefix) +
"dwo_dir=" + F +
"dwo"));
1142 if (IsThinLTO && !IsOSAIX)
1143 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
1144 else if (IsThinLTO && IsOSAIX)
1145 CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
1150 if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
1151 Args.hasArg(options::OPT_fenable_matrix))
1153 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-matrix"));
1156 if (!Parallelism.empty())
1157 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1158 ParallelismOpt + Parallelism));
1163 if (Arg *A = Args.getLastArg(options::OPT_fslp_vectorize,
1164 options::OPT_fno_slp_vectorize))
1165 CmdArgs.push_back(Args.MakeArgString(
1166 Twine(PluginOptPrefix) +
"-vectorize-slp=" +
1167 (A->getOption().matches(options::OPT_fslp_vectorize) ?
"1" :
"0")));
1170 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
1171 options::OPT_fno_global_isel)) {
1174 CmdArgs.push_back(Args.MakeArgString(
1175 Twine(PluginOptPrefix) +
"-global-isel=" +
1176 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
1181 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
1182 if (A->getOption().matches(options::OPT_glldb))
1184 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
1185 else if (A->getOption().matches(options::OPT_gsce))
1187 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
1188 else if (A->getOption().matches(options::OPT_gdbx))
1190 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
1193 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
1199 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
1203 Arg *A = Args.getLastArg(options::OPT_g_Group);
1204 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
1205 !A->getOption().matches(options::OPT_ggdb0);
1206 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
1207 options::OPT_gno_strict_dwarf,
true))
1209 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
1211 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
1212 StringRef
V = A->getValue();
1213 if (
V ==
"vec-default")
1215 if (
V ==
"vec-extabi") {
1217 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
1223 bool UseSeparateSections =
1226 if (Args.hasFlag(options::OPT_ffunction_sections,
1227 options::OPT_fno_function_sections, UseSeparateSections))
1229 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
1230 else if (Args.hasArg(options::OPT_fno_function_sections))
1232 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
1234 bool DataSectionsTurnedOff =
false;
1235 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1236 UseSeparateSections)) {
1238 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
1239 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
1240 DataSectionsTurnedOff =
true;
1242 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
1245 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
1246 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
1247 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
1248 options::OPT_mno_xcoff_roptr,
false);
1249 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
1251 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1252 << OptStr << Triple.str();
1258 if (DataSectionsTurnedOff)
1259 D.
Diag(diag::err_roptr_requires_data_sections);
1262 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
1267 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
1268 options::OPT_fno_split_machine_functions)) {
1269 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
1270 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1271 "-split-machine-functions"));
1275 Args.getLastArg(options::OPT_fpartition_static_data_sections,
1276 options::OPT_fno_partition_static_data_sections)) {
1277 if (A->getOption().matches(options::OPT_fpartition_static_data_sections)) {
1278 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1279 "-partition-static-data-sections"));
1284 StringRef FName = A->getValue();
1285 if (!llvm::sys::fs::exists(FName))
1286 D.
Diag(diag::err_drv_no_such_file) << FName;
1288 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1289 "sample-profile=" + FName));
1293 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1294 "cs-profile-generate"));
1295 if (CSPGOGenerateArg->getOption().matches(
1296 options::OPT_fcs_profile_generate_EQ)) {
1298 llvm::sys::path::append(Path,
"default_%m.profraw");
1299 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1300 "cs-profile-path=" + Path));
1303 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1304 "cs-profile-path=default_%m.profraw"));
1307 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1308 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1309 llvm::sys::path::append(Path,
"default.profdata");
1310 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1311 "cs-profile-path=" + Path));
1315 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1317 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1318 "-enable-jmc-instrument"));
1320 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1323 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1324 Triple.hasDefaultEmulatedTLS())) {
1326 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1330 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1332 if (Args.hasFlag(options::OPT_fstack_size_section,
1333 options::OPT_fno_stack_size_section,
false))
1335 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1337 if (Args.hasFlag(options::OPT_fexperimental_call_graph_section,
1338 options::OPT_fno_experimental_call_graph_section,
false))
1340 Args.MakeArgString(Twine(PluginOptPrefix) +
"-call-graph-section"));
1344 if (!StatsFile.empty())
1346 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1349 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1350 CmdArgs.push_back(Args.MakeArgString(
1351 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1362 Output, PluginOptPrefix);
1368 true, PluginOptPrefix);
1370 bool IsELF = Triple.isOSBinFormatELF();
1372 bool ImplicitMapSyms =
false;
1373 for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
1374 for (StringRef
V : A->getValues()) {
1375 auto Equal =
V.split(
'=');
1376 auto checkArg = [&](
bool ValidTarget,
1377 std::initializer_list<const char *>
Set) {
1379 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1380 << (Twine(
"-Wa,") +
Equal.first +
"=").str()
1381 << Triple.getTriple();
1382 }
else if (!llvm::is_contained(
Set,
Equal.second)) {
1383 D.
Diag(diag::err_drv_unsupported_option_argument)
1384 << (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
1387 if (
Equal.first ==
"-mmapsyms") {
1388 ImplicitMapSyms =
Equal.second ==
"implicit";
1389 checkArg(IsELF && Triple.isAArch64(), {
"default",
"implicit"});
1390 }
else if (
V ==
"--crel")
1392 else if (
V ==
"--no-crel")
1400 if (IsELF && !Triple.isMIPS()) {
1401 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"-crel"));
1403 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1407 if (ImplicitMapSyms)
1409 Args.MakeArgString(Twine(PluginOptPrefix) +
"-implicit-mapsyms"));
1411 if (Args.hasArg(options::OPT_ftime_report))
1413 Args.MakeArgString(Twine(PluginOptPrefix) +
"-time-passes"));
1419 const ArgList &Args,
1420 ArgStringList &CmdArgs) {
1425 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1426 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1430 ArgStringList &CmdArgs) {
1431 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1432 options::OPT_fno_rtlib_add_rpath,
false))
1444 llvm::sys::path::append(P, M.gccSuffix());
1445 CandidateRPaths.emplace_back(std::string(P));
1447 CandidateRPaths.emplace_back(*StdlibPath);
1449 for (
const auto &CandidateRPath : CandidateRPaths) {
1450 if (TC.
getVFS().exists(CandidateRPath)) {
1451 CmdArgs.push_back(
"-rpath");
1452 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1458 const ToolChain &TC,
const ArgList &Args,
1459 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1461 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1462 options::OPT_fno_openmp,
false)) {
1464 if (Args.hasFlag(options::OPT_foffload_via_llvm,
1465 options::OPT_fno_offload_via_llvm,
false))
1466 CmdArgs.push_back(
"-lomptarget");
1476 if (ForceStaticHostRuntime)
1477 CmdArgs.push_back(
"-Bstatic");
1481 CmdArgs.push_back(
"-lomp");
1484 CmdArgs.push_back(
"-lgomp");
1487 CmdArgs.push_back(
"-liomp5");
1493 if (ForceStaticHostRuntime)
1494 CmdArgs.push_back(
"-Bdynamic");
1497 CmdArgs.push_back(
"-lrt");
1499 if (IsOffloadingHost)
1500 CmdArgs.push_back(
"-lomptarget");
1511 const llvm::opt::ArgList &Args,
1512 llvm::opt::ArgStringList &CmdArgs) {
1518 constexpr llvm::StringLiteral Targets(
"--offload-targets=");
1522 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1523 [](
auto TC) { return TC.second->getTripleString(); });
1525 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1529 ArgStringList &CmdArgs, StringRef Sanitizer,
1530 bool IsShared,
bool IsWhole) {
1533 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1536 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1546 ArgStringList &CmdArgs,
1547 StringRef Sanitizer) {
1552 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1555 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1556 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1563 const llvm::opt::ArgList &Args,
1564 llvm::opt::ArgStringList &CmdArgs,
1567 "AIX linker does not support any form of --as-needed option yet.");
1575 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1576 CmdArgs.push_back(
"-z");
1577 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1579 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1584 const llvm::opt::ArgList &Args,
1585 ArgStringList &CmdArgs) {
1590 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1592 CmdArgs.push_back(
"-lpthread");
1594 CmdArgs.push_back(
"-lrt");
1596 CmdArgs.push_back(
"-lm");
1601 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1602 CmdArgs.push_back(
"-ldl");
1606 CmdArgs.push_back(
"-lexecinfo");
1608 CmdArgs.push_back(
"-lbsd");
1614 CmdArgs.push_back(
"-lresolv");
1624 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1629 SharedRuntimes.push_back(
"asan");
1630 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1631 HelperStaticRuntimes.push_back(
"asan-preinit");
1634 SharedRuntimes.push_back(
"memprof");
1635 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1636 HelperStaticRuntimes.push_back(
"memprof-preinit");
1639 SharedRuntimes.push_back(
"nsan");
1642 SharedRuntimes.push_back(
"ubsan_minimal");
1644 SharedRuntimes.push_back(
"ubsan_standalone");
1647 SharedRuntimes.push_back(
"scudo_standalone");
1650 SharedRuntimes.push_back(
"tsan");
1652 SharedRuntimes.push_back(
"tysan");
1655 SharedRuntimes.push_back(
"hwasan_aliases");
1657 SharedRuntimes.push_back(
"hwasan");
1658 if (!Args.hasArg(options::OPT_shared))
1659 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1662 SharedRuntimes.push_back(
"rtsan");
1667 StaticRuntimes.push_back(
"stats_client");
1671 HelperStaticRuntimes.push_back(
"asan_static");
1674 if (Args.hasArg(options::OPT_shared)) {
1683 StaticRuntimes.push_back(
"asan");
1685 StaticRuntimes.push_back(
"asan_cxx");
1690 StaticRuntimes.push_back(
"rtsan");
1693 StaticRuntimes.push_back(
"memprof");
1695 StaticRuntimes.push_back(
"memprof_cxx");
1700 StaticRuntimes.push_back(
"hwasan_aliases");
1702 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1704 StaticRuntimes.push_back(
"hwasan");
1706 StaticRuntimes.push_back(
"hwasan_cxx");
1710 StaticRuntimes.push_back(
"dfsan");
1712 StaticRuntimes.push_back(
"lsan");
1714 StaticRuntimes.push_back(
"msan");
1716 StaticRuntimes.push_back(
"msan_cxx");
1719 StaticRuntimes.push_back(
"nsan");
1721 StaticRuntimes.push_back(
"tsan");
1723 StaticRuntimes.push_back(
"tsan_cxx");
1726 StaticRuntimes.push_back(
"tysan");
1729 StaticRuntimes.push_back(
"ubsan_minimal");
1731 StaticRuntimes.push_back(
"ubsan_standalone");
1735 NonWholeStaticRuntimes.push_back(
"safestack");
1736 RequiredSymbols.push_back(
"__safestack_init");
1740 StaticRuntimes.push_back(
"cfi");
1742 StaticRuntimes.push_back(
"cfi_diag");
1747 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1750 NonWholeStaticRuntimes.push_back(
"stats");
1751 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1754 StaticRuntimes.push_back(
"scudo_standalone");
1756 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1759 NonWholeStaticRuntimes.push_back(
"ubsan_loop_detect");
1765 ArgStringList &CmdArgs) {
1768 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1771 NonWholeStaticRuntimes, HelperStaticRuntimes,
1776 for (
auto S : RequiredSymbols) {
1777 CmdArgs.push_back(
"-u");
1778 CmdArgs.push_back(Args.MakeArgString(S));
1782 for (
auto RT : SharedRuntimes)
1786 bool FuzzerNeedsSanitizerDeps =
false;
1788 !Args.hasArg(options::OPT_shared)) {
1791 FuzzerNeedsSanitizerDeps =
true;
1795 if (!Args.hasArg(options::OPT_nostdlibxx)) {
1796 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1797 !Args.hasArg(options::OPT_static);
1798 if (OnlyLibstdcxxStatic)
1799 CmdArgs.push_back(
"-Bstatic");
1801 if (OnlyLibstdcxxStatic)
1802 CmdArgs.push_back(
"-Bdynamic");
1806 for (
auto RT : HelperStaticRuntimes)
1808 bool AddExportDynamic =
false;
1809 for (
auto RT : StaticRuntimes) {
1813 for (
auto RT : NonWholeStaticRuntimes) {
1819 if (AddExportDynamic && !TC.
getTriple().isNVPTX())
1820 CmdArgs.push_back(
"--export-dynamic");
1823 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1826 CmdArgs.push_back(
"-z");
1828 Args.MakeArgString(
"memtag-mode=" + SanArgs.
getMemtagMode()));
1831 CmdArgs.push_back(
"-z");
1832 CmdArgs.push_back(
"memtag-heap");
1836 CmdArgs.push_back(
"-z");
1837 CmdArgs.push_back(
"memtag-stack");
1841 CmdArgs.push_back(
"--android-memtag-note");
1844 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty() ||
1845 FuzzerNeedsSanitizerDeps;
1850 if (Args.hasArg(options::OPT_shared)) {
1852 CmdArgs.push_back(
"--whole-archive");
1854 CmdArgs.push_back(
"--no-whole-archive");
1858 CmdArgs.push_back(
"--whole-archive");
1860 for (
const auto &Mode : XRay.
modeList())
1862 CmdArgs.push_back(
"--no-whole-archive");
1870 const llvm::opt::ArgList &Args,
1871 ArgStringList &CmdArgs) {
1873 CmdArgs.push_back(
"-lpthread");
1875 CmdArgs.push_back(
"-lrt");
1876 CmdArgs.push_back(
"-lm");
1881 CmdArgs.push_back(
"-ldl");
1886 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1887 return !A->getOption().matches(options::OPT_O0);
1895 auto AddPostfix = [JA](
auto &F) {
1900 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1901 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1905 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1908 if (Args.hasArg(options::OPT_o, options::OPT__SLASH_o,
1909 options::OPT__SLASH_Fo) &&
1910 Args.hasArg(options::OPT_c) && Output.
isFilename()) {
1914 llvm::sys::path::remove_filename(T);
1915 llvm::sys::path::append(T, llvm::sys::path::stem(Obj));
1917 return Args.MakeArgString(T);
1923 return Args.MakeArgString(T);
1927 const JobAction &JA,
const ArgList &Args,
1928 const InputInfo &Output,
const char *OutFile) {
1929 ArgStringList ExtractArgs;
1930 ExtractArgs.push_back(
"--extract-dwo");
1932 ArgStringList StripArgs;
1933 StripArgs.push_back(
"--strip-dwo");
1938 ExtractArgs.push_back(OutFile);
1945 C.addCommand(std::make_unique<Command>(JA, T,
1947 Exec, ExtractArgs, II, Output));
1950 C.addCommand(std::make_unique<Command>(
1960 Args.ClaimAllArgs(options::OPT_flto_EQ);
1961 Args.ClaimAllArgs(options::OPT_flto);
1962 Args.ClaimAllArgs(options::OPT_fno_lto);
1966 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1967 options::OPT_fcs_profile_generate_EQ,
1968 options::OPT_fno_profile_generate);
1969 if (CSPGOGenerateArg &&
1970 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1971 CSPGOGenerateArg =
nullptr;
1973 return CSPGOGenerateArg;
1977 auto *ProfileUseArg = Args.getLastArg(
1978 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1979 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1980 options::OPT_fno_profile_instr_use);
1982 if (ProfileUseArg &&
1983 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1984 ProfileUseArg =
nullptr;
1986 return ProfileUseArg;
1990 auto *ProfileSampleUseArg = Args.getLastArg(
1991 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
1993 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
1994 options::OPT_fno_profile_sample_use)))
1997 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
2002 case llvm::Reloc::Static:
2004 case llvm::Reloc::PIC_:
2006 case llvm::Reloc::DynamicNoPIC:
2007 return "dynamic-no-pic";
2008 case llvm::Reloc::ROPI:
2010 case llvm::Reloc::RWPI:
2012 case llvm::Reloc::ROPI_RWPI:
2015 llvm_unreachable(
"Unknown Reloc::Model kind");
2022std::tuple<llvm::Reloc::Model, unsigned, bool>
2030 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
2032 bool IsPICLevelTwo = PIC;
2035 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
2038 if (Triple.isAndroid()) {
2039 switch (Triple.getArch()) {
2040 case llvm::Triple::x86:
2041 case llvm::Triple::x86_64:
2043 IsPICLevelTwo =
true;
2053 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
2057 if (Triple.isOSOpenBSD()) {
2059 case llvm::Triple::arm:
2060 case llvm::Triple::aarch64:
2061 case llvm::Triple::mips64:
2062 case llvm::Triple::mips64el:
2063 case llvm::Triple::x86:
2064 case llvm::Triple::x86_64:
2065 IsPICLevelTwo =
false;
2068 case llvm::Triple::ppc:
2069 case llvm::Triple::sparcv9:
2070 IsPICLevelTwo =
true;
2082 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2083 options::OPT_fpic, options::OPT_fno_pic,
2084 options::OPT_fPIE, options::OPT_fno_PIE,
2085 options::OPT_fpie, options::OPT_fno_pie);
2086 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
2087 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
2088 options::OPT_fPIE, options::OPT_fpie)) {
2090 << LastPICArg->getSpelling() << Triple.str();
2091 if (Triple.getArch() == llvm::Triple::x86_64)
2092 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
2093 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2100 Option O = LastPICArg->getOption();
2101 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2102 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2103 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2105 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2107 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
2110 if (EffectiveTriple.isPS()) {
2111 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
2112 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
2113 if (Model !=
"kernel") {
2116 << LastPICArg->getSpelling()
2117 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
2127 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
2133 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
2134 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
2137 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2140 if (!Triple.isOSDarwin())
2142 << A->getSpelling() << Triple.str();
2151 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
2154 bool EmbeddedPISupported;
2155 switch (Triple.getArch()) {
2156 case llvm::Triple::arm:
2157 case llvm::Triple::armeb:
2158 case llvm::Triple::thumb:
2159 case llvm::Triple::thumbeb:
2160 EmbeddedPISupported =
true;
2163 EmbeddedPISupported =
false;
2167 bool ROPI =
false, RWPI =
false;
2168 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
2169 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
2170 if (!EmbeddedPISupported)
2172 << LastROPIArg->getSpelling() << Triple.str();
2175 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2176 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2177 if (!EmbeddedPISupported)
2179 << LastRWPIArg->getSpelling() << Triple.str();
2184 if ((ROPI || RWPI) && (PIC || PIE))
2187 if (Triple.isMIPS()) {
2194 if (ABIName ==
"n64")
2197 if(Args.hasArg(options::OPT_mno_abicalls))
2198 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2201 IsPICLevelTwo =
false;
2205 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2207 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2209 RelocM = llvm::Reloc::ROPI_RWPI;
2211 RelocM = llvm::Reloc::ROPI;
2213 RelocM = llvm::Reloc::RWPI;
2215 return std::make_tuple(RelocM, 0
U,
false);
2219 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
2220 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
2222 const llvm::opt::OptTable &Opts = D.
getOpts();
2223 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
2224 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
2225 D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
2227 return HasStaticPIE;
2247 const ArgList &Args) {
2248 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2249 options::OPT_falign_functions_EQ,
2250 options::OPT_fno_align_functions);
2251 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2254 if (A->getOption().matches(options::OPT_falign_functions))
2258 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2260 << A->getAsString(Args) << A->getValue();
2265 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2266 switch (DebugInfoKind) {
2267 case llvm::codegenoptions::DebugDirectivesOnly:
2268 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2270 case llvm::codegenoptions::DebugLineTablesOnly:
2271 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2273 case llvm::codegenoptions::DebugInfoConstructor:
2274 CmdArgs.push_back(
"-debug-info-kind=constructor");
2276 case llvm::codegenoptions::LimitedDebugInfo:
2277 CmdArgs.push_back(
"-debug-info-kind=limited");
2279 case llvm::codegenoptions::FullDebugInfo:
2280 CmdArgs.push_back(
"-debug-info-kind=standalone");
2282 case llvm::codegenoptions::UnusedTypeInfo:
2283 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2293 assert(A.getOption().matches(options::OPT_gN_Group) &&
2294 "Not a -g option that specifies a debug-info level");
2295 if (A.getOption().matches(options::OPT_g0) ||
2296 A.getOption().matches(options::OPT_ggdb0))
2297 return llvm::codegenoptions::NoDebugInfo;
2298 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2299 A.getOption().matches(options::OPT_ggdb1))
2300 return llvm::codegenoptions::DebugLineTablesOnly;
2301 if (A.getOption().matches(options::OPT_gline_directives_only))
2302 return llvm::codegenoptions::DebugDirectivesOnly;
2303 return llvm::codegenoptions::DebugInfoConstructor;
2307 const ArgList &Args) {
2308 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2314 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 6 ||
2317 << A->getAsString(Args) << A->getValue();
2322 return llvm::StringSwitch<unsigned>(ArgValue)
2323 .Case(
"-gdwarf-2", 2)
2324 .Case(
"-gdwarf-3", 3)
2325 .Case(
"-gdwarf-4", 4)
2326 .Case(
"-gdwarf-5", 5)
2327 .Case(
"-gdwarf-6", 6)
2332 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2333 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2334 options::OPT_gdwarf_6, options::OPT_gdwarf);
2338 const llvm::opt::ArgList &Args) {
2343 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2344 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2345 << GDwarfN->getSpelling() << TC.
getTriple().str();
2347 if (DwarfVersion == 0) {
2349 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2351 return DwarfVersion;
2355 const ArgList &Args, Arg *&Arg) {
2356 Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
2357 options::OPT_gno_split_dwarf);
2358 if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
2361 if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
2364 StringRef
Value = Arg->getValue();
2365 if (
Value ==
"split")
2367 if (
Value ==
"single")
2370 D.
Diag(diag::err_drv_unsupported_option_argument)
2371 << Arg->getSpelling() << Arg->getValue();
2377 assert(A &&
"Expected non-nullptr argument.");
2380 D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
2386 const ArgList &Args,
2387 ArgStringList &CmdArgs) {
2388 if (Args.hasFlag(options::OPT_fdebug_info_for_profiling,
2389 options::OPT_fno_debug_info_for_profiling,
false) &&
2391 Args.getLastArg(options::OPT_fdebug_info_for_profiling), Args, D, TC))
2392 CmdArgs.push_back(
"-fdebug-info-for-profiling");
2396 ArgStringList &CmdArgs) {
2397 llvm::Reloc::Model RelocationModel;
2402 if (RelocationModel != llvm::Reloc::Static)
2403 CmdArgs.push_back(
"-KPIC");
2409 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2415 const ArgList &Args) {
2416 if (Args.hasArg(options::OPT_static_libgcc) ||
2417 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2421 if (Args.hasArg(options::OPT_shared_libgcc))
2440 ArgStringList &CmdArgs,
const ArgList &Args) {
2444 CmdArgs.push_back(
"-l:libunwind.a");
2467 CmdArgs.push_back(
"-lgcc_eh");
2469 CmdArgs.push_back(
"-lgcc_s");
2477 CmdArgs.push_back(
"-lunwind");
2479 CmdArgs.push_back(
"-l:libunwind.a");
2482 CmdArgs.push_back(
"-l:libunwind.dll.a");
2484 CmdArgs.push_back(
"-l:libunwind.so");
2488 CmdArgs.push_back(
"-lunwind");
2498 ArgStringList &CmdArgs,
const ArgList &Args) {
2502 CmdArgs.push_back(
"-lgcc");
2506 CmdArgs.push_back(
"-lgcc");
2510 CmdArgs.push_back(
"--as-needed");
2512 CmdArgs.push_back(
"--no-as-needed");
2517 ArgStringList &CmdArgs,
const ArgList &Args) {
2528 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2531 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2532 if (A && A->getValue() != StringRef(
"platform")) {
2533 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2534 << A->getValue() <<
"MSVC";
2544 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2545 !Args.hasArg(options::OPT_static_pie))
2546 CmdArgs.push_back(
"-ldl");
2553 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2559 StringRef SaveStats = A->getValue();
2560 if (SaveStats ==
"obj" && Output.
isFilename()) {
2562 llvm::sys::path::remove_filename(StatsFile);
2563 }
else if (SaveStats !=
"cwd") {
2564 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2568 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2569 llvm::sys::path::append(StatsFile, BaseName);
2570 llvm::sys::path::replace_extension(StatsFile,
"stats");
2582 assert(Flag.front() ==
'-');
2584 Flags.push_back(Flag.str());
2586 Flags.push_back((
"!" + Flag.substr(1)).str());
2591 ArgStringList &CmdArgs,
bool IsLTO,
2592 const StringRef PluginOptPrefix) {
2593 auto addArg = [&, IsLTO](
const Twine &Arg) {
2595 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2596 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2598 CmdArgs.push_back(
"-mllvm");
2599 CmdArgs.push_back(Args.MakeArgString(Arg));
2603 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2604 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2606 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2607 StringRef
Value = A->getValue();
2609 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2610 !llvm::isPowerOf2_64(Boundary)) {
2611 D.
Diag(diag::err_drv_invalid_argument_to_option)
2612 <<
Value << A->getOption().getName();
2614 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2617 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2618 std::string AlignBranch;
2619 for (StringRef T : A->getValues()) {
2620 if (T !=
"fused" && T !=
"jcc" && T !=
"jmp" && T !=
"call" &&
2621 T !=
"ret" && T !=
"indirect")
2622 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2623 << T <<
"fused, jcc, jmp, call, ret, indirect";
2624 if (!AlignBranch.empty())
2628 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2630 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2631 StringRef
Value = A->getValue();
2632 unsigned PrefixSize;
2633 if (
Value.getAsInteger(10, PrefixSize)) {
2634 D.
Diag(diag::err_drv_invalid_argument_to_option)
2635 <<
Value << A->getOption().getName();
2637 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2663 llvm::opt::ArgStringList &CC1Args,
2665 StringRef Lib, StringRef
Arch, StringRef
Target,
2666 bool isBitCodeSDL) {
2669 std::string LibDeviceLoc =
"/libdevice";
2670 std::string LibBcPrefix =
"/libbc-";
2671 std::string LibPrefix =
"/lib";
2688 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2689 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2691 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2692 Twine(Lib +
"-" +
Arch).str(), Twine(Lib).str()}) {
2693 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2694 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2704 const auto *Ext =
".a";
2706 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2707 Twine(Lib +
"-" +
Arch).str()}) {
2708 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2709 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2720 bool FoundSDL =
false;
2721 for (
auto LPath : LibraryPaths) {
2722 for (
auto SDL : SDLs) {
2723 auto FullName = Twine(LPath + SDL).str();
2724 if (llvm::sys::fs::exists(FullName)) {
2725 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2742 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2743 llvm::opt::ArgStringList &CC1Args,
2745 StringRef
Arch, StringRef
Target,
bool isBitCodeSDL) {
2748 if (isBitCodeSDL &&
Arch.contains(
"nvptx"))
2751 bool FoundAOB =
false;
2752 std::string ArchiveOfBundles;
2755 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2756 auto Ext = IsMSVC ?
".lib" :
".a";
2757 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2758 if (llvm::sys::fs::exists(Lib)) {
2759 ArchiveOfBundles = Lib;
2763 Lib.consume_front(
"-l");
2764 for (
auto LPath : LibraryPaths) {
2765 ArchiveOfBundles.clear();
2766 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2767 : IsMSVC ? Lib + Ext
2768 :
"lib" + Lib + Ext)
2770 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2771 auto AOB = Twine(LPath + Prefix + LibFile).str();
2772 if (llvm::sys::fs::exists(AOB)) {
2773 ArchiveOfBundles = AOB;
2786 llvm::file_magic Magic;
2787 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2788 if (EC || Magic != llvm::file_magic::archive)
2791 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2792 std::string OutputLib =
2798 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2802 DeviceTriple +=
'-';
2803 std::string NormalizedTriple =
2804 T.getToolChain().getEffectiveTriple().normalize(
2805 llvm::Triple::CanonicalForm::FOUR_IDENT);
2806 DeviceTriple += NormalizedTriple;
2808 DeviceTriple +=
'-';
2812 std::string UnbundleArg(
"-unbundle");
2813 std::string TypeArg(
"-type=a");
2814 std::string InputArg(
"-input=" + ArchiveOfBundles);
2815 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2816 std::string OutputArg(
"-output=" + OutputLib);
2818 const char *UBProgram = DriverArgs.MakeArgString(
2819 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2821 ArgStringList UBArgs;
2822 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2823 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2824 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2825 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2826 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2830 std::string AdditionalArgs(
"-allow-missing-bundles");
2831 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2836 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2837 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2839 C.addCommand(std::make_unique<Command>(
2841 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2843 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2850 const llvm::opt::ArgList &DriverArgs,
2851 llvm::opt::ArgStringList &CC1Args,
2853 bool isBitCodeSDL) {
2884 const llvm::opt::ArgList &DriverArgs,
2885 llvm::opt::ArgStringList &CC1Args,
2887 bool isBitCodeSDL) {
2891 std::optional<std::string> LibPath =
2892 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2895 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2896 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2897 for (StringRef Path : Frags)
2898 LibraryPaths.emplace_back(Path.trim());
2902 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2903 LibraryPaths.emplace_back(Search_Dir);
2907 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2908 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2911 llvm::SmallSet<std::string, 16> SDLNames;
2912 static const StringRef HostOnlyArchives[] = {
2913 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2914 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2915 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2916 SDLNames.insert(std::string(
"-l") + SDLName);
2920 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2927 const StringRef LibFileExt =
".lib";
2928 if (!llvm::sys::path::has_extension(
FileName) ||
2930 llvm::sys::path::extension(
FileName).drop_front()) ==
2932 llvm::sys::path::extension(
FileName) == LibFileExt)
2933 SDLNames.insert(Input);
2940 for (
auto SDLName : SDLNames) {
2951static llvm::opt::Arg *
2953 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2957 const llvm::opt::ArgList &Args) {
2958 const unsigned MinCodeObjVer = 4;
2959 const unsigned MaxCodeObjVer = 6;
2962 if (CodeObjArg->getOption().getID() ==
2963 options::OPT_mcode_object_version_EQ) {
2964 unsigned CodeObjVer = MaxCodeObjVer;
2966 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2967 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2968 D.
Diag(diag::err_drv_invalid_int_value)
2969 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2975 const llvm::opt::ArgList &Args) {
2976 unsigned CodeObjVer = 6;
2978 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2983 const Driver &D,
const llvm::opt::ArgList &Args) {
2988 const llvm::opt::ArgList &Args,
2989 llvm::opt::ArgStringList &CmdArgs,
2990 const llvm::Triple &Triple,
bool IsLTO,
2991 const StringRef PluginOptPrefix) {
2992 auto addArg = [&, IsLTO](
const Twine &Arg) {
2994 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2995 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2997 CmdArgs.push_back(
"-mllvm");
2998 CmdArgs.push_back(Args.MakeArgString(Arg));
3002 if (Arg *A = Args.getLastArg(options::OPT_moutline,
3003 options::OPT_mno_outline)) {
3004 if (A->getOption().matches(options::OPT_moutline)) {
3008 if (Triple.isARM() || Triple.isThumb() || Triple.isAArch64() ||
3009 Triple.isRISCV() || Triple.isX86()) {
3010 addArg(Twine(
"-enable-machine-outliner"));
3012 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
3018 CmdArgs.push_back(
"-mno-outline");
3021 addArg(Twine(
"-enable-machine-outliner=never"));
3025 auto *CodeGenDataGenArg =
3026 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
3027 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
3030 if (CodeGenDataGenArg && CodeGenDataUseArg)
3031 D.
Diag(diag::err_drv_argument_not_allowed_with)
3032 << CodeGenDataGenArg->getAsString(Args)
3033 << CodeGenDataUseArg->getAsString(Args);
3037 if (CodeGenDataGenArg)
3038 addArg(Twine(
"-codegen-data-generate"));
3041 if (CodeGenDataUseArg)
3042 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
3046 const llvm::opt::ArgList &DriverArgs,
3047 llvm::opt::ArgStringList &CC1Args,
3048 StringRef BitcodeSuffix,
3049 const llvm::Triple &Triple,
3054 std::optional<std::string> LibPath =
3055 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
3058 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
3059 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
3060 for (StringRef Path : Frags)
3061 LibraryPaths.emplace_back(Path.trim());
3066 LibraryPaths.emplace_back(LibPath);
3070 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
3071 LibraryPaths.emplace_back(P);
3073 OptSpecifier LibomptargetBCPathOpt =
3074 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
3075 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
3076 : options::OPT_libomptarget_spirv_bc_path_EQ;
3078 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
3079 : Triple.isNVPTX() ?
"nvptx"
3081 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
3084 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
3086 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
3087 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
3088 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3091 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3092 CC1Args.push_back(
"-mlink-builtin-bitcode");
3093 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3095 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
3096 << LibOmpTargetFile;
3099 bool FoundBCLibrary =
false;
3101 for (StringRef LibraryPath : LibraryPaths) {
3103 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3104 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3105 CC1Args.push_back(
"-mlink-builtin-bitcode");
3106 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3107 FoundBCLibrary =
true;
3112 if (!FoundBCLibrary)
3113 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
3114 << LibOmpTargetName << ArchPrefix;
3119 const llvm::opt::ArgList &DriverArgs,
3120 llvm::opt::ArgStringList &CC1Args) {
3122 StringRef LibclcNamespec;
3123 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
3126 LibclcNamespec = A->getValue();
3128 if (!TT.isAMDGPU() || TT.getEnvironment() != llvm::Triple::LLVM)
3132 if (DriverArgs.hasArg(options::OPT_no_offloadlib,
3133 options::OPT_nodefaultlibs, options::OPT_nostdlib))
3137 bool FilenameSearch = LibclcNamespec.consume_front(
":");
3138 if (FilenameSearch) {
3140 if (D.
getVFS().exists(LibclcFile)) {
3141 CC1Args.push_back(
"-mlink-builtin-bitcode");
3142 CC1Args.push_back(DriverArgs.MakeArgString(LibclcFile));
3145 D.
Diag(diag::err_drv_libclc_not_found) << LibclcFile;
3151 llvm::sys::path::append(BasePath,
"lib");
3156 if (
const Arg *CPUArg = DriverArgs.getLastArg(options::OPT_mcpu_EQ)) {
3157 StringRef CPU = CPUArg->getValue();
3160 llvm::sys::path::append(CPUPath, CPU,
"libclc.bc");
3161 if (D.
getVFS().exists(CPUPath)) {
3162 CC1Args.push_back(
"-mlink-builtin-bitcode");
3163 CC1Args.push_back(DriverArgs.MakeArgString(CPUPath));
3171 llvm::sys::path::append(GenericPath,
"libclc.bc");
3172 if (D.
getVFS().exists(GenericPath)) {
3173 CC1Args.push_back(
"-mlink-builtin-bitcode");
3174 CC1Args.push_back(DriverArgs.MakeArgString(GenericPath));
3178 D.
Diag(diag::err_drv_libclc_not_found) <<
"libclc.bc";
3182 const llvm::opt::ArgList &Args,
3183 llvm::opt::ArgStringList &CmdArgs,
3184 const llvm::Triple &Triple) {
3185 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3186 options::OPT_mno_outline_atomics)) {
3188 if (!Triple.isAArch64()) {
3189 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3190 << Triple.getArchName() << A->getOption().getName();
3192 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3193 CmdArgs.push_back(
"-target-feature");
3194 CmdArgs.push_back(
"+outline-atomics");
3196 CmdArgs.push_back(
"-target-feature");
3197 CmdArgs.push_back(
"-outline-atomics");
3201 CmdArgs.push_back(
"-target-feature");
3202 CmdArgs.push_back(
"+outline-atomics");
3207 llvm::opt::ArgStringList &CmdArgs) {
3208 if (TCArgs.hasFlag(options::OPT_offload_compress,
3209 options::OPT_no_offload_compress,
false))
3210 CmdArgs.push_back(
"--compress");
3211 if (TCArgs.hasArg(options::OPT_v))
3212 CmdArgs.push_back(
"--verbose");
3213 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3215 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3219 const llvm::Triple &Triple,
3220 const llvm::Reloc::Model &RelocationModel,
3221 llvm::opt::ArgStringList &CmdArgs) {
3222 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3223 StringRef CM = A->getValue();
3225 if (Triple.isOSAIX() && CM ==
"medium")
3227 if (Triple.isAArch64(64)) {
3228 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3229 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3230 RelocationModel != llvm::Reloc::Static)
3231 D.
Diag(diag::err_drv_argument_only_allowed_with)
3232 << A->getAsString(Args) <<
"-fno-pic";
3233 }
else if (Triple.isLoongArch()) {
3234 if (CM ==
"extreme" &&
3235 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3236 D.
Diag(diag::err_drv_argument_not_allowed_with)
3237 << A->getAsString(Args) <<
"-fplt";
3238 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3241 CM = llvm::StringSwitch<StringRef>(CM)
3242 .Case(
"normal",
"small")
3243 .Case(
"extreme",
"large")
3245 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3246 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3247 }
else if (Triple.isRISCV()) {
3249 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3250 D.
Diag(diag::err_drv_argument_not_allowed_with)
3251 << A->getAsString(Args) <<
"-fpic";
3254 else if (CM ==
"medany")
3256 Ok = CM ==
"small" || CM ==
"medium" ||
3257 (CM ==
"large" && Triple.isRISCV64());
3258 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3259 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3260 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3264 }
else if (Triple.isSPARC64()) {
3267 else if (CM ==
"medmid")
3269 else if (CM ==
"medany")
3271 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3272 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3273 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3276 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3278 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3279 << A->getSpelling() << CM << Triple.getTriple();
3283 if (Triple.getArch() == llvm::Triple::x86_64) {
3284 bool IsMediumCM =
false;
3285 bool IsLargeCM =
false;
3286 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3287 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3288 IsLargeCM = StringRef(A->getValue()) ==
"large";
3290 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3291 if (!IsMediumCM && !IsLargeCM) {
3292 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3293 << A->getOption().getRenderName();
3295 A->render(Args, CmdArgs);
3297 }
else if (IsMediumCM) {
3298 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3299 }
else if (IsLargeCM) {
3300 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3306 ArgStringList &CmdArgs) {
3311 Args.getLastArg(options::OPT_fcolor_diagnostics,
3312 options::OPT_fno_color_diagnostics);
3313 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3314 StringRef
Value(A->getValue());
3316 D.
Diag(diag::err_drv_invalid_argument_to_option)
3317 <<
Value << A->getOption().getName();
3322 CmdArgs.push_back(
"-fcolor-diagnostics");
3325 CmdArgs.push_back(
"-fno-color-diagnostics");
3334 for (; *Arg; ++Arg) {
3340 Res.push_back(
'\\');
3343 Res.push_back(*Arg);
3348 const llvm::opt::ArgList &Args) {
3352 llvm::opt::ArgStringList OriginalArgs;
3353 for (
const auto &Arg : Args)
3354 Arg->render(Args, OriginalArgs);
3358 for (
const char *OriginalArg : OriginalArgs) {
3362 Flags += EscapedArg;
3365 return Args.MakeArgString(Flags);
3369 const llvm::opt::ArgList &Args,
3370 bool &FRecordCommandLine,
3371 bool &GRecordCommandLine,
3372 bool &DXRecordCommandLine) {
3375 const std::string &TripleStr = Triple.getTriple();
3377 FRecordCommandLine =
3378 Args.hasFlag(options::OPT_frecord_command_line,
3379 options::OPT_fno_record_command_line,
false);
3380 GRecordCommandLine =
3381 Args.hasFlag(options::OPT_grecord_command_line,
3382 options::OPT_gno_record_command_line,
false);
3383 DXRecordCommandLine = Triple.isDXIL() && Args.hasArg(options::OPT_g_Flag);
3384 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3385 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3386 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3387 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3391 DXRecordCommandLine;
3395 ArgStringList &CmdArgs,
3396 const llvm::Triple &Triple) {
3397 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
3398 options::OPT_fno_global_isel)) {
3399 CmdArgs.push_back(
"-mllvm");
3400 if (A->getOption().matches(options::OPT_fglobal_isel)) {
3401 CmdArgs.push_back(
"-global-isel=1");
3406 bool IsArchSupported = Triple.getArch() == llvm::Triple::aarch64;
3407 bool IsOptLevelSupported =
false;
3409 Arg *A = Args.getLastArg(options::OPT_O_Group);
3410 if (IsArchSupported) {
3411 if (!A || A->getOption().matches(options::OPT_O0))
3412 IsOptLevelSupported =
true;
3414 if (!IsArchSupported || !IsOptLevelSupported) {
3415 CmdArgs.push_back(
"-mllvm");
3416 CmdArgs.push_back(
"-global-isel-abort=2");
3418 if (!IsArchSupported)
3419 D.
Diag(diag::warn_drv_global_isel_incomplete) << Triple.getArchName();
3421 D.
Diag(diag::warn_drv_global_isel_incomplete_opt);
3424 CmdArgs.push_back(
"-global-isel=0");
3430 ArgStringList &CmdArgs,
3431 bool IsMSVCCompat) {
3432 bool use_fwrapv = IsMSVCCompat;
3433 bool use_fwrapv_pointer =
false;
3434 for (
const Arg *A : Args.filtered(
3435 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3436 options::OPT_fwrapv, options::OPT_fno_wrapv,
3437 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3439 switch (A->getOption().getID()) {
3440 case options::OPT_fstrict_overflow:
3442 use_fwrapv_pointer =
false;
3444 case options::OPT_fno_strict_overflow:
3446 use_fwrapv_pointer =
true;
3448 case options::OPT_fwrapv:
3451 case options::OPT_fno_wrapv:
3454 case options::OPT_fwrapv_pointer:
3455 use_fwrapv_pointer =
true;
3457 case options::OPT_fno_wrapv_pointer:
3458 use_fwrapv_pointer =
false;
3464 CmdArgs.push_back(
"-fwrapv");
3465 if (!use_fwrapv && IsMSVCCompat)
3466 CmdArgs.push_back(
"-fno-wrapv");
3467 if (use_fwrapv_pointer)
3468 CmdArgs.push_back(
"-fwrapv-pointer");
3475 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3476 if (A->getOption().matches(options::OPT_O4) ||
3477 A->getOption().matches(options::OPT_Ofast))
3480 if (A->getOption().matches(options::OPT_O0))
3483 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3486 StringRef S(A->getValue());
3494 unsigned OptLevel = 0;
3495 if (S.getAsInteger(10, OptLevel))
3498 return OptLevel > 1;
3505 ArgStringList &CmdArgs) {
3507 if (Args.hasFlag(options::OPT_fvectorize, options::OPT_fno_vectorize,
3509 CmdArgs.push_back(
"-vectorize-loops");
3513 ArgStringList &CmdArgs) {
3515 if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize,
3517 CmdArgs.push_back(
"-vectorize-slp");
3521 ArgStringList &CmdArgs) {
3522 if (Args.hasFlag(options::OPT_floop_interchange,
3523 options::OPT_fno_loop_interchange,
false))
3524 CmdArgs.push_back(
"-floop-interchange");
3545 llvm_unreachable(
"Fully covered switch above");
3551 if (!ComplexRangeStr.empty())
3552 return "-complex-range=" + ComplexRangeStr;
3553 return ComplexRangeStr;
3573 if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
3574 (LastOpt ==
"-fcx-limited-range" && NewOpt ==
"-fno-cx-limited-range") ||
3575 (LastOpt ==
"-fno-cx-limited-range" && NewOpt ==
"-fcx-limited-range") ||
3576 (LastOpt ==
"-fcx-fortran-rules" && NewOpt ==
"-fno-cx-fortran-rules") ||
3577 (LastOpt ==
"-fno-cx-fortran-rules" && NewOpt ==
"-fcx-fortran-rules") ||
3578 (LastOpt ==
"-ffast-math" && NewOpt ==
"-fno-fast-math") ||
3579 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-ffast-math") ||
3580 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-fno-fast-math") ||
3581 (LastOpt.starts_with(
"-ffp-model=") &&
3582 NewOpt.starts_with(
"-ffp-model=")) ||
3583 (LastOpt.starts_with(
"-fcomplex-arithmetic=") &&
3584 NewOpt.starts_with(
"-fcomplex-arithmetic=")))
3587 D.
Diag(clang::diag::warn_drv_overriding_complex_range)
3607 const ArgStringList &LinkerInputs,
3609 const llvm::opt::ArgList &Args,
3610 const char *OutputFilename) {
3614 assert(!LinkerInputs.empty() && !JobInputs.empty() &&
3615 "Must have at least one input.");
3617 ArgStringList LlvmLinkArgs(
3618 {
"-o", OutputFilename ? OutputFilename : Output.
getFilename()});
3620 LlvmLinkArgs.append(LinkerInputs);
3623 const char *LlvmLink = Args.MakeArgString(TC.
GetProgramPath(
"llvm-link"));
3625 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 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 std::string getAMDGPUTargetGPU(const llvm::Triple &T, const ArgList &Args)
Get the (LLVM) name of the AMDGPU gpu we are targeting.
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()