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/Host.h"
62#include "llvm/TargetParser/PPCTargetParser.h"
63#include "llvm/TargetParser/TargetParser.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:
109 if (Triple.isOSFuchsia() || Triple.isOSNetBSD()) {
113 if (Triple.isOSLinux() || Triple.isOSHurd()) {
114 switch (Triple.getArch()) {
116 case llvm::Triple::arm:
117 case llvm::Triple::armeb:
118 case llvm::Triple::thumb:
119 case llvm::Triple::thumbeb:
120 case llvm::Triple::mips64:
121 case llvm::Triple::mips64el:
122 case llvm::Triple::mips:
123 case llvm::Triple::mipsel:
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 Arg *MArch = Args.getLastArg(options::OPT_march_EQ);
687 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
689 return llvm::StringSwitch<std::string>(GPUName)
690 .Cases({
"rv630",
"rv635"},
"r600")
691 .Cases({
"rv610",
"rv620",
"rs780"},
"rs880")
692 .Case(
"rv740",
"rv770")
693 .Case(
"palm",
"cedar")
694 .Cases({
"sumo",
"sumo2"},
"sumo")
695 .Case(
"hemlock",
"cypress")
696 .Case(
"aruba",
"cayman")
697 .Default(GPUName.str());
705 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
706 return A->getValue();
714 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
715 StringRef CPU = A->getValue();
721 return llvm::sys::getHostCPUName();
731 const llvm::Triple &T,
bool FromAs) {
734 switch (T.getArch()) {
738 case llvm::Triple::aarch64:
739 case llvm::Triple::aarch64_32:
740 case llvm::Triple::aarch64_be:
743 case llvm::Triple::arm:
744 case llvm::Triple::armeb:
745 case llvm::Triple::thumb:
746 case llvm::Triple::thumbeb: {
747 StringRef MArch, MCPU;
752 case llvm::Triple::avr:
753 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
754 return A->getValue();
757 case llvm::Triple::m68k:
760 case llvm::Triple::mips:
761 case llvm::Triple::mipsel:
762 case llvm::Triple::mips64:
763 case llvm::Triple::mips64el: {
767 return std::string(CPUName);
770 case llvm::Triple::nvptx:
771 case llvm::Triple::nvptx64:
772 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
773 return A->getValue();
776 case llvm::Triple::ppc:
777 case llvm::Triple::ppcle:
778 case llvm::Triple::ppc64:
779 case llvm::Triple::ppc64le:
780 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
782 llvm::PPC::getNormalizedPPCTargetCPU(T, A->getValue()));
783 return std::string(llvm::PPC::getNormalizedPPCTargetCPU(T));
785 case llvm::Triple::csky:
786 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
787 return A->getValue();
788 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
789 return A->getValue();
792 case llvm::Triple::riscv32:
793 case llvm::Triple::riscv64:
794 case llvm::Triple::riscv32be:
795 case llvm::Triple::riscv64be:
798 case llvm::Triple::bpfel:
799 case llvm::Triple::bpfeb:
800 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
801 return A->getValue();
804 case llvm::Triple::sparc:
805 case llvm::Triple::sparcel:
806 case llvm::Triple::sparcv9:
809 case llvm::Triple::x86:
810 case llvm::Triple::x86_64:
813 case llvm::Triple::hexagon:
817 case llvm::Triple::lanai:
820 case llvm::Triple::systemz:
823 case llvm::Triple::r600:
824 case llvm::Triple::amdgcn:
827 case llvm::Triple::wasm32:
828 case llvm::Triple::wasm64:
831 case llvm::Triple::loongarch32:
832 case llvm::Triple::loongarch64:
835 case llvm::Triple::xtensa:
836 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
837 return A->getValue();
843 const llvm::Triple &Triple,
845 std::vector<StringRef> &Features) {
847 options::OPT_m_wasm_Features_Group);
851 const ArgList &Args, ArgStringList &CmdArgs,
852 bool ForAS,
bool IsAux) {
853 std::vector<StringRef> Features;
854 switch (Triple.getArch()) {
857 case llvm::Triple::mips:
858 case llvm::Triple::mipsel:
859 case llvm::Triple::mips64:
860 case llvm::Triple::mips64el:
863 case llvm::Triple::arm:
864 case llvm::Triple::armeb:
865 case llvm::Triple::thumb:
866 case llvm::Triple::thumbeb:
869 case llvm::Triple::ppc:
870 case llvm::Triple::ppcle:
871 case llvm::Triple::ppc64:
872 case llvm::Triple::ppc64le:
875 case llvm::Triple::riscv32:
876 case llvm::Triple::riscv64:
877 case llvm::Triple::riscv32be:
878 case llvm::Triple::riscv64be:
881 case llvm::Triple::systemz:
884 case llvm::Triple::aarch64:
885 case llvm::Triple::aarch64_32:
886 case llvm::Triple::aarch64_be:
889 case llvm::Triple::x86:
890 case llvm::Triple::x86_64:
893 case llvm::Triple::hexagon:
896 case llvm::Triple::wasm32:
897 case llvm::Triple::wasm64:
900 case llvm::Triple::sparc:
901 case llvm::Triple::sparcel:
902 case llvm::Triple::sparcv9:
905 case llvm::Triple::r600:
906 case llvm::Triple::amdgcn:
909 case llvm::Triple::nvptx:
910 case llvm::Triple::nvptx64:
913 case llvm::Triple::m68k:
916 case llvm::Triple::msp430:
919 case llvm::Triple::ve:
922 case llvm::Triple::csky:
925 case llvm::Triple::loongarch32:
926 case llvm::Triple::loongarch64:
932 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
933 CmdArgs.push_back(
Feature.data());
938 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
941 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
942 D.
Diag(diag::err_drv_invalid_int_value)
943 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
944 return LtoJobsArg->getValue();
949 return Triple.isPS();
953 const llvm::opt::ArgList &Args) {
955 Arg *A = Args.getLastArg(options::OPT_mtls_dialect_EQ);
957 return Triple.hasDefaultTLSDESC();
958 StringRef
V = A->getValue();
959 bool SupportedArgument =
false, EnableTLSDESC =
false;
960 bool Unsupported = !Triple.isOSBinFormatELF();
961 if (Triple.isLoongArch() || Triple.isRISCV()) {
962 SupportedArgument =
V ==
"desc" ||
V ==
"trad";
963 EnableTLSDESC =
V ==
"desc";
964 }
else if (Triple.isX86()) {
965 SupportedArgument =
V ==
"gnu" ||
V ==
"gnu2";
966 EnableTLSDESC =
V ==
"gnu2";
971 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
972 << A->getSpelling() << Triple.getTriple();
973 }
else if (!SupportedArgument) {
974 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument_for_target)
975 << A->getSpelling() <<
V << Triple.getTriple();
977 return EnableTLSDESC;
981 llvm::opt::ArgStringList &CmdArgs) {
982 if (Arg *A = Args.getLastArg(options::OPT_fthinlto_distributor_EQ)) {
984 Args.MakeArgString(
"--thinlto-distributor=" + Twine(A->getValue())));
986 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-remote-compiler=" +
989 CmdArgs.push_back(Args.MakeArgString(
990 "--thinlto-remote-compiler-prepend-arg=" + Twine(PA)));
993 Args.getAllArgValues(options::OPT_Xthinlto_distributor_EQ))
994 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-distributor-arg=" + A));
999 ArgStringList &CmdArgs,
const InputInfo &Output,
1002 const bool IsOSAIX = Triple.isOSAIX();
1003 const bool IsAMDGCN = Triple.isAMDGCN();
1004 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ);
1007 const bool IsFatLTO = Args.hasFlag(options::OPT_ffat_lto_objects,
1008 options::OPT_fno_fat_lto_objects,
false);
1009 const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
1011 assert(!Inputs.empty() &&
"Must have at least one input.");
1013 auto Input = llvm::find_if(
1015 if (Input == Inputs.end()) {
1018 Input = Inputs.begin();
1021 if (Linker !=
"lld" && Linker !=
"lld-link" &&
1022 llvm::sys::path::filename(LinkerPath) !=
"ld.lld" &&
1023 llvm::sys::path::stem(LinkerPath) !=
"ld.lld" && !Triple.isOSOpenBSD()) {
1027 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
1028 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
1031 CmdArgs.push_back(
"-plugin");
1034 const char *Suffix =
".dll";
1035#elif defined(__APPLE__)
1036 const char *Suffix =
".dylib";
1038 const char *Suffix =
".so";
1042 llvm::sys::path::native(Twine(D.
Dir) +
1043 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
1044 PluginName + Suffix,
1046 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
1051 CmdArgs.push_back(
"--fat-lto-objects");
1053 if (Args.hasArg(options::OPT_flto_partitions_EQ)) {
1055 StringRef A = Args.getLastArgValue(options::OPT_flto_partitions_EQ,
"8");
1056 if (A.getAsInteger(10,
Value) || (
Value < 1)) {
1057 Arg *Arg = Args.getLastArg(options::OPT_flto_partitions_EQ);
1058 D.
Diag(diag::err_drv_invalid_int_value)
1059 << Arg->getAsString(Args) << Arg->getValue();
1061 CmdArgs.push_back(Args.MakeArgString(
"--lto-partitions=" + A));
1065 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
1066 const char *ExtraDash = IsOSAIX ?
"-" :
"";
1067 const char *ParallelismOpt = IsOSAIX ?
"-threads=" :
"jobs=";
1072 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
1073 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1074 "-generate-arange-section"));
1078 Arg *ArgVecLib = Args.getLastArg(options::OPT_fveclib);
1079 if (ArgVecLib && ArgVecLib->getNumValues() == 1) {
1082 std::optional<StringRef> OptVal =
1083 llvm::StringSwitch<std::optional<StringRef>>(ArgVecLib->getValue())
1084 .Case(
"Accelerate",
"Accelerate")
1085 .Case(
"libmvec",
"LIBMVEC")
1086 .Case(
"AMDLIBM",
"AMDLIBM")
1087 .Case(
"MASSV",
"MASSV")
1088 .Case(
"SVML",
"SVML")
1089 .Case(
"SLEEF",
"sleefgnuabi")
1090 .Case(
"Darwin_libsystem_m",
"Darwin_libsystem_m")
1091 .Case(
"ArmPL",
"ArmPL")
1092 .Case(
"none",
"none")
1093 .Default(std::nullopt);
1096 CmdArgs.push_back(Args.MakeArgString(
1097 Twine(PluginOptPrefix) +
"-vector-library=" + OptVal.value()));
1107 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
1109 if (Args.getLastArg(options::OPT_O_Group)) {
1110 unsigned OptimizationLevel =
1112 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1113 "O" + Twine(OptimizationLevel)));
1116 Args.MakeArgString(Twine(
"--lto-CGO") + Twine(OptimizationLevel)));
1119 if (Args.hasArg(options::OPT_gsplit_dwarf)) {
1121 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1128 Args.MakeArgString(Twine(PluginOptPrefix) +
"dwo_dir=" + F +
"dwo"));
1131 if (IsThinLTO && !IsOSAIX)
1132 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
1133 else if (IsThinLTO && IsOSAIX)
1134 CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
1139 if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
1140 Args.hasArg(options::OPT_fenable_matrix))
1142 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-matrix"));
1145 if (!Parallelism.empty())
1146 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1147 ParallelismOpt + Parallelism));
1150 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
1151 options::OPT_fno_global_isel)) {
1154 CmdArgs.push_back(Args.MakeArgString(
1155 Twine(PluginOptPrefix) +
"-global-isel=" +
1156 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
1161 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
1162 if (A->getOption().matches(options::OPT_glldb))
1164 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
1165 else if (A->getOption().matches(options::OPT_gsce))
1167 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
1168 else if (A->getOption().matches(options::OPT_gdbx))
1170 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
1173 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
1179 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
1183 Arg *A = Args.getLastArg(options::OPT_g_Group);
1184 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
1185 !A->getOption().matches(options::OPT_ggdb0);
1186 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
1187 options::OPT_gno_strict_dwarf,
true))
1189 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
1191 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
1192 StringRef
V = A->getValue();
1193 if (
V ==
"vec-default")
1195 if (
V ==
"vec-extabi") {
1197 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
1203 bool UseSeparateSections =
1206 if (Args.hasFlag(options::OPT_ffunction_sections,
1207 options::OPT_fno_function_sections, UseSeparateSections))
1209 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
1210 else if (Args.hasArg(options::OPT_fno_function_sections))
1212 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
1214 bool DataSectionsTurnedOff =
false;
1215 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1216 UseSeparateSections)) {
1218 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
1219 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
1220 DataSectionsTurnedOff =
true;
1222 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
1225 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
1226 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
1227 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
1228 options::OPT_mno_xcoff_roptr,
false);
1229 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
1231 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1232 << OptStr << Triple.str();
1238 if (DataSectionsTurnedOff)
1239 D.
Diag(diag::err_roptr_requires_data_sections);
1242 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
1247 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
1248 options::OPT_fno_split_machine_functions)) {
1249 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
1250 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1251 "-split-machine-functions"));
1255 Args.getLastArg(options::OPT_fpartition_static_data_sections,
1256 options::OPT_fno_partition_static_data_sections)) {
1257 if (A->getOption().matches(options::OPT_fpartition_static_data_sections)) {
1258 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1259 "-partition-static-data-sections"));
1264 StringRef FName = A->getValue();
1265 if (!llvm::sys::fs::exists(FName))
1266 D.
Diag(diag::err_drv_no_such_file) << FName;
1268 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1269 "sample-profile=" + FName));
1273 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1274 "cs-profile-generate"));
1275 if (CSPGOGenerateArg->getOption().matches(
1276 options::OPT_fcs_profile_generate_EQ)) {
1278 llvm::sys::path::append(Path,
"default_%m.profraw");
1279 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1280 "cs-profile-path=" + Path));
1283 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1284 "cs-profile-path=default_%m.profraw"));
1287 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1288 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1289 llvm::sys::path::append(Path,
"default.profdata");
1290 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1291 "cs-profile-path=" + Path));
1295 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1297 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1298 "-enable-jmc-instrument"));
1300 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1303 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1304 Triple.hasDefaultEmulatedTLS())) {
1306 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1310 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1312 if (Args.hasFlag(options::OPT_fstack_size_section,
1313 options::OPT_fno_stack_size_section,
false))
1315 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1317 if (Args.hasFlag(options::OPT_fexperimental_call_graph_section,
1318 options::OPT_fno_experimental_call_graph_section,
false))
1320 Args.MakeArgString(Twine(PluginOptPrefix) +
"-call-graph-section"));
1324 if (!StatsFile.empty())
1326 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1329 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1330 CmdArgs.push_back(Args.MakeArgString(
1331 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1342 Output, PluginOptPrefix);
1348 true, PluginOptPrefix);
1350 bool IsELF = Triple.isOSBinFormatELF();
1352 bool ImplicitMapSyms =
false;
1353 for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
1354 for (StringRef
V : A->getValues()) {
1355 auto Equal =
V.split(
'=');
1356 auto checkArg = [&](
bool ValidTarget,
1357 std::initializer_list<const char *>
Set) {
1359 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1360 << (Twine(
"-Wa,") +
Equal.first +
"=").str()
1361 << Triple.getTriple();
1362 }
else if (!llvm::is_contained(
Set,
Equal.second)) {
1363 D.
Diag(diag::err_drv_unsupported_option_argument)
1364 << (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
1367 if (
Equal.first ==
"-mmapsyms") {
1368 ImplicitMapSyms =
Equal.second ==
"implicit";
1369 checkArg(IsELF && Triple.isAArch64(), {
"default",
"implicit"});
1370 }
else if (
V ==
"--crel")
1372 else if (
V ==
"--no-crel")
1380 if (IsELF && !Triple.isMIPS()) {
1381 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"-crel"));
1383 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1387 if (ImplicitMapSyms)
1389 Args.MakeArgString(Twine(PluginOptPrefix) +
"-implicit-mapsyms"));
1391 if (Args.hasArg(options::OPT_ftime_report))
1393 Args.MakeArgString(Twine(PluginOptPrefix) +
"-time-passes"));
1399 const ArgList &Args,
1400 ArgStringList &CmdArgs) {
1405 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1406 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1410 ArgStringList &CmdArgs) {
1411 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1412 options::OPT_fno_rtlib_add_rpath,
false))
1424 llvm::sys::path::append(P, M.gccSuffix());
1425 CandidateRPaths.emplace_back(std::string(P));
1427 CandidateRPaths.emplace_back(*StdlibPath);
1429 for (
const auto &CandidateRPath : CandidateRPaths) {
1430 if (TC.
getVFS().exists(CandidateRPath)) {
1431 CmdArgs.push_back(
"-rpath");
1432 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1438 const ToolChain &TC,
const ArgList &Args,
1439 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1441 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1442 options::OPT_fno_openmp,
false)) {
1444 if (Args.hasFlag(options::OPT_foffload_via_llvm,
1445 options::OPT_fno_offload_via_llvm,
false))
1446 CmdArgs.push_back(
"-lomptarget");
1456 if (ForceStaticHostRuntime)
1457 CmdArgs.push_back(
"-Bstatic");
1461 CmdArgs.push_back(
"-lomp");
1464 CmdArgs.push_back(
"-lgomp");
1467 CmdArgs.push_back(
"-liomp5");
1473 if (ForceStaticHostRuntime)
1474 CmdArgs.push_back(
"-Bdynamic");
1477 CmdArgs.push_back(
"-lrt");
1479 if (IsOffloadingHost)
1480 CmdArgs.push_back(
"-lomptarget");
1491 const llvm::opt::ArgList &Args,
1492 llvm::opt::ArgStringList &CmdArgs) {
1498 constexpr llvm::StringLiteral Targets(
"--offload-targets=");
1502 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1503 [](
auto TC) { return TC.second->getTripleString(); });
1505 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1509 ArgStringList &CmdArgs, StringRef Sanitizer,
1510 bool IsShared,
bool IsWhole) {
1513 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1516 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1526 ArgStringList &CmdArgs,
1527 StringRef Sanitizer) {
1532 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1535 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1536 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1543 const llvm::opt::ArgList &Args,
1544 llvm::opt::ArgStringList &CmdArgs,
1547 "AIX linker does not support any form of --as-needed option yet.");
1555 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1556 CmdArgs.push_back(
"-z");
1557 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1559 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1564 const llvm::opt::ArgList &Args,
1565 ArgStringList &CmdArgs) {
1570 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1572 CmdArgs.push_back(
"-lpthread");
1574 CmdArgs.push_back(
"-lrt");
1576 CmdArgs.push_back(
"-lm");
1581 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1582 CmdArgs.push_back(
"-ldl");
1586 CmdArgs.push_back(
"-lexecinfo");
1588 CmdArgs.push_back(
"-lbsd");
1594 CmdArgs.push_back(
"-lresolv");
1604 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1609 SharedRuntimes.push_back(
"asan");
1610 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1611 HelperStaticRuntimes.push_back(
"asan-preinit");
1614 SharedRuntimes.push_back(
"memprof");
1615 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1616 HelperStaticRuntimes.push_back(
"memprof-preinit");
1619 SharedRuntimes.push_back(
"nsan");
1622 SharedRuntimes.push_back(
"ubsan_minimal");
1624 SharedRuntimes.push_back(
"ubsan_standalone");
1627 SharedRuntimes.push_back(
"scudo_standalone");
1630 SharedRuntimes.push_back(
"tsan");
1632 SharedRuntimes.push_back(
"tysan");
1635 SharedRuntimes.push_back(
"hwasan_aliases");
1637 SharedRuntimes.push_back(
"hwasan");
1638 if (!Args.hasArg(options::OPT_shared))
1639 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1642 SharedRuntimes.push_back(
"rtsan");
1647 StaticRuntimes.push_back(
"stats_client");
1651 HelperStaticRuntimes.push_back(
"asan_static");
1654 if (Args.hasArg(options::OPT_shared)) {
1663 StaticRuntimes.push_back(
"asan");
1665 StaticRuntimes.push_back(
"asan_cxx");
1670 StaticRuntimes.push_back(
"rtsan");
1673 StaticRuntimes.push_back(
"memprof");
1675 StaticRuntimes.push_back(
"memprof_cxx");
1680 StaticRuntimes.push_back(
"hwasan_aliases");
1682 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1684 StaticRuntimes.push_back(
"hwasan");
1686 StaticRuntimes.push_back(
"hwasan_cxx");
1690 StaticRuntimes.push_back(
"dfsan");
1692 StaticRuntimes.push_back(
"lsan");
1694 StaticRuntimes.push_back(
"msan");
1696 StaticRuntimes.push_back(
"msan_cxx");
1699 StaticRuntimes.push_back(
"nsan");
1701 StaticRuntimes.push_back(
"tsan");
1703 StaticRuntimes.push_back(
"tsan_cxx");
1706 StaticRuntimes.push_back(
"tysan");
1709 StaticRuntimes.push_back(
"ubsan_minimal");
1711 StaticRuntimes.push_back(
"ubsan_standalone");
1715 NonWholeStaticRuntimes.push_back(
"safestack");
1716 RequiredSymbols.push_back(
"__safestack_init");
1720 StaticRuntimes.push_back(
"cfi");
1722 StaticRuntimes.push_back(
"cfi_diag");
1727 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1730 NonWholeStaticRuntimes.push_back(
"stats");
1731 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1734 StaticRuntimes.push_back(
"scudo_standalone");
1736 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1739 NonWholeStaticRuntimes.push_back(
"ubsan_loop_detect");
1745 ArgStringList &CmdArgs) {
1748 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1751 NonWholeStaticRuntimes, HelperStaticRuntimes,
1756 for (
auto S : RequiredSymbols) {
1757 CmdArgs.push_back(
"-u");
1758 CmdArgs.push_back(Args.MakeArgString(S));
1762 for (
auto RT : SharedRuntimes)
1766 bool FuzzerNeedsSanitizerDeps =
false;
1768 !Args.hasArg(options::OPT_shared)) {
1771 FuzzerNeedsSanitizerDeps =
true;
1775 if (!Args.hasArg(options::OPT_nostdlibxx)) {
1776 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1777 !Args.hasArg(options::OPT_static);
1778 if (OnlyLibstdcxxStatic)
1779 CmdArgs.push_back(
"-Bstatic");
1781 if (OnlyLibstdcxxStatic)
1782 CmdArgs.push_back(
"-Bdynamic");
1786 for (
auto RT : HelperStaticRuntimes)
1788 bool AddExportDynamic =
false;
1789 for (
auto RT : StaticRuntimes) {
1793 for (
auto RT : NonWholeStaticRuntimes) {
1799 if (AddExportDynamic)
1800 CmdArgs.push_back(
"--export-dynamic");
1803 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1806 CmdArgs.push_back(
"-z");
1808 Args.MakeArgString(
"memtag-mode=" + SanArgs.
getMemtagMode()));
1811 CmdArgs.push_back(
"-z");
1812 CmdArgs.push_back(
"memtag-heap");
1816 CmdArgs.push_back(
"-z");
1817 CmdArgs.push_back(
"memtag-stack");
1821 CmdArgs.push_back(
"--android-memtag-note");
1824 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty() ||
1825 FuzzerNeedsSanitizerDeps;
1830 if (Args.hasArg(options::OPT_shared)) {
1832 CmdArgs.push_back(
"--whole-archive");
1834 CmdArgs.push_back(
"--no-whole-archive");
1838 CmdArgs.push_back(
"--whole-archive");
1840 for (
const auto &Mode : XRay.
modeList())
1842 CmdArgs.push_back(
"--no-whole-archive");
1850 const llvm::opt::ArgList &Args,
1851 ArgStringList &CmdArgs) {
1853 CmdArgs.push_back(
"-lpthread");
1855 CmdArgs.push_back(
"-lrt");
1856 CmdArgs.push_back(
"-lm");
1861 CmdArgs.push_back(
"-ldl");
1866 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1867 return !A->getOption().matches(options::OPT_O0);
1875 auto AddPostfix = [JA](
auto &F) {
1880 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1881 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1885 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1888 Arg *FinalOutput = Args.getLastArg(options::OPT_o, options::OPT__SLASH_o);
1889 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1890 T = FinalOutput->getValue();
1891 llvm::sys::path::remove_filename(T);
1892 llvm::sys::path::append(T,
1893 llvm::sys::path::stem(FinalOutput->getValue()));
1895 return Args.MakeArgString(T);
1901 return Args.MakeArgString(T);
1905 const JobAction &JA,
const ArgList &Args,
1906 const InputInfo &Output,
const char *OutFile) {
1907 ArgStringList ExtractArgs;
1908 ExtractArgs.push_back(
"--extract-dwo");
1910 ArgStringList StripArgs;
1911 StripArgs.push_back(
"--strip-dwo");
1916 ExtractArgs.push_back(OutFile);
1923 C.addCommand(std::make_unique<Command>(JA, T,
1925 Exec, ExtractArgs, II, Output));
1928 C.addCommand(std::make_unique<Command>(
1938 Args.ClaimAllArgs(options::OPT_flto_EQ);
1939 Args.ClaimAllArgs(options::OPT_flto);
1940 Args.ClaimAllArgs(options::OPT_fno_lto);
1944 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1945 options::OPT_fcs_profile_generate_EQ,
1946 options::OPT_fno_profile_generate);
1947 if (CSPGOGenerateArg &&
1948 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1949 CSPGOGenerateArg =
nullptr;
1951 return CSPGOGenerateArg;
1955 auto *ProfileUseArg = Args.getLastArg(
1956 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1957 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1958 options::OPT_fno_profile_instr_use);
1960 if (ProfileUseArg &&
1961 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1962 ProfileUseArg =
nullptr;
1964 return ProfileUseArg;
1968 auto *ProfileSampleUseArg = Args.getLastArg(
1969 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
1971 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
1972 options::OPT_fno_profile_sample_use)))
1975 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
1980 case llvm::Reloc::Static:
1982 case llvm::Reloc::PIC_:
1984 case llvm::Reloc::DynamicNoPIC:
1985 return "dynamic-no-pic";
1986 case llvm::Reloc::ROPI:
1988 case llvm::Reloc::RWPI:
1990 case llvm::Reloc::ROPI_RWPI:
1993 llvm_unreachable(
"Unknown Reloc::Model kind");
2000std::tuple<llvm::Reloc::Model, unsigned, bool>
2008 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
2010 bool IsPICLevelTwo = PIC;
2013 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
2016 if (Triple.isAndroid()) {
2017 switch (Triple.getArch()) {
2018 case llvm::Triple::x86:
2019 case llvm::Triple::x86_64:
2021 IsPICLevelTwo =
true;
2031 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
2035 if (Triple.isOSOpenBSD()) {
2037 case llvm::Triple::arm:
2038 case llvm::Triple::aarch64:
2039 case llvm::Triple::mips64:
2040 case llvm::Triple::mips64el:
2041 case llvm::Triple::x86:
2042 case llvm::Triple::x86_64:
2043 IsPICLevelTwo =
false;
2046 case llvm::Triple::ppc:
2047 case llvm::Triple::sparcv9:
2048 IsPICLevelTwo =
true;
2060 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2061 options::OPT_fpic, options::OPT_fno_pic,
2062 options::OPT_fPIE, options::OPT_fno_PIE,
2063 options::OPT_fpie, options::OPT_fno_pie);
2064 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
2065 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
2066 options::OPT_fPIE, options::OPT_fpie)) {
2068 << LastPICArg->getSpelling() << Triple.str();
2069 if (Triple.getArch() == llvm::Triple::x86_64)
2070 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
2071 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2078 Option O = LastPICArg->getOption();
2079 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2080 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2081 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2083 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2085 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
2088 if (EffectiveTriple.isPS()) {
2089 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
2090 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
2091 if (Model !=
"kernel") {
2094 << LastPICArg->getSpelling()
2095 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
2105 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
2111 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
2112 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
2115 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2118 if (!Triple.isOSDarwin())
2120 << A->getSpelling() << Triple.str();
2129 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
2132 bool EmbeddedPISupported;
2133 switch (Triple.getArch()) {
2134 case llvm::Triple::arm:
2135 case llvm::Triple::armeb:
2136 case llvm::Triple::thumb:
2137 case llvm::Triple::thumbeb:
2138 EmbeddedPISupported =
true;
2141 EmbeddedPISupported =
false;
2145 bool ROPI =
false, RWPI =
false;
2146 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
2147 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
2148 if (!EmbeddedPISupported)
2150 << LastROPIArg->getSpelling() << Triple.str();
2153 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2154 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2155 if (!EmbeddedPISupported)
2157 << LastRWPIArg->getSpelling() << Triple.str();
2162 if ((ROPI || RWPI) && (PIC || PIE))
2165 if (Triple.isMIPS()) {
2172 if (ABIName ==
"n64")
2175 if(Args.hasArg(options::OPT_mno_abicalls))
2176 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2179 IsPICLevelTwo =
false;
2183 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2185 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2187 RelocM = llvm::Reloc::ROPI_RWPI;
2189 RelocM = llvm::Reloc::ROPI;
2191 RelocM = llvm::Reloc::RWPI;
2193 return std::make_tuple(RelocM, 0
U,
false);
2197 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
2198 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
2200 const llvm::opt::OptTable &Opts = D.
getOpts();
2201 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
2202 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
2203 D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
2205 return HasStaticPIE;
2225 const ArgList &Args) {
2226 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2227 options::OPT_falign_functions_EQ,
2228 options::OPT_fno_align_functions);
2229 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2232 if (A->getOption().matches(options::OPT_falign_functions))
2236 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2238 << A->getAsString(Args) << A->getValue();
2243 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2244 switch (DebugInfoKind) {
2245 case llvm::codegenoptions::DebugDirectivesOnly:
2246 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2248 case llvm::codegenoptions::DebugLineTablesOnly:
2249 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2251 case llvm::codegenoptions::DebugInfoConstructor:
2252 CmdArgs.push_back(
"-debug-info-kind=constructor");
2254 case llvm::codegenoptions::LimitedDebugInfo:
2255 CmdArgs.push_back(
"-debug-info-kind=limited");
2257 case llvm::codegenoptions::FullDebugInfo:
2258 CmdArgs.push_back(
"-debug-info-kind=standalone");
2260 case llvm::codegenoptions::UnusedTypeInfo:
2261 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2271 assert(A.getOption().matches(options::OPT_gN_Group) &&
2272 "Not a -g option that specifies a debug-info level");
2273 if (A.getOption().matches(options::OPT_g0) ||
2274 A.getOption().matches(options::OPT_ggdb0))
2275 return llvm::codegenoptions::NoDebugInfo;
2276 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2277 A.getOption().matches(options::OPT_ggdb1))
2278 return llvm::codegenoptions::DebugLineTablesOnly;
2279 if (A.getOption().matches(options::OPT_gline_directives_only))
2280 return llvm::codegenoptions::DebugDirectivesOnly;
2281 return llvm::codegenoptions::DebugInfoConstructor;
2285 const ArgList &Args) {
2286 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2292 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 6 ||
2295 << A->getAsString(Args) << A->getValue();
2300 return llvm::StringSwitch<unsigned>(ArgValue)
2301 .Case(
"-gdwarf-2", 2)
2302 .Case(
"-gdwarf-3", 3)
2303 .Case(
"-gdwarf-4", 4)
2304 .Case(
"-gdwarf-5", 5)
2305 .Case(
"-gdwarf-6", 6)
2310 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2311 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2312 options::OPT_gdwarf_6, options::OPT_gdwarf);
2316 const llvm::opt::ArgList &Args) {
2321 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2322 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2323 << GDwarfN->getSpelling() << TC.
getTriple().str();
2325 if (DwarfVersion == 0) {
2327 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2329 return DwarfVersion;
2333 const ArgList &Args, Arg *&Arg) {
2334 Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
2335 options::OPT_gno_split_dwarf);
2336 if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
2339 if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
2342 StringRef
Value = Arg->getValue();
2343 if (
Value ==
"split")
2345 if (
Value ==
"single")
2348 D.
Diag(diag::err_drv_unsupported_option_argument)
2349 << Arg->getSpelling() << Arg->getValue();
2355 assert(A &&
"Expected non-nullptr argument.");
2358 D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
2364 const ArgList &Args,
2365 ArgStringList &CmdArgs) {
2366 if (Args.hasFlag(options::OPT_fdebug_info_for_profiling,
2367 options::OPT_fno_debug_info_for_profiling,
false) &&
2369 Args.getLastArg(options::OPT_fdebug_info_for_profiling), Args, D, TC))
2370 CmdArgs.push_back(
"-fdebug-info-for-profiling");
2374 ArgStringList &CmdArgs) {
2375 llvm::Reloc::Model RelocationModel;
2380 if (RelocationModel != llvm::Reloc::Static)
2381 CmdArgs.push_back(
"-KPIC");
2387 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2393 const ArgList &Args) {
2394 if (Args.hasArg(options::OPT_static_libgcc) ||
2395 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2399 if (Args.hasArg(options::OPT_shared_libgcc))
2418 ArgStringList &CmdArgs,
const ArgList &Args) {
2422 CmdArgs.push_back(
"-l:libunwind.a");
2445 CmdArgs.push_back(
"-lgcc_eh");
2447 CmdArgs.push_back(
"-lgcc_s");
2455 CmdArgs.push_back(
"-lunwind");
2457 CmdArgs.push_back(
"-l:libunwind.a");
2460 CmdArgs.push_back(
"-l:libunwind.dll.a");
2462 CmdArgs.push_back(
"-l:libunwind.so");
2466 CmdArgs.push_back(
"-lunwind");
2476 ArgStringList &CmdArgs,
const ArgList &Args) {
2480 CmdArgs.push_back(
"-lgcc");
2484 CmdArgs.push_back(
"-lgcc");
2488 CmdArgs.push_back(
"--as-needed");
2490 CmdArgs.push_back(
"--no-as-needed");
2495 ArgStringList &CmdArgs,
const ArgList &Args) {
2506 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2509 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2510 if (A && A->getValue() != StringRef(
"platform")) {
2511 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2512 << A->getValue() <<
"MSVC";
2522 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2523 !Args.hasArg(options::OPT_static_pie))
2524 CmdArgs.push_back(
"-ldl");
2531 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2537 StringRef SaveStats = A->getValue();
2538 if (SaveStats ==
"obj" && Output.
isFilename()) {
2540 llvm::sys::path::remove_filename(StatsFile);
2541 }
else if (SaveStats !=
"cwd") {
2542 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2546 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2547 llvm::sys::path::append(StatsFile, BaseName);
2548 llvm::sys::path::replace_extension(StatsFile,
"stats");
2560 assert(Flag.front() ==
'-');
2562 Flags.push_back(Flag.str());
2564 Flags.push_back((
"!" + Flag.substr(1)).str());
2569 ArgStringList &CmdArgs,
bool IsLTO,
2570 const StringRef PluginOptPrefix) {
2571 auto addArg = [&, IsLTO](
const Twine &Arg) {
2573 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2574 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2576 CmdArgs.push_back(
"-mllvm");
2577 CmdArgs.push_back(Args.MakeArgString(Arg));
2581 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2582 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2584 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2585 StringRef
Value = A->getValue();
2587 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2588 !llvm::isPowerOf2_64(Boundary)) {
2589 D.
Diag(diag::err_drv_invalid_argument_to_option)
2590 <<
Value << A->getOption().getName();
2592 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2595 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2596 std::string AlignBranch;
2597 for (StringRef T : A->getValues()) {
2598 if (T !=
"fused" && T !=
"jcc" && T !=
"jmp" && T !=
"call" &&
2599 T !=
"ret" && T !=
"indirect")
2600 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2601 << T <<
"fused, jcc, jmp, call, ret, indirect";
2602 if (!AlignBranch.empty())
2606 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2608 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2609 StringRef
Value = A->getValue();
2610 unsigned PrefixSize;
2611 if (
Value.getAsInteger(10, PrefixSize)) {
2612 D.
Diag(diag::err_drv_invalid_argument_to_option)
2613 <<
Value << A->getOption().getName();
2615 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2641 llvm::opt::ArgStringList &CC1Args,
2643 StringRef Lib, StringRef
Arch, StringRef
Target,
2644 bool isBitCodeSDL) {
2647 std::string LibDeviceLoc =
"/libdevice";
2648 std::string LibBcPrefix =
"/libbc-";
2649 std::string LibPrefix =
"/lib";
2666 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2667 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2669 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2670 Twine(Lib +
"-" +
Arch).str(), Twine(Lib).str()}) {
2671 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2672 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2682 const auto *Ext =
".a";
2684 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2685 Twine(Lib +
"-" +
Arch).str()}) {
2686 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2687 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2698 bool FoundSDL =
false;
2699 for (
auto LPath : LibraryPaths) {
2700 for (
auto SDL : SDLs) {
2701 auto FullName = Twine(LPath + SDL).str();
2702 if (llvm::sys::fs::exists(FullName)) {
2703 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2720 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2721 llvm::opt::ArgStringList &CC1Args,
2723 StringRef
Arch, StringRef
Target,
bool isBitCodeSDL) {
2726 if (isBitCodeSDL &&
Arch.contains(
"nvptx"))
2729 bool FoundAOB =
false;
2730 std::string ArchiveOfBundles;
2733 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2734 auto Ext = IsMSVC ?
".lib" :
".a";
2735 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2736 if (llvm::sys::fs::exists(Lib)) {
2737 ArchiveOfBundles = Lib;
2741 Lib.consume_front(
"-l");
2742 for (
auto LPath : LibraryPaths) {
2743 ArchiveOfBundles.clear();
2744 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2745 : IsMSVC ? Lib + Ext
2746 :
"lib" + Lib + Ext)
2748 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2749 auto AOB = Twine(LPath + Prefix + LibFile).str();
2750 if (llvm::sys::fs::exists(AOB)) {
2751 ArchiveOfBundles = AOB;
2764 llvm::file_magic Magic;
2765 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2766 if (EC || Magic != llvm::file_magic::archive)
2769 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2770 std::string OutputLib =
2776 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2780 DeviceTriple +=
'-';
2781 std::string NormalizedTriple = T.getToolChain().getTriple().normalize(
2782 llvm::Triple::CanonicalForm::FOUR_IDENT);
2783 DeviceTriple += NormalizedTriple;
2785 DeviceTriple +=
'-';
2789 std::string UnbundleArg(
"-unbundle");
2790 std::string TypeArg(
"-type=a");
2791 std::string InputArg(
"-input=" + ArchiveOfBundles);
2792 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2793 std::string OutputArg(
"-output=" + OutputLib);
2795 const char *UBProgram = DriverArgs.MakeArgString(
2796 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2798 ArgStringList UBArgs;
2799 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2800 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2801 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2802 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2803 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2807 std::string AdditionalArgs(
"-allow-missing-bundles");
2808 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2813 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2814 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2816 C.addCommand(std::make_unique<Command>(
2818 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2820 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2827 const llvm::opt::ArgList &DriverArgs,
2828 llvm::opt::ArgStringList &CC1Args,
2830 bool isBitCodeSDL) {
2861 const llvm::opt::ArgList &DriverArgs,
2862 llvm::opt::ArgStringList &CC1Args,
2864 bool isBitCodeSDL) {
2868 std::optional<std::string> LibPath =
2869 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2872 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2873 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2874 for (StringRef Path : Frags)
2875 LibraryPaths.emplace_back(Path.trim());
2879 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2880 LibraryPaths.emplace_back(Search_Dir);
2884 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2885 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2888 llvm::SmallSet<std::string, 16> SDLNames;
2889 static const StringRef HostOnlyArchives[] = {
2890 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2891 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2892 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2893 SDLNames.insert(std::string(
"-l") + SDLName);
2897 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2904 const StringRef LibFileExt =
".lib";
2905 if (!llvm::sys::path::has_extension(
FileName) ||
2907 llvm::sys::path::extension(
FileName).drop_front()) ==
2909 llvm::sys::path::extension(
FileName) == LibFileExt)
2910 SDLNames.insert(Input);
2917 for (
auto SDLName : SDLNames) {
2928static llvm::opt::Arg *
2930 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2934 const llvm::opt::ArgList &Args) {
2935 const unsigned MinCodeObjVer = 4;
2936 const unsigned MaxCodeObjVer = 6;
2939 if (CodeObjArg->getOption().getID() ==
2940 options::OPT_mcode_object_version_EQ) {
2941 unsigned CodeObjVer = MaxCodeObjVer;
2943 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2944 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2945 D.
Diag(diag::err_drv_invalid_int_value)
2946 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2952 const llvm::opt::ArgList &Args) {
2953 unsigned CodeObjVer = 6;
2955 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2960 const Driver &D,
const llvm::opt::ArgList &Args) {
2965 const llvm::opt::ArgList &Args,
2966 llvm::opt::ArgStringList &CmdArgs,
2967 const llvm::Triple &Triple,
bool IsLTO,
2968 const StringRef PluginOptPrefix) {
2969 auto addArg = [&, IsLTO](
const Twine &Arg) {
2971 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2972 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2974 CmdArgs.push_back(
"-mllvm");
2975 CmdArgs.push_back(Args.MakeArgString(Arg));
2979 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2980 options::OPT_mno_outline)) {
2981 if (A->getOption().matches(options::OPT_moutline)) {
2985 if (Triple.isARM() || Triple.isThumb() || Triple.isAArch64() ||
2986 Triple.isRISCV() || Triple.isX86()) {
2987 addArg(Twine(
"-enable-machine-outliner"));
2989 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2995 CmdArgs.push_back(
"-mno-outline");
2998 addArg(Twine(
"-enable-machine-outliner=never"));
3002 auto *CodeGenDataGenArg =
3003 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
3004 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
3007 if (CodeGenDataGenArg && CodeGenDataUseArg)
3008 D.
Diag(diag::err_drv_argument_not_allowed_with)
3009 << CodeGenDataGenArg->getAsString(Args)
3010 << CodeGenDataUseArg->getAsString(Args);
3014 if (CodeGenDataGenArg)
3015 addArg(Twine(
"-codegen-data-generate"));
3018 if (CodeGenDataUseArg)
3019 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
3023 const llvm::opt::ArgList &DriverArgs,
3024 llvm::opt::ArgStringList &CC1Args,
3025 StringRef BitcodeSuffix,
3026 const llvm::Triple &Triple,
3031 std::optional<std::string> LibPath =
3032 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
3035 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
3036 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
3037 for (StringRef Path : Frags)
3038 LibraryPaths.emplace_back(Path.trim());
3043 LibraryPaths.emplace_back(LibPath);
3047 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
3048 LibraryPaths.emplace_back(P);
3050 OptSpecifier LibomptargetBCPathOpt =
3051 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
3052 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
3053 : options::OPT_libomptarget_spirv_bc_path_EQ;
3055 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
3056 : Triple.isNVPTX() ?
"nvptx"
3058 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
3061 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
3063 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
3064 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
3065 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3068 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3069 CC1Args.push_back(
"-mlink-builtin-bitcode");
3070 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3072 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
3073 << LibOmpTargetFile;
3076 bool FoundBCLibrary =
false;
3078 for (StringRef LibraryPath : LibraryPaths) {
3080 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));
3084 FoundBCLibrary =
true;
3089 if (!FoundBCLibrary)
3090 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
3091 << LibOmpTargetName << ArchPrefix;
3096 const llvm::opt::ArgList &DriverArgs,
3097 llvm::opt::ArgStringList &CC1Args) {
3099 StringRef LibclcNamespec;
3100 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
3103 LibclcNamespec = A->getValue();
3105 if (!TT.isAMDGPU() || TT.getEnvironment() != llvm::Triple::LLVM)
3109 if (DriverArgs.hasArg(options::OPT_no_offloadlib,
3110 options::OPT_nodefaultlibs, options::OPT_nostdlib))
3114 bool FilenameSearch = LibclcNamespec.consume_front(
":");
3115 if (FilenameSearch) {
3117 if (D.
getVFS().exists(LibclcFile)) {
3118 CC1Args.push_back(
"-mlink-builtin-bitcode");
3119 CC1Args.push_back(DriverArgs.MakeArgString(LibclcFile));
3122 D.
Diag(diag::err_drv_libclc_not_found) << LibclcFile;
3128 llvm::sys::path::append(BasePath,
"lib");
3133 if (
const Arg *CPUArg =
3134 DriverArgs.getLastArg(options::OPT_mcpu_EQ, options::OPT_march_EQ)) {
3135 StringRef CPU = CPUArg->getValue();
3138 llvm::sys::path::append(CPUPath, CPU,
"libclc.bc");
3139 if (D.
getVFS().exists(CPUPath)) {
3140 CC1Args.push_back(
"-mlink-builtin-bitcode");
3141 CC1Args.push_back(DriverArgs.MakeArgString(CPUPath));
3149 llvm::sys::path::append(GenericPath,
"libclc.bc");
3150 if (D.
getVFS().exists(GenericPath)) {
3151 CC1Args.push_back(
"-mlink-builtin-bitcode");
3152 CC1Args.push_back(DriverArgs.MakeArgString(GenericPath));
3156 D.
Diag(diag::err_drv_libclc_not_found) <<
"libclc.bc";
3160 const llvm::opt::ArgList &Args,
3161 llvm::opt::ArgStringList &CmdArgs,
3162 const llvm::Triple &Triple) {
3163 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3164 options::OPT_mno_outline_atomics)) {
3166 if (!Triple.isAArch64()) {
3167 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3168 << Triple.getArchName() << A->getOption().getName();
3170 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3171 CmdArgs.push_back(
"-target-feature");
3172 CmdArgs.push_back(
"+outline-atomics");
3174 CmdArgs.push_back(
"-target-feature");
3175 CmdArgs.push_back(
"-outline-atomics");
3179 CmdArgs.push_back(
"-target-feature");
3180 CmdArgs.push_back(
"+outline-atomics");
3185 llvm::opt::ArgStringList &CmdArgs) {
3186 if (TCArgs.hasFlag(options::OPT_offload_compress,
3187 options::OPT_no_offload_compress,
false))
3188 CmdArgs.push_back(
"--compress");
3189 if (TCArgs.hasArg(options::OPT_v))
3190 CmdArgs.push_back(
"--verbose");
3191 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3193 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3197 const llvm::Triple &Triple,
3198 const llvm::Reloc::Model &RelocationModel,
3199 llvm::opt::ArgStringList &CmdArgs) {
3200 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3201 StringRef CM = A->getValue();
3203 if (Triple.isOSAIX() && CM ==
"medium")
3205 if (Triple.isAArch64(64)) {
3206 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3207 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3208 RelocationModel != llvm::Reloc::Static)
3209 D.
Diag(diag::err_drv_argument_only_allowed_with)
3210 << A->getAsString(Args) <<
"-fno-pic";
3211 }
else if (Triple.isLoongArch()) {
3212 if (CM ==
"extreme" &&
3213 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3214 D.
Diag(diag::err_drv_argument_not_allowed_with)
3215 << A->getAsString(Args) <<
"-fplt";
3216 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3219 CM = llvm::StringSwitch<StringRef>(CM)
3220 .Case(
"normal",
"small")
3221 .Case(
"extreme",
"large")
3223 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3224 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3225 }
else if (Triple.isRISCV()) {
3227 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3228 D.
Diag(diag::err_drv_argument_not_allowed_with)
3229 << A->getAsString(Args) <<
"-fpic";
3232 else if (CM ==
"medany")
3234 Ok = CM ==
"small" || CM ==
"medium" ||
3235 (CM ==
"large" && Triple.isRISCV64());
3236 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3237 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3238 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3242 }
else if (Triple.isSPARC64()) {
3245 else if (CM ==
"medmid")
3247 else if (CM ==
"medany")
3249 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3250 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3251 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3254 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3256 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3257 << A->getSpelling() << CM << Triple.getTriple();
3261 if (Triple.getArch() == llvm::Triple::x86_64) {
3262 bool IsMediumCM =
false;
3263 bool IsLargeCM =
false;
3264 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3265 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3266 IsLargeCM = StringRef(A->getValue()) ==
"large";
3268 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3269 if (!IsMediumCM && !IsLargeCM) {
3270 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3271 << A->getOption().getRenderName();
3273 A->render(Args, CmdArgs);
3275 }
else if (IsMediumCM) {
3276 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3277 }
else if (IsLargeCM) {
3278 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3284 ArgStringList &CmdArgs) {
3289 Args.getLastArg(options::OPT_fcolor_diagnostics,
3290 options::OPT_fno_color_diagnostics);
3291 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3292 StringRef
Value(A->getValue());
3294 D.
Diag(diag::err_drv_invalid_argument_to_option)
3295 <<
Value << A->getOption().getName();
3299 CmdArgs.push_back(
"-fcolor-diagnostics");
3304 for (; *Arg; ++Arg) {
3310 Res.push_back(
'\\');
3313 Res.push_back(*Arg);
3318 const llvm::opt::ArgList &Args) {
3322 llvm::opt::ArgStringList OriginalArgs;
3323 for (
const auto &Arg : Args)
3324 Arg->render(Args, OriginalArgs);
3328 for (
const char *OriginalArg : OriginalArgs) {
3332 Flags += EscapedArg;
3335 return Args.MakeArgString(Flags);
3339 const llvm::opt::ArgList &Args,
3340 bool &FRecordCommandLine,
3341 bool &GRecordCommandLine) {
3344 const std::string &TripleStr = Triple.getTriple();
3346 FRecordCommandLine =
3347 Args.hasFlag(options::OPT_frecord_command_line,
3348 options::OPT_fno_record_command_line,
false);
3349 GRecordCommandLine =
3350 Args.hasFlag(options::OPT_grecord_command_line,
3351 options::OPT_gno_record_command_line,
false);
3352 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3353 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3354 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3355 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3362 ArgStringList &CmdArgs,
3363 const llvm::Triple &Triple) {
3364 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
3365 options::OPT_fno_global_isel)) {
3366 CmdArgs.push_back(
"-mllvm");
3367 if (A->getOption().matches(options::OPT_fglobal_isel)) {
3368 CmdArgs.push_back(
"-global-isel=1");
3373 bool IsArchSupported = Triple.getArch() == llvm::Triple::aarch64;
3374 bool IsOptLevelSupported =
false;
3376 Arg *A = Args.getLastArg(options::OPT_O_Group);
3377 if (IsArchSupported) {
3378 if (!A || A->getOption().matches(options::OPT_O0))
3379 IsOptLevelSupported =
true;
3381 if (!IsArchSupported || !IsOptLevelSupported) {
3382 CmdArgs.push_back(
"-mllvm");
3383 CmdArgs.push_back(
"-global-isel-abort=2");
3385 if (!IsArchSupported)
3386 D.
Diag(diag::warn_drv_global_isel_incomplete) << Triple.getArchName();
3388 D.
Diag(diag::warn_drv_global_isel_incomplete_opt);
3391 CmdArgs.push_back(
"-global-isel=0");
3397 ArgStringList &CmdArgs) {
3398 bool use_fwrapv =
false;
3399 bool use_fwrapv_pointer =
false;
3400 for (
const Arg *A : Args.filtered(
3401 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3402 options::OPT_fwrapv, options::OPT_fno_wrapv,
3403 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3405 switch (A->getOption().getID()) {
3406 case options::OPT_fstrict_overflow:
3408 use_fwrapv_pointer =
false;
3410 case options::OPT_fno_strict_overflow:
3412 use_fwrapv_pointer =
true;
3414 case options::OPT_fwrapv:
3417 case options::OPT_fno_wrapv:
3420 case options::OPT_fwrapv_pointer:
3421 use_fwrapv_pointer =
true;
3423 case options::OPT_fno_wrapv_pointer:
3424 use_fwrapv_pointer =
false;
3430 CmdArgs.push_back(
"-fwrapv");
3431 if (use_fwrapv_pointer)
3432 CmdArgs.push_back(
"-fwrapv-pointer");
3439 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3440 if (A->getOption().matches(options::OPT_O4) ||
3441 A->getOption().matches(options::OPT_Ofast))
3444 if (A->getOption().matches(options::OPT_O0))
3447 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3450 StringRef S(A->getValue());
3458 unsigned OptLevel = 0;
3459 if (S.getAsInteger(10, OptLevel))
3462 return OptLevel > 1;
3469 ArgStringList &CmdArgs) {
3471 if (Args.hasFlag(options::OPT_fvectorize, options::OPT_fno_vectorize,
3473 CmdArgs.push_back(
"-vectorize-loops");
3477 ArgStringList &CmdArgs) {
3479 if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize,
3481 CmdArgs.push_back(
"-vectorize-slp");
3485 ArgStringList &CmdArgs) {
3486 if (Args.hasFlag(options::OPT_floop_interchange,
3487 options::OPT_fno_loop_interchange,
false))
3488 CmdArgs.push_back(
"-floop-interchange");
3509 llvm_unreachable(
"Fully covered switch above");
3515 if (!ComplexRangeStr.empty())
3516 return "-complex-range=" + ComplexRangeStr;
3517 return ComplexRangeStr;
3537 if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
3538 (LastOpt ==
"-fcx-limited-range" && NewOpt ==
"-fno-cx-limited-range") ||
3539 (LastOpt ==
"-fno-cx-limited-range" && NewOpt ==
"-fcx-limited-range") ||
3540 (LastOpt ==
"-fcx-fortran-rules" && NewOpt ==
"-fno-cx-fortran-rules") ||
3541 (LastOpt ==
"-fno-cx-fortran-rules" && NewOpt ==
"-fcx-fortran-rules") ||
3542 (LastOpt ==
"-ffast-math" && NewOpt ==
"-fno-fast-math") ||
3543 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-ffast-math") ||
3544 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-fno-fast-math") ||
3545 (LastOpt.starts_with(
"-ffp-model=") &&
3546 NewOpt.starts_with(
"-ffp-model=")) ||
3547 (LastOpt.starts_with(
"-fcomplex-arithmetic=") &&
3548 NewOpt.starts_with(
"-fcomplex-arithmetic=")))
3551 D.
Diag(clang::diag::warn_drv_overriding_complex_range)
3571 const ArgStringList &LinkerInputs,
3573 const llvm::opt::ArgList &Args,
3574 const char *OutputFilename) {
3578 assert(!LinkerInputs.empty() && !JobInputs.empty() &&
3579 "Must have at least one input.");
3581 ArgStringList LlvmLinkArgs(
3582 {
"-o", OutputFilename ? OutputFilename : Output.
getFilename()});
3584 LlvmLinkArgs.append(LinkerInputs);
3587 const char *LlvmLink = Args.MakeArgString(TC.
GetProgramPath(
"llvm-link"));
3589 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.
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.
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()