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::sparc:
94 case llvm::Triple::sparcel:
95 case llvm::Triple::sparcv9:
96 case llvm::Triple::amdgcn:
97 case llvm::Triple::r600:
98 case llvm::Triple::csky:
99 case llvm::Triple::loongarch32:
100 case llvm::Triple::loongarch64:
101 case llvm::Triple::m68k:
107 if (Triple.isOSFuchsia() || Triple.isOSNetBSD()) {
111 if (Triple.isOSLinux() || Triple.isOSHurd()) {
112 switch (Triple.getArch()) {
114 case llvm::Triple::arm:
115 case llvm::Triple::armeb:
116 case llvm::Triple::thumb:
117 case llvm::Triple::thumbeb:
118 case llvm::Triple::mips64:
119 case llvm::Triple::mips64el:
120 case llvm::Triple::mips:
121 case llvm::Triple::mipsel:
122 case llvm::Triple::systemz:
123 case llvm::Triple::x86:
124 case llvm::Triple::x86_64:
131 if (Triple.isOSWindows()) {
132 switch (Triple.getArch()) {
133 case llvm::Triple::x86:
135 case llvm::Triple::x86_64:
136 return Triple.isOSBinFormatMachO();
137 case llvm::Triple::arm:
138 case llvm::Triple::thumb:
155 if (Triple.isAArch64() || Triple.isPS() || Triple.isVE() ||
156 (Triple.isAndroid() && !Triple.isARM()))
159 if ((Triple.isARM() || Triple.isThumb()) && Triple.isOSBinFormatMachO())
166 switch (Triple.getArch()) {
169 case llvm::Triple::arm:
170 case llvm::Triple::thumb:
173 return Triple.isOSDarwin();
180 const llvm::Triple &Triple) {
181 switch (Triple.getArch()) {
184 case llvm::Triple::arm:
185 case llvm::Triple::armeb:
186 case llvm::Triple::thumb:
187 case llvm::Triple::thumbeb:
191 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
192 StringRef
V = A->getValue();
197 case llvm::Triple::aarch64:
201 return Triple.isOSWindows();
208 const llvm::Triple &Triple) {
209 if (Triple.isARM() || Triple.isThumb()) {
213 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
214 StringRef
V = A->getValue();
215 return V ==
"aapcs+leaf";
224 const llvm::Triple &Triple) {
266 Args.hasFlag(options::OPT_fno_omit_frame_pointer,
267 options::OPT_fomit_frame_pointer, DefaultFP);
273 Args.hasFlag(options::OPT_mno_omit_leaf_frame_pointer,
274 options::OPT_momit_leaf_frame_pointer, DefaultLeafFP);
276 bool FPRegReserved = Args.hasFlag(options::OPT_mreserve_frame_pointer_reg,
277 options::OPT_mno_reserve_frame_pointer_reg,
295 const StringRef PluginOptPrefix) {
296 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
297 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
298 "-pass-remarks=" + A->getValue()));
300 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
301 CmdArgs.push_back(Args.MakeArgString(
302 Twine(PluginOptPrefix) +
"-pass-remarks-missed=" + A->getValue()));
304 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
305 CmdArgs.push_back(Args.MakeArgString(
306 Twine(PluginOptPrefix) +
"-pass-remarks-analysis=" + A->getValue()));
310 const llvm::Triple &Triple,
313 const StringRef PluginOptPrefix) {
314 StringRef Format =
"yaml";
315 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
316 Format = A->getValue();
320 Args.getLastArg(options::OPT_foptimization_record_file_EQ)) {
323 }
else if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
330 assert(!F.empty() &&
"Cannot determine remarks output name.");
332 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
333 "opt-remarks-filename=" + F +
"opt.ld." +
337 Args.getLastArg(options::OPT_foptimization_record_passes_EQ))
338 CmdArgs.push_back(Args.MakeArgString(
339 Twine(PluginOptPrefix) +
"opt-remarks-passes=" + A->getValue()));
341 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
342 "opt-remarks-format=" + Format.data()));
346 ArgStringList &CmdArgs,
347 const StringRef PluginOptPrefix) {
348 if (Args.hasFlag(options::OPT_fdiagnostics_show_hotness,
349 options::OPT_fno_diagnostics_show_hotness,
false))
350 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
351 "opt-remarks-with-hotness"));
354 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ))
356 Args.MakeArgString(Twine(PluginOptPrefix) +
357 "opt-remarks-hotness-threshold=" + A->getValue()));
362 StringRef Processor) {
366 auto GPUKind =
T.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Processor)
367 : llvm::AMDGPU::parseArchR600(Processor);
368 auto GPUFeatures =
T.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind)
369 : llvm::AMDGPU::getArchAttrR600(GPUKind);
370 if (GPUFeatures & llvm::AMDGPU::FEATURE_WGP)
372 return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode);
377 if (D.
getVFS().exists(Path))
378 Paths.push_back(Path.str());
382 const llvm::Triple &Triple,
384 std::vector<StringRef> &Features,
385 OptSpecifier Group) {
386 std::set<StringRef> Warned;
387 for (
const Arg *A : Args.filtered(Group)) {
388 StringRef Name = A->getOption().getName();
392 assert(Name.starts_with(
"m") &&
"Invalid feature name.");
393 Name = Name.substr(1);
397 if (Warned.count(Name) == 0) {
399 clang::diag::warn_drv_unsupported_option_for_processor)
400 << A->getAsString(Args) << Proc;
406 bool IsNegative = Name.consume_front(
"no-");
408 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
416 llvm::DenseSet<StringRef> UsedFeatures;
417 for (StringRef
Feature : llvm::reverse(Features)) {
418 if (UsedFeatures.insert(
Feature.drop_front()).second)
419 UnifiedFeatures.insert(UnifiedFeatures.begin(),
Feature);
422 return UnifiedFeatures;
426 const char *ArgName,
const char *EnvVar) {
427 const char *DirList = ::getenv(EnvVar);
428 bool CombinedArg =
false;
433 StringRef Name(ArgName);
434 if (Name ==
"-I" || Name ==
"-L" || Name.empty())
437 StringRef Dirs(DirList);
441 StringRef::size_type Delim;
442 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
445 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
447 CmdArgs.push_back(ArgName);
448 CmdArgs.push_back(
".");
453 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
455 CmdArgs.push_back(ArgName);
456 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
459 Dirs = Dirs.substr(Delim + 1);
464 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
466 CmdArgs.push_back(ArgName);
467 CmdArgs.push_back(
".");
471 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
473 CmdArgs.push_back(ArgName);
474 CmdArgs.push_back(Args.MakeArgString(Dirs));
480 const ArgList &Args, ArgStringList &CmdArgs,
486 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
493 for (
const auto &II : Inputs) {
497 if (
auto *IA = II.getAction())
507 if (II.isFilename()) {
508 CmdArgs.push_back(II.getFilename());
517 const Arg &A = II.getInputArg();
520 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
522 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
525 else if (A.getOption().matches(options::OPT_rpath) &&
529 A.renderAsInput(Args, CmdArgs);
531 if (
const Arg *A = Args.getLastArg(options::OPT_fveclib)) {
532 const llvm::Triple &Triple = TC.
getTriple();
533 StringRef
V = A->getValue();
534 if (
V ==
"ArmPL" && (Triple.isOSLinux() || Triple.isOSDarwin())) {
552 if (Triple.isOSLinux()) {
553 CmdArgs.push_back(Args.MakeArgString(
"--push-state"));
554 CmdArgs.push_back(Args.MakeArgString(
"--as-needed"));
556 if (!Args.hasArg(options::OPT_nostdlib))
557 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
558 CmdArgs.push_back(Args.MakeArgString(
"-lamath"));
559 if (!Args.hasArg(options::OPT_nostdlib))
560 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
561 if (Triple.isOSLinux())
562 CmdArgs.push_back(Args.MakeArgString(
"--pop-state"));
569 switch (
T.getArch()) {
570 case llvm::Triple::x86:
574 case llvm::Triple::aarch64:
575 if (
T.isOSManagarm())
576 return "aarch64managarm";
579 return "aarch64linux";
580 case llvm::Triple::aarch64_be:
582 return "aarch64elfb";
583 return "aarch64linuxb";
584 case llvm::Triple::arm:
585 case llvm::Triple::thumb:
586 case llvm::Triple::armeb:
587 case llvm::Triple::thumbeb: {
590 return IsBigEndian ?
"armelfb" :
"armelf";
591 return IsBigEndian ?
"armelfb_linux_eabi" :
"armelf_linux_eabi";
593 case llvm::Triple::m68k:
595 case llvm::Triple::ppc:
597 return "elf32ppclinux";
599 case llvm::Triple::ppcle:
601 return "elf32lppclinux";
603 case llvm::Triple::ppc64:
605 case llvm::Triple::ppc64le:
607 case llvm::Triple::riscv32:
608 return "elf32lriscv";
609 case llvm::Triple::riscv64:
610 return "elf64lriscv";
611 case llvm::Triple::sparc:
612 case llvm::Triple::sparcel:
613 return "elf32_sparc";
614 case llvm::Triple::sparcv9:
615 return "elf64_sparc";
616 case llvm::Triple::loongarch32:
617 return "elf32loongarch";
618 case llvm::Triple::loongarch64:
619 return "elf64loongarch";
620 case llvm::Triple::mips:
621 return "elf32btsmip";
622 case llvm::Triple::mipsel:
623 return "elf32ltsmip";
624 case llvm::Triple::mips64:
626 return "elf32btsmipn32";
627 return "elf64btsmip";
628 case llvm::Triple::mips64el:
630 return "elf32ltsmipn32";
631 return "elf64ltsmip";
632 case llvm::Triple::systemz:
634 case llvm::Triple::x86_64:
636 return "elf32_x86_64";
638 case llvm::Triple::ve:
640 case llvm::Triple::csky:
641 return "cskyelf_linux";
648 const ToolChain &TC,
const llvm::opt::ArgList &Args,
649 llvm::opt::ArgStringList &CmdArgs) {
655 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
656 StringRef
V = A->getValue();
657 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
658 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
660 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
661 << A->getSpelling() <<
V;
666 std::vector<StringRef> &Features,
667 OptSpecifier OnOpt, OptSpecifier OffOpt,
668 StringRef FeatureName) {
669 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
670 if (A->getOption().matches(OnOpt))
671 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
673 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
679 const ArgList &Args) {
680 Arg *MArch = Args.getLastArg(options::OPT_march_EQ);
681 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
683 return llvm::StringSwitch<std::string>(GPUName)
684 .Cases({
"rv630",
"rv635"},
"r600")
685 .Cases({
"rv610",
"rv620",
"rs780"},
"rs880")
686 .Case(
"rv740",
"rv770")
687 .Case(
"palm",
"cedar")
688 .Cases({
"sumo",
"sumo2"},
"sumo")
689 .Case(
"hemlock",
"cypress")
690 .Case(
"aruba",
"cayman")
691 .Default(GPUName.str());
699 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
700 return A->getValue();
708 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
709 StringRef CPU = A->getValue();
715 return llvm::sys::getHostCPUName();
725 const llvm::Triple &
T,
bool FromAs) {
728 switch (
T.getArch()) {
732 case llvm::Triple::aarch64:
733 case llvm::Triple::aarch64_32:
734 case llvm::Triple::aarch64_be:
737 case llvm::Triple::arm:
738 case llvm::Triple::armeb:
739 case llvm::Triple::thumb:
740 case llvm::Triple::thumbeb: {
741 StringRef MArch, MCPU;
746 case llvm::Triple::avr:
747 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
748 return A->getValue();
751 case llvm::Triple::m68k:
754 case llvm::Triple::mips:
755 case llvm::Triple::mipsel:
756 case llvm::Triple::mips64:
757 case llvm::Triple::mips64el: {
761 return std::string(CPUName);
764 case llvm::Triple::nvptx:
765 case llvm::Triple::nvptx64:
766 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
767 return A->getValue();
770 case llvm::Triple::ppc:
771 case llvm::Triple::ppcle:
772 case llvm::Triple::ppc64:
773 case llvm::Triple::ppc64le:
774 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
776 llvm::PPC::getNormalizedPPCTargetCPU(
T, A->getValue()));
777 return std::string(llvm::PPC::getNormalizedPPCTargetCPU(
T));
779 case llvm::Triple::csky:
780 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
781 return A->getValue();
782 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
783 return A->getValue();
786 case llvm::Triple::riscv32:
787 case llvm::Triple::riscv64:
790 case llvm::Triple::bpfel:
791 case llvm::Triple::bpfeb:
792 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
793 return A->getValue();
796 case llvm::Triple::sparc:
797 case llvm::Triple::sparcel:
798 case llvm::Triple::sparcv9:
801 case llvm::Triple::x86:
802 case llvm::Triple::x86_64:
805 case llvm::Triple::hexagon:
809 case llvm::Triple::lanai:
812 case llvm::Triple::systemz:
815 case llvm::Triple::r600:
816 case llvm::Triple::amdgcn:
819 case llvm::Triple::wasm32:
820 case llvm::Triple::wasm64:
823 case llvm::Triple::loongarch32:
824 case llvm::Triple::loongarch64:
827 case llvm::Triple::xtensa:
828 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
829 return A->getValue();
835 const llvm::Triple &Triple,
837 std::vector<StringRef> &Features) {
839 options::OPT_m_wasm_Features_Group);
843 const ArgList &Args, ArgStringList &CmdArgs,
844 bool ForAS,
bool IsAux) {
845 std::vector<StringRef> Features;
846 switch (Triple.getArch()) {
849 case llvm::Triple::mips:
850 case llvm::Triple::mipsel:
851 case llvm::Triple::mips64:
852 case llvm::Triple::mips64el:
855 case llvm::Triple::arm:
856 case llvm::Triple::armeb:
857 case llvm::Triple::thumb:
858 case llvm::Triple::thumbeb:
861 case llvm::Triple::ppc:
862 case llvm::Triple::ppcle:
863 case llvm::Triple::ppc64:
864 case llvm::Triple::ppc64le:
867 case llvm::Triple::riscv32:
868 case llvm::Triple::riscv64:
871 case llvm::Triple::systemz:
874 case llvm::Triple::aarch64:
875 case llvm::Triple::aarch64_32:
876 case llvm::Triple::aarch64_be:
879 case llvm::Triple::x86:
880 case llvm::Triple::x86_64:
883 case llvm::Triple::hexagon:
886 case llvm::Triple::wasm32:
887 case llvm::Triple::wasm64:
890 case llvm::Triple::sparc:
891 case llvm::Triple::sparcel:
892 case llvm::Triple::sparcv9:
895 case llvm::Triple::r600:
896 case llvm::Triple::amdgcn:
899 case llvm::Triple::nvptx:
900 case llvm::Triple::nvptx64:
903 case llvm::Triple::m68k:
906 case llvm::Triple::msp430:
909 case llvm::Triple::ve:
912 case llvm::Triple::csky:
915 case llvm::Triple::loongarch32:
916 case llvm::Triple::loongarch64:
922 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
923 CmdArgs.push_back(
Feature.data());
928 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
931 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
932 D.
Diag(diag::err_drv_invalid_int_value)
933 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
934 return LtoJobsArg->getValue();
939 return Triple.isPS();
943 const llvm::opt::ArgList &Args) {
945 Arg *A = Args.getLastArg(options::OPT_mtls_dialect_EQ);
947 return Triple.hasDefaultTLSDESC();
948 StringRef
V = A->getValue();
949 bool SupportedArgument =
false, EnableTLSDESC =
false;
950 bool Unsupported = !Triple.isOSBinFormatELF();
951 if (Triple.isLoongArch() || Triple.isRISCV()) {
952 SupportedArgument =
V ==
"desc" ||
V ==
"trad";
953 EnableTLSDESC =
V ==
"desc";
954 }
else if (Triple.isX86()) {
955 SupportedArgument =
V ==
"gnu" ||
V ==
"gnu2";
956 EnableTLSDESC =
V ==
"gnu2";
961 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
962 << A->getSpelling() << Triple.getTriple();
963 }
else if (!SupportedArgument) {
964 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument_for_target)
965 << A->getSpelling() <<
V << Triple.getTriple();
967 return EnableTLSDESC;
971 llvm::opt::ArgStringList &CmdArgs) {
972 if (Arg *A = Args.getLastArg(options::OPT_fthinlto_distributor_EQ)) {
974 Args.MakeArgString(
"--thinlto-distributor=" + Twine(A->getValue())));
976 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-remote-compiler=" +
979 CmdArgs.push_back(Args.MakeArgString(
980 "--thinlto-remote-compiler-prepend-arg=" + Twine(PA)));
983 Args.getAllArgValues(options::OPT_Xthinlto_distributor_EQ))
984 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-distributor-arg=" + A));
989 ArgStringList &CmdArgs,
const InputInfo &Output,
992 const bool IsOSAIX = Triple.isOSAIX();
993 const bool IsAMDGCN = Triple.isAMDGCN();
994 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ);
997 const bool IsFatLTO = Args.hasFlag(options::OPT_ffat_lto_objects,
998 options::OPT_fno_fat_lto_objects,
false);
999 const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
1001 assert(!Inputs.empty() &&
"Must have at least one input.");
1003 auto Input = llvm::find_if(
1005 if (Input == Inputs.end()) {
1008 Input = Inputs.begin();
1011 if (Linker !=
"lld" && Linker !=
"lld-link" &&
1012 llvm::sys::path::filename(LinkerPath) !=
"ld.lld" &&
1013 llvm::sys::path::stem(LinkerPath) !=
"ld.lld" && !Triple.isOSOpenBSD()) {
1017 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
1018 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
1021 CmdArgs.push_back(
"-plugin");
1024 const char *Suffix =
".dll";
1025#elif defined(__APPLE__)
1026 const char *Suffix =
".dylib";
1028 const char *Suffix =
".so";
1032 llvm::sys::path::native(Twine(D.
Dir) +
1033 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
1034 PluginName + Suffix,
1036 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
1041 CmdArgs.push_back(
"--fat-lto-objects");
1043 if (Args.hasArg(options::OPT_flto_partitions_EQ)) {
1045 StringRef A = Args.getLastArgValue(options::OPT_flto_partitions_EQ,
"8");
1046 if (A.getAsInteger(10,
Value) || (
Value < 1)) {
1047 Arg *Arg = Args.getLastArg(options::OPT_flto_partitions_EQ);
1048 D.
Diag(diag::err_drv_invalid_int_value)
1049 << Arg->getAsString(Args) << Arg->getValue();
1051 CmdArgs.push_back(Args.MakeArgString(
"--lto-partitions=" + A));
1055 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
1056 const char *ExtraDash = IsOSAIX ?
"-" :
"";
1057 const char *ParallelismOpt = IsOSAIX ?
"-threads=" :
"jobs=";
1062 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
1063 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1064 "-generate-arange-section"));
1068 Arg *ArgVecLib = Args.getLastArg(options::OPT_fveclib);
1069 if (ArgVecLib && ArgVecLib->getNumValues() == 1) {
1072 std::optional<StringRef> OptVal =
1073 llvm::StringSwitch<std::optional<StringRef>>(ArgVecLib->getValue())
1074 .Case(
"Accelerate",
"Accelerate")
1075 .Case(
"libmvec",
"LIBMVEC")
1076 .Case(
"AMDLIBM",
"AMDLIBM")
1077 .Case(
"MASSV",
"MASSV")
1078 .Case(
"SVML",
"SVML")
1079 .Case(
"SLEEF",
"sleefgnuabi")
1080 .Case(
"Darwin_libsystem_m",
"Darwin_libsystem_m")
1081 .Case(
"ArmPL",
"ArmPL")
1082 .Case(
"none",
"none")
1083 .Default(std::nullopt);
1086 CmdArgs.push_back(Args.MakeArgString(
1087 Twine(PluginOptPrefix) +
"-vector-library=" + OptVal.value()));
1097 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
1099 if (Args.getLastArg(options::OPT_O_Group)) {
1100 unsigned OptimizationLevel =
1102 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1103 "O" + Twine(OptimizationLevel)));
1106 Args.MakeArgString(Twine(
"--lto-CGO") + Twine(OptimizationLevel)));
1109 if (Args.hasArg(options::OPT_gsplit_dwarf)) {
1111 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1118 Args.MakeArgString(Twine(PluginOptPrefix) +
"dwo_dir=" + F +
"dwo"));
1121 if (IsThinLTO && !IsOSAIX)
1122 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
1123 else if (IsThinLTO && IsOSAIX)
1124 CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
1129 if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
1130 Args.hasArg(options::OPT_fenable_matrix))
1132 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-matrix"));
1135 if (!Parallelism.empty())
1136 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1137 ParallelismOpt + Parallelism));
1140 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
1141 options::OPT_fno_global_isel)) {
1144 CmdArgs.push_back(Args.MakeArgString(
1145 Twine(PluginOptPrefix) +
"-global-isel=" +
1146 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
1151 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
1152 if (A->getOption().matches(options::OPT_glldb))
1154 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
1155 else if (A->getOption().matches(options::OPT_gsce))
1157 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
1158 else if (A->getOption().matches(options::OPT_gdbx))
1160 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
1163 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
1169 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
1173 Arg *A = Args.getLastArg(options::OPT_g_Group);
1174 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
1175 !A->getOption().matches(options::OPT_ggdb0);
1176 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
1177 options::OPT_gno_strict_dwarf,
true))
1179 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
1181 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
1182 StringRef
V = A->getValue();
1183 if (
V ==
"vec-default")
1185 if (
V ==
"vec-extabi") {
1187 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
1193 bool UseSeparateSections =
1196 if (Args.hasFlag(options::OPT_ffunction_sections,
1197 options::OPT_fno_function_sections, UseSeparateSections))
1199 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
1200 else if (Args.hasArg(options::OPT_fno_function_sections))
1202 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
1204 bool DataSectionsTurnedOff =
false;
1205 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1206 UseSeparateSections)) {
1208 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
1209 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
1210 DataSectionsTurnedOff =
true;
1212 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
1215 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
1216 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
1217 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
1218 options::OPT_mno_xcoff_roptr,
false);
1219 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
1221 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1222 << OptStr << Triple.str();
1228 if (DataSectionsTurnedOff)
1229 D.
Diag(diag::err_roptr_requires_data_sections);
1232 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
1237 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
1238 options::OPT_fno_split_machine_functions)) {
1239 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
1240 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1241 "-split-machine-functions"));
1245 Args.getLastArg(options::OPT_fpartition_static_data_sections,
1246 options::OPT_fno_partition_static_data_sections)) {
1247 if (A->getOption().matches(options::OPT_fpartition_static_data_sections)) {
1248 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1249 "-partition-static-data-sections"));
1254 StringRef FName = A->getValue();
1255 if (!llvm::sys::fs::exists(FName))
1256 D.
Diag(diag::err_drv_no_such_file) << FName;
1258 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1259 "sample-profile=" + FName));
1263 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1264 "cs-profile-generate"));
1265 if (CSPGOGenerateArg->getOption().matches(
1266 options::OPT_fcs_profile_generate_EQ)) {
1268 llvm::sys::path::append(Path,
"default_%m.profraw");
1269 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1270 "cs-profile-path=" + Path));
1273 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1274 "cs-profile-path=default_%m.profraw"));
1277 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1278 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1279 llvm::sys::path::append(Path,
"default.profdata");
1280 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1281 "cs-profile-path=" + Path));
1285 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1287 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1288 "-enable-jmc-instrument"));
1290 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1293 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1294 Triple.hasDefaultEmulatedTLS())) {
1296 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1300 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1302 if (Args.hasFlag(options::OPT_fstack_size_section,
1303 options::OPT_fno_stack_size_section,
false))
1305 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1307 if (Args.hasFlag(options::OPT_fexperimental_call_graph_section,
1308 options::OPT_fno_experimental_call_graph_section,
false))
1310 Args.MakeArgString(Twine(PluginOptPrefix) +
"-call-graph-section"));
1314 if (!StatsFile.empty())
1316 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1319 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1320 CmdArgs.push_back(Args.MakeArgString(
1321 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1332 Output, PluginOptPrefix);
1338 true, PluginOptPrefix);
1340 bool IsELF = Triple.isOSBinFormatELF();
1342 bool ImplicitMapSyms =
false;
1343 for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
1344 for (StringRef
V : A->getValues()) {
1345 auto Equal =
V.split(
'=');
1346 auto checkArg = [&](
bool ValidTarget,
1347 std::initializer_list<const char *>
Set) {
1349 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1350 << (Twine(
"-Wa,") +
Equal.first +
"=").str()
1351 << Triple.getTriple();
1352 }
else if (!llvm::is_contained(
Set,
Equal.second)) {
1353 D.
Diag(diag::err_drv_unsupported_option_argument)
1354 << (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
1357 if (
Equal.first ==
"-mmapsyms") {
1358 ImplicitMapSyms =
Equal.second ==
"implicit";
1359 checkArg(IsELF && Triple.isAArch64(), {
"default",
"implicit"});
1360 }
else if (
V ==
"--crel")
1362 else if (
V ==
"--no-crel")
1370 if (IsELF && !Triple.isMIPS()) {
1371 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"-crel"));
1373 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1377 if (ImplicitMapSyms)
1379 Args.MakeArgString(Twine(PluginOptPrefix) +
"-implicit-mapsyms"));
1381 if (Args.hasArg(options::OPT_ftime_report))
1383 Args.MakeArgString(Twine(PluginOptPrefix) +
"-time-passes"));
1389 const ArgList &Args,
1390 ArgStringList &CmdArgs) {
1395 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1396 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1400 ArgStringList &CmdArgs) {
1401 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1402 options::OPT_fno_rtlib_add_rpath,
false))
1410 CandidateRPaths.emplace_back(*CandidateRPath);
1412 for (
const auto &CandidateRPath : CandidateRPaths) {
1413 if (TC.
getVFS().exists(CandidateRPath)) {
1414 CmdArgs.push_back(
"-rpath");
1415 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1421 const ToolChain &TC,
const ArgList &Args,
1422 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1424 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1425 options::OPT_fno_openmp,
false)) {
1427 if (Args.hasFlag(options::OPT_foffload_via_llvm,
1428 options::OPT_fno_offload_via_llvm,
false))
1429 CmdArgs.push_back(
"-lomptarget");
1439 if (ForceStaticHostRuntime)
1440 CmdArgs.push_back(
"-Bstatic");
1444 CmdArgs.push_back(
"-lomp");
1447 CmdArgs.push_back(
"-lgomp");
1450 CmdArgs.push_back(
"-liomp5");
1456 if (ForceStaticHostRuntime)
1457 CmdArgs.push_back(
"-Bdynamic");
1460 CmdArgs.push_back(
"-lrt");
1462 if (IsOffloadingHost)
1463 CmdArgs.push_back(
"-lomptarget");
1474 const llvm::opt::ArgList &Args,
1475 llvm::opt::ArgStringList &CmdArgs) {
1481 constexpr llvm::StringLiteral Targets(
"--offload-targets=");
1485 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1486 [](
auto TC) { return TC.second->getTripleString(); });
1488 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1492 ArgStringList &CmdArgs, StringRef Sanitizer,
1493 bool IsShared,
bool IsWhole) {
1496 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1499 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1509 ArgStringList &CmdArgs,
1510 StringRef Sanitizer) {
1515 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1518 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1519 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1526 const llvm::opt::ArgList &Args,
1527 llvm::opt::ArgStringList &CmdArgs,
1530 "AIX linker does not support any form of --as-needed option yet.");
1538 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1539 CmdArgs.push_back(
"-z");
1540 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1542 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1547 const llvm::opt::ArgList &Args,
1548 ArgStringList &CmdArgs) {
1553 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1555 CmdArgs.push_back(
"-lpthread");
1557 CmdArgs.push_back(
"-lrt");
1559 CmdArgs.push_back(
"-lm");
1564 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1565 CmdArgs.push_back(
"-ldl");
1569 CmdArgs.push_back(
"-lexecinfo");
1571 CmdArgs.push_back(
"-lbsd");
1577 CmdArgs.push_back(
"-lresolv");
1587 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1592 SharedRuntimes.push_back(
"asan");
1593 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1594 HelperStaticRuntimes.push_back(
"asan-preinit");
1597 SharedRuntimes.push_back(
"memprof");
1598 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1599 HelperStaticRuntimes.push_back(
"memprof-preinit");
1602 SharedRuntimes.push_back(
"nsan");
1605 SharedRuntimes.push_back(
"ubsan_minimal");
1607 SharedRuntimes.push_back(
"ubsan_standalone");
1610 SharedRuntimes.push_back(
"scudo_standalone");
1613 SharedRuntimes.push_back(
"tsan");
1615 SharedRuntimes.push_back(
"tysan");
1618 SharedRuntimes.push_back(
"hwasan_aliases");
1620 SharedRuntimes.push_back(
"hwasan");
1621 if (!Args.hasArg(options::OPT_shared))
1622 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1625 SharedRuntimes.push_back(
"rtsan");
1630 StaticRuntimes.push_back(
"stats_client");
1634 HelperStaticRuntimes.push_back(
"asan_static");
1637 if (Args.hasArg(options::OPT_shared)) {
1646 StaticRuntimes.push_back(
"asan");
1648 StaticRuntimes.push_back(
"asan_cxx");
1653 StaticRuntimes.push_back(
"rtsan");
1656 StaticRuntimes.push_back(
"memprof");
1658 StaticRuntimes.push_back(
"memprof_cxx");
1663 StaticRuntimes.push_back(
"hwasan_aliases");
1665 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1667 StaticRuntimes.push_back(
"hwasan");
1669 StaticRuntimes.push_back(
"hwasan_cxx");
1673 StaticRuntimes.push_back(
"dfsan");
1675 StaticRuntimes.push_back(
"lsan");
1677 StaticRuntimes.push_back(
"msan");
1679 StaticRuntimes.push_back(
"msan_cxx");
1682 StaticRuntimes.push_back(
"nsan");
1684 StaticRuntimes.push_back(
"tsan");
1686 StaticRuntimes.push_back(
"tsan_cxx");
1689 StaticRuntimes.push_back(
"tysan");
1692 StaticRuntimes.push_back(
"ubsan_minimal");
1694 StaticRuntimes.push_back(
"ubsan_standalone");
1698 NonWholeStaticRuntimes.push_back(
"safestack");
1699 RequiredSymbols.push_back(
"__safestack_init");
1703 StaticRuntimes.push_back(
"cfi");
1705 StaticRuntimes.push_back(
"cfi_diag");
1710 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1713 NonWholeStaticRuntimes.push_back(
"stats");
1714 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1717 StaticRuntimes.push_back(
"scudo_standalone");
1719 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1726 ArgStringList &CmdArgs) {
1729 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1732 NonWholeStaticRuntimes, HelperStaticRuntimes,
1737 for (
auto S : RequiredSymbols) {
1738 CmdArgs.push_back(
"-u");
1739 CmdArgs.push_back(Args.MakeArgString(S));
1744 !Args.hasArg(options::OPT_shared)) {
1750 if (!Args.hasArg(options::OPT_nostdlibxx)) {
1751 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1752 !Args.hasArg(options::OPT_static);
1753 if (OnlyLibstdcxxStatic)
1754 CmdArgs.push_back(
"-Bstatic");
1756 if (OnlyLibstdcxxStatic)
1757 CmdArgs.push_back(
"-Bdynamic");
1761 for (
auto RT : SharedRuntimes)
1763 for (
auto RT : HelperStaticRuntimes)
1765 bool AddExportDynamic =
false;
1766 for (
auto RT : StaticRuntimes) {
1770 for (
auto RT : NonWholeStaticRuntimes) {
1776 if (AddExportDynamic)
1777 CmdArgs.push_back(
"--export-dynamic");
1780 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1784 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1785 <<
"-fsanitize=memtag*" << TC.
getTriple().str();
1788 Args.MakeArgString(
"--android-memtag-mode=" + SanArgs.
getMemtagMode()));
1790 CmdArgs.push_back(
"--android-memtag-heap");
1792 CmdArgs.push_back(
"--android-memtag-stack");
1795 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty();
1800 if (Args.hasArg(options::OPT_shared)) {
1802 CmdArgs.push_back(
"--whole-archive");
1804 CmdArgs.push_back(
"--no-whole-archive");
1808 CmdArgs.push_back(
"--whole-archive");
1810 for (
const auto &Mode : XRay.
modeList())
1812 CmdArgs.push_back(
"--no-whole-archive");
1820 const llvm::opt::ArgList &Args,
1821 ArgStringList &CmdArgs) {
1823 CmdArgs.push_back(
"-lpthread");
1825 CmdArgs.push_back(
"-lrt");
1826 CmdArgs.push_back(
"-lm");
1831 CmdArgs.push_back(
"-ldl");
1836 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1837 return !A->getOption().matches(options::OPT_O0);
1845 auto AddPostfix = [JA](
auto &F) {
1850 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1851 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1855 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1858 Arg *FinalOutput = Args.getLastArg(options::OPT_o, options::OPT__SLASH_o);
1859 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1860 T = FinalOutput->getValue();
1861 llvm::sys::path::remove_filename(
T);
1862 llvm::sys::path::append(
T,
1863 llvm::sys::path::stem(FinalOutput->getValue()));
1865 return Args.MakeArgString(
T);
1871 return Args.MakeArgString(
T);
1875 const JobAction &JA,
const ArgList &Args,
1876 const InputInfo &Output,
const char *OutFile) {
1877 ArgStringList ExtractArgs;
1878 ExtractArgs.push_back(
"--extract-dwo");
1880 ArgStringList StripArgs;
1881 StripArgs.push_back(
"--strip-dwo");
1886 ExtractArgs.push_back(OutFile);
1893 C.addCommand(std::make_unique<Command>(JA,
T,
1895 Exec, ExtractArgs, II, Output));
1898 C.addCommand(std::make_unique<Command>(
1908 Args.ClaimAllArgs(options::OPT_flto_EQ);
1909 Args.ClaimAllArgs(options::OPT_flto);
1910 Args.ClaimAllArgs(options::OPT_fno_lto);
1914 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1915 options::OPT_fcs_profile_generate_EQ,
1916 options::OPT_fno_profile_generate);
1917 if (CSPGOGenerateArg &&
1918 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1919 CSPGOGenerateArg =
nullptr;
1921 return CSPGOGenerateArg;
1925 auto *ProfileUseArg = Args.getLastArg(
1926 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1927 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1928 options::OPT_fno_profile_instr_use);
1930 if (ProfileUseArg &&
1931 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1932 ProfileUseArg =
nullptr;
1934 return ProfileUseArg;
1938 auto *ProfileSampleUseArg = Args.getLastArg(
1939 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
1941 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
1942 options::OPT_fno_profile_sample_use)))
1945 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
1950 case llvm::Reloc::Static:
1952 case llvm::Reloc::PIC_:
1954 case llvm::Reloc::DynamicNoPIC:
1955 return "dynamic-no-pic";
1956 case llvm::Reloc::ROPI:
1958 case llvm::Reloc::RWPI:
1960 case llvm::Reloc::ROPI_RWPI:
1963 llvm_unreachable(
"Unknown Reloc::Model kind");
1970std::tuple<llvm::Reloc::Model, unsigned, bool>
1978 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
1980 bool IsPICLevelTwo = PIC;
1983 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
1986 if (Triple.isAndroid()) {
1987 switch (Triple.getArch()) {
1988 case llvm::Triple::x86:
1989 case llvm::Triple::x86_64:
1991 IsPICLevelTwo =
true;
2001 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
2005 if (Triple.isOSOpenBSD()) {
2007 case llvm::Triple::arm:
2008 case llvm::Triple::aarch64:
2009 case llvm::Triple::mips64:
2010 case llvm::Triple::mips64el:
2011 case llvm::Triple::x86:
2012 case llvm::Triple::x86_64:
2013 IsPICLevelTwo =
false;
2016 case llvm::Triple::ppc:
2017 case llvm::Triple::sparcv9:
2018 IsPICLevelTwo =
true;
2030 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2031 options::OPT_fpic, options::OPT_fno_pic,
2032 options::OPT_fPIE, options::OPT_fno_PIE,
2033 options::OPT_fpie, options::OPT_fno_pie);
2034 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
2035 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
2036 options::OPT_fPIE, options::OPT_fpie)) {
2038 << LastPICArg->getSpelling() << Triple.str();
2039 if (Triple.getArch() == llvm::Triple::x86_64)
2040 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
2041 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2048 Option O = LastPICArg->getOption();
2049 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2050 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2051 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2053 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2055 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
2058 if (EffectiveTriple.isPS()) {
2059 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
2060 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
2061 if (Model !=
"kernel") {
2064 << LastPICArg->getSpelling()
2065 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
2075 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
2081 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
2082 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
2085 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2088 if (!Triple.isOSDarwin())
2090 << A->getSpelling() << Triple.str();
2099 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
2102 bool EmbeddedPISupported;
2103 switch (Triple.getArch()) {
2104 case llvm::Triple::arm:
2105 case llvm::Triple::armeb:
2106 case llvm::Triple::thumb:
2107 case llvm::Triple::thumbeb:
2108 EmbeddedPISupported =
true;
2111 EmbeddedPISupported =
false;
2115 bool ROPI =
false, RWPI =
false;
2116 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
2117 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
2118 if (!EmbeddedPISupported)
2120 << LastROPIArg->getSpelling() << Triple.str();
2123 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2124 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2125 if (!EmbeddedPISupported)
2127 << LastRWPIArg->getSpelling() << Triple.str();
2132 if ((ROPI || RWPI) && (PIC || PIE))
2135 if (Triple.isMIPS()) {
2142 if (ABIName ==
"n64")
2145 if(Args.hasArg(options::OPT_mno_abicalls))
2146 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2149 IsPICLevelTwo =
false;
2153 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2155 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2157 RelocM = llvm::Reloc::ROPI_RWPI;
2159 RelocM = llvm::Reloc::ROPI;
2161 RelocM = llvm::Reloc::RWPI;
2163 return std::make_tuple(RelocM, 0
U,
false);
2167 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
2168 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
2170 const llvm::opt::OptTable &Opts = D.
getOpts();
2171 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
2172 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
2173 D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
2175 return HasStaticPIE;
2195 const ArgList &Args) {
2196 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2197 options::OPT_falign_functions_EQ,
2198 options::OPT_fno_align_functions);
2199 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2202 if (A->getOption().matches(options::OPT_falign_functions))
2206 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2208 << A->getAsString(Args) << A->getValue();
2213 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2214 switch (DebugInfoKind) {
2215 case llvm::codegenoptions::DebugDirectivesOnly:
2216 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2218 case llvm::codegenoptions::DebugLineTablesOnly:
2219 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2221 case llvm::codegenoptions::DebugInfoConstructor:
2222 CmdArgs.push_back(
"-debug-info-kind=constructor");
2224 case llvm::codegenoptions::LimitedDebugInfo:
2225 CmdArgs.push_back(
"-debug-info-kind=limited");
2227 case llvm::codegenoptions::FullDebugInfo:
2228 CmdArgs.push_back(
"-debug-info-kind=standalone");
2230 case llvm::codegenoptions::UnusedTypeInfo:
2231 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2241 assert(A.getOption().matches(options::OPT_gN_Group) &&
2242 "Not a -g option that specifies a debug-info level");
2243 if (A.getOption().matches(options::OPT_g0) ||
2244 A.getOption().matches(options::OPT_ggdb0))
2245 return llvm::codegenoptions::NoDebugInfo;
2246 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2247 A.getOption().matches(options::OPT_ggdb1))
2248 return llvm::codegenoptions::DebugLineTablesOnly;
2249 if (A.getOption().matches(options::OPT_gline_directives_only))
2250 return llvm::codegenoptions::DebugDirectivesOnly;
2251 return llvm::codegenoptions::DebugInfoConstructor;
2255 const ArgList &Args) {
2256 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2262 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 6 ||
2265 << A->getAsString(Args) << A->getValue();
2270 return llvm::StringSwitch<unsigned>(ArgValue)
2271 .Case(
"-gdwarf-2", 2)
2272 .Case(
"-gdwarf-3", 3)
2273 .Case(
"-gdwarf-4", 4)
2274 .Case(
"-gdwarf-5", 5)
2275 .Case(
"-gdwarf-6", 6)
2280 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2281 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2282 options::OPT_gdwarf_6, options::OPT_gdwarf);
2286 const llvm::opt::ArgList &Args) {
2291 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2292 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2293 << GDwarfN->getSpelling() << TC.
getTriple().str();
2295 if (DwarfVersion == 0) {
2297 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2299 return DwarfVersion;
2303 const ArgList &Args, Arg *&Arg) {
2304 Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
2305 options::OPT_gno_split_dwarf);
2306 if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
2309 if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
2312 StringRef
Value = Arg->getValue();
2313 if (
Value ==
"split")
2315 if (
Value ==
"single")
2318 D.
Diag(diag::err_drv_unsupported_option_argument)
2319 << Arg->getSpelling() << Arg->getValue();
2325 assert(A &&
"Expected non-nullptr argument.");
2328 D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
2334 ArgStringList &CmdArgs) {
2335 llvm::Reloc::Model RelocationModel;
2340 if (RelocationModel != llvm::Reloc::Static)
2341 CmdArgs.push_back(
"-KPIC");
2347 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2353 const ArgList &Args) {
2354 if (Args.hasArg(options::OPT_static_libgcc) ||
2355 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2359 if (Args.hasArg(options::OPT_shared_libgcc))
2378 ArgStringList &CmdArgs,
const ArgList &Args) {
2382 CmdArgs.push_back(
"-l:libunwind.a");
2405 CmdArgs.push_back(
"-lgcc_eh");
2407 CmdArgs.push_back(
"-lgcc_s");
2415 CmdArgs.push_back(
"-lunwind");
2417 CmdArgs.push_back(
"-l:libunwind.a");
2420 CmdArgs.push_back(
"-l:libunwind.dll.a");
2422 CmdArgs.push_back(
"-l:libunwind.so");
2426 CmdArgs.push_back(
"-lunwind");
2436 ArgStringList &CmdArgs,
const ArgList &Args) {
2440 CmdArgs.push_back(
"-lgcc");
2444 CmdArgs.push_back(
"-lgcc");
2448 CmdArgs.push_back(
"--as-needed");
2450 CmdArgs.push_back(
"--no-as-needed");
2455 ArgStringList &CmdArgs,
const ArgList &Args) {
2466 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2469 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2470 if (A && A->getValue() != StringRef(
"platform")) {
2471 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2472 << A->getValue() <<
"MSVC";
2482 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2483 !Args.hasArg(options::OPT_static_pie))
2484 CmdArgs.push_back(
"-ldl");
2491 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2497 StringRef SaveStats = A->getValue();
2498 if (SaveStats ==
"obj" && Output.
isFilename()) {
2500 llvm::sys::path::remove_filename(StatsFile);
2501 }
else if (SaveStats !=
"cwd") {
2502 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2506 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2507 llvm::sys::path::append(StatsFile, BaseName);
2508 llvm::sys::path::replace_extension(StatsFile,
"stats");
2520 assert(Flag.front() ==
'-');
2522 Flags.push_back(Flag.str());
2524 Flags.push_back((
"!" + Flag.substr(1)).str());
2529 ArgStringList &CmdArgs,
bool IsLTO,
2530 const StringRef PluginOptPrefix) {
2531 auto addArg = [&, IsLTO](
const Twine &Arg) {
2533 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2534 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2536 CmdArgs.push_back(
"-mllvm");
2537 CmdArgs.push_back(Args.MakeArgString(Arg));
2541 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2542 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2544 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2545 StringRef
Value = A->getValue();
2547 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2548 !llvm::isPowerOf2_64(Boundary)) {
2549 D.
Diag(diag::err_drv_invalid_argument_to_option)
2550 <<
Value << A->getOption().getName();
2552 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2555 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2556 std::string AlignBranch;
2557 for (StringRef
T : A->getValues()) {
2558 if (
T !=
"fused" &&
T !=
"jcc" &&
T !=
"jmp" &&
T !=
"call" &&
2559 T !=
"ret" &&
T !=
"indirect")
2560 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2561 <<
T <<
"fused, jcc, jmp, call, ret, indirect";
2562 if (!AlignBranch.empty())
2566 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2568 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2569 StringRef
Value = A->getValue();
2570 unsigned PrefixSize;
2571 if (
Value.getAsInteger(10, PrefixSize)) {
2572 D.
Diag(diag::err_drv_invalid_argument_to_option)
2573 <<
Value << A->getOption().getName();
2575 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2601 llvm::opt::ArgStringList &CC1Args,
2603 StringRef Lib, StringRef
Arch, StringRef
Target,
2604 bool isBitCodeSDL) {
2607 std::string LibDeviceLoc =
"/libdevice";
2608 std::string LibBcPrefix =
"/libbc-";
2609 std::string LibPrefix =
"/lib";
2626 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2627 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2629 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2630 Twine(Lib +
"-" +
Arch).str(), Twine(Lib).str()}) {
2631 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2632 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2642 const auto *Ext =
".a";
2644 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2645 Twine(Lib +
"-" +
Arch).str()}) {
2646 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2647 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2658 bool FoundSDL =
false;
2659 for (
auto LPath : LibraryPaths) {
2660 for (
auto SDL : SDLs) {
2661 auto FullName = Twine(LPath + SDL).str();
2662 if (llvm::sys::fs::exists(FullName)) {
2663 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2680 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2681 llvm::opt::ArgStringList &CC1Args,
2683 StringRef
Arch, StringRef
Target,
bool isBitCodeSDL) {
2686 if (isBitCodeSDL &&
Arch.contains(
"nvptx"))
2689 bool FoundAOB =
false;
2690 std::string ArchiveOfBundles;
2693 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2694 auto Ext = IsMSVC ?
".lib" :
".a";
2695 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2696 if (llvm::sys::fs::exists(Lib)) {
2697 ArchiveOfBundles = Lib;
2701 Lib.consume_front(
"-l");
2702 for (
auto LPath : LibraryPaths) {
2703 ArchiveOfBundles.clear();
2704 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2705 : IsMSVC ? Lib + Ext
2706 :
"lib" + Lib + Ext)
2708 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2709 auto AOB = Twine(LPath + Prefix + LibFile).str();
2710 if (llvm::sys::fs::exists(AOB)) {
2711 ArchiveOfBundles = AOB;
2724 llvm::file_magic Magic;
2725 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2726 if (EC || Magic != llvm::file_magic::archive)
2729 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2730 std::string OutputLib =
2736 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2740 DeviceTriple +=
'-';
2741 std::string NormalizedTriple =
T.getToolChain().getTriple().normalize(
2742 llvm::Triple::CanonicalForm::FOUR_IDENT);
2743 DeviceTriple += NormalizedTriple;
2745 DeviceTriple +=
'-';
2749 std::string UnbundleArg(
"-unbundle");
2750 std::string TypeArg(
"-type=a");
2751 std::string InputArg(
"-input=" + ArchiveOfBundles);
2752 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2753 std::string OutputArg(
"-output=" + OutputLib);
2755 const char *UBProgram = DriverArgs.MakeArgString(
2756 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2758 ArgStringList UBArgs;
2759 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2760 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2761 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2762 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2763 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2767 std::string AdditionalArgs(
"-allow-missing-bundles");
2768 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2773 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2774 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2776 C.addCommand(std::make_unique<Command>(
2778 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2780 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2787 const llvm::opt::ArgList &DriverArgs,
2788 llvm::opt::ArgStringList &CC1Args,
2790 bool isBitCodeSDL) {
2821 const llvm::opt::ArgList &DriverArgs,
2822 llvm::opt::ArgStringList &CC1Args,
2824 bool isBitCodeSDL) {
2828 std::optional<std::string> LibPath =
2829 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2832 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2833 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2834 for (StringRef Path : Frags)
2835 LibraryPaths.emplace_back(Path.trim());
2839 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2840 LibraryPaths.emplace_back(Search_Dir);
2844 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2845 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2848 llvm::SmallSet<std::string, 16> SDLNames;
2849 static const StringRef HostOnlyArchives[] = {
2850 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2851 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2852 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2853 SDLNames.insert(std::string(
"-l") + SDLName);
2857 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2864 const StringRef LibFileExt =
".lib";
2865 if (!llvm::sys::path::has_extension(
FileName) ||
2867 llvm::sys::path::extension(
FileName).drop_front()) ==
2869 llvm::sys::path::extension(
FileName) == LibFileExt)
2870 SDLNames.insert(Input);
2877 for (
auto SDLName : SDLNames) {
2888static llvm::opt::Arg *
2890 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2894 const llvm::opt::ArgList &Args) {
2895 const unsigned MinCodeObjVer = 4;
2896 const unsigned MaxCodeObjVer = 6;
2899 if (CodeObjArg->getOption().getID() ==
2900 options::OPT_mcode_object_version_EQ) {
2901 unsigned CodeObjVer = MaxCodeObjVer;
2903 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2904 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2905 D.
Diag(diag::err_drv_invalid_int_value)
2906 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2912 const llvm::opt::ArgList &Args) {
2913 unsigned CodeObjVer = 6;
2915 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2920 const Driver &D,
const llvm::opt::ArgList &Args) {
2925 const llvm::opt::ArgList &Args,
2926 llvm::opt::ArgStringList &CmdArgs,
2927 const llvm::Triple &Triple,
bool IsLTO,
2928 const StringRef PluginOptPrefix) {
2929 auto addArg = [&, IsLTO](
const Twine &Arg) {
2931 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2932 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2934 CmdArgs.push_back(
"-mllvm");
2935 CmdArgs.push_back(Args.MakeArgString(Arg));
2939 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2940 options::OPT_mno_outline)) {
2941 if (A->getOption().matches(options::OPT_moutline)) {
2945 if (!(Triple.isARM() || Triple.isThumb() || Triple.isAArch64())) {
2946 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2948 addArg(Twine(
"-enable-machine-outliner"));
2952 addArg(Twine(
"-enable-machine-outliner=never"));
2956 auto *CodeGenDataGenArg =
2957 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
2958 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
2961 if (CodeGenDataGenArg && CodeGenDataUseArg)
2962 D.
Diag(diag::err_drv_argument_not_allowed_with)
2963 << CodeGenDataGenArg->getAsString(Args)
2964 << CodeGenDataUseArg->getAsString(Args);
2968 if (CodeGenDataGenArg)
2969 addArg(Twine(
"-codegen-data-generate"));
2972 if (CodeGenDataUseArg)
2973 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
2977 const llvm::opt::ArgList &DriverArgs,
2978 llvm::opt::ArgStringList &CC1Args,
2979 StringRef BitcodeSuffix,
2980 const llvm::Triple &Triple,
2985 std::optional<std::string> LibPath =
2986 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2989 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2990 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2991 for (StringRef Path : Frags)
2992 LibraryPaths.emplace_back(Path.trim());
2997 LibraryPaths.emplace_back(LibPath);
3001 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
3002 LibraryPaths.emplace_back(P);
3004 OptSpecifier LibomptargetBCPathOpt =
3005 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
3006 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
3007 : options::OPT_libomptarget_spirv_bc_path_EQ;
3009 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
3010 : Triple.isNVPTX() ?
"nvptx"
3012 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
3015 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
3017 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
3018 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
3019 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3022 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3023 CC1Args.push_back(
"-mlink-builtin-bitcode");
3024 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3026 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
3027 << LibOmpTargetFile;
3030 bool FoundBCLibrary =
false;
3032 for (StringRef LibraryPath : LibraryPaths) {
3034 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3035 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3036 CC1Args.push_back(
"-mlink-builtin-bitcode");
3037 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3038 FoundBCLibrary =
true;
3043 if (!FoundBCLibrary)
3044 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
3045 << LibOmpTargetName << ArchPrefix;
3049 const llvm::opt::ArgList &Args,
3050 llvm::opt::ArgStringList &CmdArgs) {
3052 (!Args.hasArg(options::OPT_nostdlib) ||
3053 TC.
getTriple().isKnownWindowsMSVCEnvironment()) &&
3054 !Args.hasArg(options::OPT_no_hip_rt) && !Args.hasArg(options::OPT_r)) {
3058 for (
auto *Arg : Args.filtered(options::OPT_no_hip_rt)) {
3065 const llvm::opt::ArgList &DriverArgs,
3066 llvm::opt::ArgStringList &CC1Args) {
3068 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
3074 llvm::sys::path::append(LibclcPath,
"lib",
"libclc");
3077 StringRef LibclcNamespec(A->getValue());
3078 bool FilenameSearch = LibclcNamespec.consume_front(
":");
3081 if (FilenameSearch && llvm::sys::fs::exists(LibclcTargetFile)) {
3082 CC1Args.push_back(
"-mlink-builtin-bitcode");
3083 CC1Args.push_back(DriverArgs.MakeArgString(LibclcTargetFile));
3086 if (!FilenameSearch)
3087 LibclcTargetFile +=
".bc";
3089 llvm::sys::path::append(LibclcPath, LibclcTargetFile);
3090 if (llvm::sys::fs::exists(LibclcPath)) {
3091 CC1Args.push_back(
"-mlink-builtin-bitcode");
3092 CC1Args.push_back(DriverArgs.MakeArgString(LibclcPath));
3096 D.
Diag(diag::err_drv_libclc_not_found) << LibclcTargetFile;
3102 const llvm::opt::ArgList &Args,
3103 llvm::opt::ArgStringList &CmdArgs,
3104 const llvm::Triple &Triple) {
3105 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3106 options::OPT_mno_outline_atomics)) {
3108 if (!Triple.isAArch64()) {
3109 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3110 << Triple.getArchName() << A->getOption().getName();
3112 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3113 CmdArgs.push_back(
"-target-feature");
3114 CmdArgs.push_back(
"+outline-atomics");
3116 CmdArgs.push_back(
"-target-feature");
3117 CmdArgs.push_back(
"-outline-atomics");
3121 CmdArgs.push_back(
"-target-feature");
3122 CmdArgs.push_back(
"+outline-atomics");
3127 llvm::opt::ArgStringList &CmdArgs) {
3128 if (TCArgs.hasFlag(options::OPT_offload_compress,
3129 options::OPT_no_offload_compress,
false))
3130 CmdArgs.push_back(
"--compress");
3131 if (TCArgs.hasArg(options::OPT_v))
3132 CmdArgs.push_back(
"--verbose");
3133 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3135 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3139 const llvm::Triple &Triple,
3140 const llvm::Reloc::Model &RelocationModel,
3141 llvm::opt::ArgStringList &CmdArgs) {
3142 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3143 StringRef CM = A->getValue();
3145 if (Triple.isOSAIX() && CM ==
"medium")
3147 if (Triple.isAArch64(64)) {
3148 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3149 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3150 RelocationModel != llvm::Reloc::Static)
3151 D.
Diag(diag::err_drv_argument_only_allowed_with)
3152 << A->getAsString(Args) <<
"-fno-pic";
3153 }
else if (Triple.isLoongArch()) {
3154 if (CM ==
"extreme" &&
3155 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3156 D.
Diag(diag::err_drv_argument_not_allowed_with)
3157 << A->getAsString(Args) <<
"-fplt";
3158 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3161 CM = llvm::StringSwitch<StringRef>(CM)
3162 .Case(
"normal",
"small")
3163 .Case(
"extreme",
"large")
3165 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3166 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3167 }
else if (Triple.isRISCV()) {
3169 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3170 D.
Diag(diag::err_drv_argument_not_allowed_with)
3171 << A->getAsString(Args) <<
"-fpic";
3174 else if (CM ==
"medany")
3176 Ok = CM ==
"small" || CM ==
"medium" ||
3177 (CM ==
"large" && Triple.isRISCV64());
3178 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3179 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3180 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3184 }
else if (Triple.isSPARC64()) {
3187 else if (CM ==
"medmid")
3189 else if (CM ==
"medany")
3191 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3192 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3193 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3196 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3198 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3199 << A->getSpelling() << CM << Triple.getTriple();
3203 if (Triple.getArch() == llvm::Triple::x86_64) {
3204 bool IsMediumCM =
false;
3205 bool IsLargeCM =
false;
3206 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3207 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3208 IsLargeCM = StringRef(A->getValue()) ==
"large";
3210 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3211 if (!IsMediumCM && !IsLargeCM) {
3212 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3213 << A->getOption().getRenderName();
3215 A->render(Args, CmdArgs);
3217 }
else if (IsMediumCM) {
3218 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3219 }
else if (IsLargeCM) {
3220 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3226 ArgStringList &CmdArgs) {
3231 Args.getLastArg(options::OPT_fcolor_diagnostics,
3232 options::OPT_fno_color_diagnostics);
3233 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3234 StringRef
Value(A->getValue());
3236 D.
Diag(diag::err_drv_invalid_argument_to_option)
3237 <<
Value << A->getOption().getName();
3241 CmdArgs.push_back(
"-fcolor-diagnostics");
3246 for (; *Arg; ++Arg) {
3252 Res.push_back(
'\\');
3255 Res.push_back(*Arg);
3260 const llvm::opt::ArgList &Args) {
3264 llvm::opt::ArgStringList OriginalArgs;
3265 for (
const auto &Arg : Args)
3266 Arg->render(Args, OriginalArgs);
3270 for (
const char *OriginalArg : OriginalArgs) {
3274 Flags += EscapedArg;
3277 return Args.MakeArgString(Flags);
3281 const llvm::opt::ArgList &Args,
3282 bool &FRecordCommandLine,
3283 bool &GRecordCommandLine) {
3286 const std::string &TripleStr = Triple.getTriple();
3288 FRecordCommandLine =
3289 Args.hasFlag(options::OPT_frecord_command_line,
3290 options::OPT_fno_record_command_line,
false);
3291 GRecordCommandLine =
3292 Args.hasFlag(options::OPT_grecord_command_line,
3293 options::OPT_gno_record_command_line,
false);
3294 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3295 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3296 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3297 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3304 ArgStringList &CmdArgs) {
3305 bool use_fwrapv =
false;
3306 bool use_fwrapv_pointer =
false;
3307 for (
const Arg *A : Args.filtered(
3308 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3309 options::OPT_fwrapv, options::OPT_fno_wrapv,
3310 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3312 switch (A->getOption().getID()) {
3313 case options::OPT_fstrict_overflow:
3315 use_fwrapv_pointer =
false;
3317 case options::OPT_fno_strict_overflow:
3319 use_fwrapv_pointer =
true;
3321 case options::OPT_fwrapv:
3324 case options::OPT_fno_wrapv:
3327 case options::OPT_fwrapv_pointer:
3328 use_fwrapv_pointer =
true;
3330 case options::OPT_fno_wrapv_pointer:
3331 use_fwrapv_pointer =
false;
3337 CmdArgs.push_back(
"-fwrapv");
3338 if (use_fwrapv_pointer)
3339 CmdArgs.push_back(
"-fwrapv-pointer");
3346 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3347 if (A->getOption().matches(options::OPT_O4) ||
3348 A->getOption().matches(options::OPT_Ofast))
3351 if (A->getOption().matches(options::OPT_O0))
3354 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3357 StringRef S(A->getValue());
3365 unsigned OptLevel = 0;
3366 if (S.getAsInteger(10, OptLevel))
3369 return OptLevel > 1;
3376 ArgStringList &CmdArgs) {
3378 if (Args.hasFlag(options::OPT_fvectorize, options::OPT_fno_vectorize,
3380 CmdArgs.push_back(
"-vectorize-loops");
3384 ArgStringList &CmdArgs) {
3386 if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize,
3388 CmdArgs.push_back(
"-vectorize-slp");
3392 ArgStringList &CmdArgs) {
3393 if (Args.hasFlag(options::OPT_floop_interchange,
3394 options::OPT_fno_loop_interchange,
false))
3395 CmdArgs.push_back(
"-floop-interchange");
3416 llvm_unreachable(
"Fully covered switch above");
3422 if (!ComplexRangeStr.empty())
3423 return "-complex-range=" + ComplexRangeStr;
3424 return ComplexRangeStr;
3444 if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
3445 (LastOpt ==
"-fcx-limited-range" && NewOpt ==
"-fno-cx-limited-range") ||
3446 (LastOpt ==
"-fno-cx-limited-range" && NewOpt ==
"-fcx-limited-range") ||
3447 (LastOpt ==
"-fcx-fortran-rules" && NewOpt ==
"-fno-cx-fortran-rules") ||
3448 (LastOpt ==
"-fno-cx-fortran-rules" && NewOpt ==
"-fcx-fortran-rules") ||
3449 (LastOpt ==
"-ffast-math" && NewOpt ==
"-fno-fast-math") ||
3450 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-ffast-math") ||
3451 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-fno-fast-math") ||
3452 (LastOpt.starts_with(
"-ffp-model=") &&
3453 NewOpt.starts_with(
"-ffp-model=")) ||
3454 (LastOpt.starts_with(
"-fcomplex-arithmetic=") &&
3455 NewOpt.starts_with(
"-fcomplex-arithmetic=")))
3458 D.
Diag(clang::diag::warn_drv_overriding_complex_range)
3478 const ArgStringList &LinkerInputs,
3480 const llvm::opt::ArgList &Args,
3481 const char *OutputFilename) {
3485 assert(!LinkerInputs.empty() && !JobInputs.empty() &&
3486 "Must have at least one input.");
3488 ArgStringList LlvmLinkArgs(
3489 {
"-o", OutputFilename ? OutputFilename : Output.
getFilename()});
3491 LlvmLinkArgs.append(LinkerInputs);
3494 const char *LlvmLink = Args.MakeArgString(TC.
GetProgramPath(
"llvm-link"));
3496 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 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)
const FunctionProtoType * T
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
static constexpr ResponseFileSupport AtFileCurCP()