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::amdgcn:
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::r600:
821 case llvm::Triple::amdgcn:
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::r600:
903 case llvm::Triple::amdgcn:
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));
1161 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
1162 options::OPT_fno_global_isel)) {
1165 CmdArgs.push_back(Args.MakeArgString(
1166 Twine(PluginOptPrefix) +
"-global-isel=" +
1167 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
1172 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
1173 if (A->getOption().matches(options::OPT_glldb))
1175 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
1176 else if (A->getOption().matches(options::OPT_gsce))
1178 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
1179 else if (A->getOption().matches(options::OPT_gdbx))
1181 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
1184 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
1190 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
1194 Arg *A = Args.getLastArg(options::OPT_g_Group);
1195 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
1196 !A->getOption().matches(options::OPT_ggdb0);
1197 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
1198 options::OPT_gno_strict_dwarf,
true))
1200 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
1202 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
1203 StringRef
V = A->getValue();
1204 if (
V ==
"vec-default")
1206 if (
V ==
"vec-extabi") {
1208 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
1214 bool UseSeparateSections =
1217 if (Args.hasFlag(options::OPT_ffunction_sections,
1218 options::OPT_fno_function_sections, UseSeparateSections))
1220 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
1221 else if (Args.hasArg(options::OPT_fno_function_sections))
1223 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
1225 bool DataSectionsTurnedOff =
false;
1226 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1227 UseSeparateSections)) {
1229 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
1230 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
1231 DataSectionsTurnedOff =
true;
1233 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
1236 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
1237 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
1238 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
1239 options::OPT_mno_xcoff_roptr,
false);
1240 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
1242 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1243 << OptStr << Triple.str();
1249 if (DataSectionsTurnedOff)
1250 D.
Diag(diag::err_roptr_requires_data_sections);
1253 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
1258 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
1259 options::OPT_fno_split_machine_functions)) {
1260 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
1261 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1262 "-split-machine-functions"));
1266 Args.getLastArg(options::OPT_fpartition_static_data_sections,
1267 options::OPT_fno_partition_static_data_sections)) {
1268 if (A->getOption().matches(options::OPT_fpartition_static_data_sections)) {
1269 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1270 "-partition-static-data-sections"));
1275 StringRef FName = A->getValue();
1276 if (!llvm::sys::fs::exists(FName))
1277 D.
Diag(diag::err_drv_no_such_file) << FName;
1279 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1280 "sample-profile=" + FName));
1284 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1285 "cs-profile-generate"));
1286 if (CSPGOGenerateArg->getOption().matches(
1287 options::OPT_fcs_profile_generate_EQ)) {
1289 llvm::sys::path::append(Path,
"default_%m.profraw");
1290 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1291 "cs-profile-path=" + Path));
1294 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1295 "cs-profile-path=default_%m.profraw"));
1298 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1299 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1300 llvm::sys::path::append(Path,
"default.profdata");
1301 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1302 "cs-profile-path=" + Path));
1306 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1308 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1309 "-enable-jmc-instrument"));
1311 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1314 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1315 Triple.hasDefaultEmulatedTLS())) {
1317 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1321 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1323 if (Args.hasFlag(options::OPT_fstack_size_section,
1324 options::OPT_fno_stack_size_section,
false))
1326 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1328 if (Args.hasFlag(options::OPT_fexperimental_call_graph_section,
1329 options::OPT_fno_experimental_call_graph_section,
false))
1331 Args.MakeArgString(Twine(PluginOptPrefix) +
"-call-graph-section"));
1335 if (!StatsFile.empty())
1337 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1340 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1341 CmdArgs.push_back(Args.MakeArgString(
1342 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1353 Output, PluginOptPrefix);
1359 true, PluginOptPrefix);
1361 bool IsELF = Triple.isOSBinFormatELF();
1363 bool ImplicitMapSyms =
false;
1364 for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
1365 for (StringRef
V : A->getValues()) {
1366 auto Equal =
V.split(
'=');
1367 auto checkArg = [&](
bool ValidTarget,
1368 std::initializer_list<const char *>
Set) {
1370 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1371 << (Twine(
"-Wa,") +
Equal.first +
"=").str()
1372 << Triple.getTriple();
1373 }
else if (!llvm::is_contained(
Set,
Equal.second)) {
1374 D.
Diag(diag::err_drv_unsupported_option_argument)
1375 << (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
1378 if (
Equal.first ==
"-mmapsyms") {
1379 ImplicitMapSyms =
Equal.second ==
"implicit";
1380 checkArg(IsELF && Triple.isAArch64(), {
"default",
"implicit"});
1381 }
else if (
V ==
"--crel")
1383 else if (
V ==
"--no-crel")
1391 if (IsELF && !Triple.isMIPS()) {
1392 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"-crel"));
1394 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1398 if (ImplicitMapSyms)
1400 Args.MakeArgString(Twine(PluginOptPrefix) +
"-implicit-mapsyms"));
1402 if (Args.hasArg(options::OPT_ftime_report))
1404 Args.MakeArgString(Twine(PluginOptPrefix) +
"-time-passes"));
1410 const ArgList &Args,
1411 ArgStringList &CmdArgs) {
1416 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1417 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1421 ArgStringList &CmdArgs) {
1422 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1423 options::OPT_fno_rtlib_add_rpath,
false))
1435 llvm::sys::path::append(P, M.gccSuffix());
1436 CandidateRPaths.emplace_back(std::string(P));
1438 CandidateRPaths.emplace_back(*StdlibPath);
1440 for (
const auto &CandidateRPath : CandidateRPaths) {
1441 if (TC.
getVFS().exists(CandidateRPath)) {
1442 CmdArgs.push_back(
"-rpath");
1443 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1449 const ToolChain &TC,
const ArgList &Args,
1450 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1452 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1453 options::OPT_fno_openmp,
false)) {
1455 if (Args.hasFlag(options::OPT_foffload_via_llvm,
1456 options::OPT_fno_offload_via_llvm,
false))
1457 CmdArgs.push_back(
"-lomptarget");
1467 if (ForceStaticHostRuntime)
1468 CmdArgs.push_back(
"-Bstatic");
1472 CmdArgs.push_back(
"-lomp");
1475 CmdArgs.push_back(
"-lgomp");
1478 CmdArgs.push_back(
"-liomp5");
1484 if (ForceStaticHostRuntime)
1485 CmdArgs.push_back(
"-Bdynamic");
1488 CmdArgs.push_back(
"-lrt");
1490 if (IsOffloadingHost)
1491 CmdArgs.push_back(
"-lomptarget");
1502 const llvm::opt::ArgList &Args,
1503 llvm::opt::ArgStringList &CmdArgs) {
1509 constexpr llvm::StringLiteral Targets(
"--offload-targets=");
1513 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1514 [](
auto TC) { return TC.second->getTripleString(); });
1516 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1520 ArgStringList &CmdArgs, StringRef Sanitizer,
1521 bool IsShared,
bool IsWhole) {
1524 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1527 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1537 ArgStringList &CmdArgs,
1538 StringRef Sanitizer) {
1543 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1546 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1547 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1554 const llvm::opt::ArgList &Args,
1555 llvm::opt::ArgStringList &CmdArgs,
1558 "AIX linker does not support any form of --as-needed option yet.");
1566 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1567 CmdArgs.push_back(
"-z");
1568 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1570 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1575 const llvm::opt::ArgList &Args,
1576 ArgStringList &CmdArgs) {
1581 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1583 CmdArgs.push_back(
"-lpthread");
1585 CmdArgs.push_back(
"-lrt");
1587 CmdArgs.push_back(
"-lm");
1592 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1593 CmdArgs.push_back(
"-ldl");
1597 CmdArgs.push_back(
"-lexecinfo");
1599 CmdArgs.push_back(
"-lbsd");
1605 CmdArgs.push_back(
"-lresolv");
1615 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1620 SharedRuntimes.push_back(
"asan");
1621 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1622 HelperStaticRuntimes.push_back(
"asan-preinit");
1625 SharedRuntimes.push_back(
"memprof");
1626 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1627 HelperStaticRuntimes.push_back(
"memprof-preinit");
1630 SharedRuntimes.push_back(
"nsan");
1633 SharedRuntimes.push_back(
"ubsan_minimal");
1635 SharedRuntimes.push_back(
"ubsan_standalone");
1638 SharedRuntimes.push_back(
"scudo_standalone");
1641 SharedRuntimes.push_back(
"tsan");
1643 SharedRuntimes.push_back(
"tysan");
1646 SharedRuntimes.push_back(
"hwasan_aliases");
1648 SharedRuntimes.push_back(
"hwasan");
1649 if (!Args.hasArg(options::OPT_shared))
1650 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1653 SharedRuntimes.push_back(
"rtsan");
1658 StaticRuntimes.push_back(
"stats_client");
1662 HelperStaticRuntimes.push_back(
"asan_static");
1665 if (Args.hasArg(options::OPT_shared)) {
1674 StaticRuntimes.push_back(
"asan");
1676 StaticRuntimes.push_back(
"asan_cxx");
1681 StaticRuntimes.push_back(
"rtsan");
1684 StaticRuntimes.push_back(
"memprof");
1686 StaticRuntimes.push_back(
"memprof_cxx");
1691 StaticRuntimes.push_back(
"hwasan_aliases");
1693 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1695 StaticRuntimes.push_back(
"hwasan");
1697 StaticRuntimes.push_back(
"hwasan_cxx");
1701 StaticRuntimes.push_back(
"dfsan");
1703 StaticRuntimes.push_back(
"lsan");
1705 StaticRuntimes.push_back(
"msan");
1707 StaticRuntimes.push_back(
"msan_cxx");
1710 StaticRuntimes.push_back(
"nsan");
1712 StaticRuntimes.push_back(
"tsan");
1714 StaticRuntimes.push_back(
"tsan_cxx");
1717 StaticRuntimes.push_back(
"tysan");
1720 StaticRuntimes.push_back(
"ubsan_minimal");
1722 StaticRuntimes.push_back(
"ubsan_standalone");
1726 NonWholeStaticRuntimes.push_back(
"safestack");
1727 RequiredSymbols.push_back(
"__safestack_init");
1731 StaticRuntimes.push_back(
"cfi");
1733 StaticRuntimes.push_back(
"cfi_diag");
1738 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1741 NonWholeStaticRuntimes.push_back(
"stats");
1742 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1745 StaticRuntimes.push_back(
"scudo_standalone");
1747 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1750 NonWholeStaticRuntimes.push_back(
"ubsan_loop_detect");
1756 ArgStringList &CmdArgs) {
1759 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1762 NonWholeStaticRuntimes, HelperStaticRuntimes,
1767 for (
auto S : RequiredSymbols) {
1768 CmdArgs.push_back(
"-u");
1769 CmdArgs.push_back(Args.MakeArgString(S));
1773 for (
auto RT : SharedRuntimes)
1777 bool FuzzerNeedsSanitizerDeps =
false;
1779 !Args.hasArg(options::OPT_shared)) {
1782 FuzzerNeedsSanitizerDeps =
true;
1786 if (!Args.hasArg(options::OPT_nostdlibxx)) {
1787 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1788 !Args.hasArg(options::OPT_static);
1789 if (OnlyLibstdcxxStatic)
1790 CmdArgs.push_back(
"-Bstatic");
1792 if (OnlyLibstdcxxStatic)
1793 CmdArgs.push_back(
"-Bdynamic");
1797 for (
auto RT : HelperStaticRuntimes)
1799 bool AddExportDynamic =
false;
1800 for (
auto RT : StaticRuntimes) {
1804 for (
auto RT : NonWholeStaticRuntimes) {
1810 if (AddExportDynamic && !TC.
getTriple().isNVPTX())
1811 CmdArgs.push_back(
"--export-dynamic");
1814 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1817 CmdArgs.push_back(
"-z");
1819 Args.MakeArgString(
"memtag-mode=" + SanArgs.
getMemtagMode()));
1822 CmdArgs.push_back(
"-z");
1823 CmdArgs.push_back(
"memtag-heap");
1827 CmdArgs.push_back(
"-z");
1828 CmdArgs.push_back(
"memtag-stack");
1832 CmdArgs.push_back(
"--android-memtag-note");
1835 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty() ||
1836 FuzzerNeedsSanitizerDeps;
1841 if (Args.hasArg(options::OPT_shared)) {
1843 CmdArgs.push_back(
"--whole-archive");
1845 CmdArgs.push_back(
"--no-whole-archive");
1849 CmdArgs.push_back(
"--whole-archive");
1851 for (
const auto &Mode : XRay.
modeList())
1853 CmdArgs.push_back(
"--no-whole-archive");
1861 const llvm::opt::ArgList &Args,
1862 ArgStringList &CmdArgs) {
1864 CmdArgs.push_back(
"-lpthread");
1866 CmdArgs.push_back(
"-lrt");
1867 CmdArgs.push_back(
"-lm");
1872 CmdArgs.push_back(
"-ldl");
1877 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1878 return !A->getOption().matches(options::OPT_O0);
1886 auto AddPostfix = [JA](
auto &F) {
1891 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1892 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1896 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1899 if (Args.hasArg(options::OPT_o, options::OPT__SLASH_o,
1900 options::OPT__SLASH_Fo) &&
1901 Args.hasArg(options::OPT_c) && Output.
isFilename()) {
1905 llvm::sys::path::remove_filename(T);
1906 llvm::sys::path::append(T, llvm::sys::path::stem(Obj));
1908 return Args.MakeArgString(T);
1914 return Args.MakeArgString(T);
1918 const JobAction &JA,
const ArgList &Args,
1919 const InputInfo &Output,
const char *OutFile) {
1920 ArgStringList ExtractArgs;
1921 ExtractArgs.push_back(
"--extract-dwo");
1923 ArgStringList StripArgs;
1924 StripArgs.push_back(
"--strip-dwo");
1929 ExtractArgs.push_back(OutFile);
1936 C.addCommand(std::make_unique<Command>(JA, T,
1938 Exec, ExtractArgs, II, Output));
1941 C.addCommand(std::make_unique<Command>(
1951 Args.ClaimAllArgs(options::OPT_flto_EQ);
1952 Args.ClaimAllArgs(options::OPT_flto);
1953 Args.ClaimAllArgs(options::OPT_fno_lto);
1957 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1958 options::OPT_fcs_profile_generate_EQ,
1959 options::OPT_fno_profile_generate);
1960 if (CSPGOGenerateArg &&
1961 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1962 CSPGOGenerateArg =
nullptr;
1964 return CSPGOGenerateArg;
1968 auto *ProfileUseArg = Args.getLastArg(
1969 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1970 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1971 options::OPT_fno_profile_instr_use);
1973 if (ProfileUseArg &&
1974 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1975 ProfileUseArg =
nullptr;
1977 return ProfileUseArg;
1981 auto *ProfileSampleUseArg = Args.getLastArg(
1982 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
1984 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
1985 options::OPT_fno_profile_sample_use)))
1988 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
1993 case llvm::Reloc::Static:
1995 case llvm::Reloc::PIC_:
1997 case llvm::Reloc::DynamicNoPIC:
1998 return "dynamic-no-pic";
1999 case llvm::Reloc::ROPI:
2001 case llvm::Reloc::RWPI:
2003 case llvm::Reloc::ROPI_RWPI:
2006 llvm_unreachable(
"Unknown Reloc::Model kind");
2013std::tuple<llvm::Reloc::Model, unsigned, bool>
2021 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
2023 bool IsPICLevelTwo = PIC;
2026 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
2029 if (Triple.isAndroid()) {
2030 switch (Triple.getArch()) {
2031 case llvm::Triple::x86:
2032 case llvm::Triple::x86_64:
2034 IsPICLevelTwo =
true;
2044 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
2048 if (Triple.isOSOpenBSD()) {
2050 case llvm::Triple::arm:
2051 case llvm::Triple::aarch64:
2052 case llvm::Triple::mips64:
2053 case llvm::Triple::mips64el:
2054 case llvm::Triple::x86:
2055 case llvm::Triple::x86_64:
2056 IsPICLevelTwo =
false;
2059 case llvm::Triple::ppc:
2060 case llvm::Triple::sparcv9:
2061 IsPICLevelTwo =
true;
2073 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2074 options::OPT_fpic, options::OPT_fno_pic,
2075 options::OPT_fPIE, options::OPT_fno_PIE,
2076 options::OPT_fpie, options::OPT_fno_pie);
2077 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
2078 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
2079 options::OPT_fPIE, options::OPT_fpie)) {
2081 << LastPICArg->getSpelling() << Triple.str();
2082 if (Triple.getArch() == llvm::Triple::x86_64)
2083 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
2084 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2091 Option O = LastPICArg->getOption();
2092 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2093 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2094 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2096 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2098 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
2101 if (EffectiveTriple.isPS()) {
2102 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
2103 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
2104 if (Model !=
"kernel") {
2107 << LastPICArg->getSpelling()
2108 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
2118 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
2124 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
2125 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
2128 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2131 if (!Triple.isOSDarwin())
2133 << A->getSpelling() << Triple.str();
2142 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
2145 bool EmbeddedPISupported;
2146 switch (Triple.getArch()) {
2147 case llvm::Triple::arm:
2148 case llvm::Triple::armeb:
2149 case llvm::Triple::thumb:
2150 case llvm::Triple::thumbeb:
2151 EmbeddedPISupported =
true;
2154 EmbeddedPISupported =
false;
2158 bool ROPI =
false, RWPI =
false;
2159 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
2160 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
2161 if (!EmbeddedPISupported)
2163 << LastROPIArg->getSpelling() << Triple.str();
2166 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2167 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2168 if (!EmbeddedPISupported)
2170 << LastRWPIArg->getSpelling() << Triple.str();
2175 if ((ROPI || RWPI) && (PIC || PIE))
2178 if (Triple.isMIPS()) {
2185 if (ABIName ==
"n64")
2188 if(Args.hasArg(options::OPT_mno_abicalls))
2189 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2192 IsPICLevelTwo =
false;
2196 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2198 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2200 RelocM = llvm::Reloc::ROPI_RWPI;
2202 RelocM = llvm::Reloc::ROPI;
2204 RelocM = llvm::Reloc::RWPI;
2206 return std::make_tuple(RelocM, 0
U,
false);
2210 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
2211 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
2213 const llvm::opt::OptTable &Opts = D.
getOpts();
2214 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
2215 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
2216 D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
2218 return HasStaticPIE;
2238 const ArgList &Args) {
2239 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2240 options::OPT_falign_functions_EQ,
2241 options::OPT_fno_align_functions);
2242 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2245 if (A->getOption().matches(options::OPT_falign_functions))
2249 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2251 << A->getAsString(Args) << A->getValue();
2256 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2257 switch (DebugInfoKind) {
2258 case llvm::codegenoptions::DebugDirectivesOnly:
2259 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2261 case llvm::codegenoptions::DebugLineTablesOnly:
2262 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2264 case llvm::codegenoptions::DebugInfoConstructor:
2265 CmdArgs.push_back(
"-debug-info-kind=constructor");
2267 case llvm::codegenoptions::LimitedDebugInfo:
2268 CmdArgs.push_back(
"-debug-info-kind=limited");
2270 case llvm::codegenoptions::FullDebugInfo:
2271 CmdArgs.push_back(
"-debug-info-kind=standalone");
2273 case llvm::codegenoptions::UnusedTypeInfo:
2274 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2284 assert(A.getOption().matches(options::OPT_gN_Group) &&
2285 "Not a -g option that specifies a debug-info level");
2286 if (A.getOption().matches(options::OPT_g0) ||
2287 A.getOption().matches(options::OPT_ggdb0))
2288 return llvm::codegenoptions::NoDebugInfo;
2289 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2290 A.getOption().matches(options::OPT_ggdb1))
2291 return llvm::codegenoptions::DebugLineTablesOnly;
2292 if (A.getOption().matches(options::OPT_gline_directives_only))
2293 return llvm::codegenoptions::DebugDirectivesOnly;
2294 return llvm::codegenoptions::DebugInfoConstructor;
2298 const ArgList &Args) {
2299 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2305 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 6 ||
2308 << A->getAsString(Args) << A->getValue();
2313 return llvm::StringSwitch<unsigned>(ArgValue)
2314 .Case(
"-gdwarf-2", 2)
2315 .Case(
"-gdwarf-3", 3)
2316 .Case(
"-gdwarf-4", 4)
2317 .Case(
"-gdwarf-5", 5)
2318 .Case(
"-gdwarf-6", 6)
2323 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2324 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2325 options::OPT_gdwarf_6, options::OPT_gdwarf);
2329 const llvm::opt::ArgList &Args) {
2334 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2335 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2336 << GDwarfN->getSpelling() << TC.
getTriple().str();
2338 if (DwarfVersion == 0) {
2340 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2342 return DwarfVersion;
2346 const ArgList &Args, Arg *&Arg) {
2347 Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
2348 options::OPT_gno_split_dwarf);
2349 if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
2352 if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
2355 StringRef
Value = Arg->getValue();
2356 if (
Value ==
"split")
2358 if (
Value ==
"single")
2361 D.
Diag(diag::err_drv_unsupported_option_argument)
2362 << Arg->getSpelling() << Arg->getValue();
2368 assert(A &&
"Expected non-nullptr argument.");
2371 D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
2377 const ArgList &Args,
2378 ArgStringList &CmdArgs) {
2379 if (Args.hasFlag(options::OPT_fdebug_info_for_profiling,
2380 options::OPT_fno_debug_info_for_profiling,
false) &&
2382 Args.getLastArg(options::OPT_fdebug_info_for_profiling), Args, D, TC))
2383 CmdArgs.push_back(
"-fdebug-info-for-profiling");
2387 ArgStringList &CmdArgs) {
2388 llvm::Reloc::Model RelocationModel;
2393 if (RelocationModel != llvm::Reloc::Static)
2394 CmdArgs.push_back(
"-KPIC");
2400 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2406 const ArgList &Args) {
2407 if (Args.hasArg(options::OPT_static_libgcc) ||
2408 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2412 if (Args.hasArg(options::OPT_shared_libgcc))
2431 ArgStringList &CmdArgs,
const ArgList &Args) {
2435 CmdArgs.push_back(
"-l:libunwind.a");
2458 CmdArgs.push_back(
"-lgcc_eh");
2460 CmdArgs.push_back(
"-lgcc_s");
2468 CmdArgs.push_back(
"-lunwind");
2470 CmdArgs.push_back(
"-l:libunwind.a");
2473 CmdArgs.push_back(
"-l:libunwind.dll.a");
2475 CmdArgs.push_back(
"-l:libunwind.so");
2479 CmdArgs.push_back(
"-lunwind");
2489 ArgStringList &CmdArgs,
const ArgList &Args) {
2493 CmdArgs.push_back(
"-lgcc");
2497 CmdArgs.push_back(
"-lgcc");
2501 CmdArgs.push_back(
"--as-needed");
2503 CmdArgs.push_back(
"--no-as-needed");
2508 ArgStringList &CmdArgs,
const ArgList &Args) {
2519 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2522 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2523 if (A && A->getValue() != StringRef(
"platform")) {
2524 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2525 << A->getValue() <<
"MSVC";
2535 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2536 !Args.hasArg(options::OPT_static_pie))
2537 CmdArgs.push_back(
"-ldl");
2544 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2550 StringRef SaveStats = A->getValue();
2551 if (SaveStats ==
"obj" && Output.
isFilename()) {
2553 llvm::sys::path::remove_filename(StatsFile);
2554 }
else if (SaveStats !=
"cwd") {
2555 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2559 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2560 llvm::sys::path::append(StatsFile, BaseName);
2561 llvm::sys::path::replace_extension(StatsFile,
"stats");
2573 assert(Flag.front() ==
'-');
2575 Flags.push_back(Flag.str());
2577 Flags.push_back((
"!" + Flag.substr(1)).str());
2582 ArgStringList &CmdArgs,
bool IsLTO,
2583 const StringRef PluginOptPrefix) {
2584 auto addArg = [&, IsLTO](
const Twine &Arg) {
2586 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2587 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2589 CmdArgs.push_back(
"-mllvm");
2590 CmdArgs.push_back(Args.MakeArgString(Arg));
2594 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2595 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2597 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2598 StringRef
Value = A->getValue();
2600 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2601 !llvm::isPowerOf2_64(Boundary)) {
2602 D.
Diag(diag::err_drv_invalid_argument_to_option)
2603 <<
Value << A->getOption().getName();
2605 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2608 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2609 std::string AlignBranch;
2610 for (StringRef T : A->getValues()) {
2611 if (T !=
"fused" && T !=
"jcc" && T !=
"jmp" && T !=
"call" &&
2612 T !=
"ret" && T !=
"indirect")
2613 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2614 << T <<
"fused, jcc, jmp, call, ret, indirect";
2615 if (!AlignBranch.empty())
2619 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2621 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2622 StringRef
Value = A->getValue();
2623 unsigned PrefixSize;
2624 if (
Value.getAsInteger(10, PrefixSize)) {
2625 D.
Diag(diag::err_drv_invalid_argument_to_option)
2626 <<
Value << A->getOption().getName();
2628 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2654 llvm::opt::ArgStringList &CC1Args,
2656 StringRef Lib, StringRef
Arch, StringRef
Target,
2657 bool isBitCodeSDL) {
2660 std::string LibDeviceLoc =
"/libdevice";
2661 std::string LibBcPrefix =
"/libbc-";
2662 std::string LibPrefix =
"/lib";
2679 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2680 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2682 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2683 Twine(Lib +
"-" +
Arch).str(), Twine(Lib).str()}) {
2684 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2685 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2695 const auto *Ext =
".a";
2697 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2698 Twine(Lib +
"-" +
Arch).str()}) {
2699 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2700 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2711 bool FoundSDL =
false;
2712 for (
auto LPath : LibraryPaths) {
2713 for (
auto SDL : SDLs) {
2714 auto FullName = Twine(LPath + SDL).str();
2715 if (llvm::sys::fs::exists(FullName)) {
2716 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2733 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2734 llvm::opt::ArgStringList &CC1Args,
2736 StringRef
Arch, StringRef
Target,
bool isBitCodeSDL) {
2739 if (isBitCodeSDL &&
Arch.contains(
"nvptx"))
2742 bool FoundAOB =
false;
2743 std::string ArchiveOfBundles;
2746 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2747 auto Ext = IsMSVC ?
".lib" :
".a";
2748 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2749 if (llvm::sys::fs::exists(Lib)) {
2750 ArchiveOfBundles = Lib;
2754 Lib.consume_front(
"-l");
2755 for (
auto LPath : LibraryPaths) {
2756 ArchiveOfBundles.clear();
2757 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2758 : IsMSVC ? Lib + Ext
2759 :
"lib" + Lib + Ext)
2761 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2762 auto AOB = Twine(LPath + Prefix + LibFile).str();
2763 if (llvm::sys::fs::exists(AOB)) {
2764 ArchiveOfBundles = AOB;
2777 llvm::file_magic Magic;
2778 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2779 if (EC || Magic != llvm::file_magic::archive)
2782 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2783 std::string OutputLib =
2789 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2793 DeviceTriple +=
'-';
2794 std::string NormalizedTriple = T.getToolChain().getTriple().normalize(
2795 llvm::Triple::CanonicalForm::FOUR_IDENT);
2796 DeviceTriple += NormalizedTriple;
2798 DeviceTriple +=
'-';
2802 std::string UnbundleArg(
"-unbundle");
2803 std::string TypeArg(
"-type=a");
2804 std::string InputArg(
"-input=" + ArchiveOfBundles);
2805 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2806 std::string OutputArg(
"-output=" + OutputLib);
2808 const char *UBProgram = DriverArgs.MakeArgString(
2809 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2811 ArgStringList UBArgs;
2812 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2813 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2814 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2815 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2816 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2820 std::string AdditionalArgs(
"-allow-missing-bundles");
2821 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2826 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2827 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2829 C.addCommand(std::make_unique<Command>(
2831 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2833 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2840 const llvm::opt::ArgList &DriverArgs,
2841 llvm::opt::ArgStringList &CC1Args,
2843 bool isBitCodeSDL) {
2874 const llvm::opt::ArgList &DriverArgs,
2875 llvm::opt::ArgStringList &CC1Args,
2877 bool isBitCodeSDL) {
2881 std::optional<std::string> LibPath =
2882 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2885 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2886 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2887 for (StringRef Path : Frags)
2888 LibraryPaths.emplace_back(Path.trim());
2892 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2893 LibraryPaths.emplace_back(Search_Dir);
2897 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2898 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2901 llvm::SmallSet<std::string, 16> SDLNames;
2902 static const StringRef HostOnlyArchives[] = {
2903 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2904 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2905 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2906 SDLNames.insert(std::string(
"-l") + SDLName);
2910 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2917 const StringRef LibFileExt =
".lib";
2918 if (!llvm::sys::path::has_extension(
FileName) ||
2920 llvm::sys::path::extension(
FileName).drop_front()) ==
2922 llvm::sys::path::extension(
FileName) == LibFileExt)
2923 SDLNames.insert(Input);
2930 for (
auto SDLName : SDLNames) {
2941static llvm::opt::Arg *
2943 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2947 const llvm::opt::ArgList &Args) {
2948 const unsigned MinCodeObjVer = 4;
2949 const unsigned MaxCodeObjVer = 6;
2952 if (CodeObjArg->getOption().getID() ==
2953 options::OPT_mcode_object_version_EQ) {
2954 unsigned CodeObjVer = MaxCodeObjVer;
2956 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2957 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2958 D.
Diag(diag::err_drv_invalid_int_value)
2959 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2965 const llvm::opt::ArgList &Args) {
2966 unsigned CodeObjVer = 6;
2968 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2973 const Driver &D,
const llvm::opt::ArgList &Args) {
2978 const llvm::opt::ArgList &Args,
2979 llvm::opt::ArgStringList &CmdArgs,
2980 const llvm::Triple &Triple,
bool IsLTO,
2981 const StringRef PluginOptPrefix) {
2982 auto addArg = [&, IsLTO](
const Twine &Arg) {
2984 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2985 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2987 CmdArgs.push_back(
"-mllvm");
2988 CmdArgs.push_back(Args.MakeArgString(Arg));
2992 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2993 options::OPT_mno_outline)) {
2994 if (A->getOption().matches(options::OPT_moutline)) {
2998 if (Triple.isARM() || Triple.isThumb() || Triple.isAArch64() ||
2999 Triple.isRISCV() || Triple.isX86()) {
3000 addArg(Twine(
"-enable-machine-outliner"));
3002 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
3008 CmdArgs.push_back(
"-mno-outline");
3011 addArg(Twine(
"-enable-machine-outliner=never"));
3015 auto *CodeGenDataGenArg =
3016 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
3017 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
3020 if (CodeGenDataGenArg && CodeGenDataUseArg)
3021 D.
Diag(diag::err_drv_argument_not_allowed_with)
3022 << CodeGenDataGenArg->getAsString(Args)
3023 << CodeGenDataUseArg->getAsString(Args);
3027 if (CodeGenDataGenArg)
3028 addArg(Twine(
"-codegen-data-generate"));
3031 if (CodeGenDataUseArg)
3032 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
3036 const llvm::opt::ArgList &DriverArgs,
3037 llvm::opt::ArgStringList &CC1Args,
3038 StringRef BitcodeSuffix,
3039 const llvm::Triple &Triple,
3044 std::optional<std::string> LibPath =
3045 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
3048 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
3049 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
3050 for (StringRef Path : Frags)
3051 LibraryPaths.emplace_back(Path.trim());
3056 LibraryPaths.emplace_back(LibPath);
3060 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
3061 LibraryPaths.emplace_back(P);
3063 OptSpecifier LibomptargetBCPathOpt =
3064 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
3065 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
3066 : options::OPT_libomptarget_spirv_bc_path_EQ;
3068 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
3069 : Triple.isNVPTX() ?
"nvptx"
3071 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
3074 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
3076 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
3077 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
3078 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3081 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3082 CC1Args.push_back(
"-mlink-builtin-bitcode");
3083 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3085 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
3086 << LibOmpTargetFile;
3089 bool FoundBCLibrary =
false;
3091 for (StringRef LibraryPath : LibraryPaths) {
3093 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3094 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3095 CC1Args.push_back(
"-mlink-builtin-bitcode");
3096 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3097 FoundBCLibrary =
true;
3102 if (!FoundBCLibrary)
3103 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
3104 << LibOmpTargetName << ArchPrefix;
3109 const llvm::opt::ArgList &DriverArgs,
3110 llvm::opt::ArgStringList &CC1Args) {
3112 StringRef LibclcNamespec;
3113 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
3116 LibclcNamespec = A->getValue();
3118 if (!TT.isAMDGPU() || TT.getEnvironment() != llvm::Triple::LLVM)
3122 if (DriverArgs.hasArg(options::OPT_no_offloadlib,
3123 options::OPT_nodefaultlibs, options::OPT_nostdlib))
3127 bool FilenameSearch = LibclcNamespec.consume_front(
":");
3128 if (FilenameSearch) {
3130 if (D.
getVFS().exists(LibclcFile)) {
3131 CC1Args.push_back(
"-mlink-builtin-bitcode");
3132 CC1Args.push_back(DriverArgs.MakeArgString(LibclcFile));
3135 D.
Diag(diag::err_drv_libclc_not_found) << LibclcFile;
3141 llvm::sys::path::append(BasePath,
"lib");
3146 if (
const Arg *CPUArg = DriverArgs.getLastArg(options::OPT_mcpu_EQ)) {
3147 StringRef CPU = CPUArg->getValue();
3150 llvm::sys::path::append(CPUPath, CPU,
"libclc.bc");
3151 if (D.
getVFS().exists(CPUPath)) {
3152 CC1Args.push_back(
"-mlink-builtin-bitcode");
3153 CC1Args.push_back(DriverArgs.MakeArgString(CPUPath));
3161 llvm::sys::path::append(GenericPath,
"libclc.bc");
3162 if (D.
getVFS().exists(GenericPath)) {
3163 CC1Args.push_back(
"-mlink-builtin-bitcode");
3164 CC1Args.push_back(DriverArgs.MakeArgString(GenericPath));
3168 D.
Diag(diag::err_drv_libclc_not_found) <<
"libclc.bc";
3172 const llvm::opt::ArgList &Args,
3173 llvm::opt::ArgStringList &CmdArgs,
3174 const llvm::Triple &Triple) {
3175 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3176 options::OPT_mno_outline_atomics)) {
3178 if (!Triple.isAArch64()) {
3179 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3180 << Triple.getArchName() << A->getOption().getName();
3182 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3183 CmdArgs.push_back(
"-target-feature");
3184 CmdArgs.push_back(
"+outline-atomics");
3186 CmdArgs.push_back(
"-target-feature");
3187 CmdArgs.push_back(
"-outline-atomics");
3191 CmdArgs.push_back(
"-target-feature");
3192 CmdArgs.push_back(
"+outline-atomics");
3197 llvm::opt::ArgStringList &CmdArgs) {
3198 if (TCArgs.hasFlag(options::OPT_offload_compress,
3199 options::OPT_no_offload_compress,
false))
3200 CmdArgs.push_back(
"--compress");
3201 if (TCArgs.hasArg(options::OPT_v))
3202 CmdArgs.push_back(
"--verbose");
3203 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3205 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3209 const llvm::Triple &Triple,
3210 const llvm::Reloc::Model &RelocationModel,
3211 llvm::opt::ArgStringList &CmdArgs) {
3212 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3213 StringRef CM = A->getValue();
3215 if (Triple.isOSAIX() && CM ==
"medium")
3217 if (Triple.isAArch64(64)) {
3218 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3219 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3220 RelocationModel != llvm::Reloc::Static)
3221 D.
Diag(diag::err_drv_argument_only_allowed_with)
3222 << A->getAsString(Args) <<
"-fno-pic";
3223 }
else if (Triple.isLoongArch()) {
3224 if (CM ==
"extreme" &&
3225 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3226 D.
Diag(diag::err_drv_argument_not_allowed_with)
3227 << A->getAsString(Args) <<
"-fplt";
3228 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3231 CM = llvm::StringSwitch<StringRef>(CM)
3232 .Case(
"normal",
"small")
3233 .Case(
"extreme",
"large")
3235 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3236 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3237 }
else if (Triple.isRISCV()) {
3239 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3240 D.
Diag(diag::err_drv_argument_not_allowed_with)
3241 << A->getAsString(Args) <<
"-fpic";
3244 else if (CM ==
"medany")
3246 Ok = CM ==
"small" || CM ==
"medium" ||
3247 (CM ==
"large" && Triple.isRISCV64());
3248 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3249 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3250 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3254 }
else if (Triple.isSPARC64()) {
3257 else if (CM ==
"medmid")
3259 else if (CM ==
"medany")
3261 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3262 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3263 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3266 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3268 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3269 << A->getSpelling() << CM << Triple.getTriple();
3273 if (Triple.getArch() == llvm::Triple::x86_64) {
3274 bool IsMediumCM =
false;
3275 bool IsLargeCM =
false;
3276 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3277 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3278 IsLargeCM = StringRef(A->getValue()) ==
"large";
3280 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3281 if (!IsMediumCM && !IsLargeCM) {
3282 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3283 << A->getOption().getRenderName();
3285 A->render(Args, CmdArgs);
3287 }
else if (IsMediumCM) {
3288 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3289 }
else if (IsLargeCM) {
3290 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3296 ArgStringList &CmdArgs) {
3301 Args.getLastArg(options::OPT_fcolor_diagnostics,
3302 options::OPT_fno_color_diagnostics);
3303 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3304 StringRef
Value(A->getValue());
3306 D.
Diag(diag::err_drv_invalid_argument_to_option)
3307 <<
Value << A->getOption().getName();
3311 CmdArgs.push_back(
"-fcolor-diagnostics");
3316 for (; *Arg; ++Arg) {
3322 Res.push_back(
'\\');
3325 Res.push_back(*Arg);
3330 const llvm::opt::ArgList &Args) {
3334 llvm::opt::ArgStringList OriginalArgs;
3335 for (
const auto &Arg : Args)
3336 Arg->render(Args, OriginalArgs);
3340 for (
const char *OriginalArg : OriginalArgs) {
3344 Flags += EscapedArg;
3347 return Args.MakeArgString(Flags);
3351 const llvm::opt::ArgList &Args,
3352 bool &FRecordCommandLine,
3353 bool &GRecordCommandLine,
3354 bool &DXRecordCommandLine) {
3357 const std::string &TripleStr = Triple.getTriple();
3359 FRecordCommandLine =
3360 Args.hasFlag(options::OPT_frecord_command_line,
3361 options::OPT_fno_record_command_line,
false);
3362 GRecordCommandLine =
3363 Args.hasFlag(options::OPT_grecord_command_line,
3364 options::OPT_gno_record_command_line,
false);
3365 DXRecordCommandLine = Triple.isDXIL() && Args.hasArg(options::OPT_g_Flag);
3366 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3367 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3368 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3369 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3373 DXRecordCommandLine;
3377 ArgStringList &CmdArgs,
3378 const llvm::Triple &Triple) {
3379 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
3380 options::OPT_fno_global_isel)) {
3381 CmdArgs.push_back(
"-mllvm");
3382 if (A->getOption().matches(options::OPT_fglobal_isel)) {
3383 CmdArgs.push_back(
"-global-isel=1");
3388 bool IsArchSupported = Triple.getArch() == llvm::Triple::aarch64;
3389 bool IsOptLevelSupported =
false;
3391 Arg *A = Args.getLastArg(options::OPT_O_Group);
3392 if (IsArchSupported) {
3393 if (!A || A->getOption().matches(options::OPT_O0))
3394 IsOptLevelSupported =
true;
3396 if (!IsArchSupported || !IsOptLevelSupported) {
3397 CmdArgs.push_back(
"-mllvm");
3398 CmdArgs.push_back(
"-global-isel-abort=2");
3400 if (!IsArchSupported)
3401 D.
Diag(diag::warn_drv_global_isel_incomplete) << Triple.getArchName();
3403 D.
Diag(diag::warn_drv_global_isel_incomplete_opt);
3406 CmdArgs.push_back(
"-global-isel=0");
3412 ArgStringList &CmdArgs,
3413 bool IsMSVCCompat) {
3414 bool use_fwrapv = IsMSVCCompat;
3415 bool use_fwrapv_pointer =
false;
3416 for (
const Arg *A : Args.filtered(
3417 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3418 options::OPT_fwrapv, options::OPT_fno_wrapv,
3419 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3421 switch (A->getOption().getID()) {
3422 case options::OPT_fstrict_overflow:
3424 use_fwrapv_pointer =
false;
3426 case options::OPT_fno_strict_overflow:
3428 use_fwrapv_pointer =
true;
3430 case options::OPT_fwrapv:
3433 case options::OPT_fno_wrapv:
3436 case options::OPT_fwrapv_pointer:
3437 use_fwrapv_pointer =
true;
3439 case options::OPT_fno_wrapv_pointer:
3440 use_fwrapv_pointer =
false;
3446 CmdArgs.push_back(
"-fwrapv");
3447 if (!use_fwrapv && IsMSVCCompat)
3448 CmdArgs.push_back(
"-fno-wrapv");
3449 if (use_fwrapv_pointer)
3450 CmdArgs.push_back(
"-fwrapv-pointer");
3457 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3458 if (A->getOption().matches(options::OPT_O4) ||
3459 A->getOption().matches(options::OPT_Ofast))
3462 if (A->getOption().matches(options::OPT_O0))
3465 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3468 StringRef S(A->getValue());
3476 unsigned OptLevel = 0;
3477 if (S.getAsInteger(10, OptLevel))
3480 return OptLevel > 1;
3487 ArgStringList &CmdArgs) {
3489 if (Args.hasFlag(options::OPT_fvectorize, options::OPT_fno_vectorize,
3491 CmdArgs.push_back(
"-vectorize-loops");
3495 ArgStringList &CmdArgs) {
3497 if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize,
3499 CmdArgs.push_back(
"-vectorize-slp");
3503 ArgStringList &CmdArgs) {
3504 if (Args.hasFlag(options::OPT_floop_interchange,
3505 options::OPT_fno_loop_interchange,
false))
3506 CmdArgs.push_back(
"-floop-interchange");
3527 llvm_unreachable(
"Fully covered switch above");
3533 if (!ComplexRangeStr.empty())
3534 return "-complex-range=" + ComplexRangeStr;
3535 return ComplexRangeStr;
3555 if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
3556 (LastOpt ==
"-fcx-limited-range" && NewOpt ==
"-fno-cx-limited-range") ||
3557 (LastOpt ==
"-fno-cx-limited-range" && NewOpt ==
"-fcx-limited-range") ||
3558 (LastOpt ==
"-fcx-fortran-rules" && NewOpt ==
"-fno-cx-fortran-rules") ||
3559 (LastOpt ==
"-fno-cx-fortran-rules" && NewOpt ==
"-fcx-fortran-rules") ||
3560 (LastOpt ==
"-ffast-math" && NewOpt ==
"-fno-fast-math") ||
3561 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-ffast-math") ||
3562 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-fno-fast-math") ||
3563 (LastOpt.starts_with(
"-ffp-model=") &&
3564 NewOpt.starts_with(
"-ffp-model=")) ||
3565 (LastOpt.starts_with(
"-fcomplex-arithmetic=") &&
3566 NewOpt.starts_with(
"-fcomplex-arithmetic=")))
3569 D.
Diag(clang::diag::warn_drv_overriding_complex_range)
3589 const ArgStringList &LinkerInputs,
3591 const llvm::opt::ArgList &Args,
3592 const char *OutputFilename) {
3596 assert(!LinkerInputs.empty() && !JobInputs.empty() &&
3597 "Must have at least one input.");
3599 ArgStringList LlvmLinkArgs(
3600 {
"-o", OutputFilename ? OutputFilename : Output.
getFilename()});
3602 LlvmLinkArgs.append(LinkerInputs);
3605 const char *LlvmLink = Args.MakeArgString(TC.
GetProgramPath(
"llvm-link"));
3607 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...
const char * 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)
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
static constexpr ResponseFileSupport AtFileCurCP()