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))
1420 CandidateRPaths.emplace_back(*CandidateRPath);
1422 for (
const auto &CandidateRPath : CandidateRPaths) {
1423 if (TC.
getVFS().exists(CandidateRPath)) {
1424 CmdArgs.push_back(
"-rpath");
1425 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1431 const ToolChain &TC,
const ArgList &Args,
1432 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1434 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1435 options::OPT_fno_openmp,
false)) {
1437 if (Args.hasFlag(options::OPT_foffload_via_llvm,
1438 options::OPT_fno_offload_via_llvm,
false))
1439 CmdArgs.push_back(
"-lomptarget");
1449 if (ForceStaticHostRuntime)
1450 CmdArgs.push_back(
"-Bstatic");
1454 CmdArgs.push_back(
"-lomp");
1457 CmdArgs.push_back(
"-lgomp");
1460 CmdArgs.push_back(
"-liomp5");
1466 if (ForceStaticHostRuntime)
1467 CmdArgs.push_back(
"-Bdynamic");
1470 CmdArgs.push_back(
"-lrt");
1472 if (IsOffloadingHost)
1473 CmdArgs.push_back(
"-lomptarget");
1484 const llvm::opt::ArgList &Args,
1485 llvm::opt::ArgStringList &CmdArgs) {
1491 constexpr llvm::StringLiteral Targets(
"--offload-targets=");
1495 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1496 [](
auto TC) { return TC.second->getTripleString(); });
1498 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1502 ArgStringList &CmdArgs, StringRef Sanitizer,
1503 bool IsShared,
bool IsWhole) {
1506 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1509 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1519 ArgStringList &CmdArgs,
1520 StringRef Sanitizer) {
1525 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1528 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1529 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1536 const llvm::opt::ArgList &Args,
1537 llvm::opt::ArgStringList &CmdArgs,
1540 "AIX linker does not support any form of --as-needed option yet.");
1548 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1549 CmdArgs.push_back(
"-z");
1550 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1552 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1557 const llvm::opt::ArgList &Args,
1558 ArgStringList &CmdArgs) {
1563 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1565 CmdArgs.push_back(
"-lpthread");
1567 CmdArgs.push_back(
"-lrt");
1569 CmdArgs.push_back(
"-lm");
1574 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1575 CmdArgs.push_back(
"-ldl");
1579 CmdArgs.push_back(
"-lexecinfo");
1581 CmdArgs.push_back(
"-lbsd");
1587 CmdArgs.push_back(
"-lresolv");
1597 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1602 SharedRuntimes.push_back(
"asan");
1603 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1604 HelperStaticRuntimes.push_back(
"asan-preinit");
1607 SharedRuntimes.push_back(
"memprof");
1608 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1609 HelperStaticRuntimes.push_back(
"memprof-preinit");
1612 SharedRuntimes.push_back(
"nsan");
1615 SharedRuntimes.push_back(
"ubsan_minimal");
1617 SharedRuntimes.push_back(
"ubsan_standalone");
1620 SharedRuntimes.push_back(
"scudo_standalone");
1623 SharedRuntimes.push_back(
"tsan");
1625 SharedRuntimes.push_back(
"tysan");
1628 SharedRuntimes.push_back(
"hwasan_aliases");
1630 SharedRuntimes.push_back(
"hwasan");
1631 if (!Args.hasArg(options::OPT_shared))
1632 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1635 SharedRuntimes.push_back(
"rtsan");
1640 StaticRuntimes.push_back(
"stats_client");
1644 HelperStaticRuntimes.push_back(
"asan_static");
1647 if (Args.hasArg(options::OPT_shared)) {
1656 StaticRuntimes.push_back(
"asan");
1658 StaticRuntimes.push_back(
"asan_cxx");
1663 StaticRuntimes.push_back(
"rtsan");
1666 StaticRuntimes.push_back(
"memprof");
1668 StaticRuntimes.push_back(
"memprof_cxx");
1673 StaticRuntimes.push_back(
"hwasan_aliases");
1675 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1677 StaticRuntimes.push_back(
"hwasan");
1679 StaticRuntimes.push_back(
"hwasan_cxx");
1683 StaticRuntimes.push_back(
"dfsan");
1685 StaticRuntimes.push_back(
"lsan");
1687 StaticRuntimes.push_back(
"msan");
1689 StaticRuntimes.push_back(
"msan_cxx");
1692 StaticRuntimes.push_back(
"nsan");
1694 StaticRuntimes.push_back(
"tsan");
1696 StaticRuntimes.push_back(
"tsan_cxx");
1699 StaticRuntimes.push_back(
"tysan");
1702 StaticRuntimes.push_back(
"ubsan_minimal");
1704 StaticRuntimes.push_back(
"ubsan_standalone");
1708 NonWholeStaticRuntimes.push_back(
"safestack");
1709 RequiredSymbols.push_back(
"__safestack_init");
1713 StaticRuntimes.push_back(
"cfi");
1715 StaticRuntimes.push_back(
"cfi_diag");
1720 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1723 NonWholeStaticRuntimes.push_back(
"stats");
1724 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1727 StaticRuntimes.push_back(
"scudo_standalone");
1729 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1732 NonWholeStaticRuntimes.push_back(
"ubsan_loop_detect");
1738 ArgStringList &CmdArgs) {
1741 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1744 NonWholeStaticRuntimes, HelperStaticRuntimes,
1749 for (
auto S : RequiredSymbols) {
1750 CmdArgs.push_back(
"-u");
1751 CmdArgs.push_back(Args.MakeArgString(S));
1755 for (
auto RT : SharedRuntimes)
1759 bool FuzzerNeedsSanitizerDeps =
false;
1761 !Args.hasArg(options::OPT_shared)) {
1764 FuzzerNeedsSanitizerDeps =
true;
1768 if (!Args.hasArg(options::OPT_nostdlibxx)) {
1769 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1770 !Args.hasArg(options::OPT_static);
1771 if (OnlyLibstdcxxStatic)
1772 CmdArgs.push_back(
"-Bstatic");
1774 if (OnlyLibstdcxxStatic)
1775 CmdArgs.push_back(
"-Bdynamic");
1779 for (
auto RT : HelperStaticRuntimes)
1781 bool AddExportDynamic =
false;
1782 for (
auto RT : StaticRuntimes) {
1786 for (
auto RT : NonWholeStaticRuntimes) {
1792 if (AddExportDynamic)
1793 CmdArgs.push_back(
"--export-dynamic");
1796 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1800 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1801 <<
"-fsanitize=memtag*" << TC.
getTriple().str();
1804 Args.MakeArgString(
"--android-memtag-mode=" + SanArgs.
getMemtagMode()));
1806 CmdArgs.push_back(
"--android-memtag-heap");
1808 CmdArgs.push_back(
"--android-memtag-stack");
1811 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty() ||
1812 FuzzerNeedsSanitizerDeps;
1817 if (Args.hasArg(options::OPT_shared)) {
1819 CmdArgs.push_back(
"--whole-archive");
1821 CmdArgs.push_back(
"--no-whole-archive");
1825 CmdArgs.push_back(
"--whole-archive");
1827 for (
const auto &Mode : XRay.
modeList())
1829 CmdArgs.push_back(
"--no-whole-archive");
1837 const llvm::opt::ArgList &Args,
1838 ArgStringList &CmdArgs) {
1840 CmdArgs.push_back(
"-lpthread");
1842 CmdArgs.push_back(
"-lrt");
1843 CmdArgs.push_back(
"-lm");
1848 CmdArgs.push_back(
"-ldl");
1853 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1854 return !A->getOption().matches(options::OPT_O0);
1862 auto AddPostfix = [JA](
auto &F) {
1867 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1868 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1872 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1875 Arg *FinalOutput = Args.getLastArg(options::OPT_o, options::OPT__SLASH_o);
1876 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1877 T = FinalOutput->getValue();
1878 llvm::sys::path::remove_filename(T);
1879 llvm::sys::path::append(T,
1880 llvm::sys::path::stem(FinalOutput->getValue()));
1882 return Args.MakeArgString(T);
1888 return Args.MakeArgString(T);
1892 const JobAction &JA,
const ArgList &Args,
1893 const InputInfo &Output,
const char *OutFile) {
1894 ArgStringList ExtractArgs;
1895 ExtractArgs.push_back(
"--extract-dwo");
1897 ArgStringList StripArgs;
1898 StripArgs.push_back(
"--strip-dwo");
1903 ExtractArgs.push_back(OutFile);
1910 C.addCommand(std::make_unique<Command>(JA, T,
1912 Exec, ExtractArgs, II, Output));
1915 C.addCommand(std::make_unique<Command>(
1925 Args.ClaimAllArgs(options::OPT_flto_EQ);
1926 Args.ClaimAllArgs(options::OPT_flto);
1927 Args.ClaimAllArgs(options::OPT_fno_lto);
1931 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1932 options::OPT_fcs_profile_generate_EQ,
1933 options::OPT_fno_profile_generate);
1934 if (CSPGOGenerateArg &&
1935 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1936 CSPGOGenerateArg =
nullptr;
1938 return CSPGOGenerateArg;
1942 auto *ProfileUseArg = Args.getLastArg(
1943 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1944 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1945 options::OPT_fno_profile_instr_use);
1947 if (ProfileUseArg &&
1948 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1949 ProfileUseArg =
nullptr;
1951 return ProfileUseArg;
1955 auto *ProfileSampleUseArg = Args.getLastArg(
1956 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
1958 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
1959 options::OPT_fno_profile_sample_use)))
1962 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
1967 case llvm::Reloc::Static:
1969 case llvm::Reloc::PIC_:
1971 case llvm::Reloc::DynamicNoPIC:
1972 return "dynamic-no-pic";
1973 case llvm::Reloc::ROPI:
1975 case llvm::Reloc::RWPI:
1977 case llvm::Reloc::ROPI_RWPI:
1980 llvm_unreachable(
"Unknown Reloc::Model kind");
1987std::tuple<llvm::Reloc::Model, unsigned, bool>
1995 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
1997 bool IsPICLevelTwo = PIC;
2000 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
2003 if (Triple.isAndroid()) {
2004 switch (Triple.getArch()) {
2005 case llvm::Triple::x86:
2006 case llvm::Triple::x86_64:
2008 IsPICLevelTwo =
true;
2018 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
2022 if (Triple.isOSOpenBSD()) {
2024 case llvm::Triple::arm:
2025 case llvm::Triple::aarch64:
2026 case llvm::Triple::mips64:
2027 case llvm::Triple::mips64el:
2028 case llvm::Triple::x86:
2029 case llvm::Triple::x86_64:
2030 IsPICLevelTwo =
false;
2033 case llvm::Triple::ppc:
2034 case llvm::Triple::sparcv9:
2035 IsPICLevelTwo =
true;
2047 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2048 options::OPT_fpic, options::OPT_fno_pic,
2049 options::OPT_fPIE, options::OPT_fno_PIE,
2050 options::OPT_fpie, options::OPT_fno_pie);
2051 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
2052 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
2053 options::OPT_fPIE, options::OPT_fpie)) {
2055 << LastPICArg->getSpelling() << Triple.str();
2056 if (Triple.getArch() == llvm::Triple::x86_64)
2057 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
2058 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2065 Option O = LastPICArg->getOption();
2066 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2067 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2068 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2070 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2072 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
2075 if (EffectiveTriple.isPS()) {
2076 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
2077 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
2078 if (Model !=
"kernel") {
2081 << LastPICArg->getSpelling()
2082 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
2092 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
2098 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
2099 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
2102 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2105 if (!Triple.isOSDarwin())
2107 << A->getSpelling() << Triple.str();
2116 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
2119 bool EmbeddedPISupported;
2120 switch (Triple.getArch()) {
2121 case llvm::Triple::arm:
2122 case llvm::Triple::armeb:
2123 case llvm::Triple::thumb:
2124 case llvm::Triple::thumbeb:
2125 EmbeddedPISupported =
true;
2128 EmbeddedPISupported =
false;
2132 bool ROPI =
false, RWPI =
false;
2133 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
2134 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
2135 if (!EmbeddedPISupported)
2137 << LastROPIArg->getSpelling() << Triple.str();
2140 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2141 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2142 if (!EmbeddedPISupported)
2144 << LastRWPIArg->getSpelling() << Triple.str();
2149 if ((ROPI || RWPI) && (PIC || PIE))
2152 if (Triple.isMIPS()) {
2159 if (ABIName ==
"n64")
2162 if(Args.hasArg(options::OPT_mno_abicalls))
2163 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2166 IsPICLevelTwo =
false;
2170 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2172 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2174 RelocM = llvm::Reloc::ROPI_RWPI;
2176 RelocM = llvm::Reloc::ROPI;
2178 RelocM = llvm::Reloc::RWPI;
2180 return std::make_tuple(RelocM, 0
U,
false);
2184 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
2185 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
2187 const llvm::opt::OptTable &Opts = D.
getOpts();
2188 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
2189 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
2190 D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
2192 return HasStaticPIE;
2212 const ArgList &Args) {
2213 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2214 options::OPT_falign_functions_EQ,
2215 options::OPT_fno_align_functions);
2216 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2219 if (A->getOption().matches(options::OPT_falign_functions))
2223 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2225 << A->getAsString(Args) << A->getValue();
2230 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2231 switch (DebugInfoKind) {
2232 case llvm::codegenoptions::DebugDirectivesOnly:
2233 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2235 case llvm::codegenoptions::DebugLineTablesOnly:
2236 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2238 case llvm::codegenoptions::DebugInfoConstructor:
2239 CmdArgs.push_back(
"-debug-info-kind=constructor");
2241 case llvm::codegenoptions::LimitedDebugInfo:
2242 CmdArgs.push_back(
"-debug-info-kind=limited");
2244 case llvm::codegenoptions::FullDebugInfo:
2245 CmdArgs.push_back(
"-debug-info-kind=standalone");
2247 case llvm::codegenoptions::UnusedTypeInfo:
2248 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2258 assert(A.getOption().matches(options::OPT_gN_Group) &&
2259 "Not a -g option that specifies a debug-info level");
2260 if (A.getOption().matches(options::OPT_g0) ||
2261 A.getOption().matches(options::OPT_ggdb0))
2262 return llvm::codegenoptions::NoDebugInfo;
2263 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2264 A.getOption().matches(options::OPT_ggdb1))
2265 return llvm::codegenoptions::DebugLineTablesOnly;
2266 if (A.getOption().matches(options::OPT_gline_directives_only))
2267 return llvm::codegenoptions::DebugDirectivesOnly;
2268 return llvm::codegenoptions::DebugInfoConstructor;
2272 const ArgList &Args) {
2273 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2279 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 6 ||
2282 << A->getAsString(Args) << A->getValue();
2287 return llvm::StringSwitch<unsigned>(ArgValue)
2288 .Case(
"-gdwarf-2", 2)
2289 .Case(
"-gdwarf-3", 3)
2290 .Case(
"-gdwarf-4", 4)
2291 .Case(
"-gdwarf-5", 5)
2292 .Case(
"-gdwarf-6", 6)
2297 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2298 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2299 options::OPT_gdwarf_6, options::OPT_gdwarf);
2303 const llvm::opt::ArgList &Args) {
2308 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2309 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2310 << GDwarfN->getSpelling() << TC.
getTriple().str();
2312 if (DwarfVersion == 0) {
2314 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2316 return DwarfVersion;
2320 const ArgList &Args, Arg *&Arg) {
2321 Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
2322 options::OPT_gno_split_dwarf);
2323 if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
2326 if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
2329 StringRef
Value = Arg->getValue();
2330 if (
Value ==
"split")
2332 if (
Value ==
"single")
2335 D.
Diag(diag::err_drv_unsupported_option_argument)
2336 << Arg->getSpelling() << Arg->getValue();
2342 assert(A &&
"Expected non-nullptr argument.");
2345 D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
2351 ArgStringList &CmdArgs) {
2352 llvm::Reloc::Model RelocationModel;
2357 if (RelocationModel != llvm::Reloc::Static)
2358 CmdArgs.push_back(
"-KPIC");
2364 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2370 const ArgList &Args) {
2371 if (Args.hasArg(options::OPT_static_libgcc) ||
2372 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2376 if (Args.hasArg(options::OPT_shared_libgcc))
2395 ArgStringList &CmdArgs,
const ArgList &Args) {
2399 CmdArgs.push_back(
"-l:libunwind.a");
2422 CmdArgs.push_back(
"-lgcc_eh");
2424 CmdArgs.push_back(
"-lgcc_s");
2432 CmdArgs.push_back(
"-lunwind");
2434 CmdArgs.push_back(
"-l:libunwind.a");
2437 CmdArgs.push_back(
"-l:libunwind.dll.a");
2439 CmdArgs.push_back(
"-l:libunwind.so");
2443 CmdArgs.push_back(
"-lunwind");
2453 ArgStringList &CmdArgs,
const ArgList &Args) {
2457 CmdArgs.push_back(
"-lgcc");
2461 CmdArgs.push_back(
"-lgcc");
2465 CmdArgs.push_back(
"--as-needed");
2467 CmdArgs.push_back(
"--no-as-needed");
2472 ArgStringList &CmdArgs,
const ArgList &Args) {
2483 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2486 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2487 if (A && A->getValue() != StringRef(
"platform")) {
2488 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2489 << A->getValue() <<
"MSVC";
2499 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2500 !Args.hasArg(options::OPT_static_pie))
2501 CmdArgs.push_back(
"-ldl");
2508 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2514 StringRef SaveStats = A->getValue();
2515 if (SaveStats ==
"obj" && Output.
isFilename()) {
2517 llvm::sys::path::remove_filename(StatsFile);
2518 }
else if (SaveStats !=
"cwd") {
2519 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2523 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2524 llvm::sys::path::append(StatsFile, BaseName);
2525 llvm::sys::path::replace_extension(StatsFile,
"stats");
2537 assert(Flag.front() ==
'-');
2539 Flags.push_back(Flag.str());
2541 Flags.push_back((
"!" + Flag.substr(1)).str());
2546 ArgStringList &CmdArgs,
bool IsLTO,
2547 const StringRef PluginOptPrefix) {
2548 auto addArg = [&, IsLTO](
const Twine &Arg) {
2550 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2551 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2553 CmdArgs.push_back(
"-mllvm");
2554 CmdArgs.push_back(Args.MakeArgString(Arg));
2558 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2559 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2561 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2562 StringRef
Value = A->getValue();
2564 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2565 !llvm::isPowerOf2_64(Boundary)) {
2566 D.
Diag(diag::err_drv_invalid_argument_to_option)
2567 <<
Value << A->getOption().getName();
2569 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2572 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2573 std::string AlignBranch;
2574 for (StringRef T : A->getValues()) {
2575 if (T !=
"fused" && T !=
"jcc" && T !=
"jmp" && T !=
"call" &&
2576 T !=
"ret" && T !=
"indirect")
2577 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2578 << T <<
"fused, jcc, jmp, call, ret, indirect";
2579 if (!AlignBranch.empty())
2583 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2585 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2586 StringRef
Value = A->getValue();
2587 unsigned PrefixSize;
2588 if (
Value.getAsInteger(10, PrefixSize)) {
2589 D.
Diag(diag::err_drv_invalid_argument_to_option)
2590 <<
Value << A->getOption().getName();
2592 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2618 llvm::opt::ArgStringList &CC1Args,
2620 StringRef Lib, StringRef
Arch, StringRef
Target,
2621 bool isBitCodeSDL) {
2624 std::string LibDeviceLoc =
"/libdevice";
2625 std::string LibBcPrefix =
"/libbc-";
2626 std::string LibPrefix =
"/lib";
2643 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2644 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2646 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2647 Twine(Lib +
"-" +
Arch).str(), Twine(Lib).str()}) {
2648 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2649 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2659 const auto *Ext =
".a";
2661 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2662 Twine(Lib +
"-" +
Arch).str()}) {
2663 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2664 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2675 bool FoundSDL =
false;
2676 for (
auto LPath : LibraryPaths) {
2677 for (
auto SDL : SDLs) {
2678 auto FullName = Twine(LPath + SDL).str();
2679 if (llvm::sys::fs::exists(FullName)) {
2680 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2697 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2698 llvm::opt::ArgStringList &CC1Args,
2700 StringRef
Arch, StringRef
Target,
bool isBitCodeSDL) {
2703 if (isBitCodeSDL &&
Arch.contains(
"nvptx"))
2706 bool FoundAOB =
false;
2707 std::string ArchiveOfBundles;
2710 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2711 auto Ext = IsMSVC ?
".lib" :
".a";
2712 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2713 if (llvm::sys::fs::exists(Lib)) {
2714 ArchiveOfBundles = Lib;
2718 Lib.consume_front(
"-l");
2719 for (
auto LPath : LibraryPaths) {
2720 ArchiveOfBundles.clear();
2721 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2722 : IsMSVC ? Lib + Ext
2723 :
"lib" + Lib + Ext)
2725 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2726 auto AOB = Twine(LPath + Prefix + LibFile).str();
2727 if (llvm::sys::fs::exists(AOB)) {
2728 ArchiveOfBundles = AOB;
2741 llvm::file_magic Magic;
2742 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2743 if (EC || Magic != llvm::file_magic::archive)
2746 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2747 std::string OutputLib =
2753 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2757 DeviceTriple +=
'-';
2758 std::string NormalizedTriple = T.getToolChain().getTriple().normalize(
2759 llvm::Triple::CanonicalForm::FOUR_IDENT);
2760 DeviceTriple += NormalizedTriple;
2762 DeviceTriple +=
'-';
2766 std::string UnbundleArg(
"-unbundle");
2767 std::string TypeArg(
"-type=a");
2768 std::string InputArg(
"-input=" + ArchiveOfBundles);
2769 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2770 std::string OutputArg(
"-output=" + OutputLib);
2772 const char *UBProgram = DriverArgs.MakeArgString(
2773 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2775 ArgStringList UBArgs;
2776 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2777 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2778 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2779 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2780 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2784 std::string AdditionalArgs(
"-allow-missing-bundles");
2785 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2790 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2791 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2793 C.addCommand(std::make_unique<Command>(
2795 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2797 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2804 const llvm::opt::ArgList &DriverArgs,
2805 llvm::opt::ArgStringList &CC1Args,
2807 bool isBitCodeSDL) {
2838 const llvm::opt::ArgList &DriverArgs,
2839 llvm::opt::ArgStringList &CC1Args,
2841 bool isBitCodeSDL) {
2845 std::optional<std::string> LibPath =
2846 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2849 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2850 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2851 for (StringRef Path : Frags)
2852 LibraryPaths.emplace_back(Path.trim());
2856 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2857 LibraryPaths.emplace_back(Search_Dir);
2861 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2862 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2865 llvm::SmallSet<std::string, 16> SDLNames;
2866 static const StringRef HostOnlyArchives[] = {
2867 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2868 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2869 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2870 SDLNames.insert(std::string(
"-l") + SDLName);
2874 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2881 const StringRef LibFileExt =
".lib";
2882 if (!llvm::sys::path::has_extension(
FileName) ||
2884 llvm::sys::path::extension(
FileName).drop_front()) ==
2886 llvm::sys::path::extension(
FileName) == LibFileExt)
2887 SDLNames.insert(Input);
2894 for (
auto SDLName : SDLNames) {
2905static llvm::opt::Arg *
2907 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2911 const llvm::opt::ArgList &Args) {
2912 const unsigned MinCodeObjVer = 4;
2913 const unsigned MaxCodeObjVer = 6;
2916 if (CodeObjArg->getOption().getID() ==
2917 options::OPT_mcode_object_version_EQ) {
2918 unsigned CodeObjVer = MaxCodeObjVer;
2920 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2921 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2922 D.
Diag(diag::err_drv_invalid_int_value)
2923 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2929 const llvm::opt::ArgList &Args) {
2930 unsigned CodeObjVer = 6;
2932 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2937 const Driver &D,
const llvm::opt::ArgList &Args) {
2942 const llvm::opt::ArgList &Args,
2943 llvm::opt::ArgStringList &CmdArgs,
2944 const llvm::Triple &Triple,
bool IsLTO,
2945 const StringRef PluginOptPrefix) {
2946 auto addArg = [&, IsLTO](
const Twine &Arg) {
2948 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2949 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2951 CmdArgs.push_back(
"-mllvm");
2952 CmdArgs.push_back(Args.MakeArgString(Arg));
2956 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2957 options::OPT_mno_outline)) {
2958 if (A->getOption().matches(options::OPT_moutline)) {
2962 if (Triple.isARM() || Triple.isThumb() || Triple.isAArch64() ||
2963 Triple.isRISCV() || Triple.isX86()) {
2964 addArg(Twine(
"-enable-machine-outliner"));
2966 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2972 CmdArgs.push_back(
"-mno-outline");
2975 addArg(Twine(
"-enable-machine-outliner=never"));
2979 auto *CodeGenDataGenArg =
2980 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
2981 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
2984 if (CodeGenDataGenArg && CodeGenDataUseArg)
2985 D.
Diag(diag::err_drv_argument_not_allowed_with)
2986 << CodeGenDataGenArg->getAsString(Args)
2987 << CodeGenDataUseArg->getAsString(Args);
2991 if (CodeGenDataGenArg)
2992 addArg(Twine(
"-codegen-data-generate"));
2995 if (CodeGenDataUseArg)
2996 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
3000 const llvm::opt::ArgList &DriverArgs,
3001 llvm::opt::ArgStringList &CC1Args,
3002 StringRef BitcodeSuffix,
3003 const llvm::Triple &Triple,
3008 std::optional<std::string> LibPath =
3009 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
3012 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
3013 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
3014 for (StringRef Path : Frags)
3015 LibraryPaths.emplace_back(Path.trim());
3020 LibraryPaths.emplace_back(LibPath);
3024 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
3025 LibraryPaths.emplace_back(P);
3027 OptSpecifier LibomptargetBCPathOpt =
3028 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
3029 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
3030 : options::OPT_libomptarget_spirv_bc_path_EQ;
3032 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
3033 : Triple.isNVPTX() ?
"nvptx"
3035 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
3038 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
3040 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
3041 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
3042 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3045 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3046 CC1Args.push_back(
"-mlink-builtin-bitcode");
3047 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3049 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
3050 << LibOmpTargetFile;
3053 bool FoundBCLibrary =
false;
3055 for (StringRef LibraryPath : LibraryPaths) {
3057 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3058 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3059 CC1Args.push_back(
"-mlink-builtin-bitcode");
3060 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3061 FoundBCLibrary =
true;
3066 if (!FoundBCLibrary)
3067 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
3068 << LibOmpTargetName << ArchPrefix;
3073 const llvm::opt::ArgList &DriverArgs,
3074 llvm::opt::ArgStringList &CC1Args) {
3076 StringRef LibclcNamespec;
3077 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
3080 LibclcNamespec = A->getValue();
3082 if (!TT.isAMDGPU() || TT.getEnvironment() != llvm::Triple::LLVM)
3086 if (DriverArgs.hasArg(options::OPT_no_offloadlib,
3087 options::OPT_nodefaultlibs, options::OPT_nostdlib))
3091 bool FilenameSearch = LibclcNamespec.consume_front(
":");
3092 if (FilenameSearch) {
3094 if (D.
getVFS().exists(LibclcFile)) {
3095 CC1Args.push_back(
"-mlink-builtin-bitcode");
3096 CC1Args.push_back(DriverArgs.MakeArgString(LibclcFile));
3099 D.
Diag(diag::err_drv_libclc_not_found) << LibclcFile;
3105 llvm::sys::path::append(BasePath,
"lib");
3110 if (
const Arg *CPUArg =
3111 DriverArgs.getLastArg(options::OPT_mcpu_EQ, options::OPT_march_EQ)) {
3112 StringRef CPU = CPUArg->getValue();
3115 llvm::sys::path::append(CPUPath, CPU,
"libclc.bc");
3116 if (D.
getVFS().exists(CPUPath)) {
3117 CC1Args.push_back(
"-mlink-builtin-bitcode");
3118 CC1Args.push_back(DriverArgs.MakeArgString(CPUPath));
3126 llvm::sys::path::append(GenericPath,
"libclc.bc");
3127 if (D.
getVFS().exists(GenericPath)) {
3128 CC1Args.push_back(
"-mlink-builtin-bitcode");
3129 CC1Args.push_back(DriverArgs.MakeArgString(GenericPath));
3133 D.
Diag(diag::err_drv_libclc_not_found) <<
"libclc.bc";
3137 const llvm::opt::ArgList &Args,
3138 llvm::opt::ArgStringList &CmdArgs,
3139 const llvm::Triple &Triple) {
3140 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3141 options::OPT_mno_outline_atomics)) {
3143 if (!Triple.isAArch64()) {
3144 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3145 << Triple.getArchName() << A->getOption().getName();
3147 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3148 CmdArgs.push_back(
"-target-feature");
3149 CmdArgs.push_back(
"+outline-atomics");
3151 CmdArgs.push_back(
"-target-feature");
3152 CmdArgs.push_back(
"-outline-atomics");
3156 CmdArgs.push_back(
"-target-feature");
3157 CmdArgs.push_back(
"+outline-atomics");
3162 llvm::opt::ArgStringList &CmdArgs) {
3163 if (TCArgs.hasFlag(options::OPT_offload_compress,
3164 options::OPT_no_offload_compress,
false))
3165 CmdArgs.push_back(
"--compress");
3166 if (TCArgs.hasArg(options::OPT_v))
3167 CmdArgs.push_back(
"--verbose");
3168 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3170 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3174 const llvm::Triple &Triple,
3175 const llvm::Reloc::Model &RelocationModel,
3176 llvm::opt::ArgStringList &CmdArgs) {
3177 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3178 StringRef CM = A->getValue();
3180 if (Triple.isOSAIX() && CM ==
"medium")
3182 if (Triple.isAArch64(64)) {
3183 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3184 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3185 RelocationModel != llvm::Reloc::Static)
3186 D.
Diag(diag::err_drv_argument_only_allowed_with)
3187 << A->getAsString(Args) <<
"-fno-pic";
3188 }
else if (Triple.isLoongArch()) {
3189 if (CM ==
"extreme" &&
3190 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3191 D.
Diag(diag::err_drv_argument_not_allowed_with)
3192 << A->getAsString(Args) <<
"-fplt";
3193 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3196 CM = llvm::StringSwitch<StringRef>(CM)
3197 .Case(
"normal",
"small")
3198 .Case(
"extreme",
"large")
3200 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3201 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3202 }
else if (Triple.isRISCV()) {
3204 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3205 D.
Diag(diag::err_drv_argument_not_allowed_with)
3206 << A->getAsString(Args) <<
"-fpic";
3209 else if (CM ==
"medany")
3211 Ok = CM ==
"small" || CM ==
"medium" ||
3212 (CM ==
"large" && Triple.isRISCV64());
3213 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3214 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3215 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3219 }
else if (Triple.isSPARC64()) {
3222 else if (CM ==
"medmid")
3224 else if (CM ==
"medany")
3226 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3227 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3228 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3231 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3233 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3234 << A->getSpelling() << CM << Triple.getTriple();
3238 if (Triple.getArch() == llvm::Triple::x86_64) {
3239 bool IsMediumCM =
false;
3240 bool IsLargeCM =
false;
3241 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3242 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3243 IsLargeCM = StringRef(A->getValue()) ==
"large";
3245 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3246 if (!IsMediumCM && !IsLargeCM) {
3247 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3248 << A->getOption().getRenderName();
3250 A->render(Args, CmdArgs);
3252 }
else if (IsMediumCM) {
3253 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3254 }
else if (IsLargeCM) {
3255 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3261 ArgStringList &CmdArgs) {
3266 Args.getLastArg(options::OPT_fcolor_diagnostics,
3267 options::OPT_fno_color_diagnostics);
3268 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3269 StringRef
Value(A->getValue());
3271 D.
Diag(diag::err_drv_invalid_argument_to_option)
3272 <<
Value << A->getOption().getName();
3276 CmdArgs.push_back(
"-fcolor-diagnostics");
3281 for (; *Arg; ++Arg) {
3287 Res.push_back(
'\\');
3290 Res.push_back(*Arg);
3295 const llvm::opt::ArgList &Args) {
3299 llvm::opt::ArgStringList OriginalArgs;
3300 for (
const auto &Arg : Args)
3301 Arg->render(Args, OriginalArgs);
3305 for (
const char *OriginalArg : OriginalArgs) {
3309 Flags += EscapedArg;
3312 return Args.MakeArgString(Flags);
3316 const llvm::opt::ArgList &Args,
3317 bool &FRecordCommandLine,
3318 bool &GRecordCommandLine) {
3321 const std::string &TripleStr = Triple.getTriple();
3323 FRecordCommandLine =
3324 Args.hasFlag(options::OPT_frecord_command_line,
3325 options::OPT_fno_record_command_line,
false);
3326 GRecordCommandLine =
3327 Args.hasFlag(options::OPT_grecord_command_line,
3328 options::OPT_gno_record_command_line,
false);
3329 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3330 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3331 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3332 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3339 ArgStringList &CmdArgs,
3340 const llvm::Triple &Triple) {
3341 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
3342 options::OPT_fno_global_isel)) {
3343 CmdArgs.push_back(
"-mllvm");
3344 if (A->getOption().matches(options::OPT_fglobal_isel)) {
3345 CmdArgs.push_back(
"-global-isel=1");
3350 bool IsArchSupported = Triple.getArch() == llvm::Triple::aarch64;
3351 bool IsOptLevelSupported =
false;
3353 Arg *A = Args.getLastArg(options::OPT_O_Group);
3354 if (IsArchSupported) {
3355 if (!A || A->getOption().matches(options::OPT_O0))
3356 IsOptLevelSupported =
true;
3358 if (!IsArchSupported || !IsOptLevelSupported) {
3359 CmdArgs.push_back(
"-mllvm");
3360 CmdArgs.push_back(
"-global-isel-abort=2");
3362 if (!IsArchSupported)
3363 D.
Diag(diag::warn_drv_global_isel_incomplete) << Triple.getArchName();
3365 D.
Diag(diag::warn_drv_global_isel_incomplete_opt);
3368 CmdArgs.push_back(
"-global-isel=0");
3374 ArgStringList &CmdArgs) {
3375 bool use_fwrapv =
false;
3376 bool use_fwrapv_pointer =
false;
3377 for (
const Arg *A : Args.filtered(
3378 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3379 options::OPT_fwrapv, options::OPT_fno_wrapv,
3380 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3382 switch (A->getOption().getID()) {
3383 case options::OPT_fstrict_overflow:
3385 use_fwrapv_pointer =
false;
3387 case options::OPT_fno_strict_overflow:
3389 use_fwrapv_pointer =
true;
3391 case options::OPT_fwrapv:
3394 case options::OPT_fno_wrapv:
3397 case options::OPT_fwrapv_pointer:
3398 use_fwrapv_pointer =
true;
3400 case options::OPT_fno_wrapv_pointer:
3401 use_fwrapv_pointer =
false;
3407 CmdArgs.push_back(
"-fwrapv");
3408 if (use_fwrapv_pointer)
3409 CmdArgs.push_back(
"-fwrapv-pointer");
3416 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3417 if (A->getOption().matches(options::OPT_O4) ||
3418 A->getOption().matches(options::OPT_Ofast))
3421 if (A->getOption().matches(options::OPT_O0))
3424 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3427 StringRef S(A->getValue());
3435 unsigned OptLevel = 0;
3436 if (S.getAsInteger(10, OptLevel))
3439 return OptLevel > 1;
3446 ArgStringList &CmdArgs) {
3448 if (Args.hasFlag(options::OPT_fvectorize, options::OPT_fno_vectorize,
3450 CmdArgs.push_back(
"-vectorize-loops");
3454 ArgStringList &CmdArgs) {
3456 if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize,
3458 CmdArgs.push_back(
"-vectorize-slp");
3462 ArgStringList &CmdArgs) {
3463 if (Args.hasFlag(options::OPT_floop_interchange,
3464 options::OPT_fno_loop_interchange,
false))
3465 CmdArgs.push_back(
"-floop-interchange");
3486 llvm_unreachable(
"Fully covered switch above");
3492 if (!ComplexRangeStr.empty())
3493 return "-complex-range=" + ComplexRangeStr;
3494 return ComplexRangeStr;
3514 if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
3515 (LastOpt ==
"-fcx-limited-range" && NewOpt ==
"-fno-cx-limited-range") ||
3516 (LastOpt ==
"-fno-cx-limited-range" && NewOpt ==
"-fcx-limited-range") ||
3517 (LastOpt ==
"-fcx-fortran-rules" && NewOpt ==
"-fno-cx-fortran-rules") ||
3518 (LastOpt ==
"-fno-cx-fortran-rules" && NewOpt ==
"-fcx-fortran-rules") ||
3519 (LastOpt ==
"-ffast-math" && NewOpt ==
"-fno-fast-math") ||
3520 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-ffast-math") ||
3521 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-fno-fast-math") ||
3522 (LastOpt.starts_with(
"-ffp-model=") &&
3523 NewOpt.starts_with(
"-ffp-model=")) ||
3524 (LastOpt.starts_with(
"-fcomplex-arithmetic=") &&
3525 NewOpt.starts_with(
"-fcomplex-arithmetic=")))
3528 D.
Diag(clang::diag::warn_drv_overriding_complex_range)
3548 const ArgStringList &LinkerInputs,
3550 const llvm::opt::ArgList &Args,
3551 const char *OutputFilename) {
3555 assert(!LinkerInputs.empty() && !JobInputs.empty() &&
3556 "Must have at least one input.");
3558 ArgStringList LlvmLinkArgs(
3559 {
"-o", OutputFilename ? OutputFilename : Output.
getFilename()});
3561 LlvmLinkArgs.append(LinkerInputs);
3564 const char *LlvmLink = Args.MakeArgString(TC.
GetProgramPath(
"llvm-link"));
3566 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.
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()