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 StringRef FName = A->getValue();
1246 if (!llvm::sys::fs::exists(FName))
1247 D.
Diag(diag::err_drv_no_such_file) << FName;
1249 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1250 "sample-profile=" + FName));
1254 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1255 "cs-profile-generate"));
1256 if (CSPGOGenerateArg->getOption().matches(
1257 options::OPT_fcs_profile_generate_EQ)) {
1259 llvm::sys::path::append(Path,
"default_%m.profraw");
1260 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1261 "cs-profile-path=" + Path));
1264 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1265 "cs-profile-path=default_%m.profraw"));
1268 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1269 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1270 llvm::sys::path::append(Path,
"default.profdata");
1271 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1272 "cs-profile-path=" + Path));
1276 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1278 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1279 "-enable-jmc-instrument"));
1281 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1284 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1285 Triple.hasDefaultEmulatedTLS())) {
1287 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1291 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1293 if (Args.hasFlag(options::OPT_fstack_size_section,
1294 options::OPT_fno_stack_size_section,
false))
1296 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1298 if (Args.hasFlag(options::OPT_fexperimental_call_graph_section,
1299 options::OPT_fno_experimental_call_graph_section,
false))
1301 Args.MakeArgString(Twine(PluginOptPrefix) +
"-call-graph-section"));
1305 if (!StatsFile.empty())
1307 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1310 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1311 CmdArgs.push_back(Args.MakeArgString(
1312 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1323 Output, PluginOptPrefix);
1329 true, PluginOptPrefix);
1331 bool IsELF = Triple.isOSBinFormatELF();
1333 bool ImplicitMapSyms =
false;
1334 for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
1335 for (StringRef
V : A->getValues()) {
1336 auto Equal =
V.split(
'=');
1337 auto checkArg = [&](
bool ValidTarget,
1338 std::initializer_list<const char *>
Set) {
1340 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1341 << (Twine(
"-Wa,") +
Equal.first +
"=").str()
1342 << Triple.getTriple();
1343 }
else if (!llvm::is_contained(
Set,
Equal.second)) {
1344 D.
Diag(diag::err_drv_unsupported_option_argument)
1345 << (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
1348 if (
Equal.first ==
"-mmapsyms") {
1349 ImplicitMapSyms =
Equal.second ==
"implicit";
1350 checkArg(IsELF && Triple.isAArch64(), {
"default",
"implicit"});
1351 }
else if (
V ==
"--crel")
1353 else if (
V ==
"--no-crel")
1361 if (IsELF && !Triple.isMIPS()) {
1362 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"-crel"));
1364 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1368 if (ImplicitMapSyms)
1370 Args.MakeArgString(Twine(PluginOptPrefix) +
"-implicit-mapsyms"));
1372 if (Args.hasArg(options::OPT_ftime_report))
1374 Args.MakeArgString(Twine(PluginOptPrefix) +
"-time-passes"));
1380 const ArgList &Args,
1381 ArgStringList &CmdArgs) {
1386 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1387 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1391 ArgStringList &CmdArgs) {
1392 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1393 options::OPT_fno_rtlib_add_rpath,
false))
1401 CandidateRPaths.emplace_back(*CandidateRPath);
1403 for (
const auto &CandidateRPath : CandidateRPaths) {
1404 if (TC.
getVFS().exists(CandidateRPath)) {
1405 CmdArgs.push_back(
"-rpath");
1406 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1412 const ToolChain &TC,
const ArgList &Args,
1413 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1415 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1416 options::OPT_fno_openmp,
false)) {
1418 if (Args.hasFlag(options::OPT_foffload_via_llvm,
1419 options::OPT_fno_offload_via_llvm,
false))
1420 CmdArgs.push_back(
"-lomptarget");
1430 if (ForceStaticHostRuntime)
1431 CmdArgs.push_back(
"-Bstatic");
1435 CmdArgs.push_back(
"-lomp");
1438 CmdArgs.push_back(
"-lgomp");
1441 CmdArgs.push_back(
"-liomp5");
1447 if (ForceStaticHostRuntime)
1448 CmdArgs.push_back(
"-Bdynamic");
1451 CmdArgs.push_back(
"-lrt");
1453 if (IsOffloadingHost)
1454 CmdArgs.push_back(
"-lomptarget");
1465 const llvm::opt::ArgList &Args,
1466 llvm::opt::ArgStringList &CmdArgs) {
1472 constexpr llvm::StringLiteral Targets(
"--offload-targets=");
1476 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1477 [](
auto TC) { return TC.second->getTripleString(); });
1479 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1483 ArgStringList &CmdArgs, StringRef Sanitizer,
1484 bool IsShared,
bool IsWhole) {
1487 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1490 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1500 ArgStringList &CmdArgs,
1501 StringRef Sanitizer) {
1506 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1509 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1510 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1517 const llvm::opt::ArgList &Args,
1518 llvm::opt::ArgStringList &CmdArgs,
1521 "AIX linker does not support any form of --as-needed option yet.");
1529 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1530 CmdArgs.push_back(
"-z");
1531 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1533 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1538 const llvm::opt::ArgList &Args,
1539 ArgStringList &CmdArgs) {
1544 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1546 CmdArgs.push_back(
"-lpthread");
1548 CmdArgs.push_back(
"-lrt");
1550 CmdArgs.push_back(
"-lm");
1555 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1556 CmdArgs.push_back(
"-ldl");
1560 CmdArgs.push_back(
"-lexecinfo");
1562 CmdArgs.push_back(
"-lbsd");
1568 CmdArgs.push_back(
"-lresolv");
1578 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1583 SharedRuntimes.push_back(
"asan");
1584 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1585 HelperStaticRuntimes.push_back(
"asan-preinit");
1588 SharedRuntimes.push_back(
"memprof");
1589 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1590 HelperStaticRuntimes.push_back(
"memprof-preinit");
1593 SharedRuntimes.push_back(
"nsan");
1596 SharedRuntimes.push_back(
"ubsan_minimal");
1598 SharedRuntimes.push_back(
"ubsan_standalone");
1601 SharedRuntimes.push_back(
"scudo_standalone");
1604 SharedRuntimes.push_back(
"tsan");
1606 SharedRuntimes.push_back(
"tysan");
1609 SharedRuntimes.push_back(
"hwasan_aliases");
1611 SharedRuntimes.push_back(
"hwasan");
1612 if (!Args.hasArg(options::OPT_shared))
1613 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1616 SharedRuntimes.push_back(
"rtsan");
1621 StaticRuntimes.push_back(
"stats_client");
1625 HelperStaticRuntimes.push_back(
"asan_static");
1628 if (Args.hasArg(options::OPT_shared)) {
1637 StaticRuntimes.push_back(
"asan");
1639 StaticRuntimes.push_back(
"asan_cxx");
1644 StaticRuntimes.push_back(
"rtsan");
1647 StaticRuntimes.push_back(
"memprof");
1649 StaticRuntimes.push_back(
"memprof_cxx");
1654 StaticRuntimes.push_back(
"hwasan_aliases");
1656 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1658 StaticRuntimes.push_back(
"hwasan");
1660 StaticRuntimes.push_back(
"hwasan_cxx");
1664 StaticRuntimes.push_back(
"dfsan");
1666 StaticRuntimes.push_back(
"lsan");
1668 StaticRuntimes.push_back(
"msan");
1670 StaticRuntimes.push_back(
"msan_cxx");
1673 StaticRuntimes.push_back(
"nsan");
1675 StaticRuntimes.push_back(
"tsan");
1677 StaticRuntimes.push_back(
"tsan_cxx");
1680 StaticRuntimes.push_back(
"tysan");
1683 StaticRuntimes.push_back(
"ubsan_minimal");
1685 StaticRuntimes.push_back(
"ubsan_standalone");
1689 NonWholeStaticRuntimes.push_back(
"safestack");
1690 RequiredSymbols.push_back(
"__safestack_init");
1694 StaticRuntimes.push_back(
"cfi");
1696 StaticRuntimes.push_back(
"cfi_diag");
1701 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1704 NonWholeStaticRuntimes.push_back(
"stats");
1705 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1708 StaticRuntimes.push_back(
"scudo_standalone");
1710 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1717 ArgStringList &CmdArgs) {
1720 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1723 NonWholeStaticRuntimes, HelperStaticRuntimes,
1728 for (
auto S : RequiredSymbols) {
1729 CmdArgs.push_back(
"-u");
1730 CmdArgs.push_back(Args.MakeArgString(S));
1735 !Args.hasArg(options::OPT_shared)) {
1741 if (!Args.hasArg(options::OPT_nostdlibxx)) {
1742 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1743 !Args.hasArg(options::OPT_static);
1744 if (OnlyLibstdcxxStatic)
1745 CmdArgs.push_back(
"-Bstatic");
1747 if (OnlyLibstdcxxStatic)
1748 CmdArgs.push_back(
"-Bdynamic");
1752 for (
auto RT : SharedRuntimes)
1754 for (
auto RT : HelperStaticRuntimes)
1756 bool AddExportDynamic =
false;
1757 for (
auto RT : StaticRuntimes) {
1761 for (
auto RT : NonWholeStaticRuntimes) {
1767 if (AddExportDynamic)
1768 CmdArgs.push_back(
"--export-dynamic");
1771 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1775 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1776 <<
"-fsanitize=memtag*" << TC.
getTriple().str();
1779 Args.MakeArgString(
"--android-memtag-mode=" + SanArgs.
getMemtagMode()));
1781 CmdArgs.push_back(
"--android-memtag-heap");
1783 CmdArgs.push_back(
"--android-memtag-stack");
1786 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty();
1791 if (Args.hasArg(options::OPT_shared)) {
1793 CmdArgs.push_back(
"--whole-archive");
1795 CmdArgs.push_back(
"--no-whole-archive");
1799 CmdArgs.push_back(
"--whole-archive");
1801 for (
const auto &Mode : XRay.
modeList())
1803 CmdArgs.push_back(
"--no-whole-archive");
1811 const llvm::opt::ArgList &Args,
1812 ArgStringList &CmdArgs) {
1814 CmdArgs.push_back(
"-lpthread");
1816 CmdArgs.push_back(
"-lrt");
1817 CmdArgs.push_back(
"-lm");
1822 CmdArgs.push_back(
"-ldl");
1827 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1828 return !A->getOption().matches(options::OPT_O0);
1836 auto AddPostfix = [JA](
auto &F) {
1841 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1842 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1846 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1849 Arg *FinalOutput = Args.getLastArg(options::OPT_o, options::OPT__SLASH_o);
1850 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1851 T = FinalOutput->getValue();
1852 llvm::sys::path::remove_filename(
T);
1853 llvm::sys::path::append(
T,
1854 llvm::sys::path::stem(FinalOutput->getValue()));
1856 return Args.MakeArgString(
T);
1862 return Args.MakeArgString(
T);
1866 const JobAction &JA,
const ArgList &Args,
1867 const InputInfo &Output,
const char *OutFile) {
1868 ArgStringList ExtractArgs;
1869 ExtractArgs.push_back(
"--extract-dwo");
1871 ArgStringList StripArgs;
1872 StripArgs.push_back(
"--strip-dwo");
1877 ExtractArgs.push_back(OutFile);
1884 C.addCommand(std::make_unique<Command>(JA,
T,
1886 Exec, ExtractArgs, II, Output));
1889 C.addCommand(std::make_unique<Command>(
1899 Args.ClaimAllArgs(options::OPT_flto_EQ);
1900 Args.ClaimAllArgs(options::OPT_flto);
1901 Args.ClaimAllArgs(options::OPT_fno_lto);
1905 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1906 options::OPT_fcs_profile_generate_EQ,
1907 options::OPT_fno_profile_generate);
1908 if (CSPGOGenerateArg &&
1909 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1910 CSPGOGenerateArg =
nullptr;
1912 return CSPGOGenerateArg;
1916 auto *ProfileUseArg = Args.getLastArg(
1917 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1918 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1919 options::OPT_fno_profile_instr_use);
1921 if (ProfileUseArg &&
1922 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1923 ProfileUseArg =
nullptr;
1925 return ProfileUseArg;
1929 auto *ProfileSampleUseArg = Args.getLastArg(
1930 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
1932 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
1933 options::OPT_fno_profile_sample_use)))
1936 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
1941 case llvm::Reloc::Static:
1943 case llvm::Reloc::PIC_:
1945 case llvm::Reloc::DynamicNoPIC:
1946 return "dynamic-no-pic";
1947 case llvm::Reloc::ROPI:
1949 case llvm::Reloc::RWPI:
1951 case llvm::Reloc::ROPI_RWPI:
1954 llvm_unreachable(
"Unknown Reloc::Model kind");
1961std::tuple<llvm::Reloc::Model, unsigned, bool>
1969 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
1971 bool IsPICLevelTwo = PIC;
1974 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
1977 if (Triple.isAndroid()) {
1978 switch (Triple.getArch()) {
1979 case llvm::Triple::x86:
1980 case llvm::Triple::x86_64:
1982 IsPICLevelTwo =
true;
1992 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
1996 if (Triple.isOSOpenBSD()) {
1998 case llvm::Triple::arm:
1999 case llvm::Triple::aarch64:
2000 case llvm::Triple::mips64:
2001 case llvm::Triple::mips64el:
2002 case llvm::Triple::x86:
2003 case llvm::Triple::x86_64:
2004 IsPICLevelTwo =
false;
2007 case llvm::Triple::ppc:
2008 case llvm::Triple::sparcv9:
2009 IsPICLevelTwo =
true;
2021 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2022 options::OPT_fpic, options::OPT_fno_pic,
2023 options::OPT_fPIE, options::OPT_fno_PIE,
2024 options::OPT_fpie, options::OPT_fno_pie);
2025 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
2026 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
2027 options::OPT_fPIE, options::OPT_fpie)) {
2029 << LastPICArg->getSpelling() << Triple.str();
2030 if (Triple.getArch() == llvm::Triple::x86_64)
2031 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
2032 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2039 Option O = LastPICArg->getOption();
2040 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2041 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2042 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2044 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2046 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
2049 if (EffectiveTriple.isPS()) {
2050 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
2051 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
2052 if (Model !=
"kernel") {
2055 << LastPICArg->getSpelling()
2056 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
2066 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
2072 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
2073 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
2076 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2079 if (!Triple.isOSDarwin())
2081 << A->getSpelling() << Triple.str();
2090 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
2093 bool EmbeddedPISupported;
2094 switch (Triple.getArch()) {
2095 case llvm::Triple::arm:
2096 case llvm::Triple::armeb:
2097 case llvm::Triple::thumb:
2098 case llvm::Triple::thumbeb:
2099 EmbeddedPISupported =
true;
2102 EmbeddedPISupported =
false;
2106 bool ROPI =
false, RWPI =
false;
2107 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
2108 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
2109 if (!EmbeddedPISupported)
2111 << LastROPIArg->getSpelling() << Triple.str();
2114 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2115 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2116 if (!EmbeddedPISupported)
2118 << LastRWPIArg->getSpelling() << Triple.str();
2123 if ((ROPI || RWPI) && (PIC || PIE))
2126 if (Triple.isMIPS()) {
2133 if (ABIName ==
"n64")
2136 if(Args.hasArg(options::OPT_mno_abicalls))
2137 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2140 IsPICLevelTwo =
false;
2144 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2146 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2148 RelocM = llvm::Reloc::ROPI_RWPI;
2150 RelocM = llvm::Reloc::ROPI;
2152 RelocM = llvm::Reloc::RWPI;
2154 return std::make_tuple(RelocM, 0
U,
false);
2158 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
2159 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
2161 const llvm::opt::OptTable &Opts = D.
getOpts();
2162 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
2163 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
2164 D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
2166 return HasStaticPIE;
2186 const ArgList &Args) {
2187 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2188 options::OPT_falign_functions_EQ,
2189 options::OPT_fno_align_functions);
2190 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2193 if (A->getOption().matches(options::OPT_falign_functions))
2197 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2199 << A->getAsString(Args) << A->getValue();
2204 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2205 switch (DebugInfoKind) {
2206 case llvm::codegenoptions::DebugDirectivesOnly:
2207 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2209 case llvm::codegenoptions::DebugLineTablesOnly:
2210 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2212 case llvm::codegenoptions::DebugInfoConstructor:
2213 CmdArgs.push_back(
"-debug-info-kind=constructor");
2215 case llvm::codegenoptions::LimitedDebugInfo:
2216 CmdArgs.push_back(
"-debug-info-kind=limited");
2218 case llvm::codegenoptions::FullDebugInfo:
2219 CmdArgs.push_back(
"-debug-info-kind=standalone");
2221 case llvm::codegenoptions::UnusedTypeInfo:
2222 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2232 assert(A.getOption().matches(options::OPT_gN_Group) &&
2233 "Not a -g option that specifies a debug-info level");
2234 if (A.getOption().matches(options::OPT_g0) ||
2235 A.getOption().matches(options::OPT_ggdb0))
2236 return llvm::codegenoptions::NoDebugInfo;
2237 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2238 A.getOption().matches(options::OPT_ggdb1))
2239 return llvm::codegenoptions::DebugLineTablesOnly;
2240 if (A.getOption().matches(options::OPT_gline_directives_only))
2241 return llvm::codegenoptions::DebugDirectivesOnly;
2242 return llvm::codegenoptions::DebugInfoConstructor;
2246 const ArgList &Args) {
2247 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2253 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 6 ||
2256 << A->getAsString(Args) << A->getValue();
2261 return llvm::StringSwitch<unsigned>(ArgValue)
2262 .Case(
"-gdwarf-2", 2)
2263 .Case(
"-gdwarf-3", 3)
2264 .Case(
"-gdwarf-4", 4)
2265 .Case(
"-gdwarf-5", 5)
2266 .Case(
"-gdwarf-6", 6)
2271 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2272 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2273 options::OPT_gdwarf_6, options::OPT_gdwarf);
2277 const llvm::opt::ArgList &Args) {
2282 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2283 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2284 << GDwarfN->getSpelling() << TC.
getTriple().str();
2286 if (DwarfVersion == 0) {
2288 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2290 return DwarfVersion;
2294 const ArgList &Args, Arg *&Arg) {
2295 Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
2296 options::OPT_gno_split_dwarf);
2297 if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
2300 if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
2303 StringRef
Value = Arg->getValue();
2304 if (
Value ==
"split")
2306 if (
Value ==
"single")
2309 D.
Diag(diag::err_drv_unsupported_option_argument)
2310 << Arg->getSpelling() << Arg->getValue();
2316 assert(A &&
"Expected non-nullptr argument.");
2319 D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
2325 ArgStringList &CmdArgs) {
2326 llvm::Reloc::Model RelocationModel;
2331 if (RelocationModel != llvm::Reloc::Static)
2332 CmdArgs.push_back(
"-KPIC");
2338 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2344 const ArgList &Args) {
2345 if (Args.hasArg(options::OPT_static_libgcc) ||
2346 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2350 if (Args.hasArg(options::OPT_shared_libgcc))
2369 ArgStringList &CmdArgs,
const ArgList &Args) {
2373 CmdArgs.push_back(
"-l:libunwind.a");
2396 CmdArgs.push_back(
"-lgcc_eh");
2398 CmdArgs.push_back(
"-lgcc_s");
2406 CmdArgs.push_back(
"-lunwind");
2408 CmdArgs.push_back(
"-l:libunwind.a");
2411 CmdArgs.push_back(
"-l:libunwind.dll.a");
2413 CmdArgs.push_back(
"-l:libunwind.so");
2417 CmdArgs.push_back(
"-lunwind");
2427 ArgStringList &CmdArgs,
const ArgList &Args) {
2431 CmdArgs.push_back(
"-lgcc");
2435 CmdArgs.push_back(
"-lgcc");
2439 CmdArgs.push_back(
"--as-needed");
2441 CmdArgs.push_back(
"--no-as-needed");
2446 ArgStringList &CmdArgs,
const ArgList &Args) {
2457 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2460 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2461 if (A && A->getValue() != StringRef(
"platform")) {
2462 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2463 << A->getValue() <<
"MSVC";
2473 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2474 !Args.hasArg(options::OPT_static_pie))
2475 CmdArgs.push_back(
"-ldl");
2482 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2488 StringRef SaveStats = A->getValue();
2489 if (SaveStats ==
"obj" && Output.
isFilename()) {
2491 llvm::sys::path::remove_filename(StatsFile);
2492 }
else if (SaveStats !=
"cwd") {
2493 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2497 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2498 llvm::sys::path::append(StatsFile, BaseName);
2499 llvm::sys::path::replace_extension(StatsFile,
"stats");
2511 assert(Flag.front() ==
'-');
2513 Flags.push_back(Flag.str());
2515 Flags.push_back((
"!" + Flag.substr(1)).str());
2520 ArgStringList &CmdArgs,
bool IsLTO,
2521 const StringRef PluginOptPrefix) {
2522 auto addArg = [&, IsLTO](
const Twine &Arg) {
2524 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2525 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2527 CmdArgs.push_back(
"-mllvm");
2528 CmdArgs.push_back(Args.MakeArgString(Arg));
2532 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2533 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2535 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2536 StringRef
Value = A->getValue();
2538 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2539 !llvm::isPowerOf2_64(Boundary)) {
2540 D.
Diag(diag::err_drv_invalid_argument_to_option)
2541 <<
Value << A->getOption().getName();
2543 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2546 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2547 std::string AlignBranch;
2548 for (StringRef
T : A->getValues()) {
2549 if (
T !=
"fused" &&
T !=
"jcc" &&
T !=
"jmp" &&
T !=
"call" &&
2550 T !=
"ret" &&
T !=
"indirect")
2551 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2552 <<
T <<
"fused, jcc, jmp, call, ret, indirect";
2553 if (!AlignBranch.empty())
2557 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2559 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2560 StringRef
Value = A->getValue();
2561 unsigned PrefixSize;
2562 if (
Value.getAsInteger(10, PrefixSize)) {
2563 D.
Diag(diag::err_drv_invalid_argument_to_option)
2564 <<
Value << A->getOption().getName();
2566 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2592 llvm::opt::ArgStringList &CC1Args,
2594 StringRef Lib, StringRef
Arch, StringRef
Target,
2595 bool isBitCodeSDL) {
2598 std::string LibDeviceLoc =
"/libdevice";
2599 std::string LibBcPrefix =
"/libbc-";
2600 std::string LibPrefix =
"/lib";
2617 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2618 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2620 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2621 Twine(Lib +
"-" +
Arch).str(), Twine(Lib).str()}) {
2622 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2623 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2633 const auto *Ext =
".a";
2635 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2636 Twine(Lib +
"-" +
Arch).str()}) {
2637 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2638 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2649 bool FoundSDL =
false;
2650 for (
auto LPath : LibraryPaths) {
2651 for (
auto SDL : SDLs) {
2652 auto FullName = Twine(LPath + SDL).str();
2653 if (llvm::sys::fs::exists(FullName)) {
2654 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2671 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2672 llvm::opt::ArgStringList &CC1Args,
2674 StringRef
Arch, StringRef
Target,
bool isBitCodeSDL) {
2677 if (isBitCodeSDL &&
Arch.contains(
"nvptx"))
2680 bool FoundAOB =
false;
2681 std::string ArchiveOfBundles;
2684 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2685 auto Ext = IsMSVC ?
".lib" :
".a";
2686 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2687 if (llvm::sys::fs::exists(Lib)) {
2688 ArchiveOfBundles = Lib;
2692 Lib.consume_front(
"-l");
2693 for (
auto LPath : LibraryPaths) {
2694 ArchiveOfBundles.clear();
2695 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2696 : IsMSVC ? Lib + Ext
2697 :
"lib" + Lib + Ext)
2699 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2700 auto AOB = Twine(LPath + Prefix + LibFile).str();
2701 if (llvm::sys::fs::exists(AOB)) {
2702 ArchiveOfBundles = AOB;
2715 llvm::file_magic Magic;
2716 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2717 if (EC || Magic != llvm::file_magic::archive)
2720 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2721 std::string OutputLib =
2727 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2731 DeviceTriple +=
'-';
2732 std::string NormalizedTriple =
T.getToolChain().getTriple().normalize(
2733 llvm::Triple::CanonicalForm::FOUR_IDENT);
2734 DeviceTriple += NormalizedTriple;
2736 DeviceTriple +=
'-';
2740 std::string UnbundleArg(
"-unbundle");
2741 std::string TypeArg(
"-type=a");
2742 std::string InputArg(
"-input=" + ArchiveOfBundles);
2743 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2744 std::string OutputArg(
"-output=" + OutputLib);
2746 const char *UBProgram = DriverArgs.MakeArgString(
2747 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2749 ArgStringList UBArgs;
2750 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2751 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2752 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2753 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2754 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2758 std::string AdditionalArgs(
"-allow-missing-bundles");
2759 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2764 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2765 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2767 C.addCommand(std::make_unique<Command>(
2769 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2771 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2778 const llvm::opt::ArgList &DriverArgs,
2779 llvm::opt::ArgStringList &CC1Args,
2781 bool isBitCodeSDL) {
2812 const llvm::opt::ArgList &DriverArgs,
2813 llvm::opt::ArgStringList &CC1Args,
2815 bool isBitCodeSDL) {
2819 std::optional<std::string> LibPath =
2820 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2823 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2824 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2825 for (StringRef Path : Frags)
2826 LibraryPaths.emplace_back(Path.trim());
2830 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2831 LibraryPaths.emplace_back(Search_Dir);
2835 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2836 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2839 llvm::SmallSet<std::string, 16> SDLNames;
2840 static const StringRef HostOnlyArchives[] = {
2841 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2842 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2843 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2844 SDLNames.insert(std::string(
"-l") + SDLName);
2848 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2855 const StringRef LibFileExt =
".lib";
2856 if (!llvm::sys::path::has_extension(
FileName) ||
2858 llvm::sys::path::extension(
FileName).drop_front()) ==
2860 llvm::sys::path::extension(
FileName) == LibFileExt)
2861 SDLNames.insert(Input);
2868 for (
auto SDLName : SDLNames) {
2879static llvm::opt::Arg *
2881 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2885 const llvm::opt::ArgList &Args) {
2886 const unsigned MinCodeObjVer = 4;
2887 const unsigned MaxCodeObjVer = 6;
2890 if (CodeObjArg->getOption().getID() ==
2891 options::OPT_mcode_object_version_EQ) {
2892 unsigned CodeObjVer = MaxCodeObjVer;
2894 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2895 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2896 D.
Diag(diag::err_drv_invalid_int_value)
2897 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2903 const llvm::opt::ArgList &Args) {
2904 unsigned CodeObjVer = 6;
2906 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2911 const Driver &D,
const llvm::opt::ArgList &Args) {
2916 const llvm::opt::ArgList &Args,
2917 llvm::opt::ArgStringList &CmdArgs,
2918 const llvm::Triple &Triple,
bool IsLTO,
2919 const StringRef PluginOptPrefix) {
2920 auto addArg = [&, IsLTO](
const Twine &Arg) {
2922 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2923 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2925 CmdArgs.push_back(
"-mllvm");
2926 CmdArgs.push_back(Args.MakeArgString(Arg));
2930 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2931 options::OPT_mno_outline)) {
2932 if (A->getOption().matches(options::OPT_moutline)) {
2936 if (!(Triple.isARM() || Triple.isThumb() || Triple.isAArch64())) {
2937 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2939 addArg(Twine(
"-enable-machine-outliner"));
2943 addArg(Twine(
"-enable-machine-outliner=never"));
2947 auto *CodeGenDataGenArg =
2948 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
2949 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
2952 if (CodeGenDataGenArg && CodeGenDataUseArg)
2953 D.
Diag(diag::err_drv_argument_not_allowed_with)
2954 << CodeGenDataGenArg->getAsString(Args)
2955 << CodeGenDataUseArg->getAsString(Args);
2959 if (CodeGenDataGenArg)
2960 addArg(Twine(
"-codegen-data-generate"));
2963 if (CodeGenDataUseArg)
2964 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
2968 const llvm::opt::ArgList &DriverArgs,
2969 llvm::opt::ArgStringList &CC1Args,
2970 StringRef BitcodeSuffix,
2971 const llvm::Triple &Triple,
2976 std::optional<std::string> LibPath =
2977 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2980 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2981 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2982 for (StringRef Path : Frags)
2983 LibraryPaths.emplace_back(Path.trim());
2988 LibraryPaths.emplace_back(LibPath);
2992 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
2993 LibraryPaths.emplace_back(P);
2995 OptSpecifier LibomptargetBCPathOpt =
2996 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
2997 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
2998 : options::OPT_libomptarget_spirv_bc_path_EQ;
3000 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
3001 : Triple.isNVPTX() ?
"nvptx"
3003 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
3006 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
3008 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
3009 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
3010 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3013 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3014 CC1Args.push_back(
"-mlink-builtin-bitcode");
3015 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3017 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
3018 << LibOmpTargetFile;
3021 bool FoundBCLibrary =
false;
3023 for (StringRef LibraryPath : LibraryPaths) {
3025 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3026 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3027 CC1Args.push_back(
"-mlink-builtin-bitcode");
3028 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3029 FoundBCLibrary =
true;
3034 if (!FoundBCLibrary)
3035 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
3036 << LibOmpTargetName << ArchPrefix;
3040 const llvm::opt::ArgList &Args,
3041 llvm::opt::ArgStringList &CmdArgs) {
3043 (!Args.hasArg(options::OPT_nostdlib) ||
3044 TC.
getTriple().isKnownWindowsMSVCEnvironment()) &&
3045 !Args.hasArg(options::OPT_no_hip_rt) && !Args.hasArg(options::OPT_r)) {
3049 for (
auto *Arg : Args.filtered(options::OPT_no_hip_rt)) {
3056 const llvm::opt::ArgList &DriverArgs,
3057 llvm::opt::ArgStringList &CC1Args) {
3059 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
3065 llvm::sys::path::append(LibclcPath,
"lib",
"libclc");
3068 StringRef LibclcNamespec(A->getValue());
3069 bool FilenameSearch = LibclcNamespec.consume_front(
":");
3072 if (FilenameSearch && llvm::sys::fs::exists(LibclcTargetFile)) {
3073 CC1Args.push_back(
"-mlink-builtin-bitcode");
3074 CC1Args.push_back(DriverArgs.MakeArgString(LibclcTargetFile));
3077 if (!FilenameSearch)
3078 LibclcTargetFile +=
".bc";
3080 llvm::sys::path::append(LibclcPath, LibclcTargetFile);
3081 if (llvm::sys::fs::exists(LibclcPath)) {
3082 CC1Args.push_back(
"-mlink-builtin-bitcode");
3083 CC1Args.push_back(DriverArgs.MakeArgString(LibclcPath));
3087 D.
Diag(diag::err_drv_libclc_not_found) << LibclcTargetFile;
3093 const llvm::opt::ArgList &Args,
3094 llvm::opt::ArgStringList &CmdArgs,
3095 const llvm::Triple &Triple) {
3096 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3097 options::OPT_mno_outline_atomics)) {
3099 if (!Triple.isAArch64()) {
3100 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3101 << Triple.getArchName() << A->getOption().getName();
3103 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3104 CmdArgs.push_back(
"-target-feature");
3105 CmdArgs.push_back(
"+outline-atomics");
3107 CmdArgs.push_back(
"-target-feature");
3108 CmdArgs.push_back(
"-outline-atomics");
3112 CmdArgs.push_back(
"-target-feature");
3113 CmdArgs.push_back(
"+outline-atomics");
3118 llvm::opt::ArgStringList &CmdArgs) {
3119 if (TCArgs.hasFlag(options::OPT_offload_compress,
3120 options::OPT_no_offload_compress,
false))
3121 CmdArgs.push_back(
"--compress");
3122 if (TCArgs.hasArg(options::OPT_v))
3123 CmdArgs.push_back(
"--verbose");
3124 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3126 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3130 const llvm::Triple &Triple,
3131 const llvm::Reloc::Model &RelocationModel,
3132 llvm::opt::ArgStringList &CmdArgs) {
3133 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3134 StringRef CM = A->getValue();
3136 if (Triple.isOSAIX() && CM ==
"medium")
3138 if (Triple.isAArch64(64)) {
3139 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3140 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3141 RelocationModel != llvm::Reloc::Static)
3142 D.
Diag(diag::err_drv_argument_only_allowed_with)
3143 << A->getAsString(Args) <<
"-fno-pic";
3144 }
else if (Triple.isLoongArch()) {
3145 if (CM ==
"extreme" &&
3146 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3147 D.
Diag(diag::err_drv_argument_not_allowed_with)
3148 << A->getAsString(Args) <<
"-fplt";
3149 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3152 CM = llvm::StringSwitch<StringRef>(CM)
3153 .Case(
"normal",
"small")
3154 .Case(
"extreme",
"large")
3156 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3157 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3158 }
else if (Triple.isRISCV()) {
3160 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3161 D.
Diag(diag::err_drv_argument_not_allowed_with)
3162 << A->getAsString(Args) <<
"-fpic";
3165 else if (CM ==
"medany")
3167 Ok = CM ==
"small" || CM ==
"medium" ||
3168 (CM ==
"large" && Triple.isRISCV64());
3169 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3170 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3171 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3175 }
else if (Triple.isSPARC64()) {
3178 else if (CM ==
"medmid")
3180 else if (CM ==
"medany")
3182 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3183 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3184 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3187 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3189 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3190 << A->getSpelling() << CM << Triple.getTriple();
3194 if (Triple.getArch() == llvm::Triple::x86_64) {
3195 bool IsMediumCM =
false;
3196 bool IsLargeCM =
false;
3197 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3198 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3199 IsLargeCM = StringRef(A->getValue()) ==
"large";
3201 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3202 if (!IsMediumCM && !IsLargeCM) {
3203 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3204 << A->getOption().getRenderName();
3206 A->render(Args, CmdArgs);
3208 }
else if (IsMediumCM) {
3209 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3210 }
else if (IsLargeCM) {
3211 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3217 ArgStringList &CmdArgs) {
3222 Args.getLastArg(options::OPT_fcolor_diagnostics,
3223 options::OPT_fno_color_diagnostics);
3224 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3225 StringRef
Value(A->getValue());
3227 D.
Diag(diag::err_drv_invalid_argument_to_option)
3228 <<
Value << A->getOption().getName();
3232 CmdArgs.push_back(
"-fcolor-diagnostics");
3237 for (; *Arg; ++Arg) {
3243 Res.push_back(
'\\');
3246 Res.push_back(*Arg);
3251 const llvm::opt::ArgList &Args) {
3255 llvm::opt::ArgStringList OriginalArgs;
3256 for (
const auto &Arg : Args)
3257 Arg->render(Args, OriginalArgs);
3261 for (
const char *OriginalArg : OriginalArgs) {
3265 Flags += EscapedArg;
3268 return Args.MakeArgString(Flags);
3272 const llvm::opt::ArgList &Args,
3273 bool &FRecordCommandLine,
3274 bool &GRecordCommandLine) {
3277 const std::string &TripleStr = Triple.getTriple();
3279 FRecordCommandLine =
3280 Args.hasFlag(options::OPT_frecord_command_line,
3281 options::OPT_fno_record_command_line,
false);
3282 GRecordCommandLine =
3283 Args.hasFlag(options::OPT_grecord_command_line,
3284 options::OPT_gno_record_command_line,
false);
3285 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3286 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3287 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3288 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3295 ArgStringList &CmdArgs) {
3296 bool use_fwrapv =
false;
3297 bool use_fwrapv_pointer =
false;
3298 for (
const Arg *A : Args.filtered(
3299 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3300 options::OPT_fwrapv, options::OPT_fno_wrapv,
3301 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3303 switch (A->getOption().getID()) {
3304 case options::OPT_fstrict_overflow:
3306 use_fwrapv_pointer =
false;
3308 case options::OPT_fno_strict_overflow:
3310 use_fwrapv_pointer =
true;
3312 case options::OPT_fwrapv:
3315 case options::OPT_fno_wrapv:
3318 case options::OPT_fwrapv_pointer:
3319 use_fwrapv_pointer =
true;
3321 case options::OPT_fno_wrapv_pointer:
3322 use_fwrapv_pointer =
false;
3328 CmdArgs.push_back(
"-fwrapv");
3329 if (use_fwrapv_pointer)
3330 CmdArgs.push_back(
"-fwrapv-pointer");
3337 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3338 if (A->getOption().matches(options::OPT_O4) ||
3339 A->getOption().matches(options::OPT_Ofast))
3342 if (A->getOption().matches(options::OPT_O0))
3345 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3348 StringRef S(A->getValue());
3356 unsigned OptLevel = 0;
3357 if (S.getAsInteger(10, OptLevel))
3360 return OptLevel > 1;
3367 ArgStringList &CmdArgs) {
3369 if (Args.hasFlag(options::OPT_fvectorize, options::OPT_fno_vectorize,
3371 CmdArgs.push_back(
"-vectorize-loops");
3375 ArgStringList &CmdArgs) {
3377 if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize,
3379 CmdArgs.push_back(
"-vectorize-slp");
3383 ArgStringList &CmdArgs) {
3384 if (Args.hasFlag(options::OPT_floop_interchange,
3385 options::OPT_fno_loop_interchange,
false))
3386 CmdArgs.push_back(
"-floop-interchange");
3407 llvm_unreachable(
"Fully covered switch above");
3413 if (!ComplexRangeStr.empty())
3414 return "-complex-range=" + ComplexRangeStr;
3415 return ComplexRangeStr;
3435 if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
3436 (LastOpt ==
"-fcx-limited-range" && NewOpt ==
"-fno-cx-limited-range") ||
3437 (LastOpt ==
"-fno-cx-limited-range" && NewOpt ==
"-fcx-limited-range") ||
3438 (LastOpt ==
"-fcx-fortran-rules" && NewOpt ==
"-fno-cx-fortran-rules") ||
3439 (LastOpt ==
"-fno-cx-fortran-rules" && NewOpt ==
"-fcx-fortran-rules") ||
3440 (LastOpt ==
"-ffast-math" && NewOpt ==
"-fno-fast-math") ||
3441 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-ffast-math") ||
3442 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-fno-fast-math") ||
3443 (LastOpt.starts_with(
"-ffp-model=") &&
3444 NewOpt.starts_with(
"-ffp-model=")) ||
3445 (LastOpt.starts_with(
"-fcomplex-arithmetic=") &&
3446 NewOpt.starts_with(
"-fcomplex-arithmetic=")))
3449 D.
Diag(clang::diag::warn_drv_overriding_complex_range)
static bool useLeafFramePointerForTargetByDefault(const llvm::Triple &Triple)
static unsigned ParseDebugDefaultVersion(const ToolChain &TC, const ArgList &Args)
static 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 AtFileCurCP()