28#include "clang/Config/config.h"
39#include "llvm/ADT/STLExtras.h"
40#include "llvm/ADT/SmallSet.h"
41#include "llvm/ADT/SmallString.h"
42#include "llvm/ADT/StringExtras.h"
43#include "llvm/ADT/StringSwitch.h"
44#include "llvm/ADT/Twine.h"
45#include "llvm/BinaryFormat/Magic.h"
46#include "llvm/Config/llvm-config.h"
47#include "llvm/Option/Arg.h"
48#include "llvm/Option/ArgList.h"
49#include "llvm/Option/Option.h"
50#include "llvm/Support/CodeGen.h"
51#include "llvm/Support/Compression.h"
52#include "llvm/Support/ErrorHandling.h"
53#include "llvm/Support/FileSystem.h"
54#include "llvm/Support/Path.h"
55#include "llvm/Support/Process.h"
56#include "llvm/Support/Program.h"
57#include "llvm/Support/Threading.h"
58#include "llvm/Support/VirtualFileSystem.h"
59#include "llvm/Support/YAMLParser.h"
60#include "llvm/TargetParser/Host.h"
61#include "llvm/TargetParser/PPCTargetParser.h"
62#include "llvm/TargetParser/TargetParser.h"
71 const llvm::Triple &Triple) {
72 if (Args.hasArg(options::OPT_pg) && !Args.hasArg(options::OPT_mfentry))
75 if (Triple.isAndroid())
78 switch (Triple.getArch()) {
79 case llvm::Triple::xcore:
80 case llvm::Triple::wasm32:
81 case llvm::Triple::wasm64:
82 case llvm::Triple::msp430:
86 case llvm::Triple::ppc:
87 case llvm::Triple::ppcle:
88 case llvm::Triple::ppc64:
89 case llvm::Triple::ppc64le:
90 case llvm::Triple::riscv32:
91 case llvm::Triple::riscv64:
92 case llvm::Triple::sparc:
93 case llvm::Triple::sparcel:
94 case llvm::Triple::sparcv9:
95 case llvm::Triple::amdgcn:
96 case llvm::Triple::r600:
97 case llvm::Triple::csky:
98 case llvm::Triple::loongarch32:
99 case llvm::Triple::loongarch64:
100 case llvm::Triple::m68k:
106 if (Triple.isOSFuchsia() || Triple.isOSNetBSD()) {
110 if (Triple.isOSLinux() || Triple.isOSHurd()) {
111 switch (Triple.getArch()) {
113 case llvm::Triple::arm:
114 case llvm::Triple::armeb:
115 case llvm::Triple::thumb:
116 case llvm::Triple::thumbeb:
117 case llvm::Triple::mips64:
118 case llvm::Triple::mips64el:
119 case llvm::Triple::mips:
120 case llvm::Triple::mipsel:
121 case llvm::Triple::systemz:
122 case llvm::Triple::x86:
123 case llvm::Triple::x86_64:
130 if (Triple.isOSWindows()) {
131 switch (Triple.getArch()) {
132 case llvm::Triple::x86:
134 case llvm::Triple::x86_64:
135 return Triple.isOSBinFormatMachO();
136 case llvm::Triple::arm:
137 case llvm::Triple::thumb:
154 if (Triple.isAArch64() || Triple.isPS() || Triple.isVE() ||
155 (Triple.isAndroid() && !Triple.isARM()))
158 if ((Triple.isARM() || Triple.isThumb()) && Triple.isOSBinFormatMachO())
165 switch (Triple.getArch()) {
168 case llvm::Triple::arm:
169 case llvm::Triple::thumb:
172 return Triple.isOSDarwin();
179 const llvm::Triple &Triple) {
180 switch (Triple.getArch()) {
183 case llvm::Triple::arm:
184 case llvm::Triple::armeb:
185 case llvm::Triple::thumb:
186 case llvm::Triple::thumbeb:
190 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
191 StringRef
V = A->getValue();
196 case llvm::Triple::aarch64:
200 return Triple.isOSWindows();
207 const llvm::Triple &Triple) {
208 if (Triple.isARM() || Triple.isThumb()) {
212 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
213 StringRef
V = A->getValue();
214 return V ==
"aapcs+leaf";
223 const llvm::Triple &Triple) {
265 Args.hasFlag(options::OPT_fno_omit_frame_pointer,
266 options::OPT_fomit_frame_pointer, DefaultFP);
272 Args.hasFlag(options::OPT_mno_omit_leaf_frame_pointer,
273 options::OPT_momit_leaf_frame_pointer, DefaultLeafFP);
275 bool FPRegReserved = Args.hasFlag(options::OPT_mreserve_frame_pointer_reg,
276 options::OPT_mno_reserve_frame_pointer_reg,
294 const StringRef PluginOptPrefix) {
295 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
296 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
297 "-pass-remarks=" + A->getValue()));
299 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
300 CmdArgs.push_back(Args.MakeArgString(
301 Twine(PluginOptPrefix) +
"-pass-remarks-missed=" + A->getValue()));
303 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
304 CmdArgs.push_back(Args.MakeArgString(
305 Twine(PluginOptPrefix) +
"-pass-remarks-analysis=" + A->getValue()));
309 const llvm::Triple &Triple,
312 const StringRef PluginOptPrefix) {
313 StringRef Format =
"yaml";
314 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
315 Format = A->getValue();
319 Args.getLastArg(options::OPT_foptimization_record_file_EQ)) {
322 }
else if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
329 assert(!F.empty() &&
"Cannot determine remarks output name.");
331 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
332 "opt-remarks-filename=" + F +
"opt.ld." +
336 Args.getLastArg(options::OPT_foptimization_record_passes_EQ))
337 CmdArgs.push_back(Args.MakeArgString(
338 Twine(PluginOptPrefix) +
"opt-remarks-passes=" + A->getValue()));
340 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
341 "opt-remarks-format=" + Format.data()));
345 ArgStringList &CmdArgs,
346 const StringRef PluginOptPrefix) {
347 if (Args.hasFlag(options::OPT_fdiagnostics_show_hotness,
348 options::OPT_fno_diagnostics_show_hotness,
false))
349 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
350 "opt-remarks-with-hotness"));
353 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ))
355 Args.MakeArgString(Twine(PluginOptPrefix) +
356 "opt-remarks-hotness-threshold=" + A->getValue()));
361 StringRef Processor) {
365 auto GPUKind =
T.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Processor)
366 : llvm::AMDGPU::parseArchR600(Processor);
367 auto GPUFeatures =
T.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind)
368 : llvm::AMDGPU::getArchAttrR600(GPUKind);
369 if (GPUFeatures & llvm::AMDGPU::FEATURE_WGP)
371 return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode);
376 if (D.
getVFS().exists(Path))
377 Paths.push_back(Path.str());
381 const llvm::Triple &Triple,
383 std::vector<StringRef> &Features,
384 OptSpecifier Group) {
385 std::set<StringRef> Warned;
386 for (
const Arg *A : Args.filtered(Group)) {
387 StringRef Name = A->getOption().getName();
391 assert(Name.starts_with(
"m") &&
"Invalid feature name.");
392 Name = Name.substr(1);
396 if (Warned.count(Name) == 0) {
398 clang::diag::warn_drv_unsupported_option_for_processor)
399 << A->getAsString(Args) << Proc;
405 bool IsNegative = Name.consume_front(
"no-");
407 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
415 llvm::DenseSet<StringRef> UsedFeatures;
416 for (StringRef
Feature : llvm::reverse(Features)) {
417 if (UsedFeatures.insert(
Feature.drop_front()).second)
418 UnifiedFeatures.insert(UnifiedFeatures.begin(),
Feature);
421 return UnifiedFeatures;
425 const char *ArgName,
const char *EnvVar) {
426 const char *DirList = ::getenv(EnvVar);
427 bool CombinedArg =
false;
432 StringRef Name(ArgName);
433 if (Name ==
"-I" || Name ==
"-L" || Name.empty())
436 StringRef Dirs(DirList);
440 StringRef::size_type Delim;
441 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
444 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
446 CmdArgs.push_back(ArgName);
447 CmdArgs.push_back(
".");
452 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
454 CmdArgs.push_back(ArgName);
455 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
458 Dirs = Dirs.substr(Delim + 1);
463 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
465 CmdArgs.push_back(ArgName);
466 CmdArgs.push_back(
".");
470 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
472 CmdArgs.push_back(ArgName);
473 CmdArgs.push_back(Args.MakeArgString(Dirs));
479 const ArgList &Args, ArgStringList &CmdArgs,
485 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
492 for (
const auto &II : Inputs) {
496 if (
auto *IA = II.getAction())
506 if (II.isFilename()) {
507 CmdArgs.push_back(II.getFilename());
516 const Arg &A = II.getInputArg();
519 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
521 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
524 else if (A.getOption().matches(options::OPT_rpath) &&
528 A.renderAsInput(Args, CmdArgs);
530 if (
const Arg *A = Args.getLastArg(options::OPT_fveclib)) {
531 const llvm::Triple &Triple = TC.
getTriple();
532 StringRef
V = A->getValue();
533 if (
V ==
"ArmPL" && (Triple.isOSLinux() || Triple.isOSDarwin())) {
551 if (Triple.isOSLinux()) {
552 CmdArgs.push_back(Args.MakeArgString(
"--push-state"));
553 CmdArgs.push_back(Args.MakeArgString(
"--as-needed"));
555 if (!Args.hasArg(options::OPT_nostdlib))
556 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
557 CmdArgs.push_back(Args.MakeArgString(
"-lamath"));
558 if (!Args.hasArg(options::OPT_nostdlib))
559 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
560 if (Triple.isOSLinux())
561 CmdArgs.push_back(Args.MakeArgString(
"--pop-state"));
568 switch (
T.getArch()) {
569 case llvm::Triple::x86:
573 case llvm::Triple::aarch64:
574 if (
T.isOSManagarm())
575 return "aarch64managarm";
578 return "aarch64linux";
579 case llvm::Triple::aarch64_be:
581 return "aarch64elfb";
582 return "aarch64linuxb";
583 case llvm::Triple::arm:
584 case llvm::Triple::thumb:
585 case llvm::Triple::armeb:
586 case llvm::Triple::thumbeb: {
589 return IsBigEndian ?
"armelfb" :
"armelf";
590 return IsBigEndian ?
"armelfb_linux_eabi" :
"armelf_linux_eabi";
592 case llvm::Triple::m68k:
594 case llvm::Triple::ppc:
596 return "elf32ppclinux";
598 case llvm::Triple::ppcle:
600 return "elf32lppclinux";
602 case llvm::Triple::ppc64:
604 case llvm::Triple::ppc64le:
606 case llvm::Triple::riscv32:
607 return "elf32lriscv";
608 case llvm::Triple::riscv64:
609 return "elf64lriscv";
610 case llvm::Triple::sparc:
611 case llvm::Triple::sparcel:
612 return "elf32_sparc";
613 case llvm::Triple::sparcv9:
614 return "elf64_sparc";
615 case llvm::Triple::loongarch32:
616 return "elf32loongarch";
617 case llvm::Triple::loongarch64:
618 return "elf64loongarch";
619 case llvm::Triple::mips:
620 return "elf32btsmip";
621 case llvm::Triple::mipsel:
622 return "elf32ltsmip";
623 case llvm::Triple::mips64:
625 return "elf32btsmipn32";
626 return "elf64btsmip";
627 case llvm::Triple::mips64el:
629 return "elf32ltsmipn32";
630 return "elf64ltsmip";
631 case llvm::Triple::systemz:
633 case llvm::Triple::x86_64:
635 return "elf32_x86_64";
637 case llvm::Triple::ve:
639 case llvm::Triple::csky:
640 return "cskyelf_linux";
647 const ToolChain &TC,
const llvm::opt::ArgList &Args,
648 llvm::opt::ArgStringList &CmdArgs) {
654 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
655 StringRef
V = A->getValue();
656 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
657 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
659 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
660 << A->getSpelling() <<
V;
665 std::vector<StringRef> &Features,
666 OptSpecifier OnOpt, OptSpecifier OffOpt,
667 StringRef FeatureName) {
668 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
669 if (A->getOption().matches(OnOpt))
670 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
672 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
678 const ArgList &Args) {
679 Arg *MArch = Args.getLastArg(options::OPT_march_EQ);
680 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
682 return llvm::StringSwitch<std::string>(GPUName)
683 .Cases({
"rv630",
"rv635"},
"r600")
684 .Cases({
"rv610",
"rv620",
"rs780"},
"rs880")
685 .Case(
"rv740",
"rv770")
686 .Case(
"palm",
"cedar")
687 .Cases({
"sumo",
"sumo2"},
"sumo")
688 .Case(
"hemlock",
"cypress")
689 .Case(
"aruba",
"cayman")
690 .Default(GPUName.str());
698 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
699 return A->getValue();
707 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
708 StringRef CPU = A->getValue();
714 return llvm::sys::getHostCPUName();
724 const llvm::Triple &
T,
bool FromAs) {
727 switch (
T.getArch()) {
731 case llvm::Triple::aarch64:
732 case llvm::Triple::aarch64_32:
733 case llvm::Triple::aarch64_be:
736 case llvm::Triple::arm:
737 case llvm::Triple::armeb:
738 case llvm::Triple::thumb:
739 case llvm::Triple::thumbeb: {
740 StringRef MArch, MCPU;
745 case llvm::Triple::avr:
746 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
747 return A->getValue();
750 case llvm::Triple::m68k:
753 case llvm::Triple::mips:
754 case llvm::Triple::mipsel:
755 case llvm::Triple::mips64:
756 case llvm::Triple::mips64el: {
760 return std::string(CPUName);
763 case llvm::Triple::nvptx:
764 case llvm::Triple::nvptx64:
765 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
766 return A->getValue();
769 case llvm::Triple::ppc:
770 case llvm::Triple::ppcle:
771 case llvm::Triple::ppc64:
772 case llvm::Triple::ppc64le:
773 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
775 llvm::PPC::getNormalizedPPCTargetCPU(
T, A->getValue()));
776 return std::string(llvm::PPC::getNormalizedPPCTargetCPU(
T));
778 case llvm::Triple::csky:
779 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
780 return A->getValue();
781 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
782 return A->getValue();
785 case llvm::Triple::riscv32:
786 case llvm::Triple::riscv64:
789 case llvm::Triple::bpfel:
790 case llvm::Triple::bpfeb:
791 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
792 return A->getValue();
795 case llvm::Triple::sparc:
796 case llvm::Triple::sparcel:
797 case llvm::Triple::sparcv9:
800 case llvm::Triple::x86:
801 case llvm::Triple::x86_64:
804 case llvm::Triple::hexagon:
808 case llvm::Triple::lanai:
811 case llvm::Triple::systemz:
814 case llvm::Triple::r600:
815 case llvm::Triple::amdgcn:
818 case llvm::Triple::wasm32:
819 case llvm::Triple::wasm64:
822 case llvm::Triple::loongarch32:
823 case llvm::Triple::loongarch64:
826 case llvm::Triple::xtensa:
827 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
828 return A->getValue();
834 const llvm::Triple &Triple,
836 std::vector<StringRef> &Features) {
838 options::OPT_m_wasm_Features_Group);
842 const ArgList &Args, ArgStringList &CmdArgs,
843 bool ForAS,
bool IsAux) {
844 std::vector<StringRef> Features;
845 switch (Triple.getArch()) {
848 case llvm::Triple::mips:
849 case llvm::Triple::mipsel:
850 case llvm::Triple::mips64:
851 case llvm::Triple::mips64el:
854 case llvm::Triple::arm:
855 case llvm::Triple::armeb:
856 case llvm::Triple::thumb:
857 case llvm::Triple::thumbeb:
860 case llvm::Triple::ppc:
861 case llvm::Triple::ppcle:
862 case llvm::Triple::ppc64:
863 case llvm::Triple::ppc64le:
866 case llvm::Triple::riscv32:
867 case llvm::Triple::riscv64:
870 case llvm::Triple::systemz:
873 case llvm::Triple::aarch64:
874 case llvm::Triple::aarch64_32:
875 case llvm::Triple::aarch64_be:
878 case llvm::Triple::x86:
879 case llvm::Triple::x86_64:
882 case llvm::Triple::hexagon:
885 case llvm::Triple::wasm32:
886 case llvm::Triple::wasm64:
889 case llvm::Triple::sparc:
890 case llvm::Triple::sparcel:
891 case llvm::Triple::sparcv9:
894 case llvm::Triple::r600:
895 case llvm::Triple::amdgcn:
898 case llvm::Triple::nvptx:
899 case llvm::Triple::nvptx64:
902 case llvm::Triple::m68k:
905 case llvm::Triple::msp430:
908 case llvm::Triple::ve:
911 case llvm::Triple::csky:
914 case llvm::Triple::loongarch32:
915 case llvm::Triple::loongarch64:
921 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
922 CmdArgs.push_back(
Feature.data());
927 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
930 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
931 D.
Diag(diag::err_drv_invalid_int_value)
932 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
933 return LtoJobsArg->getValue();
938 return Triple.isPS();
942 const llvm::opt::ArgList &Args) {
944 Arg *A = Args.getLastArg(options::OPT_mtls_dialect_EQ);
946 return Triple.hasDefaultTLSDESC();
947 StringRef
V = A->getValue();
948 bool SupportedArgument =
false, EnableTLSDESC =
false;
949 bool Unsupported = !Triple.isOSBinFormatELF();
950 if (Triple.isLoongArch() || Triple.isRISCV()) {
951 SupportedArgument =
V ==
"desc" ||
V ==
"trad";
952 EnableTLSDESC =
V ==
"desc";
953 }
else if (Triple.isX86()) {
954 SupportedArgument =
V ==
"gnu" ||
V ==
"gnu2";
955 EnableTLSDESC =
V ==
"gnu2";
960 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
961 << A->getSpelling() << Triple.getTriple();
962 }
else if (!SupportedArgument) {
963 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument_for_target)
964 << A->getSpelling() <<
V << Triple.getTriple();
966 return EnableTLSDESC;
970 llvm::opt::ArgStringList &CmdArgs) {
971 if (Arg *A = Args.getLastArg(options::OPT_fthinlto_distributor_EQ)) {
973 Args.MakeArgString(
"--thinlto-distributor=" + Twine(A->getValue())));
975 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-remote-compiler=" +
978 CmdArgs.push_back(Args.MakeArgString(
979 "--thinlto-remote-compiler-prepend-arg=" + Twine(PA)));
982 Args.getAllArgValues(options::OPT_Xthinlto_distributor_EQ))
983 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-distributor-arg=" + A));
988 ArgStringList &CmdArgs,
const InputInfo &Output,
991 const bool IsOSAIX = Triple.isOSAIX();
992 const bool IsAMDGCN = Triple.isAMDGCN();
993 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ);
996 const bool IsFatLTO = Args.hasFlag(options::OPT_ffat_lto_objects,
997 options::OPT_fno_fat_lto_objects,
false);
998 const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
1000 assert(!Inputs.empty() &&
"Must have at least one input.");
1002 auto Input = llvm::find_if(
1004 if (Input == Inputs.end()) {
1007 Input = Inputs.begin();
1010 if (Linker !=
"lld" && Linker !=
"lld-link" &&
1011 llvm::sys::path::filename(LinkerPath) !=
"ld.lld" &&
1012 llvm::sys::path::stem(LinkerPath) !=
"ld.lld" && !Triple.isOSOpenBSD()) {
1016 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
1017 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
1020 CmdArgs.push_back(
"-plugin");
1023 const char *Suffix =
".dll";
1024#elif defined(__APPLE__)
1025 const char *Suffix =
".dylib";
1027 const char *Suffix =
".so";
1031 llvm::sys::path::native(Twine(D.
Dir) +
1032 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
1033 PluginName + Suffix,
1035 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
1040 CmdArgs.push_back(
"--fat-lto-objects");
1042 if (Args.hasArg(options::OPT_flto_partitions_EQ)) {
1044 StringRef A = Args.getLastArgValue(options::OPT_flto_partitions_EQ,
"8");
1045 if (A.getAsInteger(10,
Value) || (
Value < 1)) {
1046 Arg *Arg = Args.getLastArg(options::OPT_flto_partitions_EQ);
1047 D.
Diag(diag::err_drv_invalid_int_value)
1048 << Arg->getAsString(Args) << Arg->getValue();
1050 CmdArgs.push_back(Args.MakeArgString(
"--lto-partitions=" + A));
1054 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
1055 const char *ExtraDash = IsOSAIX ?
"-" :
"";
1056 const char *ParallelismOpt = IsOSAIX ?
"-threads=" :
"jobs=";
1061 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
1062 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1063 "-generate-arange-section"));
1067 Arg *ArgVecLib = Args.getLastArg(options::OPT_fveclib);
1068 if (ArgVecLib && ArgVecLib->getNumValues() == 1) {
1071 std::optional<StringRef> OptVal =
1072 llvm::StringSwitch<std::optional<StringRef>>(ArgVecLib->getValue())
1073 .Case(
"Accelerate",
"Accelerate")
1074 .Case(
"libmvec",
"LIBMVEC")
1075 .Case(
"AMDLIBM",
"AMDLIBM")
1076 .Case(
"MASSV",
"MASSV")
1077 .Case(
"SVML",
"SVML")
1078 .Case(
"SLEEF",
"sleefgnuabi")
1079 .Case(
"Darwin_libsystem_m",
"Darwin_libsystem_m")
1080 .Case(
"ArmPL",
"ArmPL")
1081 .Case(
"none",
"none")
1082 .Default(std::nullopt);
1085 CmdArgs.push_back(Args.MakeArgString(
1086 Twine(PluginOptPrefix) +
"-vector-library=" + OptVal.value()));
1096 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
1098 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1102 if (A->getOption().matches(options::OPT_O4) ||
1103 A->getOption().matches(options::OPT_Ofast))
1105 else if (A->getOption().matches(options::OPT_O)) {
1106 OOpt = A->getValue();
1109 else if (OOpt ==
"s" || OOpt ==
"z")
1111 }
else if (A->getOption().matches(options::OPT_O0))
1113 if (!OOpt.empty()) {
1115 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"O" + OOpt));
1117 CmdArgs.push_back(Args.MakeArgString(Twine(
"--lto-CGO") + OOpt));
1121 if (Args.hasArg(options::OPT_gsplit_dwarf)) {
1123 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1130 Args.MakeArgString(Twine(PluginOptPrefix) +
"dwo_dir=" + F +
"dwo"));
1133 if (IsThinLTO && !IsOSAIX)
1134 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
1135 else if (IsThinLTO && IsOSAIX)
1136 CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
1141 if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
1142 Args.hasArg(options::OPT_fenable_matrix))
1144 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-matrix"));
1147 if (!Parallelism.empty())
1148 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1149 ParallelismOpt + Parallelism));
1152 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
1153 options::OPT_fno_global_isel)) {
1156 CmdArgs.push_back(Args.MakeArgString(
1157 Twine(PluginOptPrefix) +
"-global-isel=" +
1158 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
1163 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
1164 if (A->getOption().matches(options::OPT_glldb))
1166 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
1167 else if (A->getOption().matches(options::OPT_gsce))
1169 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
1170 else if (A->getOption().matches(options::OPT_gdbx))
1172 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
1175 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
1181 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
1185 Arg *A = Args.getLastArg(options::OPT_g_Group);
1186 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
1187 !A->getOption().matches(options::OPT_ggdb0);
1188 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
1189 options::OPT_gno_strict_dwarf,
true))
1191 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
1193 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
1194 StringRef
V = A->getValue();
1195 if (
V ==
"vec-default")
1197 if (
V ==
"vec-extabi") {
1199 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
1205 bool UseSeparateSections =
1208 if (Args.hasFlag(options::OPT_ffunction_sections,
1209 options::OPT_fno_function_sections, UseSeparateSections))
1211 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
1212 else if (Args.hasArg(options::OPT_fno_function_sections))
1214 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
1216 bool DataSectionsTurnedOff =
false;
1217 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1218 UseSeparateSections)) {
1220 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
1221 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
1222 DataSectionsTurnedOff =
true;
1224 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
1227 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
1228 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
1229 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
1230 options::OPT_mno_xcoff_roptr,
false);
1231 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
1233 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1234 << OptStr << Triple.str();
1240 if (DataSectionsTurnedOff)
1241 D.
Diag(diag::err_roptr_requires_data_sections);
1244 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
1249 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
1250 options::OPT_fno_split_machine_functions)) {
1251 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
1252 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1253 "-split-machine-functions"));
1257 StringRef FName = A->getValue();
1258 if (!llvm::sys::fs::exists(FName))
1259 D.
Diag(diag::err_drv_no_such_file) << FName;
1261 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1262 "sample-profile=" + FName));
1266 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1267 "cs-profile-generate"));
1268 if (CSPGOGenerateArg->getOption().matches(
1269 options::OPT_fcs_profile_generate_EQ)) {
1271 llvm::sys::path::append(Path,
"default_%m.profraw");
1272 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1273 "cs-profile-path=" + Path));
1276 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1277 "cs-profile-path=default_%m.profraw"));
1280 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1281 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1282 llvm::sys::path::append(Path,
"default.profdata");
1283 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1284 "cs-profile-path=" + Path));
1288 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1290 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1291 "-enable-jmc-instrument"));
1293 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1296 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1297 Triple.hasDefaultEmulatedTLS())) {
1299 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1303 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1305 if (Args.hasFlag(options::OPT_fstack_size_section,
1306 options::OPT_fno_stack_size_section,
false))
1308 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1310 if (Args.hasFlag(options::OPT_fexperimental_call_graph_section,
1311 options::OPT_fno_experimental_call_graph_section,
false))
1313 Args.MakeArgString(Twine(PluginOptPrefix) +
"-call-graph-section"));
1317 if (!StatsFile.empty())
1319 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1322 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1323 CmdArgs.push_back(Args.MakeArgString(
1324 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1335 Output, PluginOptPrefix);
1341 true, PluginOptPrefix);
1343 bool IsELF = Triple.isOSBinFormatELF();
1345 bool ImplicitMapSyms =
false;
1346 for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
1347 for (StringRef
V : A->getValues()) {
1348 auto Equal =
V.split(
'=');
1349 auto checkArg = [&](
bool ValidTarget,
1350 std::initializer_list<const char *>
Set) {
1352 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1353 << (Twine(
"-Wa,") +
Equal.first +
"=").str()
1354 << Triple.getTriple();
1355 }
else if (!llvm::is_contained(
Set,
Equal.second)) {
1356 D.
Diag(diag::err_drv_unsupported_option_argument)
1357 << (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
1360 if (
Equal.first ==
"-mmapsyms") {
1361 ImplicitMapSyms =
Equal.second ==
"implicit";
1362 checkArg(IsELF && Triple.isAArch64(), {
"default",
"implicit"});
1363 }
else if (
V ==
"--crel")
1365 else if (
V ==
"--no-crel")
1373 if (IsELF && !Triple.isMIPS()) {
1374 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"-crel"));
1376 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1380 if (ImplicitMapSyms)
1382 Args.MakeArgString(Twine(PluginOptPrefix) +
"-implicit-mapsyms"));
1384 if (Args.hasArg(options::OPT_ftime_report))
1386 Args.MakeArgString(Twine(PluginOptPrefix) +
"-time-passes"));
1392 const ArgList &Args,
1393 ArgStringList &CmdArgs) {
1398 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1399 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1403 ArgStringList &CmdArgs) {
1404 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1405 options::OPT_fno_rtlib_add_rpath,
false))
1413 CandidateRPaths.emplace_back(*CandidateRPath);
1415 for (
const auto &CandidateRPath : CandidateRPaths) {
1416 if (TC.
getVFS().exists(CandidateRPath)) {
1417 CmdArgs.push_back(
"-rpath");
1418 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1424 const ToolChain &TC,
const ArgList &Args,
1425 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1427 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1428 options::OPT_fno_openmp,
false)) {
1430 if (Args.hasFlag(options::OPT_foffload_via_llvm,
1431 options::OPT_fno_offload_via_llvm,
false))
1432 CmdArgs.push_back(
"-lomptarget");
1442 if (ForceStaticHostRuntime)
1443 CmdArgs.push_back(
"-Bstatic");
1447 CmdArgs.push_back(
"-lomp");
1450 CmdArgs.push_back(
"-lgomp");
1453 CmdArgs.push_back(
"-liomp5");
1459 if (ForceStaticHostRuntime)
1460 CmdArgs.push_back(
"-Bdynamic");
1463 CmdArgs.push_back(
"-lrt");
1465 if (IsOffloadingHost)
1466 CmdArgs.push_back(
"-lomptarget");
1477 const llvm::opt::ArgList &Args,
1478 llvm::opt::ArgStringList &CmdArgs) {
1484 constexpr llvm::StringLiteral Targets(
"--offload-targets=");
1488 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1489 [](
auto TC) { return TC.second->getTripleString(); });
1491 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1495 ArgStringList &CmdArgs, StringRef Sanitizer,
1496 bool IsShared,
bool IsWhole) {
1499 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1502 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1512 ArgStringList &CmdArgs,
1513 StringRef Sanitizer) {
1518 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1521 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1522 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1529 const llvm::opt::ArgList &Args,
1530 llvm::opt::ArgStringList &CmdArgs,
1533 "AIX linker does not support any form of --as-needed option yet.");
1541 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1542 CmdArgs.push_back(
"-z");
1543 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1545 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1550 const llvm::opt::ArgList &Args,
1551 ArgStringList &CmdArgs) {
1556 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1558 CmdArgs.push_back(
"-lpthread");
1560 CmdArgs.push_back(
"-lrt");
1562 CmdArgs.push_back(
"-lm");
1567 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1568 CmdArgs.push_back(
"-ldl");
1572 CmdArgs.push_back(
"-lexecinfo");
1574 CmdArgs.push_back(
"-lbsd");
1580 CmdArgs.push_back(
"-lresolv");
1590 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1595 SharedRuntimes.push_back(
"asan");
1596 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1597 HelperStaticRuntimes.push_back(
"asan-preinit");
1600 SharedRuntimes.push_back(
"memprof");
1601 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1602 HelperStaticRuntimes.push_back(
"memprof-preinit");
1605 SharedRuntimes.push_back(
"nsan");
1608 SharedRuntimes.push_back(
"ubsan_minimal");
1610 SharedRuntimes.push_back(
"ubsan_standalone");
1613 SharedRuntimes.push_back(
"scudo_standalone");
1616 SharedRuntimes.push_back(
"tsan");
1618 SharedRuntimes.push_back(
"tysan");
1621 SharedRuntimes.push_back(
"hwasan_aliases");
1623 SharedRuntimes.push_back(
"hwasan");
1624 if (!Args.hasArg(options::OPT_shared))
1625 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1628 SharedRuntimes.push_back(
"rtsan");
1633 StaticRuntimes.push_back(
"stats_client");
1637 HelperStaticRuntimes.push_back(
"asan_static");
1640 if (Args.hasArg(options::OPT_shared)) {
1649 StaticRuntimes.push_back(
"asan");
1651 StaticRuntimes.push_back(
"asan_cxx");
1656 StaticRuntimes.push_back(
"rtsan");
1659 StaticRuntimes.push_back(
"memprof");
1661 StaticRuntimes.push_back(
"memprof_cxx");
1666 StaticRuntimes.push_back(
"hwasan_aliases");
1668 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1670 StaticRuntimes.push_back(
"hwasan");
1672 StaticRuntimes.push_back(
"hwasan_cxx");
1676 StaticRuntimes.push_back(
"dfsan");
1678 StaticRuntimes.push_back(
"lsan");
1680 StaticRuntimes.push_back(
"msan");
1682 StaticRuntimes.push_back(
"msan_cxx");
1685 StaticRuntimes.push_back(
"nsan");
1687 StaticRuntimes.push_back(
"tsan");
1689 StaticRuntimes.push_back(
"tsan_cxx");
1692 StaticRuntimes.push_back(
"tysan");
1695 StaticRuntimes.push_back(
"ubsan_minimal");
1697 StaticRuntimes.push_back(
"ubsan_standalone");
1701 NonWholeStaticRuntimes.push_back(
"safestack");
1702 RequiredSymbols.push_back(
"__safestack_init");
1706 StaticRuntimes.push_back(
"cfi");
1708 StaticRuntimes.push_back(
"cfi_diag");
1713 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1716 NonWholeStaticRuntimes.push_back(
"stats");
1717 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1720 StaticRuntimes.push_back(
"scudo_standalone");
1722 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1729 ArgStringList &CmdArgs) {
1732 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1735 NonWholeStaticRuntimes, HelperStaticRuntimes,
1740 for (
auto S : RequiredSymbols) {
1741 CmdArgs.push_back(
"-u");
1742 CmdArgs.push_back(Args.MakeArgString(S));
1747 !Args.hasArg(options::OPT_shared)) {
1753 if (!Args.hasArg(options::OPT_nostdlibxx)) {
1754 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1755 !Args.hasArg(options::OPT_static);
1756 if (OnlyLibstdcxxStatic)
1757 CmdArgs.push_back(
"-Bstatic");
1759 if (OnlyLibstdcxxStatic)
1760 CmdArgs.push_back(
"-Bdynamic");
1764 for (
auto RT : SharedRuntimes)
1766 for (
auto RT : HelperStaticRuntimes)
1768 bool AddExportDynamic =
false;
1769 for (
auto RT : StaticRuntimes) {
1773 for (
auto RT : NonWholeStaticRuntimes) {
1779 if (AddExportDynamic)
1780 CmdArgs.push_back(
"--export-dynamic");
1783 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1787 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1788 <<
"-fsanitize=memtag*" << TC.
getTriple().str();
1791 Args.MakeArgString(
"--android-memtag-mode=" + SanArgs.
getMemtagMode()));
1793 CmdArgs.push_back(
"--android-memtag-heap");
1795 CmdArgs.push_back(
"--android-memtag-stack");
1798 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty();
1803 if (Args.hasArg(options::OPT_shared)) {
1805 CmdArgs.push_back(
"--whole-archive");
1807 CmdArgs.push_back(
"--no-whole-archive");
1811 CmdArgs.push_back(
"--whole-archive");
1813 for (
const auto &Mode : XRay.
modeList())
1815 CmdArgs.push_back(
"--no-whole-archive");
1823 const llvm::opt::ArgList &Args,
1824 ArgStringList &CmdArgs) {
1826 CmdArgs.push_back(
"-lpthread");
1828 CmdArgs.push_back(
"-lrt");
1829 CmdArgs.push_back(
"-lm");
1834 CmdArgs.push_back(
"-ldl");
1839 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1840 return !A->getOption().matches(options::OPT_O0);
1848 auto AddPostfix = [JA](
auto &F) {
1853 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1854 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1858 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1861 Arg *FinalOutput = Args.getLastArg(options::OPT_o, options::OPT__SLASH_o);
1862 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1863 T = FinalOutput->getValue();
1864 llvm::sys::path::remove_filename(
T);
1865 llvm::sys::path::append(
T,
1866 llvm::sys::path::stem(FinalOutput->getValue()));
1868 return Args.MakeArgString(
T);
1874 return Args.MakeArgString(
T);
1878 const JobAction &JA,
const ArgList &Args,
1879 const InputInfo &Output,
const char *OutFile) {
1880 ArgStringList ExtractArgs;
1881 ExtractArgs.push_back(
"--extract-dwo");
1883 ArgStringList StripArgs;
1884 StripArgs.push_back(
"--strip-dwo");
1889 ExtractArgs.push_back(OutFile);
1896 C.addCommand(std::make_unique<Command>(JA,
T,
1898 Exec, ExtractArgs, II, Output));
1901 C.addCommand(std::make_unique<Command>(
1911 Args.ClaimAllArgs(options::OPT_flto_EQ);
1912 Args.ClaimAllArgs(options::OPT_flto);
1913 Args.ClaimAllArgs(options::OPT_fno_lto);
1917 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1918 options::OPT_fcs_profile_generate_EQ,
1919 options::OPT_fno_profile_generate);
1920 if (CSPGOGenerateArg &&
1921 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1922 CSPGOGenerateArg =
nullptr;
1924 return CSPGOGenerateArg;
1928 auto *ProfileUseArg = Args.getLastArg(
1929 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1930 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1931 options::OPT_fno_profile_instr_use);
1933 if (ProfileUseArg &&
1934 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1935 ProfileUseArg =
nullptr;
1937 return ProfileUseArg;
1941 auto *ProfileSampleUseArg = Args.getLastArg(
1942 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
1944 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
1945 options::OPT_fno_profile_sample_use)))
1948 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
1953 case llvm::Reloc::Static:
1955 case llvm::Reloc::PIC_:
1957 case llvm::Reloc::DynamicNoPIC:
1958 return "dynamic-no-pic";
1959 case llvm::Reloc::ROPI:
1961 case llvm::Reloc::RWPI:
1963 case llvm::Reloc::ROPI_RWPI:
1966 llvm_unreachable(
"Unknown Reloc::Model kind");
1973std::tuple<llvm::Reloc::Model, unsigned, bool>
1981 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
1983 bool IsPICLevelTwo = PIC;
1986 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
1989 if (Triple.isAndroid()) {
1990 switch (Triple.getArch()) {
1991 case llvm::Triple::x86:
1992 case llvm::Triple::x86_64:
1994 IsPICLevelTwo =
true;
2004 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
2008 if (Triple.isOSOpenBSD()) {
2010 case llvm::Triple::arm:
2011 case llvm::Triple::aarch64:
2012 case llvm::Triple::mips64:
2013 case llvm::Triple::mips64el:
2014 case llvm::Triple::x86:
2015 case llvm::Triple::x86_64:
2016 IsPICLevelTwo =
false;
2019 case llvm::Triple::ppc:
2020 case llvm::Triple::sparcv9:
2021 IsPICLevelTwo =
true;
2033 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2034 options::OPT_fpic, options::OPT_fno_pic,
2035 options::OPT_fPIE, options::OPT_fno_PIE,
2036 options::OPT_fpie, options::OPT_fno_pie);
2037 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
2038 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
2039 options::OPT_fPIE, options::OPT_fpie)) {
2041 << LastPICArg->getSpelling() << Triple.str();
2042 if (Triple.getArch() == llvm::Triple::x86_64)
2043 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
2044 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2051 Option O = LastPICArg->getOption();
2052 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2053 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2054 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2056 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2058 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
2061 if (EffectiveTriple.isPS()) {
2062 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
2063 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
2064 if (Model !=
"kernel") {
2067 << LastPICArg->getSpelling()
2068 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
2078 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
2084 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
2085 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
2088 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2091 if (!Triple.isOSDarwin())
2093 << A->getSpelling() << Triple.str();
2102 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
2105 bool EmbeddedPISupported;
2106 switch (Triple.getArch()) {
2107 case llvm::Triple::arm:
2108 case llvm::Triple::armeb:
2109 case llvm::Triple::thumb:
2110 case llvm::Triple::thumbeb:
2111 EmbeddedPISupported =
true;
2114 EmbeddedPISupported =
false;
2118 bool ROPI =
false, RWPI =
false;
2119 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
2120 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
2121 if (!EmbeddedPISupported)
2123 << LastROPIArg->getSpelling() << Triple.str();
2126 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2127 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2128 if (!EmbeddedPISupported)
2130 << LastRWPIArg->getSpelling() << Triple.str();
2135 if ((ROPI || RWPI) && (PIC || PIE))
2138 if (Triple.isMIPS()) {
2145 if (ABIName ==
"n64")
2148 if(Args.hasArg(options::OPT_mno_abicalls))
2149 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2152 IsPICLevelTwo =
false;
2156 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2158 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2160 RelocM = llvm::Reloc::ROPI_RWPI;
2162 RelocM = llvm::Reloc::ROPI;
2164 RelocM = llvm::Reloc::RWPI;
2166 return std::make_tuple(RelocM, 0
U,
false);
2170 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
2171 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
2173 const llvm::opt::OptTable &Opts = D.
getOpts();
2174 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
2175 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
2176 D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
2178 return HasStaticPIE;
2198 const ArgList &Args) {
2199 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2200 options::OPT_falign_functions_EQ,
2201 options::OPT_fno_align_functions);
2202 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2205 if (A->getOption().matches(options::OPT_falign_functions))
2209 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2211 << A->getAsString(Args) << A->getValue();
2216 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2217 switch (DebugInfoKind) {
2218 case llvm::codegenoptions::DebugDirectivesOnly:
2219 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2221 case llvm::codegenoptions::DebugLineTablesOnly:
2222 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2224 case llvm::codegenoptions::DebugInfoConstructor:
2225 CmdArgs.push_back(
"-debug-info-kind=constructor");
2227 case llvm::codegenoptions::LimitedDebugInfo:
2228 CmdArgs.push_back(
"-debug-info-kind=limited");
2230 case llvm::codegenoptions::FullDebugInfo:
2231 CmdArgs.push_back(
"-debug-info-kind=standalone");
2233 case llvm::codegenoptions::UnusedTypeInfo:
2234 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2244 assert(A.getOption().matches(options::OPT_gN_Group) &&
2245 "Not a -g option that specifies a debug-info level");
2246 if (A.getOption().matches(options::OPT_g0) ||
2247 A.getOption().matches(options::OPT_ggdb0))
2248 return llvm::codegenoptions::NoDebugInfo;
2249 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2250 A.getOption().matches(options::OPT_ggdb1))
2251 return llvm::codegenoptions::DebugLineTablesOnly;
2252 if (A.getOption().matches(options::OPT_gline_directives_only))
2253 return llvm::codegenoptions::DebugDirectivesOnly;
2254 return llvm::codegenoptions::DebugInfoConstructor;
2258 const ArgList &Args) {
2259 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2265 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 6 ||
2268 << A->getAsString(Args) << A->getValue();
2273 return llvm::StringSwitch<unsigned>(ArgValue)
2274 .Case(
"-gdwarf-2", 2)
2275 .Case(
"-gdwarf-3", 3)
2276 .Case(
"-gdwarf-4", 4)
2277 .Case(
"-gdwarf-5", 5)
2278 .Case(
"-gdwarf-6", 6)
2283 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2284 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2285 options::OPT_gdwarf_6, options::OPT_gdwarf);
2289 const llvm::opt::ArgList &Args) {
2294 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2295 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2296 << GDwarfN->getSpelling() << TC.
getTriple().str();
2298 if (DwarfVersion == 0) {
2300 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2302 return DwarfVersion;
2306 const ArgList &Args, Arg *&Arg) {
2307 Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
2308 options::OPT_gno_split_dwarf);
2309 if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
2312 if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
2315 StringRef
Value = Arg->getValue();
2316 if (
Value ==
"split")
2318 if (
Value ==
"single")
2321 D.
Diag(diag::err_drv_unsupported_option_argument)
2322 << Arg->getSpelling() << Arg->getValue();
2328 assert(A &&
"Expected non-nullptr argument.");
2331 D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
2337 ArgStringList &CmdArgs) {
2338 llvm::Reloc::Model RelocationModel;
2343 if (RelocationModel != llvm::Reloc::Static)
2344 CmdArgs.push_back(
"-KPIC");
2350 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2356 const ArgList &Args) {
2357 if (Args.hasArg(options::OPT_static_libgcc) ||
2358 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2362 if (Args.hasArg(options::OPT_shared_libgcc))
2381 ArgStringList &CmdArgs,
const ArgList &Args) {
2385 CmdArgs.push_back(
"-l:libunwind.a");
2408 CmdArgs.push_back(
"-lgcc_eh");
2410 CmdArgs.push_back(
"-lgcc_s");
2418 CmdArgs.push_back(
"-lunwind");
2420 CmdArgs.push_back(
"-l:libunwind.a");
2423 CmdArgs.push_back(
"-l:libunwind.dll.a");
2425 CmdArgs.push_back(
"-l:libunwind.so");
2429 CmdArgs.push_back(
"-lunwind");
2439 ArgStringList &CmdArgs,
const ArgList &Args) {
2443 CmdArgs.push_back(
"-lgcc");
2447 CmdArgs.push_back(
"-lgcc");
2451 CmdArgs.push_back(
"--as-needed");
2453 CmdArgs.push_back(
"--no-as-needed");
2458 ArgStringList &CmdArgs,
const ArgList &Args) {
2469 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2472 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2473 if (A && A->getValue() != StringRef(
"platform")) {
2474 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2475 << A->getValue() <<
"MSVC";
2485 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2486 !Args.hasArg(options::OPT_static_pie))
2487 CmdArgs.push_back(
"-ldl");
2494 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2500 StringRef SaveStats = A->getValue();
2501 if (SaveStats ==
"obj" && Output.
isFilename()) {
2503 llvm::sys::path::remove_filename(StatsFile);
2504 }
else if (SaveStats !=
"cwd") {
2505 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2509 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2510 llvm::sys::path::append(StatsFile, BaseName);
2511 llvm::sys::path::replace_extension(StatsFile,
"stats");
2523 assert(Flag.front() ==
'-');
2525 Flags.push_back(Flag.str());
2527 Flags.push_back((
"!" + Flag.substr(1)).str());
2532 ArgStringList &CmdArgs,
bool IsLTO,
2533 const StringRef PluginOptPrefix) {
2534 auto addArg = [&, IsLTO](
const Twine &Arg) {
2536 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2537 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2539 CmdArgs.push_back(
"-mllvm");
2540 CmdArgs.push_back(Args.MakeArgString(Arg));
2544 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2545 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2547 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2548 StringRef
Value = A->getValue();
2550 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2551 !llvm::isPowerOf2_64(Boundary)) {
2552 D.
Diag(diag::err_drv_invalid_argument_to_option)
2553 <<
Value << A->getOption().getName();
2555 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2558 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2559 std::string AlignBranch;
2560 for (StringRef
T : A->getValues()) {
2561 if (
T !=
"fused" &&
T !=
"jcc" &&
T !=
"jmp" &&
T !=
"call" &&
2562 T !=
"ret" &&
T !=
"indirect")
2563 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2564 <<
T <<
"fused, jcc, jmp, call, ret, indirect";
2565 if (!AlignBranch.empty())
2569 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2571 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2572 StringRef
Value = A->getValue();
2573 unsigned PrefixSize;
2574 if (
Value.getAsInteger(10, PrefixSize)) {
2575 D.
Diag(diag::err_drv_invalid_argument_to_option)
2576 <<
Value << A->getOption().getName();
2578 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2604 llvm::opt::ArgStringList &CC1Args,
2606 StringRef Lib, StringRef
Arch, StringRef
Target,
2607 bool isBitCodeSDL) {
2610 std::string LibDeviceLoc =
"/libdevice";
2611 std::string LibBcPrefix =
"/libbc-";
2612 std::string LibPrefix =
"/lib";
2629 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2630 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2632 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2633 Twine(Lib +
"-" +
Arch).str(), Twine(Lib).str()}) {
2634 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2635 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2645 const auto *Ext =
".a";
2647 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2648 Twine(Lib +
"-" +
Arch).str()}) {
2649 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2650 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2661 bool FoundSDL =
false;
2662 for (
auto LPath : LibraryPaths) {
2663 for (
auto SDL : SDLs) {
2664 auto FullName = Twine(LPath + SDL).str();
2665 if (llvm::sys::fs::exists(FullName)) {
2666 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2683 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2684 llvm::opt::ArgStringList &CC1Args,
2686 StringRef
Arch, StringRef
Target,
bool isBitCodeSDL) {
2689 if (isBitCodeSDL &&
Arch.contains(
"nvptx"))
2692 bool FoundAOB =
false;
2693 std::string ArchiveOfBundles;
2696 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2697 auto Ext = IsMSVC ?
".lib" :
".a";
2698 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2699 if (llvm::sys::fs::exists(Lib)) {
2700 ArchiveOfBundles = Lib;
2704 Lib.consume_front(
"-l");
2705 for (
auto LPath : LibraryPaths) {
2706 ArchiveOfBundles.clear();
2707 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2708 : IsMSVC ? Lib + Ext
2709 :
"lib" + Lib + Ext)
2711 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2712 auto AOB = Twine(LPath + Prefix + LibFile).str();
2713 if (llvm::sys::fs::exists(AOB)) {
2714 ArchiveOfBundles = AOB;
2727 llvm::file_magic Magic;
2728 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2729 if (EC || Magic != llvm::file_magic::archive)
2732 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2733 std::string OutputLib =
2739 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2743 DeviceTriple +=
'-';
2744 std::string NormalizedTriple =
T.getToolChain().getTriple().normalize(
2745 llvm::Triple::CanonicalForm::FOUR_IDENT);
2746 DeviceTriple += NormalizedTriple;
2748 DeviceTriple +=
'-';
2752 std::string UnbundleArg(
"-unbundle");
2753 std::string TypeArg(
"-type=a");
2754 std::string InputArg(
"-input=" + ArchiveOfBundles);
2755 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2756 std::string OutputArg(
"-output=" + OutputLib);
2758 const char *UBProgram = DriverArgs.MakeArgString(
2759 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2761 ArgStringList UBArgs;
2762 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2763 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2764 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2765 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2766 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2770 std::string AdditionalArgs(
"-allow-missing-bundles");
2771 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2776 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2777 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2779 C.addCommand(std::make_unique<Command>(
2781 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2783 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2790 const llvm::opt::ArgList &DriverArgs,
2791 llvm::opt::ArgStringList &CC1Args,
2793 bool isBitCodeSDL) {
2824 const llvm::opt::ArgList &DriverArgs,
2825 llvm::opt::ArgStringList &CC1Args,
2827 bool isBitCodeSDL) {
2831 std::optional<std::string> LibPath =
2832 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2835 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2836 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2837 for (StringRef Path : Frags)
2838 LibraryPaths.emplace_back(Path.trim());
2842 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2843 LibraryPaths.emplace_back(Search_Dir);
2847 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2848 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2851 llvm::SmallSet<std::string, 16> SDLNames;
2852 static const StringRef HostOnlyArchives[] = {
2853 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2854 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2855 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2856 SDLNames.insert(std::string(
"-l") + SDLName);
2860 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2867 const StringRef LibFileExt =
".lib";
2868 if (!llvm::sys::path::has_extension(
FileName) ||
2870 llvm::sys::path::extension(
FileName).drop_front()) ==
2872 llvm::sys::path::extension(
FileName) == LibFileExt)
2873 SDLNames.insert(Input);
2880 for (
auto SDLName : SDLNames) {
2891static llvm::opt::Arg *
2893 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2897 const llvm::opt::ArgList &Args) {
2898 const unsigned MinCodeObjVer = 4;
2899 const unsigned MaxCodeObjVer = 6;
2902 if (CodeObjArg->getOption().getID() ==
2903 options::OPT_mcode_object_version_EQ) {
2904 unsigned CodeObjVer = MaxCodeObjVer;
2906 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2907 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2908 D.
Diag(diag::err_drv_invalid_int_value)
2909 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2915 const llvm::opt::ArgList &Args) {
2916 unsigned CodeObjVer = 6;
2918 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2923 const Driver &D,
const llvm::opt::ArgList &Args) {
2928 const llvm::opt::ArgList &Args,
2929 llvm::opt::ArgStringList &CmdArgs,
2930 const llvm::Triple &Triple,
bool IsLTO,
2931 const StringRef PluginOptPrefix) {
2932 auto addArg = [&, IsLTO](
const Twine &Arg) {
2934 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2935 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2937 CmdArgs.push_back(
"-mllvm");
2938 CmdArgs.push_back(Args.MakeArgString(Arg));
2942 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2943 options::OPT_mno_outline)) {
2944 if (A->getOption().matches(options::OPT_moutline)) {
2948 if (!(Triple.isARM() || Triple.isThumb() || Triple.isAArch64())) {
2949 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2951 addArg(Twine(
"-enable-machine-outliner"));
2955 addArg(Twine(
"-enable-machine-outliner=never"));
2959 auto *CodeGenDataGenArg =
2960 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
2961 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
2964 if (CodeGenDataGenArg && CodeGenDataUseArg)
2965 D.
Diag(diag::err_drv_argument_not_allowed_with)
2966 << CodeGenDataGenArg->getAsString(Args)
2967 << CodeGenDataUseArg->getAsString(Args);
2971 if (CodeGenDataGenArg)
2972 addArg(Twine(
"-codegen-data-generate"));
2975 if (CodeGenDataUseArg)
2976 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
2980 const llvm::opt::ArgList &DriverArgs,
2981 llvm::opt::ArgStringList &CC1Args,
2982 StringRef BitcodeSuffix,
2983 const llvm::Triple &Triple,
2988 std::optional<std::string> LibPath =
2989 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2992 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2993 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2994 for (StringRef Path : Frags)
2995 LibraryPaths.emplace_back(Path.trim());
3000 LibraryPaths.emplace_back(LibPath);
3004 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
3005 LibraryPaths.emplace_back(P);
3007 OptSpecifier LibomptargetBCPathOpt =
3008 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
3009 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
3010 : options::OPT_libomptarget_spirv_bc_path_EQ;
3012 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
3013 : Triple.isNVPTX() ?
"nvptx"
3015 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
3018 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
3020 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
3021 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
3022 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3025 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3026 CC1Args.push_back(
"-mlink-builtin-bitcode");
3027 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3029 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
3030 << LibOmpTargetFile;
3033 bool FoundBCLibrary =
false;
3035 for (StringRef LibraryPath : LibraryPaths) {
3037 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3038 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3039 CC1Args.push_back(
"-mlink-builtin-bitcode");
3040 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3041 FoundBCLibrary =
true;
3046 if (!FoundBCLibrary)
3047 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
3048 << LibOmpTargetName << ArchPrefix;
3052 const llvm::opt::ArgList &Args,
3053 llvm::opt::ArgStringList &CmdArgs) {
3055 (!Args.hasArg(options::OPT_nostdlib) ||
3056 TC.
getTriple().isKnownWindowsMSVCEnvironment()) &&
3057 !Args.hasArg(options::OPT_no_hip_rt) && !Args.hasArg(options::OPT_r)) {
3061 for (
auto *Arg : Args.filtered(options::OPT_no_hip_rt)) {
3068 const llvm::opt::ArgList &DriverArgs,
3069 llvm::opt::ArgStringList &CC1Args) {
3071 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
3077 llvm::sys::path::append(LibclcPath,
"lib",
"libclc");
3080 StringRef LibclcNamespec(A->getValue());
3081 bool FilenameSearch = LibclcNamespec.consume_front(
":");
3084 if (FilenameSearch && llvm::sys::fs::exists(LibclcTargetFile)) {
3085 CC1Args.push_back(
"-mlink-builtin-bitcode");
3086 CC1Args.push_back(DriverArgs.MakeArgString(LibclcTargetFile));
3089 if (!FilenameSearch)
3090 LibclcTargetFile +=
".bc";
3092 llvm::sys::path::append(LibclcPath, LibclcTargetFile);
3093 if (llvm::sys::fs::exists(LibclcPath)) {
3094 CC1Args.push_back(
"-mlink-builtin-bitcode");
3095 CC1Args.push_back(DriverArgs.MakeArgString(LibclcPath));
3099 D.
Diag(diag::err_drv_libclc_not_found) << LibclcTargetFile;
3105 const llvm::opt::ArgList &Args,
3106 llvm::opt::ArgStringList &CmdArgs,
3107 const llvm::Triple &Triple) {
3108 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3109 options::OPT_mno_outline_atomics)) {
3111 if (!Triple.isAArch64()) {
3112 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3113 << Triple.getArchName() << A->getOption().getName();
3115 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3116 CmdArgs.push_back(
"-target-feature");
3117 CmdArgs.push_back(
"+outline-atomics");
3119 CmdArgs.push_back(
"-target-feature");
3120 CmdArgs.push_back(
"-outline-atomics");
3124 CmdArgs.push_back(
"-target-feature");
3125 CmdArgs.push_back(
"+outline-atomics");
3130 llvm::opt::ArgStringList &CmdArgs) {
3131 if (TCArgs.hasFlag(options::OPT_offload_compress,
3132 options::OPT_no_offload_compress,
false))
3133 CmdArgs.push_back(
"--compress");
3134 if (TCArgs.hasArg(options::OPT_v))
3135 CmdArgs.push_back(
"--verbose");
3136 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3138 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3142 const llvm::Triple &Triple,
3143 const llvm::Reloc::Model &RelocationModel,
3144 llvm::opt::ArgStringList &CmdArgs) {
3145 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3146 StringRef CM = A->getValue();
3148 if (Triple.isOSAIX() && CM ==
"medium")
3150 if (Triple.isAArch64(64)) {
3151 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3152 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3153 RelocationModel != llvm::Reloc::Static)
3154 D.
Diag(diag::err_drv_argument_only_allowed_with)
3155 << A->getAsString(Args) <<
"-fno-pic";
3156 }
else if (Triple.isLoongArch()) {
3157 if (CM ==
"extreme" &&
3158 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3159 D.
Diag(diag::err_drv_argument_not_allowed_with)
3160 << A->getAsString(Args) <<
"-fplt";
3161 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3164 CM = llvm::StringSwitch<StringRef>(CM)
3165 .Case(
"normal",
"small")
3166 .Case(
"extreme",
"large")
3168 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3169 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3170 }
else if (Triple.isRISCV()) {
3172 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3173 D.
Diag(diag::err_drv_argument_not_allowed_with)
3174 << A->getAsString(Args) <<
"-fpic";
3177 else if (CM ==
"medany")
3179 Ok = CM ==
"small" || CM ==
"medium" ||
3180 (CM ==
"large" && Triple.isRISCV64());
3181 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3182 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3183 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3187 }
else if (Triple.isSPARC64()) {
3190 else if (CM ==
"medmid")
3192 else if (CM ==
"medany")
3194 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3195 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3196 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3199 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3201 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3202 << A->getSpelling() << CM << Triple.getTriple();
3206 if (Triple.getArch() == llvm::Triple::x86_64) {
3207 bool IsMediumCM =
false;
3208 bool IsLargeCM =
false;
3209 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3210 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3211 IsLargeCM = StringRef(A->getValue()) ==
"large";
3213 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3214 if (!IsMediumCM && !IsLargeCM) {
3215 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3216 << A->getOption().getRenderName();
3218 A->render(Args, CmdArgs);
3220 }
else if (IsMediumCM) {
3221 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3222 }
else if (IsLargeCM) {
3223 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3229 ArgStringList &CmdArgs) {
3234 Args.getLastArg(options::OPT_fcolor_diagnostics,
3235 options::OPT_fno_color_diagnostics);
3236 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3237 StringRef
Value(A->getValue());
3239 D.
Diag(diag::err_drv_invalid_argument_to_option)
3240 <<
Value << A->getOption().getName();
3244 CmdArgs.push_back(
"-fcolor-diagnostics");
3249 for (; *Arg; ++Arg) {
3255 Res.push_back(
'\\');
3258 Res.push_back(*Arg);
3263 const llvm::opt::ArgList &Args) {
3267 llvm::opt::ArgStringList OriginalArgs;
3268 for (
const auto &Arg : Args)
3269 Arg->render(Args, OriginalArgs);
3273 for (
const char *OriginalArg : OriginalArgs) {
3277 Flags += EscapedArg;
3280 return Args.MakeArgString(Flags);
3284 const llvm::opt::ArgList &Args,
3285 bool &FRecordCommandLine,
3286 bool &GRecordCommandLine) {
3289 const std::string &TripleStr = Triple.getTriple();
3291 FRecordCommandLine =
3292 Args.hasFlag(options::OPT_frecord_command_line,
3293 options::OPT_fno_record_command_line,
false);
3294 GRecordCommandLine =
3295 Args.hasFlag(options::OPT_grecord_command_line,
3296 options::OPT_gno_record_command_line,
false);
3297 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3298 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3299 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3300 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3307 ArgStringList &CmdArgs) {
3308 bool use_fwrapv =
false;
3309 bool use_fwrapv_pointer =
false;
3310 for (
const Arg *A : Args.filtered(
3311 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3312 options::OPT_fwrapv, options::OPT_fno_wrapv,
3313 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3315 switch (A->getOption().getID()) {
3316 case options::OPT_fstrict_overflow:
3318 use_fwrapv_pointer =
false;
3320 case options::OPT_fno_strict_overflow:
3322 use_fwrapv_pointer =
true;
3324 case options::OPT_fwrapv:
3327 case options::OPT_fno_wrapv:
3330 case options::OPT_fwrapv_pointer:
3331 use_fwrapv_pointer =
true;
3333 case options::OPT_fno_wrapv_pointer:
3334 use_fwrapv_pointer =
false;
3340 CmdArgs.push_back(
"-fwrapv");
3341 if (use_fwrapv_pointer)
3342 CmdArgs.push_back(
"-fwrapv-pointer");
3349 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3350 if (A->getOption().matches(options::OPT_O4) ||
3351 A->getOption().matches(options::OPT_Ofast))
3354 if (A->getOption().matches(options::OPT_O0))
3357 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3360 StringRef S(A->getValue());
3368 unsigned OptLevel = 0;
3369 if (S.getAsInteger(10, OptLevel))
3372 return OptLevel > 1;
3379 ArgStringList &CmdArgs) {
3381 if (Args.hasFlag(options::OPT_fvectorize, options::OPT_fno_vectorize,
3383 CmdArgs.push_back(
"-vectorize-loops");
3387 ArgStringList &CmdArgs) {
3389 if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize,
3391 CmdArgs.push_back(
"-vectorize-slp");
3395 ArgStringList &CmdArgs) {
3396 if (Args.hasFlag(options::OPT_floop_interchange,
3397 options::OPT_fno_loop_interchange,
false))
3398 CmdArgs.push_back(
"-floop-interchange");
3404 const llvm::opt::ArgList &Args) {
3405 Arg *A = Args.getLastArg(options::OPT_mprefer_vector_width_EQ);
3409 StringRef
Value = A->getValue();
3410 unsigned Width LLVM_ATTRIBUTE_UNINITIALIZED;
3414 if (
Value !=
"none" &&
Value.getAsInteger(10, Width)) {
3415 Diags.
Report(clang::diag::err_drv_invalid_value)
3416 << A->getOption().getName() <<
Value;
3428 const Arg &A,
size_t &Position) {
3429 const char RefinementStepToken =
':';
3430 Position = In.find(RefinementStepToken);
3431 if (Position != StringRef::npos) {
3432 StringRef Option = A.getOption().getName();
3433 StringRef RefStep = In.substr(Position + 1);
3441 if (RefStep.size() != 1) {
3442 Diags.
Report(diag::err_drv_invalid_value) << Option << RefStep;
3445 char RefStepChar = RefStep[0];
3446 if (RefStepChar <
'0' || RefStepChar >
'9') {
3447 Diags.
Report(diag::err_drv_invalid_value) << Option << RefStep;
3457 const ArgList &Args) {
3458 StringRef DisabledPrefixIn =
"!";
3459 StringRef DisabledPrefixOut =
"!";
3460 StringRef EnabledPrefixOut =
"";
3463 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
3467 unsigned NumOptions = A->getNumValues();
3468 if (NumOptions == 0) {
3474 if (NumOptions == 1) {
3475 StringRef Val = A->getValue(0);
3479 StringRef ValBase = Val.slice(0, RefStepLoc);
3480 if (ValBase ==
"all" || ValBase ==
"none" || ValBase ==
"default") {
3489 llvm::StringMap<bool> OptionStrings;
3490 OptionStrings.insert(std::make_pair(
"divd",
false));
3491 OptionStrings.insert(std::make_pair(
"divf",
false));
3492 OptionStrings.insert(std::make_pair(
"divh",
false));
3493 OptionStrings.insert(std::make_pair(
"vec-divd",
false));
3494 OptionStrings.insert(std::make_pair(
"vec-divf",
false));
3495 OptionStrings.insert(std::make_pair(
"vec-divh",
false));
3496 OptionStrings.insert(std::make_pair(
"sqrtd",
false));
3497 OptionStrings.insert(std::make_pair(
"sqrtf",
false));
3498 OptionStrings.insert(std::make_pair(
"sqrth",
false));
3499 OptionStrings.insert(std::make_pair(
"vec-sqrtd",
false));
3500 OptionStrings.insert(std::make_pair(
"vec-sqrtf",
false));
3501 OptionStrings.insert(std::make_pair(
"vec-sqrth",
false));
3503 for (
unsigned i = 0; i != NumOptions; ++i) {
3504 StringRef Val = A->getValue(i);
3506 bool IsDisabled = Val.starts_with(DisabledPrefixIn);
3509 Val = Val.substr(1);
3515 StringRef ValBase = Val.slice(0, RefStep);
3516 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
3517 if (OptionIter == OptionStrings.end()) {
3519 OptionIter = OptionStrings.find(ValBase.str() +
'f');
3520 if (OptionIter == OptionStrings.end()) {
3522 Diags.
Report(diag::err_drv_unknown_argument) << Val;
3528 if (OptionStrings[ValBase.str() +
'd'] ||
3529 OptionStrings[ValBase.str() +
'h']) {
3530 Diags.
Report(diag::err_drv_invalid_value)
3531 << A->getOption().getName() << Val;
3536 if (OptionIter->second ==
true) {
3538 Diags.
Report(diag::err_drv_invalid_value)
3539 << A->getOption().getName() << Val;
3544 OptionIter->second =
true;
3548 if (ValBase.back() !=
'f' && ValBase.back() !=
'd' &&
3549 ValBase.back() !=
'h') {
3550 OptionStrings[ValBase.str() +
'd'] =
true;
3551 OptionStrings[ValBase.str() +
'h'] =
true;
3555 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
3556 Out = Args.MakeArgString(Out + Prefix + Val);
3557 if (i != NumOptions - 1)
3558 Out = Args.MakeArgString(Out +
",");
3582 llvm_unreachable(
"Fully covered switch above");
3588 if (!ComplexRangeStr.empty())
3589 return "-complex-range=" + ComplexRangeStr;
3590 return ComplexRangeStr;
3610 if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
3611 (LastOpt ==
"-fcx-limited-range" && NewOpt ==
"-fno-cx-limited-range") ||
3612 (LastOpt ==
"-fno-cx-limited-range" && NewOpt ==
"-fcx-limited-range") ||
3613 (LastOpt ==
"-fcx-fortran-rules" && NewOpt ==
"-fno-cx-fortran-rules") ||
3614 (LastOpt ==
"-fno-cx-fortran-rules" && NewOpt ==
"-fcx-fortran-rules") ||
3615 (LastOpt ==
"-ffast-math" && NewOpt ==
"-fno-fast-math") ||
3616 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-ffast-math") ||
3617 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-fno-fast-math") ||
3618 (LastOpt.starts_with(
"-ffp-model=") &&
3619 NewOpt.starts_with(
"-ffp-model=")) ||
3620 (LastOpt.starts_with(
"-fcomplex-arithmetic=") &&
3621 NewOpt.starts_with(
"-fcomplex-arithmetic=")))
3624 D.
Diag(clang::diag::warn_drv_overriding_complex_range)
static bool useLeafFramePointerForTargetByDefault(const llvm::Triple &Triple)
static unsigned ParseDebugDefaultVersion(const ToolChain &TC, const ArgList &Args)
static bool getRefinementStep(StringRef In, clang::DiagnosticsEngine &Diags, const Arg &A, size_t &Position)
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
Concrete class used by the front-end to report problems and issues.
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.
const char * getClangProgramPath() const
Get the path to the main clang executable.
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
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.
std::vector< std::string > flags_list
bool needsFuzzerInterceptors() const
bool needsHwasanAliasesRt() const
bool needsStatsRt() const
bool needsMemProfRt() const
bool linkRuntimes() 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.
const FunctionProtoType * T
static constexpr ResponseFileSupport AtFileCurCP()