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/AMDGPUTargetParser.h"
62#include "llvm/TargetParser/Host.h"
63#include "llvm/TargetParser/PPCTargetParser.h"
72 const llvm::Triple &Triple) {
73 if (Args.hasArg(options::OPT_pg) && !Args.hasArg(options::OPT_mfentry))
76 if (Triple.isAndroid())
79 switch (Triple.getArch()) {
80 case llvm::Triple::xcore:
81 case llvm::Triple::wasm32:
82 case llvm::Triple::wasm64:
83 case llvm::Triple::msp430:
87 case llvm::Triple::ppc:
88 case llvm::Triple::ppcle:
89 case llvm::Triple::ppc64:
90 case llvm::Triple::ppc64le:
91 case llvm::Triple::riscv32:
92 case llvm::Triple::riscv64:
93 case llvm::Triple::riscv32be:
94 case llvm::Triple::riscv64be:
95 case llvm::Triple::sparc:
96 case llvm::Triple::sparcel:
97 case llvm::Triple::sparcv9:
98 case llvm::Triple::amdgcn:
99 case llvm::Triple::r600:
100 case llvm::Triple::csky:
101 case llvm::Triple::loongarch32:
102 case llvm::Triple::loongarch64:
103 case llvm::Triple::m68k:
104 case llvm::Triple::mips64:
105 case llvm::Triple::mips64el:
106 case llvm::Triple::mips:
107 case llvm::Triple::mipsel:
113 if (Triple.isOSFuchsia() || Triple.isOSNetBSD()) {
117 if (Triple.isOSLinux() || Triple.isOSHurd()) {
118 switch (Triple.getArch()) {
120 case llvm::Triple::arm:
121 case llvm::Triple::armeb:
122 case llvm::Triple::thumb:
123 case llvm::Triple::thumbeb:
124 case llvm::Triple::systemz:
125 case llvm::Triple::x86:
126 case llvm::Triple::x86_64:
133 if (Triple.isOSWindows()) {
134 switch (Triple.getArch()) {
135 case llvm::Triple::x86:
137 case llvm::Triple::x86_64:
138 return Triple.isOSBinFormatMachO();
139 case llvm::Triple::arm:
140 case llvm::Triple::thumb:
157 if (Triple.isAArch64() || Triple.isPS() || Triple.isVE() ||
158 (Triple.isAndroid() && !Triple.isARM()))
161 if ((Triple.isARM() || Triple.isThumb()) && Triple.isOSBinFormatMachO())
168 switch (Triple.getArch()) {
171 case llvm::Triple::arm:
172 case llvm::Triple::thumb:
175 return Triple.isOSDarwin();
182 const llvm::Triple &Triple) {
183 switch (Triple.getArch()) {
186 case llvm::Triple::arm:
187 case llvm::Triple::armeb:
188 case llvm::Triple::thumb:
189 case llvm::Triple::thumbeb:
193 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
194 StringRef
V = A->getValue();
199 case llvm::Triple::aarch64:
203 return Triple.isOSWindows();
210 const llvm::Triple &Triple) {
211 if (Triple.isARM() || Triple.isThumb()) {
215 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
216 StringRef
V = A->getValue();
217 return V ==
"aapcs+leaf";
226 const llvm::Triple &Triple) {
268 Args.hasFlag(options::OPT_fno_omit_frame_pointer,
269 options::OPT_fomit_frame_pointer, DefaultFP);
275 Args.hasFlag(options::OPT_mno_omit_leaf_frame_pointer,
276 options::OPT_momit_leaf_frame_pointer, DefaultLeafFP);
278 bool FPRegReserved = Args.hasFlag(options::OPT_mreserve_frame_pointer_reg,
279 options::OPT_mno_reserve_frame_pointer_reg,
297 const StringRef PluginOptPrefix) {
298 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
299 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
300 "-pass-remarks=" + A->getValue()));
302 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
303 CmdArgs.push_back(Args.MakeArgString(
304 Twine(PluginOptPrefix) +
"-pass-remarks-missed=" + A->getValue()));
306 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
307 CmdArgs.push_back(Args.MakeArgString(
308 Twine(PluginOptPrefix) +
"-pass-remarks-analysis=" + A->getValue()));
312 const llvm::Triple &Triple,
315 const StringRef PluginOptPrefix) {
316 StringRef Format =
"yaml";
317 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
318 Format = A->getValue();
322 Args.getLastArg(options::OPT_foptimization_record_file_EQ)) {
325 }
else if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
332 assert(!F.empty() &&
"Cannot determine remarks output name.");
334 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
335 "opt-remarks-filename=" + F +
"opt.ld." +
339 Args.getLastArg(options::OPT_foptimization_record_passes_EQ))
340 CmdArgs.push_back(Args.MakeArgString(
341 Twine(PluginOptPrefix) +
"opt-remarks-passes=" + A->getValue()));
343 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
344 "opt-remarks-format=" + Format.data()));
348 ArgStringList &CmdArgs,
349 const StringRef PluginOptPrefix) {
350 if (Args.hasFlag(options::OPT_fdiagnostics_show_hotness,
351 options::OPT_fno_diagnostics_show_hotness,
false))
352 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
353 "opt-remarks-with-hotness"));
356 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ))
358 Args.MakeArgString(Twine(PluginOptPrefix) +
359 "opt-remarks-hotness-threshold=" + A->getValue()));
364 StringRef Processor) {
368 auto GPUKind = T.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Processor)
369 : llvm::AMDGPU::parseArchR600(Processor);
370 auto GPUFeatures = T.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind)
371 : llvm::AMDGPU::getArchAttrR600(GPUKind);
372 if (GPUFeatures & llvm::AMDGPU::FEATURE_WGP)
374 return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode);
379 if (D.
getVFS().exists(Path))
380 Paths.push_back(Path.str());
384 const llvm::Triple &Triple,
386 std::vector<StringRef> &Features,
387 OptSpecifier Group) {
388 std::set<StringRef> Warned;
389 for (
const Arg *A : Args.filtered(Group)) {
390 StringRef Name = A->getOption().getName();
394 assert(Name.starts_with(
"m") &&
"Invalid feature name.");
395 Name = Name.substr(1);
399 if (Warned.count(Name) == 0) {
401 clang::diag::warn_drv_unsupported_option_for_processor)
402 << A->getAsString(Args) << Proc;
408 bool IsNegative = Name.consume_front(
"no-");
410 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
418 llvm::DenseSet<StringRef> UsedFeatures;
419 for (StringRef
Feature : llvm::reverse(Features)) {
420 if (UsedFeatures.insert(
Feature.drop_front()).second)
421 UnifiedFeatures.insert(UnifiedFeatures.begin(),
Feature);
424 return UnifiedFeatures;
428 const char *ArgName,
const char *EnvVar) {
429 const char *DirList = ::getenv(EnvVar);
430 bool CombinedArg =
false;
435 StringRef Name(ArgName);
436 if (Name ==
"-I" || Name ==
"-L" || Name.empty())
439 StringRef Dirs(DirList);
443 StringRef::size_type Delim;
444 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
447 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
449 CmdArgs.push_back(ArgName);
450 CmdArgs.push_back(
".");
455 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
457 CmdArgs.push_back(ArgName);
458 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
461 Dirs = Dirs.substr(Delim + 1);
466 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
468 CmdArgs.push_back(ArgName);
469 CmdArgs.push_back(
".");
473 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
475 CmdArgs.push_back(ArgName);
476 CmdArgs.push_back(Args.MakeArgString(Dirs));
482 const ArgList &Args, ArgStringList &CmdArgs,
488 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
495 for (
const auto &II : Inputs) {
499 if (
auto *IA = II.getAction())
509 if (II.isFilename()) {
510 CmdArgs.push_back(II.getFilename());
519 const Arg &A = II.getInputArg();
522 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
524 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
527 else if (A.getOption().matches(options::OPT_rpath) &&
531 A.renderAsInput(Args, CmdArgs);
533 if (
const Arg *A = Args.getLastArg(options::OPT_fveclib)) {
534 const llvm::Triple &Triple = TC.
getTriple();
535 StringRef
V = A->getValue();
536 if (
V ==
"ArmPL" && (Triple.isOSLinux() || Triple.isOSDarwin())) {
554 if (Triple.isOSLinux()) {
555 CmdArgs.push_back(Args.MakeArgString(
"--push-state"));
556 CmdArgs.push_back(Args.MakeArgString(
"--as-needed"));
558 if (!Args.hasArg(options::OPT_nostdlib))
559 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
560 CmdArgs.push_back(Args.MakeArgString(
"-lamath"));
561 if (!Args.hasArg(options::OPT_nostdlib))
562 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
563 if (Triple.isOSLinux())
564 CmdArgs.push_back(Args.MakeArgString(
"--pop-state"));
571 switch (T.getArch()) {
572 case llvm::Triple::x86:
576 case llvm::Triple::aarch64:
577 if (T.isOSManagarm())
578 return "aarch64managarm";
581 return "aarch64linux";
582 case llvm::Triple::aarch64_be:
584 return "aarch64elfb";
585 return "aarch64linuxb";
586 case llvm::Triple::arm:
587 case llvm::Triple::thumb:
588 case llvm::Triple::armeb:
589 case llvm::Triple::thumbeb: {
592 return IsBigEndian ?
"armelfb" :
"armelf";
593 return IsBigEndian ?
"armelfb_linux_eabi" :
"armelf_linux_eabi";
595 case llvm::Triple::m68k:
597 case llvm::Triple::ppc:
599 return "elf32ppclinux";
601 case llvm::Triple::ppcle:
603 return "elf32lppclinux";
605 case llvm::Triple::ppc64:
607 case llvm::Triple::ppc64le:
609 case llvm::Triple::riscv32:
610 return "elf32lriscv";
611 case llvm::Triple::riscv64:
612 return "elf64lriscv";
613 case llvm::Triple::riscv32be:
614 return "elf32briscv";
615 case llvm::Triple::riscv64be:
616 return "elf64briscv";
617 case llvm::Triple::sparc:
618 case llvm::Triple::sparcel:
619 return "elf32_sparc";
620 case llvm::Triple::sparcv9:
621 return "elf64_sparc";
622 case llvm::Triple::loongarch32:
623 return "elf32loongarch";
624 case llvm::Triple::loongarch64:
625 return "elf64loongarch";
626 case llvm::Triple::mips:
627 return "elf32btsmip";
628 case llvm::Triple::mipsel:
629 return "elf32ltsmip";
630 case llvm::Triple::mips64:
632 return "elf32btsmipn32";
633 return "elf64btsmip";
634 case llvm::Triple::mips64el:
636 return "elf32ltsmipn32";
637 return "elf64ltsmip";
638 case llvm::Triple::systemz:
640 case llvm::Triple::x86_64:
642 return "elf32_x86_64";
644 case llvm::Triple::ve:
646 case llvm::Triple::csky:
647 return "cskyelf_linux";
654 const ToolChain &TC,
const llvm::opt::ArgList &Args,
655 llvm::opt::ArgStringList &CmdArgs) {
661 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
662 StringRef
V = A->getValue();
663 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
664 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
666 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
667 << A->getSpelling() <<
V;
672 std::vector<StringRef> &Features,
673 OptSpecifier OnOpt, OptSpecifier OffOpt,
674 StringRef FeatureName) {
675 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
676 if (A->getOption().matches(OnOpt))
677 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
679 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
685 const ArgList &Args) {
686 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
688 return llvm::StringSwitch<std::string>(GPUName)
689 .Cases({
"rv630",
"rv635"},
"r600")
690 .Cases({
"rv610",
"rv620",
"rs780"},
"rs880")
691 .Case(
"rv740",
"rv770")
692 .Case(
"palm",
"cedar")
693 .Cases({
"sumo",
"sumo2"},
"sumo")
694 .Case(
"hemlock",
"cypress")
695 .Case(
"aruba",
"cayman")
696 .Default(GPUName.str());
702 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
703 return A->getValue();
711 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
712 StringRef CPU = A->getValue();
718 return llvm::sys::getHostCPUName();
728 const llvm::Triple &T,
bool FromAs) {
731 switch (T.getArch()) {
735 case llvm::Triple::aarch64:
736 case llvm::Triple::aarch64_32:
737 case llvm::Triple::aarch64_be:
740 case llvm::Triple::arm:
741 case llvm::Triple::armeb:
742 case llvm::Triple::thumb:
743 case llvm::Triple::thumbeb: {
744 StringRef MArch, MCPU;
749 case llvm::Triple::avr:
750 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
751 return A->getValue();
754 case llvm::Triple::m68k:
757 case llvm::Triple::mips:
758 case llvm::Triple::mipsel:
759 case llvm::Triple::mips64:
760 case llvm::Triple::mips64el: {
764 return std::string(CPUName);
767 case llvm::Triple::nvptx:
768 case llvm::Triple::nvptx64:
769 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
770 return A->getValue();
773 case llvm::Triple::ppc:
774 case llvm::Triple::ppcle:
775 case llvm::Triple::ppc64:
776 case llvm::Triple::ppc64le:
777 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
779 llvm::PPC::getNormalizedPPCTargetCPU(T, A->getValue()));
780 return std::string(llvm::PPC::getNormalizedPPCTargetCPU(T));
782 case llvm::Triple::csky:
783 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
784 return A->getValue();
785 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
786 return A->getValue();
789 case llvm::Triple::riscv32:
790 case llvm::Triple::riscv64:
791 case llvm::Triple::riscv32be:
792 case llvm::Triple::riscv64be:
795 case llvm::Triple::bpfel:
796 case llvm::Triple::bpfeb:
797 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
798 return A->getValue();
801 case llvm::Triple::sparc:
802 case llvm::Triple::sparcel:
803 case llvm::Triple::sparcv9:
806 case llvm::Triple::x86:
807 case llvm::Triple::x86_64:
810 case llvm::Triple::hexagon:
814 case llvm::Triple::lanai:
817 case llvm::Triple::systemz:
820 case llvm::Triple::r600:
821 case llvm::Triple::amdgcn:
824 case llvm::Triple::wasm32:
825 case llvm::Triple::wasm64:
828 case llvm::Triple::loongarch32:
829 case llvm::Triple::loongarch64:
832 case llvm::Triple::xtensa:
833 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
834 return A->getValue();
840 const llvm::Triple &Triple,
842 std::vector<StringRef> &Features) {
844 options::OPT_m_wasm_Features_Group);
848 const ArgList &Args, ArgStringList &CmdArgs,
849 bool ForAS,
bool IsAux) {
850 std::vector<StringRef> Features;
851 switch (Triple.getArch()) {
854 case llvm::Triple::mips:
855 case llvm::Triple::mipsel:
856 case llvm::Triple::mips64:
857 case llvm::Triple::mips64el:
860 case llvm::Triple::arm:
861 case llvm::Triple::armeb:
862 case llvm::Triple::thumb:
863 case llvm::Triple::thumbeb:
866 case llvm::Triple::ppc:
867 case llvm::Triple::ppcle:
868 case llvm::Triple::ppc64:
869 case llvm::Triple::ppc64le:
872 case llvm::Triple::riscv32:
873 case llvm::Triple::riscv64:
874 case llvm::Triple::riscv32be:
875 case llvm::Triple::riscv64be:
878 case llvm::Triple::systemz:
881 case llvm::Triple::aarch64:
882 case llvm::Triple::aarch64_32:
883 case llvm::Triple::aarch64_be:
886 case llvm::Triple::x86:
887 case llvm::Triple::x86_64:
890 case llvm::Triple::hexagon:
893 case llvm::Triple::wasm32:
894 case llvm::Triple::wasm64:
897 case llvm::Triple::sparc:
898 case llvm::Triple::sparcel:
899 case llvm::Triple::sparcv9:
902 case llvm::Triple::r600:
903 case llvm::Triple::amdgcn:
906 case llvm::Triple::nvptx:
907 case llvm::Triple::nvptx64:
910 case llvm::Triple::m68k:
913 case llvm::Triple::msp430:
916 case llvm::Triple::ve:
919 case llvm::Triple::csky:
922 case llvm::Triple::loongarch32:
923 case llvm::Triple::loongarch64:
929 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
930 CmdArgs.push_back(
Feature.data());
935 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
938 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
939 D.
Diag(diag::err_drv_invalid_int_value)
940 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
941 return LtoJobsArg->getValue();
946 return Triple.isPS();
950 const llvm::opt::ArgList &Args) {
952 Arg *A = Args.getLastArg(options::OPT_mtls_dialect_EQ);
954 return Triple.hasDefaultTLSDESC();
955 StringRef
V = A->getValue();
956 bool SupportedArgument =
false, EnableTLSDESC =
false;
957 bool Unsupported = !Triple.isOSBinFormatELF();
958 if (Triple.isLoongArch() || Triple.isRISCV()) {
959 SupportedArgument =
V ==
"desc" ||
V ==
"trad";
960 EnableTLSDESC =
V ==
"desc";
961 }
else if (Triple.isX86()) {
962 SupportedArgument =
V ==
"gnu" ||
V ==
"gnu2";
963 EnableTLSDESC =
V ==
"gnu2";
968 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
969 << A->getSpelling() << Triple.getTriple();
970 }
else if (!SupportedArgument) {
971 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument_for_target)
972 << A->getSpelling() <<
V << Triple.getTriple();
974 return EnableTLSDESC;
978 llvm::opt::ArgStringList &CmdArgs) {
979 if (Arg *A = Args.getLastArg(options::OPT_fthinlto_distributor_EQ)) {
981 Args.MakeArgString(
"--thinlto-distributor=" + Twine(A->getValue())));
983 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-remote-compiler=" +
986 CmdArgs.push_back(Args.MakeArgString(
987 "--thinlto-remote-compiler-prepend-arg=" + Twine(PA)));
990 Args.getAllArgValues(options::OPT_Xthinlto_distributor_EQ))
991 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-distributor-arg=" + A));
996 ArgStringList &CmdArgs,
const InputInfo &Output,
999 const bool IsOSAIX = Triple.isOSAIX();
1000 const bool IsAMDGCN = Triple.isAMDGCN();
1001 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ);
1004 const bool IsFatLTO = Args.hasFlag(options::OPT_ffat_lto_objects,
1005 options::OPT_fno_fat_lto_objects,
false);
1006 const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
1008 assert(!Inputs.empty() &&
"Must have at least one input.");
1010 auto Input = llvm::find_if(
1012 if (Input == Inputs.end()) {
1015 Input = Inputs.begin();
1018 if (Linker !=
"lld" && Linker !=
"lld-link" &&
1019 llvm::sys::path::filename(LinkerPath) !=
"ld.lld" &&
1020 llvm::sys::path::stem(LinkerPath) !=
"ld.lld" && !Triple.isOSOpenBSD()) {
1024 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
1025 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
1028 CmdArgs.push_back(
"-plugin");
1031 const char *Suffix =
".dll";
1032#elif defined(__APPLE__)
1033 const char *Suffix =
".dylib";
1035 const char *Suffix =
".so";
1039 llvm::sys::path::native(Twine(D.
Dir) +
1040 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
1041 PluginName + Suffix,
1043 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
1048 CmdArgs.push_back(
"--fat-lto-objects");
1050 if (Args.hasArg(options::OPT_flto_partitions_EQ)) {
1052 StringRef A = Args.getLastArgValue(options::OPT_flto_partitions_EQ,
"8");
1053 if (A.getAsInteger(10,
Value) || (
Value < 1)) {
1054 Arg *Arg = Args.getLastArg(options::OPT_flto_partitions_EQ);
1055 D.
Diag(diag::err_drv_invalid_int_value)
1056 << Arg->getAsString(Args) << Arg->getValue();
1058 CmdArgs.push_back(Args.MakeArgString(
"--lto-partitions=" + A));
1062 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
1063 const char *ExtraDash = IsOSAIX ?
"-" :
"";
1064 const char *ParallelismOpt = IsOSAIX ?
"-threads=" :
"jobs=";
1069 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
1070 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1071 "-generate-arange-section"));
1075 Arg *ArgVecLib = Args.getLastArg(options::OPT_fveclib);
1076 if (ArgVecLib && ArgVecLib->getNumValues() == 1) {
1079 std::optional<StringRef> OptVal =
1080 llvm::StringSwitch<std::optional<StringRef>>(ArgVecLib->getValue())
1081 .Case(
"Accelerate",
"Accelerate")
1082 .Case(
"libmvec",
"LIBMVEC")
1083 .Case(
"AMDLIBM",
"AMDLIBM")
1084 .Case(
"MASSV",
"MASSV")
1085 .Case(
"SVML",
"SVML")
1086 .Case(
"SLEEF",
"sleefgnuabi")
1087 .Case(
"Darwin_libsystem_m",
"Darwin_libsystem_m")
1088 .Case(
"ArmPL",
"ArmPL")
1089 .Case(
"none",
"none")
1090 .Default(std::nullopt);
1093 CmdArgs.push_back(Args.MakeArgString(
1094 Twine(PluginOptPrefix) +
"-vector-library=" + OptVal.value()));
1104 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
1106 if (Args.getLastArg(options::OPT_O_Group)) {
1107 unsigned OptimizationLevel =
1109 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1110 "O" + Twine(OptimizationLevel)));
1113 Args.MakeArgString(Twine(
"--lto-CGO") + Twine(OptimizationLevel)));
1116 if (Args.hasArg(options::OPT_gsplit_dwarf)) {
1118 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1125 Args.MakeArgString(Twine(PluginOptPrefix) +
"dwo_dir=" + F +
"dwo"));
1128 if (IsThinLTO && !IsOSAIX)
1129 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
1130 else if (IsThinLTO && IsOSAIX)
1131 CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
1136 if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
1137 Args.hasArg(options::OPT_fenable_matrix))
1139 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-matrix"));
1142 if (!Parallelism.empty())
1143 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1144 ParallelismOpt + Parallelism));
1147 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
1148 options::OPT_fno_global_isel)) {
1151 CmdArgs.push_back(Args.MakeArgString(
1152 Twine(PluginOptPrefix) +
"-global-isel=" +
1153 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
1158 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
1159 if (A->getOption().matches(options::OPT_glldb))
1161 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
1162 else if (A->getOption().matches(options::OPT_gsce))
1164 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
1165 else if (A->getOption().matches(options::OPT_gdbx))
1167 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
1170 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
1176 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
1180 Arg *A = Args.getLastArg(options::OPT_g_Group);
1181 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
1182 !A->getOption().matches(options::OPT_ggdb0);
1183 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
1184 options::OPT_gno_strict_dwarf,
true))
1186 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
1188 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
1189 StringRef
V = A->getValue();
1190 if (
V ==
"vec-default")
1192 if (
V ==
"vec-extabi") {
1194 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
1200 bool UseSeparateSections =
1203 if (Args.hasFlag(options::OPT_ffunction_sections,
1204 options::OPT_fno_function_sections, UseSeparateSections))
1206 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
1207 else if (Args.hasArg(options::OPT_fno_function_sections))
1209 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
1211 bool DataSectionsTurnedOff =
false;
1212 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1213 UseSeparateSections)) {
1215 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
1216 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
1217 DataSectionsTurnedOff =
true;
1219 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
1222 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
1223 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
1224 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
1225 options::OPT_mno_xcoff_roptr,
false);
1226 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
1228 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1229 << OptStr << Triple.str();
1235 if (DataSectionsTurnedOff)
1236 D.
Diag(diag::err_roptr_requires_data_sections);
1239 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
1244 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
1245 options::OPT_fno_split_machine_functions)) {
1246 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
1247 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1248 "-split-machine-functions"));
1252 Args.getLastArg(options::OPT_fpartition_static_data_sections,
1253 options::OPT_fno_partition_static_data_sections)) {
1254 if (A->getOption().matches(options::OPT_fpartition_static_data_sections)) {
1255 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1256 "-partition-static-data-sections"));
1261 StringRef FName = A->getValue();
1262 if (!llvm::sys::fs::exists(FName))
1263 D.
Diag(diag::err_drv_no_such_file) << FName;
1265 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1266 "sample-profile=" + FName));
1270 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1271 "cs-profile-generate"));
1272 if (CSPGOGenerateArg->getOption().matches(
1273 options::OPT_fcs_profile_generate_EQ)) {
1275 llvm::sys::path::append(Path,
"default_%m.profraw");
1276 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1277 "cs-profile-path=" + Path));
1280 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1281 "cs-profile-path=default_%m.profraw"));
1284 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1285 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1286 llvm::sys::path::append(Path,
"default.profdata");
1287 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1288 "cs-profile-path=" + Path));
1292 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1294 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1295 "-enable-jmc-instrument"));
1297 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1300 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1301 Triple.hasDefaultEmulatedTLS())) {
1303 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1307 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1309 if (Args.hasFlag(options::OPT_fstack_size_section,
1310 options::OPT_fno_stack_size_section,
false))
1312 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1314 if (Args.hasFlag(options::OPT_fexperimental_call_graph_section,
1315 options::OPT_fno_experimental_call_graph_section,
false))
1317 Args.MakeArgString(Twine(PluginOptPrefix) +
"-call-graph-section"));
1321 if (!StatsFile.empty())
1323 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1326 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1327 CmdArgs.push_back(Args.MakeArgString(
1328 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1339 Output, PluginOptPrefix);
1345 true, PluginOptPrefix);
1347 bool IsELF = Triple.isOSBinFormatELF();
1349 bool ImplicitMapSyms =
false;
1350 for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
1351 for (StringRef
V : A->getValues()) {
1352 auto Equal =
V.split(
'=');
1353 auto checkArg = [&](
bool ValidTarget,
1354 std::initializer_list<const char *>
Set) {
1356 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1357 << (Twine(
"-Wa,") +
Equal.first +
"=").str()
1358 << Triple.getTriple();
1359 }
else if (!llvm::is_contained(
Set,
Equal.second)) {
1360 D.
Diag(diag::err_drv_unsupported_option_argument)
1361 << (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
1364 if (
Equal.first ==
"-mmapsyms") {
1365 ImplicitMapSyms =
Equal.second ==
"implicit";
1366 checkArg(IsELF && Triple.isAArch64(), {
"default",
"implicit"});
1367 }
else if (
V ==
"--crel")
1369 else if (
V ==
"--no-crel")
1377 if (IsELF && !Triple.isMIPS()) {
1378 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"-crel"));
1380 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1384 if (ImplicitMapSyms)
1386 Args.MakeArgString(Twine(PluginOptPrefix) +
"-implicit-mapsyms"));
1388 if (Args.hasArg(options::OPT_ftime_report))
1390 Args.MakeArgString(Twine(PluginOptPrefix) +
"-time-passes"));
1396 const ArgList &Args,
1397 ArgStringList &CmdArgs) {
1402 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1403 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1407 ArgStringList &CmdArgs) {
1408 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1409 options::OPT_fno_rtlib_add_rpath,
false))
1421 llvm::sys::path::append(P, M.gccSuffix());
1422 CandidateRPaths.emplace_back(std::string(P));
1424 CandidateRPaths.emplace_back(*StdlibPath);
1426 for (
const auto &CandidateRPath : CandidateRPaths) {
1427 if (TC.
getVFS().exists(CandidateRPath)) {
1428 CmdArgs.push_back(
"-rpath");
1429 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1435 const ToolChain &TC,
const ArgList &Args,
1436 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1438 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1439 options::OPT_fno_openmp,
false)) {
1441 if (Args.hasFlag(options::OPT_foffload_via_llvm,
1442 options::OPT_fno_offload_via_llvm,
false))
1443 CmdArgs.push_back(
"-lomptarget");
1453 if (ForceStaticHostRuntime)
1454 CmdArgs.push_back(
"-Bstatic");
1458 CmdArgs.push_back(
"-lomp");
1461 CmdArgs.push_back(
"-lgomp");
1464 CmdArgs.push_back(
"-liomp5");
1470 if (ForceStaticHostRuntime)
1471 CmdArgs.push_back(
"-Bdynamic");
1474 CmdArgs.push_back(
"-lrt");
1476 if (IsOffloadingHost)
1477 CmdArgs.push_back(
"-lomptarget");
1488 const llvm::opt::ArgList &Args,
1489 llvm::opt::ArgStringList &CmdArgs) {
1495 constexpr llvm::StringLiteral Targets(
"--offload-targets=");
1499 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1500 [](
auto TC) { return TC.second->getTripleString(); });
1502 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1506 ArgStringList &CmdArgs, StringRef Sanitizer,
1507 bool IsShared,
bool IsWhole) {
1510 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1513 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1523 ArgStringList &CmdArgs,
1524 StringRef Sanitizer) {
1529 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1532 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1533 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1540 const llvm::opt::ArgList &Args,
1541 llvm::opt::ArgStringList &CmdArgs,
1544 "AIX linker does not support any form of --as-needed option yet.");
1552 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1553 CmdArgs.push_back(
"-z");
1554 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1556 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1561 const llvm::opt::ArgList &Args,
1562 ArgStringList &CmdArgs) {
1567 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1569 CmdArgs.push_back(
"-lpthread");
1571 CmdArgs.push_back(
"-lrt");
1573 CmdArgs.push_back(
"-lm");
1578 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1579 CmdArgs.push_back(
"-ldl");
1583 CmdArgs.push_back(
"-lexecinfo");
1585 CmdArgs.push_back(
"-lbsd");
1591 CmdArgs.push_back(
"-lresolv");
1601 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1606 SharedRuntimes.push_back(
"asan");
1607 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1608 HelperStaticRuntimes.push_back(
"asan-preinit");
1611 SharedRuntimes.push_back(
"memprof");
1612 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1613 HelperStaticRuntimes.push_back(
"memprof-preinit");
1616 SharedRuntimes.push_back(
"nsan");
1619 SharedRuntimes.push_back(
"ubsan_minimal");
1621 SharedRuntimes.push_back(
"ubsan_standalone");
1624 SharedRuntimes.push_back(
"scudo_standalone");
1627 SharedRuntimes.push_back(
"tsan");
1629 SharedRuntimes.push_back(
"tysan");
1632 SharedRuntimes.push_back(
"hwasan_aliases");
1634 SharedRuntimes.push_back(
"hwasan");
1635 if (!Args.hasArg(options::OPT_shared))
1636 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1639 SharedRuntimes.push_back(
"rtsan");
1644 StaticRuntimes.push_back(
"stats_client");
1648 HelperStaticRuntimes.push_back(
"asan_static");
1651 if (Args.hasArg(options::OPT_shared)) {
1660 StaticRuntimes.push_back(
"asan");
1662 StaticRuntimes.push_back(
"asan_cxx");
1667 StaticRuntimes.push_back(
"rtsan");
1670 StaticRuntimes.push_back(
"memprof");
1672 StaticRuntimes.push_back(
"memprof_cxx");
1677 StaticRuntimes.push_back(
"hwasan_aliases");
1679 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1681 StaticRuntimes.push_back(
"hwasan");
1683 StaticRuntimes.push_back(
"hwasan_cxx");
1687 StaticRuntimes.push_back(
"dfsan");
1689 StaticRuntimes.push_back(
"lsan");
1691 StaticRuntimes.push_back(
"msan");
1693 StaticRuntimes.push_back(
"msan_cxx");
1696 StaticRuntimes.push_back(
"nsan");
1698 StaticRuntimes.push_back(
"tsan");
1700 StaticRuntimes.push_back(
"tsan_cxx");
1703 StaticRuntimes.push_back(
"tysan");
1706 StaticRuntimes.push_back(
"ubsan_minimal");
1708 StaticRuntimes.push_back(
"ubsan_standalone");
1712 NonWholeStaticRuntimes.push_back(
"safestack");
1713 RequiredSymbols.push_back(
"__safestack_init");
1717 StaticRuntimes.push_back(
"cfi");
1719 StaticRuntimes.push_back(
"cfi_diag");
1724 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1727 NonWholeStaticRuntimes.push_back(
"stats");
1728 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1731 StaticRuntimes.push_back(
"scudo_standalone");
1733 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1736 NonWholeStaticRuntimes.push_back(
"ubsan_loop_detect");
1742 ArgStringList &CmdArgs) {
1745 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1748 NonWholeStaticRuntimes, HelperStaticRuntimes,
1753 for (
auto S : RequiredSymbols) {
1754 CmdArgs.push_back(
"-u");
1755 CmdArgs.push_back(Args.MakeArgString(S));
1759 for (
auto RT : SharedRuntimes)
1763 bool FuzzerNeedsSanitizerDeps =
false;
1765 !Args.hasArg(options::OPT_shared)) {
1768 FuzzerNeedsSanitizerDeps =
true;
1772 if (!Args.hasArg(options::OPT_nostdlibxx)) {
1773 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1774 !Args.hasArg(options::OPT_static);
1775 if (OnlyLibstdcxxStatic)
1776 CmdArgs.push_back(
"-Bstatic");
1778 if (OnlyLibstdcxxStatic)
1779 CmdArgs.push_back(
"-Bdynamic");
1783 for (
auto RT : HelperStaticRuntimes)
1785 bool AddExportDynamic =
false;
1786 for (
auto RT : StaticRuntimes) {
1790 for (
auto RT : NonWholeStaticRuntimes) {
1796 if (AddExportDynamic && !TC.
getTriple().isNVPTX())
1797 CmdArgs.push_back(
"--export-dynamic");
1800 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1803 CmdArgs.push_back(
"-z");
1805 Args.MakeArgString(
"memtag-mode=" + SanArgs.
getMemtagMode()));
1808 CmdArgs.push_back(
"-z");
1809 CmdArgs.push_back(
"memtag-heap");
1813 CmdArgs.push_back(
"-z");
1814 CmdArgs.push_back(
"memtag-stack");
1818 CmdArgs.push_back(
"--android-memtag-note");
1821 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty() ||
1822 FuzzerNeedsSanitizerDeps;
1827 if (Args.hasArg(options::OPT_shared)) {
1829 CmdArgs.push_back(
"--whole-archive");
1831 CmdArgs.push_back(
"--no-whole-archive");
1835 CmdArgs.push_back(
"--whole-archive");
1837 for (
const auto &Mode : XRay.
modeList())
1839 CmdArgs.push_back(
"--no-whole-archive");
1847 const llvm::opt::ArgList &Args,
1848 ArgStringList &CmdArgs) {
1850 CmdArgs.push_back(
"-lpthread");
1852 CmdArgs.push_back(
"-lrt");
1853 CmdArgs.push_back(
"-lm");
1858 CmdArgs.push_back(
"-ldl");
1863 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1864 return !A->getOption().matches(options::OPT_O0);
1872 auto AddPostfix = [JA](
auto &F) {
1877 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1878 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1882 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1885 if (Args.hasArg(options::OPT_o, options::OPT__SLASH_o,
1886 options::OPT__SLASH_Fo) &&
1887 Args.hasArg(options::OPT_c) && Output.
isFilename()) {
1891 llvm::sys::path::remove_filename(T);
1892 llvm::sys::path::append(T, llvm::sys::path::stem(Obj));
1894 return Args.MakeArgString(T);
1900 return Args.MakeArgString(T);
1904 const JobAction &JA,
const ArgList &Args,
1905 const InputInfo &Output,
const char *OutFile) {
1906 ArgStringList ExtractArgs;
1907 ExtractArgs.push_back(
"--extract-dwo");
1909 ArgStringList StripArgs;
1910 StripArgs.push_back(
"--strip-dwo");
1915 ExtractArgs.push_back(OutFile);
1922 C.addCommand(std::make_unique<Command>(JA, T,
1924 Exec, ExtractArgs, II, Output));
1927 C.addCommand(std::make_unique<Command>(
1937 Args.ClaimAllArgs(options::OPT_flto_EQ);
1938 Args.ClaimAllArgs(options::OPT_flto);
1939 Args.ClaimAllArgs(options::OPT_fno_lto);
1943 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1944 options::OPT_fcs_profile_generate_EQ,
1945 options::OPT_fno_profile_generate);
1946 if (CSPGOGenerateArg &&
1947 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1948 CSPGOGenerateArg =
nullptr;
1950 return CSPGOGenerateArg;
1954 auto *ProfileUseArg = Args.getLastArg(
1955 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1956 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1957 options::OPT_fno_profile_instr_use);
1959 if (ProfileUseArg &&
1960 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1961 ProfileUseArg =
nullptr;
1963 return ProfileUseArg;
1967 auto *ProfileSampleUseArg = Args.getLastArg(
1968 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
1970 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
1971 options::OPT_fno_profile_sample_use)))
1974 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
1979 case llvm::Reloc::Static:
1981 case llvm::Reloc::PIC_:
1983 case llvm::Reloc::DynamicNoPIC:
1984 return "dynamic-no-pic";
1985 case llvm::Reloc::ROPI:
1987 case llvm::Reloc::RWPI:
1989 case llvm::Reloc::ROPI_RWPI:
1992 llvm_unreachable(
"Unknown Reloc::Model kind");
1999std::tuple<llvm::Reloc::Model, unsigned, bool>
2007 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
2009 bool IsPICLevelTwo = PIC;
2012 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
2015 if (Triple.isAndroid()) {
2016 switch (Triple.getArch()) {
2017 case llvm::Triple::x86:
2018 case llvm::Triple::x86_64:
2020 IsPICLevelTwo =
true;
2030 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
2034 if (Triple.isOSOpenBSD()) {
2036 case llvm::Triple::arm:
2037 case llvm::Triple::aarch64:
2038 case llvm::Triple::mips64:
2039 case llvm::Triple::mips64el:
2040 case llvm::Triple::x86:
2041 case llvm::Triple::x86_64:
2042 IsPICLevelTwo =
false;
2045 case llvm::Triple::ppc:
2046 case llvm::Triple::sparcv9:
2047 IsPICLevelTwo =
true;
2059 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2060 options::OPT_fpic, options::OPT_fno_pic,
2061 options::OPT_fPIE, options::OPT_fno_PIE,
2062 options::OPT_fpie, options::OPT_fno_pie);
2063 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
2064 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
2065 options::OPT_fPIE, options::OPT_fpie)) {
2067 << LastPICArg->getSpelling() << Triple.str();
2068 if (Triple.getArch() == llvm::Triple::x86_64)
2069 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
2070 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2077 Option O = LastPICArg->getOption();
2078 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2079 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2080 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2082 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2084 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
2087 if (EffectiveTriple.isPS()) {
2088 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
2089 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
2090 if (Model !=
"kernel") {
2093 << LastPICArg->getSpelling()
2094 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
2104 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
2110 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
2111 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
2114 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2117 if (!Triple.isOSDarwin())
2119 << A->getSpelling() << Triple.str();
2128 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
2131 bool EmbeddedPISupported;
2132 switch (Triple.getArch()) {
2133 case llvm::Triple::arm:
2134 case llvm::Triple::armeb:
2135 case llvm::Triple::thumb:
2136 case llvm::Triple::thumbeb:
2137 EmbeddedPISupported =
true;
2140 EmbeddedPISupported =
false;
2144 bool ROPI =
false, RWPI =
false;
2145 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
2146 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
2147 if (!EmbeddedPISupported)
2149 << LastROPIArg->getSpelling() << Triple.str();
2152 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2153 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2154 if (!EmbeddedPISupported)
2156 << LastRWPIArg->getSpelling() << Triple.str();
2161 if ((ROPI || RWPI) && (PIC || PIE))
2164 if (Triple.isMIPS()) {
2171 if (ABIName ==
"n64")
2174 if(Args.hasArg(options::OPT_mno_abicalls))
2175 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2178 IsPICLevelTwo =
false;
2182 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2184 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2186 RelocM = llvm::Reloc::ROPI_RWPI;
2188 RelocM = llvm::Reloc::ROPI;
2190 RelocM = llvm::Reloc::RWPI;
2192 return std::make_tuple(RelocM, 0
U,
false);
2196 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
2197 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
2199 const llvm::opt::OptTable &Opts = D.
getOpts();
2200 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
2201 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
2202 D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
2204 return HasStaticPIE;
2224 const ArgList &Args) {
2225 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2226 options::OPT_falign_functions_EQ,
2227 options::OPT_fno_align_functions);
2228 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2231 if (A->getOption().matches(options::OPT_falign_functions))
2235 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2237 << A->getAsString(Args) << A->getValue();
2242 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2243 switch (DebugInfoKind) {
2244 case llvm::codegenoptions::DebugDirectivesOnly:
2245 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2247 case llvm::codegenoptions::DebugLineTablesOnly:
2248 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2250 case llvm::codegenoptions::DebugInfoConstructor:
2251 CmdArgs.push_back(
"-debug-info-kind=constructor");
2253 case llvm::codegenoptions::LimitedDebugInfo:
2254 CmdArgs.push_back(
"-debug-info-kind=limited");
2256 case llvm::codegenoptions::FullDebugInfo:
2257 CmdArgs.push_back(
"-debug-info-kind=standalone");
2259 case llvm::codegenoptions::UnusedTypeInfo:
2260 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2270 assert(A.getOption().matches(options::OPT_gN_Group) &&
2271 "Not a -g option that specifies a debug-info level");
2272 if (A.getOption().matches(options::OPT_g0) ||
2273 A.getOption().matches(options::OPT_ggdb0))
2274 return llvm::codegenoptions::NoDebugInfo;
2275 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2276 A.getOption().matches(options::OPT_ggdb1))
2277 return llvm::codegenoptions::DebugLineTablesOnly;
2278 if (A.getOption().matches(options::OPT_gline_directives_only))
2279 return llvm::codegenoptions::DebugDirectivesOnly;
2280 return llvm::codegenoptions::DebugInfoConstructor;
2284 const ArgList &Args) {
2285 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2291 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 6 ||
2294 << A->getAsString(Args) << A->getValue();
2299 return llvm::StringSwitch<unsigned>(ArgValue)
2300 .Case(
"-gdwarf-2", 2)
2301 .Case(
"-gdwarf-3", 3)
2302 .Case(
"-gdwarf-4", 4)
2303 .Case(
"-gdwarf-5", 5)
2304 .Case(
"-gdwarf-6", 6)
2309 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2310 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2311 options::OPT_gdwarf_6, options::OPT_gdwarf);
2315 const llvm::opt::ArgList &Args) {
2320 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2321 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2322 << GDwarfN->getSpelling() << TC.
getTriple().str();
2324 if (DwarfVersion == 0) {
2326 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2328 return DwarfVersion;
2332 const ArgList &Args, Arg *&Arg) {
2333 Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
2334 options::OPT_gno_split_dwarf);
2335 if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
2338 if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
2341 StringRef
Value = Arg->getValue();
2342 if (
Value ==
"split")
2344 if (
Value ==
"single")
2347 D.
Diag(diag::err_drv_unsupported_option_argument)
2348 << Arg->getSpelling() << Arg->getValue();
2354 assert(A &&
"Expected non-nullptr argument.");
2357 D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
2363 const ArgList &Args,
2364 ArgStringList &CmdArgs) {
2365 if (Args.hasFlag(options::OPT_fdebug_info_for_profiling,
2366 options::OPT_fno_debug_info_for_profiling,
false) &&
2368 Args.getLastArg(options::OPT_fdebug_info_for_profiling), Args, D, TC))
2369 CmdArgs.push_back(
"-fdebug-info-for-profiling");
2373 ArgStringList &CmdArgs) {
2374 llvm::Reloc::Model RelocationModel;
2379 if (RelocationModel != llvm::Reloc::Static)
2380 CmdArgs.push_back(
"-KPIC");
2386 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2392 const ArgList &Args) {
2393 if (Args.hasArg(options::OPT_static_libgcc) ||
2394 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2398 if (Args.hasArg(options::OPT_shared_libgcc))
2417 ArgStringList &CmdArgs,
const ArgList &Args) {
2421 CmdArgs.push_back(
"-l:libunwind.a");
2444 CmdArgs.push_back(
"-lgcc_eh");
2446 CmdArgs.push_back(
"-lgcc_s");
2454 CmdArgs.push_back(
"-lunwind");
2456 CmdArgs.push_back(
"-l:libunwind.a");
2459 CmdArgs.push_back(
"-l:libunwind.dll.a");
2461 CmdArgs.push_back(
"-l:libunwind.so");
2465 CmdArgs.push_back(
"-lunwind");
2475 ArgStringList &CmdArgs,
const ArgList &Args) {
2479 CmdArgs.push_back(
"-lgcc");
2483 CmdArgs.push_back(
"-lgcc");
2487 CmdArgs.push_back(
"--as-needed");
2489 CmdArgs.push_back(
"--no-as-needed");
2494 ArgStringList &CmdArgs,
const ArgList &Args) {
2505 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2508 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2509 if (A && A->getValue() != StringRef(
"platform")) {
2510 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2511 << A->getValue() <<
"MSVC";
2521 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2522 !Args.hasArg(options::OPT_static_pie))
2523 CmdArgs.push_back(
"-ldl");
2530 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2536 StringRef SaveStats = A->getValue();
2537 if (SaveStats ==
"obj" && Output.
isFilename()) {
2539 llvm::sys::path::remove_filename(StatsFile);
2540 }
else if (SaveStats !=
"cwd") {
2541 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2545 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2546 llvm::sys::path::append(StatsFile, BaseName);
2547 llvm::sys::path::replace_extension(StatsFile,
"stats");
2559 assert(Flag.front() ==
'-');
2561 Flags.push_back(Flag.str());
2563 Flags.push_back((
"!" + Flag.substr(1)).str());
2568 ArgStringList &CmdArgs,
bool IsLTO,
2569 const StringRef PluginOptPrefix) {
2570 auto addArg = [&, IsLTO](
const Twine &Arg) {
2572 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2573 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2575 CmdArgs.push_back(
"-mllvm");
2576 CmdArgs.push_back(Args.MakeArgString(Arg));
2580 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2581 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2583 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2584 StringRef
Value = A->getValue();
2586 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2587 !llvm::isPowerOf2_64(Boundary)) {
2588 D.
Diag(diag::err_drv_invalid_argument_to_option)
2589 <<
Value << A->getOption().getName();
2591 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2594 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2595 std::string AlignBranch;
2596 for (StringRef T : A->getValues()) {
2597 if (T !=
"fused" && T !=
"jcc" && T !=
"jmp" && T !=
"call" &&
2598 T !=
"ret" && T !=
"indirect")
2599 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2600 << T <<
"fused, jcc, jmp, call, ret, indirect";
2601 if (!AlignBranch.empty())
2605 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2607 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2608 StringRef
Value = A->getValue();
2609 unsigned PrefixSize;
2610 if (
Value.getAsInteger(10, PrefixSize)) {
2611 D.
Diag(diag::err_drv_invalid_argument_to_option)
2612 <<
Value << A->getOption().getName();
2614 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2640 llvm::opt::ArgStringList &CC1Args,
2642 StringRef Lib, StringRef
Arch, StringRef
Target,
2643 bool isBitCodeSDL) {
2646 std::string LibDeviceLoc =
"/libdevice";
2647 std::string LibBcPrefix =
"/libbc-";
2648 std::string LibPrefix =
"/lib";
2665 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2666 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2668 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2669 Twine(Lib +
"-" +
Arch).str(), Twine(Lib).str()}) {
2670 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2671 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2681 const auto *Ext =
".a";
2683 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2684 Twine(Lib +
"-" +
Arch).str()}) {
2685 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2686 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2697 bool FoundSDL =
false;
2698 for (
auto LPath : LibraryPaths) {
2699 for (
auto SDL : SDLs) {
2700 auto FullName = Twine(LPath + SDL).str();
2701 if (llvm::sys::fs::exists(FullName)) {
2702 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2719 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2720 llvm::opt::ArgStringList &CC1Args,
2722 StringRef
Arch, StringRef
Target,
bool isBitCodeSDL) {
2725 if (isBitCodeSDL &&
Arch.contains(
"nvptx"))
2728 bool FoundAOB =
false;
2729 std::string ArchiveOfBundles;
2732 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2733 auto Ext = IsMSVC ?
".lib" :
".a";
2734 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2735 if (llvm::sys::fs::exists(Lib)) {
2736 ArchiveOfBundles = Lib;
2740 Lib.consume_front(
"-l");
2741 for (
auto LPath : LibraryPaths) {
2742 ArchiveOfBundles.clear();
2743 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2744 : IsMSVC ? Lib + Ext
2745 :
"lib" + Lib + Ext)
2747 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2748 auto AOB = Twine(LPath + Prefix + LibFile).str();
2749 if (llvm::sys::fs::exists(AOB)) {
2750 ArchiveOfBundles = AOB;
2763 llvm::file_magic Magic;
2764 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2765 if (EC || Magic != llvm::file_magic::archive)
2768 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2769 std::string OutputLib =
2775 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2779 DeviceTriple +=
'-';
2780 std::string NormalizedTriple = T.getToolChain().getTriple().normalize(
2781 llvm::Triple::CanonicalForm::FOUR_IDENT);
2782 DeviceTriple += NormalizedTriple;
2784 DeviceTriple +=
'-';
2788 std::string UnbundleArg(
"-unbundle");
2789 std::string TypeArg(
"-type=a");
2790 std::string InputArg(
"-input=" + ArchiveOfBundles);
2791 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2792 std::string OutputArg(
"-output=" + OutputLib);
2794 const char *UBProgram = DriverArgs.MakeArgString(
2795 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2797 ArgStringList UBArgs;
2798 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2799 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2800 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2801 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2802 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2806 std::string AdditionalArgs(
"-allow-missing-bundles");
2807 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2812 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2813 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2815 C.addCommand(std::make_unique<Command>(
2817 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2819 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2826 const llvm::opt::ArgList &DriverArgs,
2827 llvm::opt::ArgStringList &CC1Args,
2829 bool isBitCodeSDL) {
2860 const llvm::opt::ArgList &DriverArgs,
2861 llvm::opt::ArgStringList &CC1Args,
2863 bool isBitCodeSDL) {
2867 std::optional<std::string> LibPath =
2868 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2871 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2872 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2873 for (StringRef Path : Frags)
2874 LibraryPaths.emplace_back(Path.trim());
2878 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2879 LibraryPaths.emplace_back(Search_Dir);
2883 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2884 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2887 llvm::SmallSet<std::string, 16> SDLNames;
2888 static const StringRef HostOnlyArchives[] = {
2889 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2890 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2891 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2892 SDLNames.insert(std::string(
"-l") + SDLName);
2896 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2903 const StringRef LibFileExt =
".lib";
2904 if (!llvm::sys::path::has_extension(
FileName) ||
2906 llvm::sys::path::extension(
FileName).drop_front()) ==
2908 llvm::sys::path::extension(
FileName) == LibFileExt)
2909 SDLNames.insert(Input);
2916 for (
auto SDLName : SDLNames) {
2927static llvm::opt::Arg *
2929 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2933 const llvm::opt::ArgList &Args) {
2934 const unsigned MinCodeObjVer = 4;
2935 const unsigned MaxCodeObjVer = 6;
2938 if (CodeObjArg->getOption().getID() ==
2939 options::OPT_mcode_object_version_EQ) {
2940 unsigned CodeObjVer = MaxCodeObjVer;
2942 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2943 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2944 D.
Diag(diag::err_drv_invalid_int_value)
2945 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2951 const llvm::opt::ArgList &Args) {
2952 unsigned CodeObjVer = 6;
2954 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2959 const Driver &D,
const llvm::opt::ArgList &Args) {
2964 const llvm::opt::ArgList &Args,
2965 llvm::opt::ArgStringList &CmdArgs,
2966 const llvm::Triple &Triple,
bool IsLTO,
2967 const StringRef PluginOptPrefix) {
2968 auto addArg = [&, IsLTO](
const Twine &Arg) {
2970 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2971 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2973 CmdArgs.push_back(
"-mllvm");
2974 CmdArgs.push_back(Args.MakeArgString(Arg));
2978 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2979 options::OPT_mno_outline)) {
2980 if (A->getOption().matches(options::OPT_moutline)) {
2984 if (Triple.isARM() || Triple.isThumb() || Triple.isAArch64() ||
2985 Triple.isRISCV() || Triple.isX86()) {
2986 addArg(Twine(
"-enable-machine-outliner"));
2988 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2994 CmdArgs.push_back(
"-mno-outline");
2997 addArg(Twine(
"-enable-machine-outliner=never"));
3001 auto *CodeGenDataGenArg =
3002 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
3003 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
3006 if (CodeGenDataGenArg && CodeGenDataUseArg)
3007 D.
Diag(diag::err_drv_argument_not_allowed_with)
3008 << CodeGenDataGenArg->getAsString(Args)
3009 << CodeGenDataUseArg->getAsString(Args);
3013 if (CodeGenDataGenArg)
3014 addArg(Twine(
"-codegen-data-generate"));
3017 if (CodeGenDataUseArg)
3018 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
3022 const llvm::opt::ArgList &DriverArgs,
3023 llvm::opt::ArgStringList &CC1Args,
3024 StringRef BitcodeSuffix,
3025 const llvm::Triple &Triple,
3030 std::optional<std::string> LibPath =
3031 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
3034 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
3035 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
3036 for (StringRef Path : Frags)
3037 LibraryPaths.emplace_back(Path.trim());
3042 LibraryPaths.emplace_back(LibPath);
3046 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
3047 LibraryPaths.emplace_back(P);
3049 OptSpecifier LibomptargetBCPathOpt =
3050 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
3051 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
3052 : options::OPT_libomptarget_spirv_bc_path_EQ;
3054 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
3055 : Triple.isNVPTX() ?
"nvptx"
3057 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
3060 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
3062 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
3063 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
3064 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3067 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3068 CC1Args.push_back(
"-mlink-builtin-bitcode");
3069 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3071 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
3072 << LibOmpTargetFile;
3075 bool FoundBCLibrary =
false;
3077 for (StringRef LibraryPath : LibraryPaths) {
3079 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3080 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3081 CC1Args.push_back(
"-mlink-builtin-bitcode");
3082 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3083 FoundBCLibrary =
true;
3088 if (!FoundBCLibrary)
3089 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
3090 << LibOmpTargetName << ArchPrefix;
3095 const llvm::opt::ArgList &DriverArgs,
3096 llvm::opt::ArgStringList &CC1Args) {
3098 StringRef LibclcNamespec;
3099 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
3102 LibclcNamespec = A->getValue();
3104 if (!TT.isAMDGPU() || TT.getEnvironment() != llvm::Triple::LLVM)
3108 if (DriverArgs.hasArg(options::OPT_no_offloadlib,
3109 options::OPT_nodefaultlibs, options::OPT_nostdlib))
3113 bool FilenameSearch = LibclcNamespec.consume_front(
":");
3114 if (FilenameSearch) {
3116 if (D.
getVFS().exists(LibclcFile)) {
3117 CC1Args.push_back(
"-mlink-builtin-bitcode");
3118 CC1Args.push_back(DriverArgs.MakeArgString(LibclcFile));
3121 D.
Diag(diag::err_drv_libclc_not_found) << LibclcFile;
3127 llvm::sys::path::append(BasePath,
"lib");
3132 if (
const Arg *CPUArg = DriverArgs.getLastArg(options::OPT_mcpu_EQ)) {
3133 StringRef CPU = CPUArg->getValue();
3136 llvm::sys::path::append(CPUPath, CPU,
"libclc.bc");
3137 if (D.
getVFS().exists(CPUPath)) {
3138 CC1Args.push_back(
"-mlink-builtin-bitcode");
3139 CC1Args.push_back(DriverArgs.MakeArgString(CPUPath));
3147 llvm::sys::path::append(GenericPath,
"libclc.bc");
3148 if (D.
getVFS().exists(GenericPath)) {
3149 CC1Args.push_back(
"-mlink-builtin-bitcode");
3150 CC1Args.push_back(DriverArgs.MakeArgString(GenericPath));
3154 D.
Diag(diag::err_drv_libclc_not_found) <<
"libclc.bc";
3158 const llvm::opt::ArgList &Args,
3159 llvm::opt::ArgStringList &CmdArgs,
3160 const llvm::Triple &Triple) {
3161 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3162 options::OPT_mno_outline_atomics)) {
3164 if (!Triple.isAArch64()) {
3165 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3166 << Triple.getArchName() << A->getOption().getName();
3168 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3169 CmdArgs.push_back(
"-target-feature");
3170 CmdArgs.push_back(
"+outline-atomics");
3172 CmdArgs.push_back(
"-target-feature");
3173 CmdArgs.push_back(
"-outline-atomics");
3177 CmdArgs.push_back(
"-target-feature");
3178 CmdArgs.push_back(
"+outline-atomics");
3183 llvm::opt::ArgStringList &CmdArgs) {
3184 if (TCArgs.hasFlag(options::OPT_offload_compress,
3185 options::OPT_no_offload_compress,
false))
3186 CmdArgs.push_back(
"--compress");
3187 if (TCArgs.hasArg(options::OPT_v))
3188 CmdArgs.push_back(
"--verbose");
3189 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3191 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3195 const llvm::Triple &Triple,
3196 const llvm::Reloc::Model &RelocationModel,
3197 llvm::opt::ArgStringList &CmdArgs) {
3198 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3199 StringRef CM = A->getValue();
3201 if (Triple.isOSAIX() && CM ==
"medium")
3203 if (Triple.isAArch64(64)) {
3204 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3205 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3206 RelocationModel != llvm::Reloc::Static)
3207 D.
Diag(diag::err_drv_argument_only_allowed_with)
3208 << A->getAsString(Args) <<
"-fno-pic";
3209 }
else if (Triple.isLoongArch()) {
3210 if (CM ==
"extreme" &&
3211 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3212 D.
Diag(diag::err_drv_argument_not_allowed_with)
3213 << A->getAsString(Args) <<
"-fplt";
3214 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3217 CM = llvm::StringSwitch<StringRef>(CM)
3218 .Case(
"normal",
"small")
3219 .Case(
"extreme",
"large")
3221 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3222 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3223 }
else if (Triple.isRISCV()) {
3225 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3226 D.
Diag(diag::err_drv_argument_not_allowed_with)
3227 << A->getAsString(Args) <<
"-fpic";
3230 else if (CM ==
"medany")
3232 Ok = CM ==
"small" || CM ==
"medium" ||
3233 (CM ==
"large" && Triple.isRISCV64());
3234 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3235 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3236 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3240 }
else if (Triple.isSPARC64()) {
3243 else if (CM ==
"medmid")
3245 else if (CM ==
"medany")
3247 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3248 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3249 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3252 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3254 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3255 << A->getSpelling() << CM << Triple.getTriple();
3259 if (Triple.getArch() == llvm::Triple::x86_64) {
3260 bool IsMediumCM =
false;
3261 bool IsLargeCM =
false;
3262 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3263 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3264 IsLargeCM = StringRef(A->getValue()) ==
"large";
3266 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3267 if (!IsMediumCM && !IsLargeCM) {
3268 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3269 << A->getOption().getRenderName();
3271 A->render(Args, CmdArgs);
3273 }
else if (IsMediumCM) {
3274 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3275 }
else if (IsLargeCM) {
3276 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3282 ArgStringList &CmdArgs) {
3287 Args.getLastArg(options::OPT_fcolor_diagnostics,
3288 options::OPT_fno_color_diagnostics);
3289 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3290 StringRef
Value(A->getValue());
3292 D.
Diag(diag::err_drv_invalid_argument_to_option)
3293 <<
Value << A->getOption().getName();
3297 CmdArgs.push_back(
"-fcolor-diagnostics");
3302 for (; *Arg; ++Arg) {
3308 Res.push_back(
'\\');
3311 Res.push_back(*Arg);
3316 const llvm::opt::ArgList &Args) {
3320 llvm::opt::ArgStringList OriginalArgs;
3321 for (
const auto &Arg : Args)
3322 Arg->render(Args, OriginalArgs);
3326 for (
const char *OriginalArg : OriginalArgs) {
3330 Flags += EscapedArg;
3333 return Args.MakeArgString(Flags);
3337 const llvm::opt::ArgList &Args,
3338 bool &FRecordCommandLine,
3339 bool &GRecordCommandLine) {
3342 const std::string &TripleStr = Triple.getTriple();
3344 FRecordCommandLine =
3345 Args.hasFlag(options::OPT_frecord_command_line,
3346 options::OPT_fno_record_command_line,
false);
3347 GRecordCommandLine =
3348 Args.hasFlag(options::OPT_grecord_command_line,
3349 options::OPT_gno_record_command_line,
false);
3350 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3351 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3352 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3353 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3360 ArgStringList &CmdArgs,
3361 const llvm::Triple &Triple) {
3362 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
3363 options::OPT_fno_global_isel)) {
3364 CmdArgs.push_back(
"-mllvm");
3365 if (A->getOption().matches(options::OPT_fglobal_isel)) {
3366 CmdArgs.push_back(
"-global-isel=1");
3371 bool IsArchSupported = Triple.getArch() == llvm::Triple::aarch64;
3372 bool IsOptLevelSupported =
false;
3374 Arg *A = Args.getLastArg(options::OPT_O_Group);
3375 if (IsArchSupported) {
3376 if (!A || A->getOption().matches(options::OPT_O0))
3377 IsOptLevelSupported =
true;
3379 if (!IsArchSupported || !IsOptLevelSupported) {
3380 CmdArgs.push_back(
"-mllvm");
3381 CmdArgs.push_back(
"-global-isel-abort=2");
3383 if (!IsArchSupported)
3384 D.
Diag(diag::warn_drv_global_isel_incomplete) << Triple.getArchName();
3386 D.
Diag(diag::warn_drv_global_isel_incomplete_opt);
3389 CmdArgs.push_back(
"-global-isel=0");
3395 ArgStringList &CmdArgs,
3396 bool IsMSVCCompat) {
3397 bool use_fwrapv = IsMSVCCompat;
3398 bool use_fwrapv_pointer =
false;
3399 for (
const Arg *A : Args.filtered(
3400 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3401 options::OPT_fwrapv, options::OPT_fno_wrapv,
3402 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3404 switch (A->getOption().getID()) {
3405 case options::OPT_fstrict_overflow:
3407 use_fwrapv_pointer =
false;
3409 case options::OPT_fno_strict_overflow:
3411 use_fwrapv_pointer =
true;
3413 case options::OPT_fwrapv:
3416 case options::OPT_fno_wrapv:
3419 case options::OPT_fwrapv_pointer:
3420 use_fwrapv_pointer =
true;
3422 case options::OPT_fno_wrapv_pointer:
3423 use_fwrapv_pointer =
false;
3429 CmdArgs.push_back(
"-fwrapv");
3430 if (!use_fwrapv && IsMSVCCompat)
3431 CmdArgs.push_back(
"-fno-wrapv");
3432 if (use_fwrapv_pointer)
3433 CmdArgs.push_back(
"-fwrapv-pointer");
3440 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3441 if (A->getOption().matches(options::OPT_O4) ||
3442 A->getOption().matches(options::OPT_Ofast))
3445 if (A->getOption().matches(options::OPT_O0))
3448 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3451 StringRef S(A->getValue());
3459 unsigned OptLevel = 0;
3460 if (S.getAsInteger(10, OptLevel))
3463 return OptLevel > 1;
3470 ArgStringList &CmdArgs) {
3472 if (Args.hasFlag(options::OPT_fvectorize, options::OPT_fno_vectorize,
3474 CmdArgs.push_back(
"-vectorize-loops");
3478 ArgStringList &CmdArgs) {
3480 if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize,
3482 CmdArgs.push_back(
"-vectorize-slp");
3486 ArgStringList &CmdArgs) {
3487 if (Args.hasFlag(options::OPT_floop_interchange,
3488 options::OPT_fno_loop_interchange,
false))
3489 CmdArgs.push_back(
"-floop-interchange");
3510 llvm_unreachable(
"Fully covered switch above");
3516 if (!ComplexRangeStr.empty())
3517 return "-complex-range=" + ComplexRangeStr;
3518 return ComplexRangeStr;
3538 if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
3539 (LastOpt ==
"-fcx-limited-range" && NewOpt ==
"-fno-cx-limited-range") ||
3540 (LastOpt ==
"-fno-cx-limited-range" && NewOpt ==
"-fcx-limited-range") ||
3541 (LastOpt ==
"-fcx-fortran-rules" && NewOpt ==
"-fno-cx-fortran-rules") ||
3542 (LastOpt ==
"-fno-cx-fortran-rules" && NewOpt ==
"-fcx-fortran-rules") ||
3543 (LastOpt ==
"-ffast-math" && NewOpt ==
"-fno-fast-math") ||
3544 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-ffast-math") ||
3545 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-fno-fast-math") ||
3546 (LastOpt.starts_with(
"-ffp-model=") &&
3547 NewOpt.starts_with(
"-ffp-model=")) ||
3548 (LastOpt.starts_with(
"-fcomplex-arithmetic=") &&
3549 NewOpt.starts_with(
"-fcomplex-arithmetic=")))
3552 D.
Diag(clang::diag::warn_drv_overriding_complex_range)
3572 const ArgStringList &LinkerInputs,
3574 const llvm::opt::ArgList &Args,
3575 const char *OutputFilename) {
3579 assert(!LinkerInputs.empty() && !JobInputs.empty() &&
3580 "Must have at least one input.");
3582 ArgStringList LlvmLinkArgs(
3583 {
"-o", OutputFilename ? OutputFilename : Output.
getFilename()});
3585 LlvmLinkArgs.append(LinkerInputs);
3588 const char *LlvmLink = Args.MakeArgString(TC.
GetProgramPath(
"llvm-link"));
3590 LlvmLink, LlvmLinkArgs, JobInputs,
static bool useLeafFramePointerForTargetByDefault(const llvm::Triple &Triple)
static unsigned ParseDebugDefaultVersion(const ToolChain &TC, const ArgList &Args)
static void getWebAssemblyTargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, std::vector< StringRef > &Features)
static void emitComplexRangeDiag(const Driver &D, StringRef LastOpt, LangOptions::ComplexRangeKind Range, StringRef NewOpt, LangOptions::ComplexRangeKind NewRange)
static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer)
static bool mustMaintainValidFrameChain(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static llvm::opt::Arg * getAMDGPUCodeObjectArgument(const Driver &D, const llvm::opt::ArgList &Args)
static void collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, SmallVectorImpl< StringRef > &SharedRuntimes, SmallVectorImpl< StringRef > &StaticRuntimes, SmallVectorImpl< StringRef > &NonWholeStaticRuntimes, SmallVectorImpl< StringRef > &HelperStaticRuntimes, SmallVectorImpl< StringRef > &RequiredSymbols)
static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer, bool IsShared, bool IsWhole)
static void AddUnwindLibrary(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
static bool SDLSearch(const Driver &D, const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, const SmallVectorImpl< std::string > &LibraryPaths, StringRef Lib, StringRef Arch, StringRef Target, bool isBitCodeSDL)
SDLSearch: Search for Static Device Library The search for SDL bitcode files is consistent with how s...
static void renderRpassOptions(const ArgList &Args, ArgStringList &CmdArgs, const StringRef PluginOptPrefix)
static StringRef getWebAssemblyTargetCPU(const ArgList &Args)
Get the (LLVM) name of the WebAssembly cpu we are targeting.
static bool framePointerImpliesLeafFramePointer(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static void renderRemarksHotnessOptions(const ArgList &Args, ArgStringList &CmdArgs, const StringRef PluginOptPrefix)
static void GetSDLFromOffloadArchive(Compilation &C, const Driver &D, const Tool &T, const JobAction &JA, const InputInfoList &Inputs, const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, const SmallVectorImpl< std::string > &LibraryPaths, StringRef Lib, StringRef Arch, StringRef Target, bool isBitCodeSDL)
Search if a user provided archive file lib<libname>.a exists in any of the library paths.
static std::string getLanaiTargetCPU(const ArgList &Args)
static void renderRemarksOptions(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple, const InputInfo &Input, const InputInfo &Output, const StringRef PluginOptPrefix)
static bool useFramePointerForTargetByDefault(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static void AddLibgcc(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
static LibGccType getLibGccType(const ToolChain &TC, const Driver &D, const ArgList &Args)
clang::CodeGenOptions::FramePointerKind getFramePointerKind(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static std::string getAMDGPUTargetGPU(const llvm::Triple &T, const ArgList &Args)
Get the (LLVM) name of the AMDGPU gpu we are targeting.
static bool mustUseNonLeafFramePointerForTarget(const llvm::Triple &Triple)
static bool shouldIgnoreUnsupportedTargetFeature(const Arg &TargetFeatureArg, llvm::Triple T, StringRef Processor)
llvm::MachO::Target Target
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
ComplexRangeKind
Controls the various implementations for complex multiplication and.
@ CX_Full
Implementation of complex division and multiplication using a call to runtime library functions(gener...
@ CX_Basic
Implementation of complex division and multiplication using algebraic formulas at source precision.
@ CX_Promoted
Implementation of complex division using algebraic formulas at higher precision.
@ CX_None
No range rule is enabled.
@ CX_Improved
Implementation of complex division offering an improved handling for overflow in intermediate calcula...
const char * getOffloadingArch() const
static StringRef GetOffloadKindName(OffloadKind Kind)
Return a string containing a offload kind name.
OffloadKind getOffloadingDeviceKind() const
bool isHostOffloading(unsigned int OKind) const
Check if this action have any offload kinds.
Compilation - A set of tasks to perform for a single driver invocation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
std::string CCPrintInternalStatReportFilename
The file to log CC_PRINT_INTERNAL_STAT_FILE output to, if enabled.
DiagnosticsEngine & getDiags() const
const char * getPrependArg() const
OpenMPRuntimeKind getOpenMPRuntime(const llvm::opt::ArgList &Args) const
Compute the desired OpenMP runtime from the flags provided.
const char * getClangProgramPath() const
Get the path to the main clang executable.
DiagnosticBuilder Diag(unsigned DiagID) const
unsigned CCPrintInternalStats
Set CC_PRINT_INTERNAL_STAT mode, which causes the driver to dump internal performance report to CC_PR...
const llvm::opt::OptTable & getOpts() const
std::string ResourceDir
The path to the compiler resource directory.
llvm::vfs::FileSystem & getVFS() const
std::string GetTemporaryPath(StringRef Prefix, StringRef Suffix) const
GetTemporaryPath - Return the pathname of a temporary file to use as part of compilation; the file wi...
std::string Dir
The path the driver executable was in, as invoked from the command line.
@ OMPRT_IOMP5
The legacy name for the LLVM OpenMP runtime from when it was the Intel OpenMP runtime.
@ OMPRT_OMP
The LLVM OpenMP runtime.
@ OMPRT_Unknown
An unknown OpenMP runtime.
@ OMPRT_GOMP
The GNU OpenMP runtime.
std::string getTargetTriple() const
bool IsFlangMode() const
Whether the driver should invoke flang for fortran inputs.
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
This corresponds to a single GCC Multilib, or a segment of one controlled by a command line flag.
std::vector< std::string > flags_list
bool needsFuzzerInterceptors() const
bool needsHwasanAliasesRt() const
bool needsStatsRt() const
bool needsMemProfRt() const
bool linkRuntimes() const
bool needsUbsanLoopDetectRt() const
bool needsUbsanRt() const
bool needsHwasanRt() const
bool hasCrossDsoCfi() const
bool needsCfiCrossDsoDiagRt() const
bool hasMemtagHeap() const
bool needsSafeStackRt() const
bool needsRtsanRt() const
bool requiresMinimalRuntime() const
bool hasMemtagStack() const
bool needsDfsanRt() const
bool needsScudoRt() const
bool needsUbsanCXXRt() const
bool needsCfiCrossDsoRt() const
const std::string & getMemtagMode() const
bool needsSharedRt() const
bool needsTysanRt() const
bool linkCXXRuntimes() const
bool needsXRayDSORt() const
llvm::ArrayRef< std::string > modeList() const
bool isLLVMIR(ID Id)
Is this LLVM IR.
ID lookupTypeForExtension(llvm::StringRef Ext)
lookupTypeForExtension - Lookup the type to use for the file extension Ext.
SmallVector< InputInfo, 4 > InputInfoList
bool willEmitRemarks(const llvm::opt::ArgList &Args)
The JSON file list parser is used to communicate input to InstallAPI.
llvm::StringRef getProcessorFromTargetID(const llvm::Triple &T, llvm::StringRef OffloadArch)
Get processor name from target ID.
unsigned getOptimizationLevel(const llvm::opt::ArgList &Args, InputKind IK, DiagnosticsEngine &Diags)
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
static constexpr ResponseFileSupport AtFileCurCP()