28#include "clang/Config/config.h"
40#include "llvm/ADT/STLExtras.h"
41#include "llvm/ADT/SmallString.h"
42#include "llvm/ADT/StringExtras.h"
43#include "llvm/ADT/StringSwitch.h"
44#include "llvm/ADT/Twine.h"
45#include "llvm/Config/llvm-config.h"
46#include "llvm/Option/Arg.h"
47#include "llvm/Option/ArgList.h"
48#include "llvm/Option/Option.h"
49#include "llvm/Support/CodeGen.h"
50#include "llvm/Support/Compression.h"
51#include "llvm/Support/ErrorHandling.h"
52#include "llvm/Support/FileSystem.h"
53#include "llvm/Support/Path.h"
54#include "llvm/Support/Process.h"
55#include "llvm/Support/Program.h"
56#include "llvm/Support/Threading.h"
57#include "llvm/Support/VirtualFileSystem.h"
58#include "llvm/Support/YAMLParser.h"
59#include "llvm/TargetParser/AMDGPUTargetParser.h"
60#include "llvm/TargetParser/Host.h"
61#include "llvm/TargetParser/PPCTargetParser.h"
70 Arg *A = Args.getLastArg(options::OPT_offload_jobs_EQ);
74 StringRef Val = A->getValue();
75 if (Val.equals_insensitive(
"jobserver"))
79 if (Val.getAsInteger(10, NumThreads) || NumThreads <= 0)
86 const llvm::Triple &Triple) {
87 if (Args.hasArg(options::OPT_pg) && !Args.hasArg(options::OPT_mfentry))
90 if (Triple.isAndroid())
93 switch (Triple.getArch()) {
94 case llvm::Triple::xcore:
95 case llvm::Triple::wasm32:
96 case llvm::Triple::wasm64:
97 case llvm::Triple::msp430:
101 case llvm::Triple::ppc:
102 case llvm::Triple::ppcle:
103 case llvm::Triple::ppc64:
104 case llvm::Triple::ppc64le:
105 case llvm::Triple::riscv32:
106 case llvm::Triple::riscv64:
107 case llvm::Triple::riscv32be:
108 case llvm::Triple::riscv64be:
109 case llvm::Triple::sparc:
110 case llvm::Triple::sparcel:
111 case llvm::Triple::sparcv9:
112 case llvm::Triple::amdgpu:
113 case llvm::Triple::r600:
114 case llvm::Triple::csky:
115 case llvm::Triple::loongarch32:
116 case llvm::Triple::loongarch64:
117 case llvm::Triple::m68k:
118 case llvm::Triple::mips64:
119 case llvm::Triple::mips64el:
120 case llvm::Triple::mips:
121 case llvm::Triple::mipsel:
127 if (Triple.isOSFuchsia() || Triple.isOSNetBSD()) {
131 if (Triple.isOSLinux() || Triple.isOSHurd()) {
132 switch (Triple.getArch()) {
134 case llvm::Triple::arm:
135 case llvm::Triple::armeb:
136 case llvm::Triple::thumb:
137 case llvm::Triple::thumbeb:
138 case llvm::Triple::systemz:
139 case llvm::Triple::x86:
140 case llvm::Triple::x86_64:
147 if (Triple.isOSWindows()) {
148 switch (Triple.getArch()) {
149 case llvm::Triple::x86:
151 case llvm::Triple::x86_64:
152 return Triple.isOSBinFormatMachO();
153 case llvm::Triple::arm:
154 case llvm::Triple::thumb:
171 if (Triple.isAArch64() || Triple.isPS() || Triple.isVE() ||
172 (Triple.isAndroid() && !Triple.isARM()))
175 if ((Triple.isARM() || Triple.isThumb()) && Triple.isOSBinFormatMachO())
182 switch (Triple.getArch()) {
185 case llvm::Triple::arm:
186 case llvm::Triple::thumb:
189 return Triple.isOSDarwin();
196 const llvm::Triple &Triple) {
197 switch (Triple.getArch()) {
200 case llvm::Triple::arm:
201 case llvm::Triple::armeb:
202 case llvm::Triple::thumb:
203 case llvm::Triple::thumbeb:
207 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
208 StringRef
V = A->getValue();
213 case llvm::Triple::aarch64:
217 return Triple.isOSWindows();
224 const llvm::Triple &Triple) {
225 if (Triple.isARM() || Triple.isThumb()) {
229 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
230 StringRef
V = A->getValue();
231 return V ==
"aapcs+leaf";
240 const llvm::Triple &Triple) {
282 Args.hasFlag(options::OPT_fno_omit_frame_pointer,
283 options::OPT_fomit_frame_pointer, DefaultFP);
289 Args.hasFlag(options::OPT_mno_omit_leaf_frame_pointer,
290 options::OPT_momit_leaf_frame_pointer, DefaultLeafFP);
292 bool FPRegReserved = Args.hasFlag(options::OPT_mreserve_frame_pointer_reg,
293 options::OPT_mno_reserve_frame_pointer_reg,
311 const StringRef PluginOptPrefix) {
312 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
313 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
314 "-pass-remarks=" + A->getValue()));
316 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
317 CmdArgs.push_back(Args.MakeArgString(
318 Twine(PluginOptPrefix) +
"-pass-remarks-missed=" + A->getValue()));
320 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
321 CmdArgs.push_back(Args.MakeArgString(
322 Twine(PluginOptPrefix) +
"-pass-remarks-analysis=" + A->getValue()));
326 const llvm::Triple &Triple,
329 const StringRef PluginOptPrefix) {
330 StringRef Format =
"yaml";
331 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
332 Format = A->getValue();
336 Args.getLastArg(options::OPT_foptimization_record_file_EQ)) {
339 }
else if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
346 assert(!F.empty() &&
"Cannot determine remarks output name.");
348 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
349 "opt-remarks-filename=" + F +
"opt.ld." +
353 Args.getLastArg(options::OPT_foptimization_record_passes_EQ))
354 CmdArgs.push_back(Args.MakeArgString(
355 Twine(PluginOptPrefix) +
"opt-remarks-passes=" + A->getValue()));
357 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
358 "opt-remarks-format=" + Format.data()));
362 ArgStringList &CmdArgs,
363 const StringRef PluginOptPrefix) {
364 if (Args.hasFlag(options::OPT_fdiagnostics_show_hotness,
365 options::OPT_fno_diagnostics_show_hotness,
false))
366 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
367 "opt-remarks-with-hotness"));
370 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ))
372 Args.MakeArgString(Twine(PluginOptPrefix) +
373 "opt-remarks-hotness-threshold=" + A->getValue()));
377 const llvm::Triple &
T) {
382 llvm::AMDGPU::GPUKind GK =
383 llvm::AMDGPU::getGPUKindFromSubArch(
T.getSubArch());
384 if (llvm::AMDGPU::getFeatureBitset(GK).test(llvm::AMDGPU::FEAT_SUPPORTS_WGP))
386 return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode);
391 if (D.
getVFS().exists(Path))
392 Paths.push_back(Path.str());
396 const llvm::Triple &Triple,
398 std::vector<StringRef> &Features,
399 OptSpecifier Group) {
400 std::set<StringRef> Warned;
401 for (
const Arg *A : Args.filtered(Group)) {
402 StringRef Name = A->getOption().getName();
406 assert(Name.starts_with(
"m") &&
"Invalid feature name.");
407 Name = Name.substr(1);
410 if (Warned.count(Name) == 0) {
412 clang::diag::warn_drv_unsupported_option_for_processor)
413 << A->getAsString(Args) << Triple.getArchName();
419 bool IsNegative = Name.consume_front(
"no-");
421 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
429 llvm::DenseSet<StringRef> UsedFeatures;
430 for (StringRef
Feature : llvm::reverse(Features)) {
431 if (UsedFeatures.insert(
Feature.drop_front()).second)
432 UnifiedFeatures.insert(UnifiedFeatures.begin(),
Feature);
435 return UnifiedFeatures;
439 const char *ArgName,
const char *EnvVar) {
440 const char *DirList = ::getenv(EnvVar);
441 bool CombinedArg =
false;
446 StringRef Name(ArgName);
447 if (Name ==
"-I" || Name ==
"-L" || Name.empty())
450 StringRef Dirs(DirList);
454 StringRef::size_type Delim;
455 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
458 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
460 CmdArgs.push_back(ArgName);
461 CmdArgs.push_back(
".");
466 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
468 CmdArgs.push_back(ArgName);
469 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
472 Dirs = Dirs.substr(Delim + 1);
477 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
479 CmdArgs.push_back(ArgName);
480 CmdArgs.push_back(
".");
484 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
486 CmdArgs.push_back(ArgName);
487 CmdArgs.push_back(Args.MakeArgString(Dirs));
493 const ArgList &Args, ArgStringList &CmdArgs,
499 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
506 for (
const auto &II : Inputs) {
510 if (
auto *IA = II.getAction())
520 if (II.isFilename()) {
521 CmdArgs.push_back(II.getFilename());
530 const Arg &A = II.getInputArg();
533 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
535 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
538 else if (A.getOption().matches(options::OPT_rpath) &&
542 A.renderAsInput(Args, CmdArgs);
544 if (
const Arg *A = Args.getLastArg(options::OPT_fveclib)) {
545 const llvm::Triple &Triple = TC.
getTriple();
546 StringRef
V = A->getValue();
547 if (
V ==
"ArmPL" && (Triple.isOSLinux() || Triple.isOSDarwin())) {
565 if (Triple.isOSLinux()) {
566 CmdArgs.push_back(Args.MakeArgString(
"--push-state"));
567 CmdArgs.push_back(Args.MakeArgString(
"--as-needed"));
569 if (!Args.hasArg(options::OPT_nostdlib))
570 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
571 CmdArgs.push_back(Args.MakeArgString(
"-lamath"));
572 if (!Args.hasArg(options::OPT_nostdlib))
573 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
574 if (Triple.isOSLinux())
575 CmdArgs.push_back(Args.MakeArgString(
"--pop-state"));
583 switch (
T.getArch()) {
584 case llvm::Triple::x86:
588 case llvm::Triple::aarch64:
589 if (
T.isOSManagarm())
590 return "aarch64managarm";
593 return "aarch64linux";
594 case llvm::Triple::aarch64_be:
596 return "aarch64elfb";
597 return "aarch64linuxb";
598 case llvm::Triple::arm:
599 case llvm::Triple::thumb:
600 case llvm::Triple::armeb:
601 case llvm::Triple::thumbeb: {
604 return IsBigEndian ?
"armelfb" :
"armelf";
605 return IsBigEndian ?
"armelfb_linux_eabi" :
"armelf_linux_eabi";
607 case llvm::Triple::m68k:
609 case llvm::Triple::ppc:
611 return "elf32ppclinux";
613 case llvm::Triple::ppcle:
615 return "elf32lppclinux";
617 case llvm::Triple::ppc64:
619 case llvm::Triple::ppc64le:
621 case llvm::Triple::riscv32:
622 return "elf32lriscv";
623 case llvm::Triple::riscv64:
624 return "elf64lriscv";
625 case llvm::Triple::riscv32be:
626 return "elf32briscv";
627 case llvm::Triple::riscv64be:
628 return "elf64briscv";
629 case llvm::Triple::sparc:
630 case llvm::Triple::sparcel:
631 return "elf32_sparc";
632 case llvm::Triple::sparcv9:
633 return "elf64_sparc";
634 case llvm::Triple::loongarch32:
635 return "elf32loongarch";
636 case llvm::Triple::loongarch64:
637 return "elf64loongarch";
638 case llvm::Triple::mips:
639 return "elf32btsmip";
640 case llvm::Triple::mipsel:
641 return "elf32ltsmip";
642 case llvm::Triple::mips64:
644 return "elf32btsmipn32";
645 return "elf64btsmip";
646 case llvm::Triple::mips64el:
648 return "elf32ltsmipn32";
649 return "elf64ltsmip";
650 case llvm::Triple::systemz:
652 case llvm::Triple::x86_64:
654 return "elf32_x86_64";
656 case llvm::Triple::ve:
658 case llvm::Triple::csky:
659 return "cskyelf_linux";
666 const ToolChain &TC,
const llvm::opt::ArgList &Args,
667 llvm::opt::ArgStringList &CmdArgs) {
673 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
674 StringRef
V = A->getValue();
675 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
676 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
678 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
679 << A->getSpelling() <<
V;
684 ArgStringList &CmdArgs,
687 const Arg *A = Args.getLastArg(options::OPT_gz_EQ);
691 StringRef
Value = A->getValue();
692 if (
Value ==
"none") {
693 CmdArgs.push_back(
"--compress-debug-sections=none");
694 }
else if (
Value ==
"zlib") {
695 if (llvm::compression::zlib::isAvailable()) {
697 Args.MakeArgString(
"--compress-debug-sections=" + Twine(
Value)));
699 D.
Diag(diag::warn_debug_compression_unavailable) <<
"zlib";
701 }
else if (
Value ==
"zstd") {
702 if (llvm::compression::zstd::isAvailable()) {
704 Args.MakeArgString(
"--compress-debug-sections=" + Twine(
Value)));
706 D.
Diag(diag::warn_debug_compression_unavailable) <<
"zstd";
709 D.
Diag(diag::err_drv_unsupported_option_argument)
710 << A->getSpelling() <<
Value;
716 std::vector<StringRef> &Features,
717 OptSpecifier OnOpt, OptSpecifier OffOpt,
718 StringRef FeatureName) {
719 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
720 if (A->getOption().matches(OnOpt))
721 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
723 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
729 const ArgList &Args) {
735 llvm::Triple::SubArchType SubArch =
T.getSubArch();
736 if (SubArch != llvm::Triple::NoSubArch &&
737 SubArch != llvm::AMDGPU::getMajorSubArch(SubArch))
741 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
748 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
749 return A->getValue();
757 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
758 StringRef CPU = A->getValue();
764 return llvm::sys::getHostCPUName();
774 const llvm::Triple &
T,
bool FromAs) {
777 switch (
T.getArch()) {
781 case llvm::Triple::aarch64:
782 case llvm::Triple::aarch64_32:
783 case llvm::Triple::aarch64_be:
786 case llvm::Triple::arm:
787 case llvm::Triple::armeb:
788 case llvm::Triple::thumb:
789 case llvm::Triple::thumbeb: {
790 StringRef MArch, MCPU;
795 case llvm::Triple::avr:
796 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
797 return A->getValue();
800 case llvm::Triple::m68k:
803 case llvm::Triple::mips:
804 case llvm::Triple::mipsel:
805 case llvm::Triple::mips64:
806 case llvm::Triple::mips64el: {
810 return std::string(CPUName);
813 case llvm::Triple::nvptx:
814 case llvm::Triple::nvptx64:
815 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
816 return A->getValue();
819 case llvm::Triple::ppc:
820 case llvm::Triple::ppcle:
821 case llvm::Triple::ppc64:
822 case llvm::Triple::ppc64le:
823 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
825 llvm::PPC::getNormalizedPPCTargetCPU(
T, A->getValue()));
826 return std::string(llvm::PPC::getNormalizedPPCTargetCPU(
T));
828 case llvm::Triple::csky:
829 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
830 return A->getValue();
831 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
832 return A->getValue();
835 case llvm::Triple::riscv32:
836 case llvm::Triple::riscv64:
837 case llvm::Triple::riscv32be:
838 case llvm::Triple::riscv64be:
841 case llvm::Triple::bpfel:
842 case llvm::Triple::bpfeb:
843 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
844 return A->getValue();
847 case llvm::Triple::sparc:
848 case llvm::Triple::sparcel:
849 case llvm::Triple::sparcv9:
852 case llvm::Triple::x86:
853 case llvm::Triple::x86_64:
856 case llvm::Triple::hexagon:
860 case llvm::Triple::lanai:
863 case llvm::Triple::systemz:
866 case llvm::Triple::amdgpu:
867 case llvm::Triple::r600:
870 case llvm::Triple::wasm32:
871 case llvm::Triple::wasm64:
874 case llvm::Triple::loongarch32:
875 case llvm::Triple::loongarch64:
878 case llvm::Triple::xtensa:
879 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
880 return A->getValue();
886 const llvm::Triple &Triple,
888 std::vector<StringRef> &Features) {
890 options::OPT_m_wasm_Features_Group);
894 const ArgList &Args, ArgStringList &CmdArgs,
895 bool ForAS,
bool IsAux) {
896 std::vector<StringRef> Features;
897 switch (Triple.getArch()) {
900 case llvm::Triple::mips:
901 case llvm::Triple::mipsel:
902 case llvm::Triple::mips64:
903 case llvm::Triple::mips64el:
906 case llvm::Triple::arm:
907 case llvm::Triple::armeb:
908 case llvm::Triple::thumb:
909 case llvm::Triple::thumbeb:
912 case llvm::Triple::ppc:
913 case llvm::Triple::ppcle:
914 case llvm::Triple::ppc64:
915 case llvm::Triple::ppc64le:
918 case llvm::Triple::riscv32:
919 case llvm::Triple::riscv64:
920 case llvm::Triple::riscv32be:
921 case llvm::Triple::riscv64be:
924 case llvm::Triple::systemz:
927 case llvm::Triple::aarch64:
928 case llvm::Triple::aarch64_32:
929 case llvm::Triple::aarch64_be:
932 case llvm::Triple::x86:
933 case llvm::Triple::x86_64:
936 case llvm::Triple::hexagon:
939 case llvm::Triple::wasm32:
940 case llvm::Triple::wasm64:
943 case llvm::Triple::sparc:
944 case llvm::Triple::sparcel:
945 case llvm::Triple::sparcv9:
948 case llvm::Triple::amdgpu:
949 case llvm::Triple::r600:
952 case llvm::Triple::nvptx:
953 case llvm::Triple::nvptx64:
956 case llvm::Triple::m68k:
959 case llvm::Triple::msp430:
962 case llvm::Triple::ve:
965 case llvm::Triple::csky:
968 case llvm::Triple::loongarch32:
969 case llvm::Triple::loongarch64:
975 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
976 CmdArgs.push_back(
Feature.data());
981 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
984 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
985 D.
Diag(diag::err_drv_invalid_int_value)
986 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
987 return LtoJobsArg->getValue();
992 return Triple.isPS();
997 ArgStringList &CmdArgs) {
999 if (Args.hasFlag(options::OPT_ffunction_sections,
1000 options::OPT_fno_function_sections, UseSeparateSections))
1001 CmdArgs.push_back(
"-ffunction-sections");
1003 bool HasDefaultDataSections = Triple.isOSBinFormatXCOFF();
1004 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1005 UseSeparateSections || HasDefaultDataSections))
1006 CmdArgs.push_back(
"-fdata-sections");
1010 const llvm::opt::ArgList &Args) {
1012 Arg *A = Args.getLastArg(options::OPT_mtls_dialect_EQ);
1014 return Triple.hasDefaultTLSDESC();
1015 StringRef
V = A->getValue();
1016 bool SupportedArgument =
false, EnableTLSDESC =
false;
1017 bool Unsupported = !Triple.isOSBinFormatELF();
1018 if (Triple.isLoongArch() || Triple.isRISCV()) {
1019 SupportedArgument =
V ==
"desc" ||
V ==
"trad";
1020 EnableTLSDESC =
V ==
"desc";
1021 }
else if (Triple.isX86()) {
1022 SupportedArgument =
V ==
"gnu" ||
V ==
"gnu2";
1023 EnableTLSDESC =
V ==
"gnu2";
1028 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1029 << A->getSpelling() << Triple.getTriple();
1030 }
else if (!SupportedArgument) {
1031 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument_for_target)
1032 << A->getSpelling() <<
V << Triple.getTriple();
1034 return EnableTLSDESC;
1038 llvm::opt::ArgStringList &CmdArgs) {
1039 if (Arg *A = Args.getLastArg(options::OPT_fthinlto_distributor_EQ)) {
1041 Args.MakeArgString(
"--thinlto-distributor=" + Twine(A->getValue())));
1043 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-remote-compiler=" +
1046 CmdArgs.push_back(Args.MakeArgString(
1047 "--thinlto-remote-compiler-prepend-arg=" + Twine(PA)));
1049 for (
const auto &A :
1050 Args.getAllArgValues(options::OPT_Xthinlto_distributor_EQ))
1051 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-distributor-arg=" + A));
1056 ArgStringList &CmdArgs,
const InputInfo &Output,
1059 const bool IsOSAIX = Triple.isOSAIX();
1060 const bool IsAMDGCN = Triple.isAMDGCN();
1061 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ);
1064 const bool IsFatLTO = Args.hasFlag(options::OPT_ffat_lto_objects,
1065 options::OPT_fno_fat_lto_objects,
false);
1066 const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
1068 assert(!Inputs.empty() &&
"Must have at least one input.");
1070 auto Input = llvm::find_if(
1072 if (Input == Inputs.end()) {
1075 Input = Inputs.begin();
1078 if (Linker !=
"lld" && Linker !=
"lld-link" &&
1079 llvm::sys::path::filename(LinkerPath) !=
"ld.lld" &&
1080 llvm::sys::path::stem(LinkerPath) !=
"ld.lld" && !Triple.isOSOpenBSD()) {
1084 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
1085 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
1088 CmdArgs.push_back(
"-plugin");
1091 const char *Suffix =
".dll";
1092#elif defined(__APPLE__)
1093 const char *Suffix =
".dylib";
1095 const char *Suffix =
".so";
1099 llvm::sys::path::native(Twine(D.
Dir) +
1100 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
1101 PluginName + Suffix,
1103 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
1108 CmdArgs.push_back(
"--fat-lto-objects");
1110 if (Args.hasArg(options::OPT_flto_partitions_EQ)) {
1112 StringRef A = Args.getLastArgValue(options::OPT_flto_partitions_EQ,
"8");
1113 if (A.getAsInteger(10,
Value) || (
Value < 1)) {
1114 Arg *Arg = Args.getLastArg(options::OPT_flto_partitions_EQ);
1115 D.
Diag(diag::err_drv_invalid_int_value)
1116 << Arg->getAsString(Args) << Arg->getValue();
1118 CmdArgs.push_back(Args.MakeArgString(
"--lto-partitions=" + A));
1122 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
1123 const char *ExtraDash = IsOSAIX ?
"-" :
"";
1124 const char *ParallelismOpt = IsOSAIX ?
"-threads=" :
"jobs=";
1129 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
1130 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1131 "-generate-arange-section"));
1135 Arg *ArgVecLib = Args.getLastArg(options::OPT_fveclib);
1136 if (ArgVecLib && ArgVecLib->getNumValues() == 1) {
1139 std::optional<StringRef> OptVal =
1140 llvm::StringSwitch<std::optional<StringRef>>(ArgVecLib->getValue())
1141 .Case(
"Accelerate",
"Accelerate")
1142 .Case(
"libmvec",
"LIBMVEC")
1143 .Case(
"AMDLIBM",
"AMDLIBM")
1144 .Case(
"MASSV",
"MASSV")
1145 .Case(
"SVML",
"SVML")
1146 .Case(
"SLEEF",
"sleefgnuabi")
1147 .Case(
"Darwin_libsystem_m",
"Darwin_libsystem_m")
1148 .Case(
"ArmPL",
"ArmPL")
1149 .Case(
"none",
"none")
1150 .Default(std::nullopt);
1153 CmdArgs.push_back(Args.MakeArgString(
1154 Twine(PluginOptPrefix) +
"-vector-library=" + OptVal.value()));
1164 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
1166 if (Args.getLastArg(options::OPT_O_Group)) {
1167 unsigned OptimizationLevel =
1169 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1170 "O" + Twine(OptimizationLevel)));
1173 Args.MakeArgString(Twine(
"--lto-CGO") + Twine(OptimizationLevel)));
1176 if (Args.hasArg(options::OPT_gsplit_dwarf)) {
1178 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1185 Args.MakeArgString(Twine(PluginOptPrefix) +
"dwo_dir=" + F +
"dwo"));
1188 if (IsThinLTO && !IsOSAIX)
1189 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
1190 else if (IsThinLTO && IsOSAIX)
1191 CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
1196 if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
1197 Args.hasArg(options::OPT_fenable_matrix))
1199 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-matrix"));
1202 if (!Parallelism.empty())
1203 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1204 ParallelismOpt + Parallelism));
1209 if (Arg *A = Args.getLastArg(options::OPT_fslp_vectorize,
1210 options::OPT_fno_slp_vectorize))
1211 CmdArgs.push_back(Args.MakeArgString(
1212 Twine(PluginOptPrefix) +
"-vectorize-slp=" +
1213 (A->getOption().matches(options::OPT_fslp_vectorize) ?
"1" :
"0")));
1216 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
1217 options::OPT_fno_global_isel)) {
1220 CmdArgs.push_back(Args.MakeArgString(
1221 Twine(PluginOptPrefix) +
"-global-isel=" +
1222 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
1227 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
1228 if (A->getOption().matches(options::OPT_glldb))
1230 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
1231 else if (A->getOption().matches(options::OPT_gsce))
1233 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
1234 else if (A->getOption().matches(options::OPT_gdbx))
1236 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
1239 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
1245 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
1249 Arg *A = Args.getLastArg(options::OPT_g_Group);
1250 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
1251 !A->getOption().matches(options::OPT_ggdb0);
1252 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
1253 options::OPT_gno_strict_dwarf,
true))
1255 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
1258 bool UseSeparateSections =
1261 if (Args.hasFlag(options::OPT_ffunction_sections,
1262 options::OPT_fno_function_sections, UseSeparateSections))
1264 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
1265 else if (Args.hasArg(options::OPT_fno_function_sections))
1267 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
1269 bool DataSectionsTurnedOff =
false;
1270 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1271 UseSeparateSections)) {
1273 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
1274 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
1275 DataSectionsTurnedOff =
true;
1277 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
1280 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
1281 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
1282 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
1283 options::OPT_mno_xcoff_roptr,
false);
1284 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
1286 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1287 << OptStr << Triple.str();
1293 if (DataSectionsTurnedOff)
1294 D.
Diag(diag::err_roptr_requires_data_sections);
1297 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
1302 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
1303 options::OPT_fno_split_machine_functions)) {
1304 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
1305 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1306 "-function-splitting=all"));
1310 Args.getLastArg(options::OPT_fpartition_static_data_sections,
1311 options::OPT_fno_partition_static_data_sections)) {
1312 if (A->getOption().matches(options::OPT_fpartition_static_data_sections)) {
1313 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1314 "-partition-static-data-sections"));
1319 StringRef FName = A->getValue();
1320 if (!llvm::sys::fs::exists(FName))
1321 D.
Diag(diag::err_drv_no_such_file) << FName;
1323 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1324 "sample-profile=" + FName));
1328 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1329 "cs-profile-generate"));
1330 if (CSPGOGenerateArg->getOption().matches(
1331 options::OPT_fcs_profile_generate_EQ)) {
1333 llvm::sys::path::append(Path,
"default_%m.profraw");
1334 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1335 "cs-profile-path=" + Path));
1338 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1339 "cs-profile-path=default_%m.profraw"));
1342 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1343 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1344 llvm::sys::path::append(Path,
"default.profdata");
1345 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1346 "cs-profile-path=" + Path));
1350 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1352 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1353 "-enable-jmc-instrument"));
1355 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1358 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1359 Triple.hasDefaultEmulatedTLS())) {
1361 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1365 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1367 if (Args.hasFlag(options::OPT_fstack_size_section,
1368 options::OPT_fno_stack_size_section,
false))
1370 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1372 if (Args.hasFlag(options::OPT_fexperimental_call_graph_section,
1373 options::OPT_fno_experimental_call_graph_section,
false))
1375 Args.MakeArgString(Twine(PluginOptPrefix) +
"-call-graph-section"));
1379 if (!StatsFile.empty())
1381 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1384 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1385 CmdArgs.push_back(Args.MakeArgString(
1386 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1397 Output, PluginOptPrefix);
1403 true, PluginOptPrefix);
1405 bool IsELF = Triple.isOSBinFormatELF();
1407 bool ImplicitMapSyms =
false;
1408 for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
1409 for (StringRef
V : A->getValues()) {
1410 auto Equal =
V.split(
'=');
1411 auto checkArg = [&](
bool ValidTarget,
1412 std::initializer_list<const char *>
Set) {
1414 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1415 << (Twine(
"-Wa,") +
Equal.first +
"=").str()
1416 << Triple.getTriple();
1417 }
else if (!llvm::is_contained(
Set,
Equal.second)) {
1418 D.
Diag(diag::err_drv_unsupported_option_argument)
1419 << (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
1422 if (
Equal.first ==
"-mmapsyms") {
1423 ImplicitMapSyms =
Equal.second ==
"implicit";
1424 checkArg(IsELF && Triple.isAArch64(), {
"default",
"implicit"});
1425 }
else if (
V ==
"--crel")
1427 else if (
V ==
"--no-crel")
1435 if (IsELF && !Triple.isMIPS()) {
1436 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"-crel"));
1438 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1442 if (ImplicitMapSyms)
1444 Args.MakeArgString(Twine(PluginOptPrefix) +
"-implicit-mapsyms"));
1446 if (Args.hasArg(options::OPT_ftime_report))
1448 Args.MakeArgString(Twine(PluginOptPrefix) +
"-time-passes"));
1454 const ArgList &Args,
1455 ArgStringList &CmdArgs) {
1460 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1461 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1465 ArgStringList &CmdArgs) {
1466 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1467 options::OPT_fno_rtlib_add_rpath,
false))
1471 const llvm::Triple &Triple = TC.
getTriple();
1472 if ((!Triple.isOSBinFormatELF() && !Triple.isOSBinFormatMachO()))
1481 llvm::sys::path::append(P, M.gccSuffix());
1482 CandidateRPaths.emplace_back(std::string(P));
1484 CandidateRPaths.emplace_back(*StdlibPath);
1486 for (
const auto &CandidateRPath : CandidateRPaths) {
1487 if (TC.
getVFS().exists(CandidateRPath)) {
1488 CmdArgs.push_back(
"-rpath");
1489 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1495 ArgStringList &CmdArgs,
1496 const ToolChain &TC,
const ArgList &Args) {
1498 if (!Args.hasFlag(options::OPT_foffload_via_llvm,
1499 options::OPT_fno_offload_via_llvm,
false))
1502 if (
const Arg *A = Args.getLastArg(options::OPT_fgpu_default_stream_EQ);
1503 A && StringRef(A->getValue()) ==
"per-thread")
1504 CmdArgs.push_back(Args.MakeArgString(
1505 TC.
GetFilePath(
"LLVMOffloadKernelPerThreadDefaultStream.o")));
1507 CmdArgs.push_back(
"-lLLVMOffloadKernel");
1512 const ToolChain &TC,
const ArgList &Args,
1513 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1515 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1516 options::OPT_fno_openmp,
false))
1525 if (ForceStaticHostRuntime)
1526 CmdArgs.push_back(
"-Bstatic");
1530 CmdArgs.push_back(
"-lomp");
1533 CmdArgs.push_back(
"-lgomp");
1536 CmdArgs.push_back(
"-liomp5");
1542 if (ForceStaticHostRuntime)
1543 CmdArgs.push_back(
"-Bdynamic");
1546 CmdArgs.push_back(
"-lrt");
1548 if (IsOffloadingHost)
1549 CmdArgs.push_back(
"-lomptarget");
1558 const llvm::opt::ArgList &Args,
1559 llvm::opt::ArgStringList &CmdArgs) {
1565 constexpr llvm::StringLiteral Targets(
"--offload-targets=");
1569 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1570 [](
auto TC) { return TC.second->getTripleString(); });
1572 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1576 ArgStringList &CmdArgs, StringRef Sanitizer,
1577 bool IsShared,
bool IsWhole) {
1580 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1584 CmdArgs.push_back(
"--no-whole-archive");
1590 ArgStringList &CmdArgs,
1591 StringRef Sanitizer) {
1596 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1599 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1600 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1607 const llvm::opt::ArgList &Args,
1608 llvm::opt::ArgStringList &CmdArgs,
1611 "AIX linker does not support any form of --as-needed option yet.");
1619 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1620 CmdArgs.push_back(
"-z");
1621 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1623 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1628 const llvm::opt::ArgList &Args,
1629 ArgStringList &CmdArgs) {
1634 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1636 CmdArgs.push_back(
"-lpthread");
1638 CmdArgs.push_back(
"-lrt");
1640 CmdArgs.push_back(
"-lm");
1645 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1646 CmdArgs.push_back(
"-ldl");
1650 CmdArgs.push_back(
"-lexecinfo");
1652 CmdArgs.push_back(
"-lbsd");
1658 CmdArgs.push_back(
"-lresolv");
1669 for (
const auto &Entry : llvm::make_range(
C.getOffloadToolChains(Kind))) {
1672 const llvm::Triple &TT = DevTC->
getTriple();
1677 C.getDriver().getOffloadArchs(
C,
C.getArgs(), Kind, *DevTC)) {
1678 const ArgList &DevArgs =
C.getArgsForToolChain(DevTC, BA, Kind);
1690 const ArgList &Args,
1696 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1703 SharedRuntimes.push_back(
"asan");
1704 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1705 HelperStaticRuntimes.push_back(
"asan-preinit");
1708 SharedRuntimes.push_back(
"memprof");
1709 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1710 HelperStaticRuntimes.push_back(
"memprof-preinit");
1713 SharedRuntimes.push_back(
"nsan");
1716 SharedRuntimes.push_back(
"ubsan_minimal");
1718 SharedRuntimes.push_back(
"ubsan_standalone");
1721 SharedRuntimes.push_back(
"scudo_standalone");
1724 SharedRuntimes.push_back(
"tsan");
1726 SharedRuntimes.push_back(
"tysan");
1729 SharedRuntimes.push_back(
"hwasan_aliases");
1731 SharedRuntimes.push_back(
"hwasan");
1732 if (!Args.hasArg(options::OPT_shared))
1733 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1736 SharedRuntimes.push_back(
"rtsan");
1741 StaticRuntimes.push_back(
"stats_client");
1745 HelperStaticRuntimes.push_back(
"asan_static");
1750 NonWholeStaticRuntimes.push_back(
"ubsan_offload");
1751 RequiredSymbols.push_back(
"__ubsan_offload_init");
1753 if (NeedsOffloadRt && !Args.hasArg(options::OPT_shared))
1754 HelperStaticRuntimes.push_back(
"ubsan_offload-preinit");
1757 if (Args.hasArg(options::OPT_shared)) {
1760 StaticRuntimes.push_back(
"ubsan_standalone");
1768 StaticRuntimes.push_back(
"asan");
1770 StaticRuntimes.push_back(
"asan_cxx");
1775 StaticRuntimes.push_back(
"rtsan");
1778 StaticRuntimes.push_back(
"memprof");
1780 StaticRuntimes.push_back(
"memprof_cxx");
1785 StaticRuntimes.push_back(
"hwasan_aliases");
1787 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1789 StaticRuntimes.push_back(
"hwasan");
1791 StaticRuntimes.push_back(
"hwasan_cxx");
1795 StaticRuntimes.push_back(
"dfsan");
1797 StaticRuntimes.push_back(
"lsan");
1799 StaticRuntimes.push_back(
"copyprof");
1801 StaticRuntimes.push_back(
"msan");
1803 StaticRuntimes.push_back(
"msan_cxx");
1806 StaticRuntimes.push_back(
"nsan");
1808 StaticRuntimes.push_back(
"tsan");
1810 StaticRuntimes.push_back(
"tsan_cxx");
1813 StaticRuntimes.push_back(
"tysan");
1816 StaticRuntimes.push_back(
"ubsan_minimal");
1818 StaticRuntimes.push_back(
"ubsan_standalone");
1822 NonWholeStaticRuntimes.push_back(
"safestack");
1823 RequiredSymbols.push_back(
"__safestack_init");
1827 StaticRuntimes.push_back(
"cfi");
1829 StaticRuntimes.push_back(
"cfi_diag");
1834 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1837 NonWholeStaticRuntimes.push_back(
"stats");
1838 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1841 StaticRuntimes.push_back(
"scudo_standalone");
1843 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1846 StaticRuntimes.push_back(
"ubsan_loop_detect");
1855 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1858 NonWholeStaticRuntimes, HelperStaticRuntimes,
1863 for (
auto S : RequiredSymbols) {
1864 CmdArgs.push_back(
"-u");
1865 CmdArgs.push_back(Args.MakeArgString(S));
1869 for (
auto RT : SharedRuntimes)
1873 bool FuzzerNeedsSanitizerDeps =
false;
1875 !Args.hasArg(options::OPT_shared)) {
1878 FuzzerNeedsSanitizerDeps =
true;
1882 if (!Args.hasArg(options::OPT_nostdlibxx)) {
1883 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1884 !Args.hasArg(options::OPT_static);
1885 if (OnlyLibstdcxxStatic)
1886 CmdArgs.push_back(
"-Bstatic");
1888 if (OnlyLibstdcxxStatic)
1889 CmdArgs.push_back(
"-Bdynamic");
1893 for (
auto RT : HelperStaticRuntimes)
1895 bool AddExportDynamic =
false;
1896 for (
auto RT : StaticRuntimes) {
1900 for (
auto RT : NonWholeStaticRuntimes) {
1906 if (AddExportDynamic && !TC.
getTriple().isNVPTX())
1907 CmdArgs.push_back(
"--export-dynamic");
1910 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1913 CmdArgs.push_back(
"-z");
1915 Args.MakeArgString(
"memtag-mode=" + SanArgs.
getMemtagMode()));
1918 CmdArgs.push_back(
"-z");
1919 CmdArgs.push_back(
"memtag-heap");
1923 CmdArgs.push_back(
"-z");
1924 CmdArgs.push_back(
"memtag-stack");
1928 CmdArgs.push_back(
"--android-memtag-note");
1931 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty() ||
1932 FuzzerNeedsSanitizerDeps;
1937 if (Args.hasArg(options::OPT_shared)) {
1939 CmdArgs.push_back(
"--whole-archive");
1941 CmdArgs.push_back(
"--no-whole-archive");
1945 CmdArgs.push_back(
"--whole-archive");
1947 for (
const auto &Mode : XRay.
modeList())
1949 CmdArgs.push_back(
"--no-whole-archive");
1957 const llvm::opt::ArgList &Args,
1958 ArgStringList &CmdArgs) {
1960 CmdArgs.push_back(
"-lpthread");
1962 CmdArgs.push_back(
"-lrt");
1963 CmdArgs.push_back(
"-lm");
1968 CmdArgs.push_back(
"-ldl");
1973 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1974 return !A->getOption().matches(options::OPT_O0);
1982 auto AddPostfix = [JA](
auto &F) {
1987 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1988 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1992 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1995 if (Args.hasArg(options::OPT_o, options::OPT__SLASH_o,
1996 options::OPT__SLASH_Fo) &&
1997 Args.hasArg(options::OPT_c) && Output.
isFilename()) {
2001 llvm::sys::path::remove_filename(
T);
2002 llvm::sys::path::append(
T, llvm::sys::path::stem(Obj));
2004 return Args.MakeArgString(
T);
2010 return Args.MakeArgString(
T);
2014 const JobAction &JA,
const ArgList &Args,
2015 const InputInfo &Output,
const char *OutFile) {
2016 ArgStringList ExtractArgs;
2017 ExtractArgs.push_back(
"--extract-dwo");
2019 ArgStringList StripArgs;
2020 StripArgs.push_back(
"--strip-dwo");
2025 ExtractArgs.push_back(OutFile);
2032 C.addCommand(std::make_unique<Command>(JA,
T,
2034 Exec, ExtractArgs, II, Output));
2037 C.addCommand(std::make_unique<Command>(
2047 Args.ClaimAllArgs(options::OPT_flto_EQ);
2048 Args.ClaimAllArgs(options::OPT_flto);
2049 Args.ClaimAllArgs(options::OPT_fno_lto);
2053 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
2054 options::OPT_fcs_profile_generate_EQ,
2055 options::OPT_fno_profile_generate);
2056 if (CSPGOGenerateArg &&
2057 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
2058 CSPGOGenerateArg =
nullptr;
2060 return CSPGOGenerateArg;
2064 auto *ProfileUseArg = Args.getLastArg(
2065 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
2066 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2067 options::OPT_fno_profile_instr_use);
2069 if (ProfileUseArg &&
2070 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2071 ProfileUseArg =
nullptr;
2073 return ProfileUseArg;
2077 auto *ProfileSampleUseArg = Args.getLastArg(
2078 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
2080 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
2081 options::OPT_fno_profile_sample_use)))
2084 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
2089 case llvm::Reloc::Static:
2091 case llvm::Reloc::PIC_:
2093 case llvm::Reloc::DynamicNoPIC:
2094 return "dynamic-no-pic";
2095 case llvm::Reloc::ROPI:
2097 case llvm::Reloc::RWPI:
2099 case llvm::Reloc::ROPI_RWPI:
2102 llvm_unreachable(
"Unknown Reloc::Model kind");
2109std::tuple<llvm::Reloc::Model, unsigned, bool>
2117 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
2119 bool IsPICLevelTwo = PIC;
2122 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
2125 if (Triple.isAndroid()) {
2126 switch (Triple.getArch()) {
2127 case llvm::Triple::x86:
2128 case llvm::Triple::x86_64:
2130 IsPICLevelTwo =
true;
2140 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
2144 if (Triple.isOSOpenBSD()) {
2146 case llvm::Triple::arm:
2147 case llvm::Triple::aarch64:
2148 case llvm::Triple::mips64:
2149 case llvm::Triple::mips64el:
2150 case llvm::Triple::x86:
2151 case llvm::Triple::x86_64:
2152 IsPICLevelTwo =
false;
2155 case llvm::Triple::ppc:
2156 case llvm::Triple::sparcv9:
2157 IsPICLevelTwo =
true;
2169 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2170 options::OPT_fpic, options::OPT_fno_pic,
2171 options::OPT_fPIE, options::OPT_fno_PIE,
2172 options::OPT_fpie, options::OPT_fno_pie);
2173 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
2174 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
2175 options::OPT_fPIE, options::OPT_fpie)) {
2177 << LastPICArg->getSpelling() << Triple.str();
2178 if (Triple.getArch() == llvm::Triple::x86_64)
2179 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
2180 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2187 Option O = LastPICArg->getOption();
2188 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2189 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2190 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2192 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2194 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
2197 if (EffectiveTriple.isPS()) {
2198 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
2199 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
2200 if (Model !=
"kernel") {
2203 << LastPICArg->getSpelling()
2204 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
2214 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
2220 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
2221 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
2224 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2227 if (!Triple.isOSDarwin())
2229 << A->getSpelling() << Triple.str();
2238 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
2241 bool EmbeddedPISupported;
2242 switch (Triple.getArch()) {
2243 case llvm::Triple::arm:
2244 case llvm::Triple::armeb:
2245 case llvm::Triple::thumb:
2246 case llvm::Triple::thumbeb:
2247 EmbeddedPISupported =
true;
2250 EmbeddedPISupported =
false;
2254 bool ROPI =
false, RWPI =
false;
2255 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
2256 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
2257 if (!EmbeddedPISupported)
2259 << LastROPIArg->getSpelling() << Triple.str();
2262 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2263 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2264 if (!EmbeddedPISupported)
2266 << LastRWPIArg->getSpelling() << Triple.str();
2271 if ((ROPI || RWPI) && (PIC || PIE))
2274 if (Triple.isMIPS()) {
2281 if (ABIName ==
"n64")
2284 if(Args.hasArg(options::OPT_mno_abicalls))
2285 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2288 IsPICLevelTwo =
false;
2292 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2294 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2296 RelocM = llvm::Reloc::ROPI_RWPI;
2298 RelocM = llvm::Reloc::ROPI;
2300 RelocM = llvm::Reloc::RWPI;
2302 return std::make_tuple(RelocM, 0
U,
false);
2306 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
2307 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
2309 const llvm::opt::OptTable &Opts = D.
getOpts();
2310 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
2311 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
2312 D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
2314 return HasStaticPIE;
2334 const ArgList &Args) {
2335 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2336 options::OPT_falign_functions_EQ,
2337 options::OPT_fno_align_functions);
2338 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2341 if (A->getOption().matches(options::OPT_falign_functions))
2345 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2347 << A->getAsString(Args) << A->getValue();
2352 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2353 switch (DebugInfoKind) {
2354 case llvm::codegenoptions::DebugDirectivesOnly:
2355 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2357 case llvm::codegenoptions::DebugLineTablesOnly:
2358 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2360 case llvm::codegenoptions::DebugInfoConstructor:
2361 CmdArgs.push_back(
"-debug-info-kind=constructor");
2363 case llvm::codegenoptions::LimitedDebugInfo:
2364 CmdArgs.push_back(
"-debug-info-kind=limited");
2366 case llvm::codegenoptions::FullDebugInfo:
2367 CmdArgs.push_back(
"-debug-info-kind=standalone");
2369 case llvm::codegenoptions::UnusedTypeInfo:
2370 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2380 assert(A.getOption().matches(options::OPT_gN_Group) &&
2381 "Not a -g option that specifies a debug-info level");
2382 if (A.getOption().matches(options::OPT_g0) ||
2383 A.getOption().matches(options::OPT_ggdb0))
2384 return llvm::codegenoptions::NoDebugInfo;
2385 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2386 A.getOption().matches(options::OPT_ggdb1))
2387 return llvm::codegenoptions::DebugLineTablesOnly;
2388 if (A.getOption().matches(options::OPT_gline_directives_only))
2389 return llvm::codegenoptions::DebugDirectivesOnly;
2390 return llvm::codegenoptions::DebugInfoConstructor;
2394 const ArgList &Args) {
2395 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2401 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 6 ||
2404 << A->getAsString(Args) << A->getValue();
2409 return llvm::StringSwitch<unsigned>(ArgValue)
2410 .Case(
"-gdwarf-2", 2)
2411 .Case(
"-gdwarf-3", 3)
2412 .Case(
"-gdwarf-4", 4)
2413 .Case(
"-gdwarf-5", 5)
2414 .Case(
"-gdwarf-6", 6)
2419 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2420 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2421 options::OPT_gdwarf_6, options::OPT_gdwarf);
2425 const llvm::opt::ArgList &Args) {
2430 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2431 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2432 << GDwarfN->getSpelling() << TC.
getTriple().str();
2434 if (DwarfVersion == 0) {
2436 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2438 return DwarfVersion;
2442 const ArgList &Args, Arg *&Arg) {
2443 Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
2444 options::OPT_gno_split_dwarf);
2445 if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
2448 if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
2451 StringRef
Value = Arg->getValue();
2452 if (
Value ==
"split")
2454 if (
Value ==
"single")
2457 D.
Diag(diag::err_drv_unsupported_option_argument)
2458 << Arg->getSpelling() << Arg->getValue();
2464 assert(A &&
"Expected non-nullptr argument.");
2467 D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
2473 const ArgList &Args,
2474 ArgStringList &CmdArgs) {
2475 if (Args.hasFlag(options::OPT_fdebug_info_for_profiling,
2476 options::OPT_fno_debug_info_for_profiling,
false) &&
2478 Args.getLastArg(options::OPT_fdebug_info_for_profiling), Args, D, TC))
2479 CmdArgs.push_back(
"-fdebug-info-for-profiling");
2483 ArgStringList &CmdArgs) {
2484 llvm::Reloc::Model RelocationModel;
2489 if (RelocationModel != llvm::Reloc::Static)
2490 CmdArgs.push_back(
"-KPIC");
2496 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2502 const ArgList &Args) {
2503 if (Args.hasArg(options::OPT_static_libgcc) ||
2504 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2508 if (Args.hasArg(options::OPT_shared_libgcc))
2527 ArgStringList &CmdArgs,
const ArgList &Args) {
2531 CmdArgs.push_back(
"-l:libunwind.a");
2554 CmdArgs.push_back(
"-lgcc_eh");
2556 CmdArgs.push_back(
"-lgcc_s");
2564 CmdArgs.push_back(
"-lunwind");
2566 CmdArgs.push_back(
"-l:libunwind.a");
2569 CmdArgs.push_back(
"-l:libunwind.dll.a");
2571 CmdArgs.push_back(
"-l:libunwind.so");
2575 CmdArgs.push_back(
"-lunwind");
2585 ArgStringList &CmdArgs,
const ArgList &Args) {
2589 CmdArgs.push_back(
"-lgcc");
2593 CmdArgs.push_back(
"-lgcc");
2597 CmdArgs.push_back(
"--as-needed");
2599 CmdArgs.push_back(
"--no-as-needed");
2604 ArgStringList &CmdArgs,
const ArgList &Args) {
2615 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2618 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2619 if (A && A->getValue() != StringRef(
"platform")) {
2620 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2621 << A->getValue() <<
"MSVC";
2631 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2632 !Args.hasArg(options::OPT_static_pie))
2633 CmdArgs.push_back(
"-ldl");
2640 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2646 StringRef SaveStats = A->getValue();
2647 if (SaveStats ==
"obj" && Output.
isFilename()) {
2649 llvm::sys::path::remove_filename(StatsFile);
2650 }
else if (SaveStats !=
"cwd") {
2651 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2655 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2656 llvm::sys::path::append(StatsFile, BaseName);
2657 llvm::sys::path::replace_extension(StatsFile,
"stats");
2669 assert(Flag.front() ==
'-');
2671 Flags.push_back(Flag.str());
2673 Flags.push_back((
"!" + Flag.substr(1)).str());
2678 ArgStringList &CmdArgs,
bool IsLTO,
2679 const StringRef PluginOptPrefix) {
2680 auto addArg = [&, IsLTO](
const Twine &Arg) {
2682 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2683 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2685 CmdArgs.push_back(
"-mllvm");
2686 CmdArgs.push_back(Args.MakeArgString(Arg));
2690 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2691 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2693 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2694 StringRef
Value = A->getValue();
2696 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2697 !llvm::isPowerOf2_64(Boundary)) {
2698 D.
Diag(diag::err_drv_invalid_argument_to_option)
2699 <<
Value << A->getOption().getName();
2701 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2704 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2705 std::string AlignBranch;
2706 for (StringRef
T : A->getValues()) {
2707 if (
T !=
"fused" &&
T !=
"jcc" &&
T !=
"jmp" &&
T !=
"call" &&
2708 T !=
"ret" &&
T !=
"indirect")
2709 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2710 <<
T <<
"fused, jcc, jmp, call, ret, indirect";
2711 if (!AlignBranch.empty())
2715 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2717 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2718 StringRef
Value = A->getValue();
2719 unsigned PrefixSize;
2720 if (
Value.getAsInteger(10, PrefixSize)) {
2721 D.
Diag(diag::err_drv_invalid_argument_to_option)
2722 <<
Value << A->getOption().getName();
2724 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2729static llvm::opt::Arg *
2731 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2735 const llvm::opt::ArgList &Args) {
2736 const unsigned MinCodeObjVer = 4;
2737 const unsigned MaxCodeObjVer = 6;
2740 if (CodeObjArg->getOption().getID() ==
2741 options::OPT_mcode_object_version_EQ) {
2742 unsigned CodeObjVer = MaxCodeObjVer;
2744 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2745 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2746 D.
Diag(diag::err_drv_invalid_int_value)
2747 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2753 const llvm::opt::ArgList &Args) {
2754 unsigned CodeObjVer = 6;
2756 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2761 const Driver &D,
const llvm::opt::ArgList &Args) {
2766 const llvm::opt::ArgList &Args,
2767 llvm::opt::ArgStringList &CmdArgs,
2768 const llvm::Triple &Triple,
bool IsLTO,
2769 const StringRef PluginOptPrefix) {
2770 auto addArg = [&, IsLTO](
const Twine &Arg) {
2772 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2773 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2775 CmdArgs.push_back(
"-mllvm");
2776 CmdArgs.push_back(Args.MakeArgString(Arg));
2780 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2781 options::OPT_mno_outline)) {
2782 if (A->getOption().matches(options::OPT_moutline)) {
2786 if (Triple.isARM() || Triple.isThumb() || Triple.isAArch64() ||
2787 Triple.isRISCV() || Triple.isX86()) {
2788 addArg(Twine(
"-enable-machine-outliner"));
2790 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2796 CmdArgs.push_back(
"-mno-outline");
2799 addArg(Twine(
"-enable-machine-outliner=never"));
2803 auto *CodeGenDataGenArg =
2804 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
2805 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
2808 if (CodeGenDataGenArg && CodeGenDataUseArg)
2809 D.
Diag(diag::err_drv_argument_not_allowed_with)
2810 << CodeGenDataGenArg->getAsString(Args)
2811 << CodeGenDataUseArg->getAsString(Args);
2815 if (CodeGenDataGenArg)
2816 addArg(Twine(
"-codegen-data-generate"));
2819 if (CodeGenDataUseArg)
2820 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
2824 const llvm::opt::ArgList &Args,
2825 llvm::opt::ArgStringList &CmdArgs,
2826 const llvm::Triple &Triple) {
2827 if (Arg *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
2828 options::OPT_fno_split_machine_functions)) {
2829 if (!A->getOption().matches(options::OPT_fno_split_machine_functions)) {
2831 if ((Triple.isX86() || Triple.isAArch64()) && Triple.isOSBinFormatELF())
2832 A->render(Args, CmdArgs);
2834 D.
Diag(diag::err_drv_unsupported_opt_for_target)
2835 << A->getAsString(Args) << Triple.getTriple();
2841 const llvm::opt::ArgList &DriverArgs,
2842 llvm::opt::ArgStringList &CC1Args,
2843 StringRef BitcodeSuffix,
2844 const llvm::Triple &Triple,
2849 std::optional<std::string> LibPath =
2850 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2853 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2854 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2855 for (StringRef Path : Frags)
2856 LibraryPaths.emplace_back(Path.trim());
2861 LibraryPaths.emplace_back(LibPath);
2865 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
2866 LibraryPaths.emplace_back(P);
2868 OptSpecifier LibomptargetBCPathOpt =
2869 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
2870 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
2871 : options::OPT_libomptarget_spirv_bc_path_EQ;
2873 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
2874 : Triple.isNVPTX() ?
"nvptx"
2876 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
2879 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
2881 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
2882 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
2883 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2886 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2887 CC1Args.push_back(
"-mlink-builtin-bitcode");
2888 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2890 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
2891 << LibOmpTargetFile;
2894 bool FoundBCLibrary =
false;
2896 for (StringRef LibraryPath : LibraryPaths) {
2898 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2899 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2900 CC1Args.push_back(
"-mlink-builtin-bitcode");
2901 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2902 FoundBCLibrary =
true;
2907 if (!FoundBCLibrary)
2908 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
2909 << LibOmpTargetName << ArchPrefix;
2914 const llvm::opt::ArgList &DriverArgs,
2915 llvm::opt::ArgStringList &CC1Args) {
2917 StringRef LibclcNamespec;
2918 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
2921 LibclcNamespec = A->getValue();
2923 if (!TT.isAMDGPU() || TT.getEnvironment() != llvm::Triple::LLVM)
2927 if (DriverArgs.hasArg(options::OPT_no_offloadlib,
2928 options::OPT_nodefaultlibs, options::OPT_nostdlib))
2932 bool FilenameSearch = LibclcNamespec.consume_front(
":");
2933 if (FilenameSearch) {
2935 if (D.
getVFS().exists(LibclcFile)) {
2936 CC1Args.push_back(
"-mlink-builtin-bitcode");
2937 CC1Args.push_back(DriverArgs.MakeArgString(LibclcFile));
2940 D.
Diag(diag::err_drv_libclc_not_found) << LibclcFile;
2946 llvm::sys::path::append(ResourceLibPath,
"lib");
2949 if (
const Arg *CPUArg = DriverArgs.getLastArg(options::OPT_mcpu_EQ))
2950 CPU = CPUArg->getValue();
2953 auto TryTriplePath = [&](StringRef TripleStr) ->
bool {
2955 llvm::sys::path::append(BasePath, TripleStr);
2962 llvm::sys::path::append(CPUPath, CPU,
"libclc.bc");
2963 if (D.
getVFS().exists(CPUPath)) {
2964 CC1Args.push_back(
"-mlink-builtin-bitcode");
2965 CC1Args.push_back(DriverArgs.MakeArgString(CPUPath));
2972 llvm::sys::path::append(GenericPath,
"libclc.bc");
2973 if (D.
getVFS().exists(GenericPath)) {
2974 CC1Args.push_back(
"-mlink-builtin-bitcode");
2975 CC1Args.push_back(DriverArgs.MakeArgString(GenericPath));
2982 if (TryTriplePath(TT.str()))
2985 llvm::Triple::SubArchType SubArch = TT.getSubArch();
2986 if (TT.isAMDGCN() && SubArch != llvm::Triple::NoSubArch) {
2991 llvm::Triple::SubArchType MajorSubArch =
2992 llvm::AMDGPU::getMajorSubArch(SubArch);
2993 if (MajorSubArch != SubArch) {
2994 llvm::Triple MajorTT(TT);
2995 MajorTT.setArch(TT.getArch(), MajorSubArch);
2996 if (TryTriplePath(MajorTT.str()))
3001 llvm::Triple NoSubArchTT(TT);
3002 NoSubArchTT.setArch(TT.getArch(), llvm::Triple::NoSubArch);
3003 if (TryTriplePath(NoSubArchTT.str()))
3007 D.
Diag(diag::err_drv_libclc_not_found) <<
"libclc.bc";
3012 const llvm::opt::ArgList &Args,
3013 llvm::opt::ArgStringList &CmdArgs,
3014 const llvm::Triple &Triple) {
3015 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3016 options::OPT_mno_outline_atomics)) {
3018 if (!Triple.isAArch64()) {
3019 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3020 << Triple.getArchName() << A->getOption().getName();
3022 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3023 CmdArgs.push_back(
"-target-feature");
3024 CmdArgs.push_back(
"+outline-atomics");
3026 CmdArgs.push_back(
"-target-feature");
3027 CmdArgs.push_back(
"-outline-atomics");
3031 CmdArgs.push_back(
"-target-feature");
3032 CmdArgs.push_back(
"+outline-atomics");
3037 llvm::opt::ArgStringList &CmdArgs) {
3038 if (TCArgs.hasFlag(options::OPT_offload_compress,
3039 options::OPT_no_offload_compress,
false))
3040 CmdArgs.push_back(
"--compress");
3041 if (TCArgs.hasArg(options::OPT_v))
3042 CmdArgs.push_back(
"--verbose");
3043 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3045 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3049 const llvm::Triple &Triple,
3050 const llvm::Reloc::Model &RelocationModel,
3051 llvm::opt::ArgStringList &CmdArgs) {
3052 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3053 StringRef CM = A->getValue();
3055 if (Triple.isOSAIX() && CM ==
"medium")
3057 if (Triple.isAArch64(64)) {
3058 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3059 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3060 RelocationModel != llvm::Reloc::Static)
3061 D.
Diag(diag::err_drv_argument_only_allowed_with)
3062 << A->getAsString(Args) <<
"-fno-pic";
3063 }
else if (Triple.isLoongArch()) {
3064 if (CM ==
"extreme" &&
3065 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3066 D.
Diag(diag::err_drv_argument_not_allowed_with)
3067 << A->getAsString(Args) <<
"-fplt";
3068 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3071 CM = llvm::StringSwitch<StringRef>(CM)
3072 .Case(
"normal",
"small")
3073 .Case(
"extreme",
"large")
3075 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3076 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3077 }
else if (Triple.isRISCV()) {
3079 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3080 D.
Diag(diag::err_drv_argument_not_allowed_with)
3081 << A->getAsString(Args) <<
"-fpic";
3084 else if (CM ==
"medany")
3086 Ok = CM ==
"small" || CM ==
"medium" ||
3087 (CM ==
"large" && Triple.isRISCV64());
3088 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3089 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3090 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3094 }
else if (Triple.isSPARC64()) {
3097 else if (CM ==
"medmid")
3099 else if (CM ==
"medany")
3101 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3102 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3103 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3106 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3108 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3109 << A->getSpelling() << CM << Triple.getTriple();
3113 if (Triple.getArch() == llvm::Triple::x86_64) {
3114 bool IsMediumCM =
false;
3115 bool IsLargeCM =
false;
3116 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3117 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3118 IsLargeCM = StringRef(A->getValue()) ==
"large";
3120 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3121 if (!IsMediumCM && !IsLargeCM) {
3122 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3123 << A->getOption().getRenderName();
3125 A->render(Args, CmdArgs);
3127 }
else if (IsMediumCM) {
3128 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3129 }
else if (IsLargeCM) {
3130 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3136 ArgStringList &CmdArgs) {
3141 Args.getLastArg(options::OPT_fcolor_diagnostics,
3142 options::OPT_fno_color_diagnostics);
3143 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3144 StringRef
Value(A->getValue());
3146 D.
Diag(diag::err_drv_invalid_argument_to_option)
3147 <<
Value << A->getOption().getName();
3152 CmdArgs.push_back(
"-fcolor-diagnostics");
3155 CmdArgs.push_back(
"-fno-color-diagnostics");
3164 for (; *Arg; ++Arg) {
3170 Res.push_back(
'\\');
3173 Res.push_back(*Arg);
3178 const llvm::opt::ArgList &Args) {
3182 llvm::opt::ArgStringList OriginalArgs;
3183 for (
const auto &Arg : Args)
3184 Arg->render(Args, OriginalArgs);
3188 for (
const char *OriginalArg : OriginalArgs) {
3192 Flags += EscapedArg;
3195 return Args.MakeArgString(Flags);
3199 const llvm::opt::ArgList &Args,
3200 bool &FRecordCommandLine,
3201 bool &GRecordCommandLine,
3202 bool &DXRecordCommandLine) {
3205 const std::string &TripleStr = Triple.getTriple();
3207 FRecordCommandLine =
3208 Args.hasFlag(options::OPT_frecord_command_line,
3209 options::OPT_fno_record_command_line,
false);
3210 GRecordCommandLine =
3211 Args.hasFlag(options::OPT_grecord_command_line,
3212 options::OPT_gno_record_command_line,
false);
3213 DXRecordCommandLine = Triple.isDXIL() && Args.hasArg(options::OPT_g_Flag);
3214 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3215 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3216 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3217 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3221 DXRecordCommandLine;
3225 ArgStringList &CmdArgs,
3226 const llvm::Triple &Triple) {
3227 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
3228 options::OPT_fno_global_isel)) {
3229 CmdArgs.push_back(
"-mllvm");
3230 if (A->getOption().matches(options::OPT_fglobal_isel)) {
3231 CmdArgs.push_back(
"-global-isel=1");
3236 bool IsArchSupported = Triple.getArch() == llvm::Triple::aarch64;
3237 bool IsOptLevelSupported =
false;
3239 Arg *A = Args.getLastArg(options::OPT_O_Group);
3240 if (IsArchSupported) {
3241 if (!A || A->getOption().matches(options::OPT_O0))
3242 IsOptLevelSupported =
true;
3244 if (!IsArchSupported || !IsOptLevelSupported) {
3245 CmdArgs.push_back(
"-mllvm");
3246 CmdArgs.push_back(
"-global-isel-abort=2");
3248 if (!IsArchSupported)
3249 D.
Diag(diag::warn_drv_global_isel_incomplete) << Triple.getArchName();
3251 D.
Diag(diag::warn_drv_global_isel_incomplete_opt);
3254 CmdArgs.push_back(
"-global-isel=0");
3260 ArgStringList &CmdArgs,
3261 bool IsMSVCCompat) {
3262 bool use_fwrapv = IsMSVCCompat;
3263 bool use_fwrapv_pointer =
false;
3264 for (
const Arg *A : Args.filtered(
3265 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3266 options::OPT_fwrapv, options::OPT_fno_wrapv,
3267 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3269 switch (A->getOption().getID()) {
3270 case options::OPT_fstrict_overflow:
3272 use_fwrapv_pointer =
false;
3274 case options::OPT_fno_strict_overflow:
3276 use_fwrapv_pointer =
true;
3278 case options::OPT_fwrapv:
3281 case options::OPT_fno_wrapv:
3284 case options::OPT_fwrapv_pointer:
3285 use_fwrapv_pointer =
true;
3287 case options::OPT_fno_wrapv_pointer:
3288 use_fwrapv_pointer =
false;
3294 CmdArgs.push_back(
"-fwrapv");
3295 if (!use_fwrapv && IsMSVCCompat)
3296 CmdArgs.push_back(
"-fno-wrapv");
3297 if (use_fwrapv_pointer)
3298 CmdArgs.push_back(
"-fwrapv-pointer");
3305 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3306 if (A->getOption().matches(options::OPT_O4) ||
3307 A->getOption().matches(options::OPT_Ofast))
3310 if (A->getOption().matches(options::OPT_O0))
3313 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3316 StringRef S(A->getValue());
3324 unsigned OptLevel = 0;
3325 if (S.getAsInteger(10, OptLevel))
3328 return OptLevel > 1;
3335 ArgStringList &CmdArgs) {
3337 if (Args.hasFlag(options::OPT_fvectorize, options::OPT_fno_vectorize,
3339 CmdArgs.push_back(
"-vectorize-loops");
3343 ArgStringList &CmdArgs) {
3345 if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize,
3347 CmdArgs.push_back(
"-vectorize-slp");
3351 ArgStringList &CmdArgs) {
3354 Args.AddLastArg(CmdArgs, options::OPT_floop_interchange,
3355 options::OPT_fno_loop_interchange);
3376 llvm_unreachable(
"Fully covered switch above");
3382 if (!ComplexRangeStr.empty())
3383 return "-complex-range=" + ComplexRangeStr;
3384 return ComplexRangeStr;
3404 if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
3405 (LastOpt ==
"-fcx-limited-range" && NewOpt ==
"-fno-cx-limited-range") ||
3406 (LastOpt ==
"-fno-cx-limited-range" && NewOpt ==
"-fcx-limited-range") ||
3407 (LastOpt ==
"-fcx-fortran-rules" && NewOpt ==
"-fno-cx-fortran-rules") ||
3408 (LastOpt ==
"-fno-cx-fortran-rules" && NewOpt ==
"-fcx-fortran-rules") ||
3409 (LastOpt ==
"-ffast-math" && NewOpt ==
"-fno-fast-math") ||
3410 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-ffast-math") ||
3411 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-fno-fast-math") ||
3412 (LastOpt.starts_with(
"-ffp-model=") &&
3413 NewOpt.starts_with(
"-ffp-model=")) ||
3414 (LastOpt.starts_with(
"-fcomplex-arithmetic=") &&
3415 NewOpt.starts_with(
"-fcomplex-arithmetic=")))
3418 D.
Diag(clang::diag::warn_drv_overriding_complex_range)
3438 const ArgStringList &LinkerInputs,
3440 const llvm::opt::ArgList &Args,
3441 const char *OutputFilename) {
3445 assert(!LinkerInputs.empty() && !JobInputs.empty() &&
3446 "Must have at least one input.");
3448 ArgStringList LlvmLinkArgs(
3449 {
"-o", OutputFilename ? OutputFilename : Output.
getFilename()});
3451 LlvmLinkArgs.append(LinkerInputs);
3454 const char *LlvmLink = Args.MakeArgString(TC.
GetProgramPath(
"llvm-link"));
3456 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 addSanitizerRuntime(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer, bool IsShared, bool IsWhole)
static void collectSanitizerRuntimes(Compilation &C, const ToolChain &TC, const ArgList &Args, SmallVectorImpl< StringRef > &SharedRuntimes, SmallVectorImpl< StringRef > &StaticRuntimes, SmallVectorImpl< StringRef > &NonWholeStaticRuntimes, SmallVectorImpl< StringRef > &HelperStaticRuntimes, SmallVectorImpl< StringRef > &RequiredSymbols)
static void AddUnwindLibrary(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
static bool shouldIgnoreUnsupportedTargetFeature(const Arg &TargetFeatureArg, const llvm::Triple &T)
static StringRef getAMDGPUTargetGPU(const llvm::Triple &T, const ArgList &Args)
Get the (LLVM) name of the AMDGPU gpu we are targeting.
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 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 bool hostNeedsUbsanOffloadRt(Compilation &C, const ToolChain &HostTC)
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 bool mustUseNonLeafFramePointerForTarget(const llvm::Triple &Triple)
static const SanitizerMask NeedsUbsanRt
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
ComplexRangeKind
Controls the various implementations for complex multiplication and.
@ CX_Full
Implementation of complex division and multiplication using a call to runtime library functions(gener...
@ CX_Basic
Implementation of complex division and multiplication using algebraic formulas at source precision.
@ CX_Promoted
Implementation of complex division using algebraic formulas at higher precision.
@ CX_None
No range rule is enabled.
@ CX_Improved
Implementation of complex division offering an improved handling for overflow in intermediate calcula...
BoundArch getOffloadingArch() const
OffloadKind getOffloadingDeviceKind() const
bool isHostOffloading(unsigned int OKind) const
Check if this action have any offload kinds.
Compilation - A set of tasks to perform for a single driver invocation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
std::string CCPrintInternalStatReportFilename
The file to log CC_PRINT_INTERNAL_STAT_FILE output to, if enabled.
DiagnosticsEngine & getDiags() const
const char * getPrependArg() const
OpenMPRuntimeKind getOpenMPRuntime(const llvm::opt::ArgList &Args) const
Compute the desired OpenMP runtime from the flags provided.
DiagnosticBuilder Diag(unsigned DiagID) const
unsigned CCPrintInternalStats
Set CC_PRINT_INTERNAL_STAT mode, which causes the driver to dump internal performance report to CC_PR...
const llvm::opt::OptTable & getOpts() const
const char * getDriverProgramPath() const
Get the path to the main driver executable.
std::string ResourceDir
The path to the compiler resource directory.
llvm::vfs::FileSystem & getVFS() const
std::string 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 needsCopyProfRt() 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.
SmallVector< InputInfo, 4 > InputInfoList
bool willEmitRemarks(const llvm::opt::ArgList &Args)
Top level wrappers for InstallAPI frontend operations.
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)
const FunctionProtoType * T
@ Auto
Emit colors only if the output stream is detected to support them.
@ On
Always emit colors regardless of the output stream.
@ Off
Never emit colors regardless of the output stream.
Represents a bound architecture for offload / multiple architecture compilation.
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
static constexpr ResponseFileSupport AtFileCurCP()