28#include "clang/Config/config.h"
39#include "llvm/ADT/STLExtras.h"
40#include "llvm/ADT/SmallSet.h"
41#include "llvm/ADT/SmallString.h"
42#include "llvm/ADT/StringExtras.h"
43#include "llvm/ADT/StringSwitch.h"
44#include "llvm/ADT/Twine.h"
45#include "llvm/BinaryFormat/Magic.h"
46#include "llvm/Config/llvm-config.h"
47#include "llvm/Option/Arg.h"
48#include "llvm/Option/ArgList.h"
49#include "llvm/Option/Option.h"
50#include "llvm/Support/CodeGen.h"
51#include "llvm/Support/Compression.h"
52#include "llvm/Support/ErrorHandling.h"
53#include "llvm/Support/FileSystem.h"
54#include "llvm/Support/Path.h"
55#include "llvm/Support/Process.h"
56#include "llvm/Support/Program.h"
57#include "llvm/Support/Threading.h"
58#include "llvm/Support/VirtualFileSystem.h"
59#include "llvm/Support/YAMLParser.h"
60#include "llvm/TargetParser/Host.h"
61#include "llvm/TargetParser/PPCTargetParser.h"
62#include "llvm/TargetParser/TargetParser.h"
71 const llvm::Triple &Triple) {
72 if (Args.hasArg(clang::driver::options::OPT_pg) &&
73 !Args.hasArg(clang::driver::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) {
254 Args.hasFlag(clang::driver::options::OPT_fno_omit_frame_pointer,
255 clang::driver::options::OPT_fomit_frame_pointer, DefaultFP);
260 bool EnableLeafFP = Args.hasFlag(
261 clang::driver::options::OPT_mno_omit_leaf_frame_pointer,
262 clang::driver::options::OPT_momit_leaf_frame_pointer, DefaultLeafFP);
277 const StringRef PluginOptPrefix) {
278 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
279 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
280 "-pass-remarks=" + A->getValue()));
282 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
283 CmdArgs.push_back(Args.MakeArgString(
284 Twine(PluginOptPrefix) +
"-pass-remarks-missed=" + A->getValue()));
286 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
287 CmdArgs.push_back(Args.MakeArgString(
288 Twine(PluginOptPrefix) +
"-pass-remarks-analysis=" + A->getValue()));
292 const llvm::Triple &Triple,
295 const StringRef PluginOptPrefix) {
296 StringRef Format =
"yaml";
297 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
298 Format = A->getValue();
302 Args.getLastArg(options::OPT_foptimization_record_file_EQ)) {
305 }
else if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
312 assert(!F.empty() &&
"Cannot determine remarks output name.");
314 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
315 "opt-remarks-filename=" + F +
"opt.ld." +
319 Args.getLastArg(options::OPT_foptimization_record_passes_EQ))
320 CmdArgs.push_back(Args.MakeArgString(
321 Twine(PluginOptPrefix) +
"opt-remarks-passes=" + A->getValue()));
323 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
324 "opt-remarks-format=" + Format.data()));
328 ArgStringList &CmdArgs,
329 const StringRef PluginOptPrefix) {
330 if (Args.hasFlag(options::OPT_fdiagnostics_show_hotness,
331 options::OPT_fno_diagnostics_show_hotness,
false))
332 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
333 "opt-remarks-with-hotness"));
336 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ))
338 Args.MakeArgString(Twine(PluginOptPrefix) +
339 "opt-remarks-hotness-threshold=" + A->getValue()));
344 StringRef Processor) {
348 auto GPUKind =
T.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Processor)
349 : llvm::AMDGPU::parseArchR600(Processor);
350 auto GPUFeatures =
T.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind)
351 : llvm::AMDGPU::getArchAttrR600(GPUKind);
352 if (GPUFeatures & llvm::AMDGPU::FEATURE_WGP)
354 return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode);
359 if (D.
getVFS().exists(Path))
360 Paths.push_back(Path.str());
364 const llvm::Triple &Triple,
366 std::vector<StringRef> &Features,
367 OptSpecifier Group) {
368 std::set<StringRef> Warned;
369 for (
const Arg *A : Args.filtered(Group)) {
370 StringRef Name = A->getOption().getName();
374 assert(Name.starts_with(
"m") &&
"Invalid feature name.");
375 Name = Name.substr(1);
379 if (Warned.count(Name) == 0) {
381 clang::diag::warn_drv_unsupported_option_for_processor)
382 << A->getAsString(Args) << Proc;
388 bool IsNegative = Name.consume_front(
"no-");
390 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
398 llvm::DenseSet<StringRef> UsedFeatures;
399 for (StringRef
Feature : llvm::reverse(Features)) {
400 if (UsedFeatures.insert(
Feature.drop_front()).second)
401 UnifiedFeatures.insert(UnifiedFeatures.begin(),
Feature);
404 return UnifiedFeatures;
408 const char *ArgName,
const char *EnvVar) {
409 const char *DirList = ::getenv(EnvVar);
410 bool CombinedArg =
false;
415 StringRef Name(ArgName);
416 if (Name ==
"-I" || Name ==
"-L" || Name.empty())
419 StringRef Dirs(DirList);
423 StringRef::size_type Delim;
424 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
427 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
429 CmdArgs.push_back(ArgName);
430 CmdArgs.push_back(
".");
435 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
437 CmdArgs.push_back(ArgName);
438 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
441 Dirs = Dirs.substr(Delim + 1);
446 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
448 CmdArgs.push_back(ArgName);
449 CmdArgs.push_back(
".");
453 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
455 CmdArgs.push_back(ArgName);
456 CmdArgs.push_back(Args.MakeArgString(Dirs));
462 const ArgList &Args, ArgStringList &CmdArgs,
468 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
475 for (
const auto &II : Inputs) {
479 if (
auto *IA = II.getAction())
489 if (II.isFilename()) {
490 CmdArgs.push_back(II.getFilename());
499 const Arg &A = II.getInputArg();
502 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
504 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
507 else if (A.getOption().matches(options::OPT_rpath) &&
511 A.renderAsInput(Args, CmdArgs);
513 if (
const Arg *A = Args.getLastArg(options::OPT_fveclib)) {
514 const llvm::Triple &Triple = TC.
getTriple();
515 StringRef
V = A->getValue();
516 if (
V ==
"ArmPL" && (Triple.isOSLinux() || Triple.isOSDarwin())) {
534 if (Triple.isOSLinux()) {
535 CmdArgs.push_back(Args.MakeArgString(
"--push-state"));
536 CmdArgs.push_back(Args.MakeArgString(
"--as-needed"));
538 if (!Args.hasArg(options::OPT_nostdlib))
539 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
540 CmdArgs.push_back(Args.MakeArgString(
"-lamath"));
541 if (!Args.hasArg(options::OPT_nostdlib))
542 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
543 if (Triple.isOSLinux())
544 CmdArgs.push_back(Args.MakeArgString(
"--pop-state"));
551 switch (
T.getArch()) {
552 case llvm::Triple::x86:
556 case llvm::Triple::aarch64:
557 if (
T.isOSManagarm())
558 return "aarch64managarm";
561 return "aarch64linux";
562 case llvm::Triple::aarch64_be:
564 return "aarch64elfb";
565 return "aarch64linuxb";
566 case llvm::Triple::arm:
567 case llvm::Triple::thumb:
568 case llvm::Triple::armeb:
569 case llvm::Triple::thumbeb: {
572 return IsBigEndian ?
"armelfb" :
"armelf";
573 return IsBigEndian ?
"armelfb_linux_eabi" :
"armelf_linux_eabi";
575 case llvm::Triple::m68k:
577 case llvm::Triple::ppc:
579 return "elf32ppclinux";
581 case llvm::Triple::ppcle:
583 return "elf32lppclinux";
585 case llvm::Triple::ppc64:
587 case llvm::Triple::ppc64le:
589 case llvm::Triple::riscv32:
590 return "elf32lriscv";
591 case llvm::Triple::riscv64:
592 return "elf64lriscv";
593 case llvm::Triple::sparc:
594 case llvm::Triple::sparcel:
595 return "elf32_sparc";
596 case llvm::Triple::sparcv9:
597 return "elf64_sparc";
598 case llvm::Triple::loongarch32:
599 return "elf32loongarch";
600 case llvm::Triple::loongarch64:
601 return "elf64loongarch";
602 case llvm::Triple::mips:
603 return "elf32btsmip";
604 case llvm::Triple::mipsel:
605 return "elf32ltsmip";
606 case llvm::Triple::mips64:
608 return "elf32btsmipn32";
609 return "elf64btsmip";
610 case llvm::Triple::mips64el:
612 return "elf32ltsmipn32";
613 return "elf64ltsmip";
614 case llvm::Triple::systemz:
616 case llvm::Triple::x86_64:
618 return "elf32_x86_64";
620 case llvm::Triple::ve:
622 case llvm::Triple::csky:
623 return "cskyelf_linux";
630 const ToolChain &TC,
const llvm::opt::ArgList &Args,
631 llvm::opt::ArgStringList &CmdArgs) {
637 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
638 StringRef
V = A->getValue();
639 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
640 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
642 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
643 << A->getSpelling() <<
V;
648 std::vector<StringRef> &Features,
649 OptSpecifier OnOpt, OptSpecifier OffOpt,
650 StringRef FeatureName) {
651 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
652 if (A->getOption().matches(OnOpt))
653 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
655 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
661 const ArgList &Args) {
662 Arg *MArch = Args.getLastArg(options::OPT_march_EQ);
663 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
665 return llvm::StringSwitch<std::string>(GPUName)
666 .Cases(
"rv630",
"rv635",
"r600")
667 .Cases(
"rv610",
"rv620",
"rs780",
"rs880")
668 .Case(
"rv740",
"rv770")
669 .Case(
"palm",
"cedar")
670 .Cases(
"sumo",
"sumo2",
"sumo")
671 .Case(
"hemlock",
"cypress")
672 .Case(
"aruba",
"cayman")
673 .Default(GPUName.str());
681 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
682 return A->getValue();
690 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
691 StringRef CPU = A->getValue();
697 return llvm::sys::getHostCPUName();
707 const llvm::Triple &
T,
bool FromAs) {
710 switch (
T.getArch()) {
714 case llvm::Triple::aarch64:
715 case llvm::Triple::aarch64_32:
716 case llvm::Triple::aarch64_be:
719 case llvm::Triple::arm:
720 case llvm::Triple::armeb:
721 case llvm::Triple::thumb:
722 case llvm::Triple::thumbeb: {
723 StringRef MArch, MCPU;
728 case llvm::Triple::avr:
729 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
730 return A->getValue();
733 case llvm::Triple::m68k:
736 case llvm::Triple::mips:
737 case llvm::Triple::mipsel:
738 case llvm::Triple::mips64:
739 case llvm::Triple::mips64el: {
743 return std::string(CPUName);
746 case llvm::Triple::nvptx:
747 case llvm::Triple::nvptx64:
748 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
749 return A->getValue();
752 case llvm::Triple::ppc:
753 case llvm::Triple::ppcle:
754 case llvm::Triple::ppc64:
755 case llvm::Triple::ppc64le:
756 if (Arg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ))
758 llvm::PPC::getNormalizedPPCTargetCPU(
T, A->getValue()));
759 return std::string(llvm::PPC::getNormalizedPPCTargetCPU(
T));
761 case llvm::Triple::csky:
762 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
763 return A->getValue();
764 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
765 return A->getValue();
768 case llvm::Triple::riscv32:
769 case llvm::Triple::riscv64:
772 case llvm::Triple::bpfel:
773 case llvm::Triple::bpfeb:
774 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
775 return A->getValue();
778 case llvm::Triple::sparc:
779 case llvm::Triple::sparcel:
780 case llvm::Triple::sparcv9:
783 case llvm::Triple::x86:
784 case llvm::Triple::x86_64:
787 case llvm::Triple::hexagon:
791 case llvm::Triple::lanai:
794 case llvm::Triple::systemz:
797 case llvm::Triple::r600:
798 case llvm::Triple::amdgcn:
801 case llvm::Triple::wasm32:
802 case llvm::Triple::wasm64:
805 case llvm::Triple::loongarch32:
806 case llvm::Triple::loongarch64:
809 case llvm::Triple::xtensa:
810 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
811 return A->getValue();
817 const llvm::Triple &Triple,
819 std::vector<StringRef> &Features) {
821 options::OPT_m_wasm_Features_Group);
825 const ArgList &Args, ArgStringList &CmdArgs,
826 bool ForAS,
bool IsAux) {
827 std::vector<StringRef> Features;
828 switch (Triple.getArch()) {
831 case llvm::Triple::mips:
832 case llvm::Triple::mipsel:
833 case llvm::Triple::mips64:
834 case llvm::Triple::mips64el:
837 case llvm::Triple::arm:
838 case llvm::Triple::armeb:
839 case llvm::Triple::thumb:
840 case llvm::Triple::thumbeb:
843 case llvm::Triple::ppc:
844 case llvm::Triple::ppcle:
845 case llvm::Triple::ppc64:
846 case llvm::Triple::ppc64le:
849 case llvm::Triple::riscv32:
850 case llvm::Triple::riscv64:
853 case llvm::Triple::systemz:
856 case llvm::Triple::aarch64:
857 case llvm::Triple::aarch64_32:
858 case llvm::Triple::aarch64_be:
861 case llvm::Triple::x86:
862 case llvm::Triple::x86_64:
865 case llvm::Triple::hexagon:
868 case llvm::Triple::wasm32:
869 case llvm::Triple::wasm64:
872 case llvm::Triple::sparc:
873 case llvm::Triple::sparcel:
874 case llvm::Triple::sparcv9:
877 case llvm::Triple::r600:
878 case llvm::Triple::amdgcn:
881 case llvm::Triple::nvptx:
882 case llvm::Triple::nvptx64:
885 case llvm::Triple::m68k:
888 case llvm::Triple::msp430:
891 case llvm::Triple::ve:
894 case llvm::Triple::csky:
897 case llvm::Triple::loongarch32:
898 case llvm::Triple::loongarch64:
904 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
905 CmdArgs.push_back(
Feature.data());
910 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
913 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
914 D.
Diag(diag::err_drv_invalid_int_value)
915 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
916 return LtoJobsArg->getValue();
921 return Triple.isPS();
925 const llvm::opt::ArgList &Args) {
927 Arg *A = Args.getLastArg(options::OPT_mtls_dialect_EQ);
929 return Triple.hasDefaultTLSDESC();
930 StringRef
V = A->getValue();
931 bool SupportedArgument =
false, EnableTLSDESC =
false;
932 bool Unsupported = !Triple.isOSBinFormatELF();
933 if (Triple.isLoongArch() || Triple.isRISCV()) {
934 SupportedArgument =
V ==
"desc" ||
V ==
"trad";
935 EnableTLSDESC =
V ==
"desc";
936 }
else if (Triple.isX86()) {
937 SupportedArgument =
V ==
"gnu" ||
V ==
"gnu2";
938 EnableTLSDESC =
V ==
"gnu2";
943 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
944 << A->getSpelling() << Triple.getTriple();
945 }
else if (!SupportedArgument) {
946 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument_for_target)
947 << A->getSpelling() <<
V << Triple.getTriple();
949 return EnableTLSDESC;
953 ArgStringList &CmdArgs,
const InputInfo &Output,
956 const bool IsOSAIX = Triple.isOSAIX();
957 const bool IsAMDGCN = Triple.isAMDGCN();
958 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ);
961 const bool IsFatLTO = Args.hasFlag(options::OPT_ffat_lto_objects,
962 options::OPT_fno_fat_lto_objects,
false);
963 const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
965 assert(!Inputs.empty() &&
"Must have at least one input.");
967 auto Input = llvm::find_if(
969 if (Input == Inputs.end()) {
972 Input = Inputs.begin();
975 if (Linker !=
"lld" && Linker !=
"lld-link" &&
976 llvm::sys::path::filename(LinkerPath) !=
"ld.lld" &&
977 llvm::sys::path::stem(LinkerPath) !=
"ld.lld" && !Triple.isOSOpenBSD()) {
981 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
982 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
985 CmdArgs.push_back(
"-plugin");
988 const char *Suffix =
".dll";
989#elif defined(__APPLE__)
990 const char *Suffix =
".dylib";
992 const char *Suffix =
".so";
996 llvm::sys::path::native(Twine(D.
Dir) +
997 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
1000 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
1005 CmdArgs.push_back(
"--fat-lto-objects");
1007 if (Args.hasArg(options::OPT_flto_partitions_EQ)) {
1009 StringRef A = Args.getLastArgValue(options::OPT_flto_partitions_EQ,
"8");
1010 if (A.getAsInteger(10,
Value) || (
Value < 1)) {
1011 Arg *Arg = Args.getLastArg(options::OPT_flto_partitions_EQ);
1012 D.
Diag(diag::err_drv_invalid_int_value)
1013 << Arg->getAsString(Args) << Arg->getValue();
1015 CmdArgs.push_back(Args.MakeArgString(
"--lto-partitions=" + A));
1019 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
1020 const char *ExtraDash = IsOSAIX ?
"-" :
"";
1021 const char *ParallelismOpt = IsOSAIX ?
"-threads=" :
"jobs=";
1026 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
1027 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1028 "-generate-arange-section"));
1032 Arg *ArgVecLib = Args.getLastArg(options::OPT_fveclib);
1033 if (ArgVecLib && ArgVecLib->getNumValues() == 1) {
1036 std::optional<StringRef> OptVal =
1037 llvm::StringSwitch<std::optional<StringRef>>(ArgVecLib->getValue())
1038 .Case(
"Accelerate",
"Accelerate")
1039 .Case(
"libmvec",
"LIBMVEC")
1040 .Case(
"AMDLIBM",
"AMDLIBM")
1041 .Case(
"MASSV",
"MASSV")
1042 .Case(
"SVML",
"SVML")
1043 .Case(
"SLEEF",
"sleefgnuabi")
1044 .Case(
"Darwin_libsystem_m",
"Darwin_libsystem_m")
1045 .Case(
"ArmPL",
"ArmPL")
1046 .Case(
"none",
"none")
1047 .Default(std::nullopt);
1050 CmdArgs.push_back(Args.MakeArgString(
1051 Twine(PluginOptPrefix) +
"-vector-library=" + OptVal.value()));
1061 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
1063 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1067 if (A->getOption().matches(options::OPT_O4) ||
1068 A->getOption().matches(options::OPT_Ofast))
1070 else if (A->getOption().matches(options::OPT_O)) {
1071 OOpt = A->getValue();
1074 else if (OOpt ==
"s" || OOpt ==
"z")
1076 }
else if (A->getOption().matches(options::OPT_O0))
1078 if (!OOpt.empty()) {
1080 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"O" + OOpt));
1082 CmdArgs.push_back(Args.MakeArgString(Twine(
"--lto-CGO") + OOpt));
1086 if (Args.hasArg(options::OPT_gsplit_dwarf)) {
1088 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1095 Args.MakeArgString(Twine(PluginOptPrefix) +
"dwo_dir=" + F +
"dwo"));
1098 if (IsThinLTO && !IsOSAIX)
1099 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
1100 else if (IsThinLTO && IsOSAIX)
1101 CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
1106 if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
1107 Args.hasArg(options::OPT_fenable_matrix))
1109 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-matrix"));
1112 if (!Parallelism.empty())
1113 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1114 ParallelismOpt + Parallelism));
1117 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
1118 options::OPT_fno_global_isel)) {
1121 CmdArgs.push_back(Args.MakeArgString(
1122 Twine(PluginOptPrefix) +
"-global-isel=" +
1123 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
1128 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
1129 if (A->getOption().matches(options::OPT_glldb))
1131 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
1132 else if (A->getOption().matches(options::OPT_gsce))
1134 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
1135 else if (A->getOption().matches(options::OPT_gdbx))
1137 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
1140 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
1146 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
1150 Arg *A = Args.getLastArg(options::OPT_g_Group);
1151 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
1152 !A->getOption().matches(options::OPT_ggdb0);
1153 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
1154 options::OPT_gno_strict_dwarf,
true))
1156 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
1158 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
1159 StringRef
V = A->getValue();
1160 if (
V ==
"vec-default")
1162 if (
V ==
"vec-extabi") {
1164 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
1170 bool UseSeparateSections =
1173 if (Args.hasFlag(options::OPT_ffunction_sections,
1174 options::OPT_fno_function_sections, UseSeparateSections))
1176 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
1177 else if (Args.hasArg(options::OPT_fno_function_sections))
1179 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
1181 bool DataSectionsTurnedOff =
false;
1182 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1183 UseSeparateSections)) {
1185 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
1186 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
1187 DataSectionsTurnedOff =
true;
1189 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
1192 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
1193 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
1194 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
1195 options::OPT_mno_xcoff_roptr,
false);
1196 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
1198 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1199 << OptStr << Triple.str();
1205 if (DataSectionsTurnedOff)
1206 D.
Diag(diag::err_roptr_requires_data_sections);
1209 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
1214 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
1215 options::OPT_fno_split_machine_functions)) {
1216 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
1217 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1218 "-split-machine-functions"));
1222 StringRef FName = A->getValue();
1223 if (!llvm::sys::fs::exists(FName))
1224 D.
Diag(diag::err_drv_no_such_file) << FName;
1226 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1227 "sample-profile=" + FName));
1231 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1232 "cs-profile-generate"));
1233 if (CSPGOGenerateArg->getOption().matches(
1234 options::OPT_fcs_profile_generate_EQ)) {
1236 llvm::sys::path::append(Path,
"default_%m.profraw");
1237 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1238 "cs-profile-path=" + Path));
1241 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1242 "cs-profile-path=default_%m.profraw"));
1245 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1246 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1247 llvm::sys::path::append(Path,
"default.profdata");
1248 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1249 "cs-profile-path=" + Path));
1253 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1255 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1256 "-enable-jmc-instrument"));
1258 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1261 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1262 Triple.hasDefaultEmulatedTLS())) {
1264 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1268 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1270 if (Args.hasFlag(options::OPT_fstack_size_section,
1271 options::OPT_fno_stack_size_section,
false))
1273 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1277 if (!StatsFile.empty())
1279 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1282 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1283 CmdArgs.push_back(Args.MakeArgString(
1284 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1295 Output, PluginOptPrefix);
1301 true, PluginOptPrefix);
1303 bool IsELF = Triple.isOSBinFormatELF();
1305 bool ImplicitMapSyms =
false;
1306 for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
1307 for (StringRef
V : A->getValues()) {
1308 auto Equal =
V.split(
'=');
1309 auto checkArg = [&](
bool ValidTarget,
1310 std::initializer_list<const char *>
Set) {
1312 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1313 << (Twine(
"-Wa,") +
Equal.first +
"=").str()
1314 << Triple.getTriple();
1315 }
else if (!llvm::is_contained(
Set,
Equal.second)) {
1316 D.
Diag(diag::err_drv_unsupported_option_argument)
1317 << (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
1320 if (
Equal.first ==
"-mmapsyms") {
1321 ImplicitMapSyms =
Equal.second ==
"implicit";
1322 checkArg(IsELF && Triple.isAArch64(), {
"default",
"implicit"});
1323 }
else if (
V ==
"--crel")
1325 else if (
V ==
"--no-crel")
1333 if (IsELF && !Triple.isMIPS()) {
1334 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"-crel"));
1336 D.
Diag(diag::err_drv_unsupported_opt_for_target)
1340 if (ImplicitMapSyms)
1342 Args.MakeArgString(Twine(PluginOptPrefix) +
"-implicit-mapsyms"));
1344 if (Args.hasArg(options::OPT_ftime_report))
1346 Args.MakeArgString(Twine(PluginOptPrefix) +
"-time-passes"));
1348 if (Arg *A = Args.getLastArg(options::OPT_fthinlto_distributor_EQ)) {
1350 Args.MakeArgString(
"--thinlto-distributor=" + Twine(A->getValue())));
1352 Args.MakeArgString(
"--thinlto-remote-compiler=" +
1355 for (
auto A : Args.getAllArgValues(options::OPT_Xthinlto_distributor_EQ))
1356 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-distributor-arg=" + A));
1361 const ArgList &Args,
1362 ArgStringList &CmdArgs) {
1367 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1368 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1372 ArgStringList &CmdArgs) {
1373 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1374 options::OPT_fno_rtlib_add_rpath,
false))
1382 CandidateRPaths.emplace_back(*CandidateRPath);
1384 for (
const auto &CandidateRPath : CandidateRPaths) {
1385 if (TC.
getVFS().exists(CandidateRPath)) {
1386 CmdArgs.push_back(
"-rpath");
1387 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1393 const ToolChain &TC,
const ArgList &Args,
1394 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1396 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1397 options::OPT_fno_openmp,
false)) {
1399 if (Args.hasFlag(options::OPT_foffload_via_llvm,
1400 options::OPT_fno_offload_via_llvm,
false))
1401 CmdArgs.push_back(
"-lomptarget");
1411 if (ForceStaticHostRuntime)
1412 CmdArgs.push_back(
"-Bstatic");
1416 CmdArgs.push_back(
"-lomp");
1419 CmdArgs.push_back(
"-lgomp");
1422 CmdArgs.push_back(
"-liomp5");
1428 if (ForceStaticHostRuntime)
1429 CmdArgs.push_back(
"-Bdynamic");
1432 CmdArgs.push_back(
"-lrt");
1434 if (IsOffloadingHost)
1435 CmdArgs.push_back(
"-lomptarget");
1446 const llvm::opt::ArgList &Args,
1447 llvm::opt::ArgStringList &CmdArgs) {
1453 constexpr llvm::StringLiteral Targets(
"--offload-targets=");
1457 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1458 [](
auto TC) { return TC.second->getTripleString(); });
1460 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1464 ArgStringList &CmdArgs, StringRef Sanitizer,
1465 bool IsShared,
bool IsWhole) {
1468 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1471 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1481 ArgStringList &CmdArgs,
1482 StringRef Sanitizer) {
1487 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1490 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1491 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1498 const llvm::opt::ArgList &Args,
1499 llvm::opt::ArgStringList &CmdArgs,
1502 "AIX linker does not support any form of --as-needed option yet.");
1510 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1511 CmdArgs.push_back(
"-z");
1512 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1514 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1519 const llvm::opt::ArgList &Args,
1520 ArgStringList &CmdArgs) {
1525 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1527 CmdArgs.push_back(
"-lpthread");
1529 CmdArgs.push_back(
"-lrt");
1531 CmdArgs.push_back(
"-lm");
1536 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1537 CmdArgs.push_back(
"-ldl");
1541 CmdArgs.push_back(
"-lexecinfo");
1543 CmdArgs.push_back(
"-lbsd");
1549 CmdArgs.push_back(
"-lresolv");
1559 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1564 SharedRuntimes.push_back(
"asan");
1565 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1566 HelperStaticRuntimes.push_back(
"asan-preinit");
1569 SharedRuntimes.push_back(
"memprof");
1570 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1571 HelperStaticRuntimes.push_back(
"memprof-preinit");
1574 SharedRuntimes.push_back(
"nsan");
1577 SharedRuntimes.push_back(
"ubsan_minimal");
1579 SharedRuntimes.push_back(
"ubsan_standalone");
1582 SharedRuntimes.push_back(
"scudo_standalone");
1585 SharedRuntimes.push_back(
"tsan");
1587 SharedRuntimes.push_back(
"tysan");
1590 SharedRuntimes.push_back(
"hwasan_aliases");
1592 SharedRuntimes.push_back(
"hwasan");
1593 if (!Args.hasArg(options::OPT_shared))
1594 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1597 SharedRuntimes.push_back(
"rtsan");
1602 StaticRuntimes.push_back(
"stats_client");
1606 HelperStaticRuntimes.push_back(
"asan_static");
1609 if (Args.hasArg(options::OPT_shared)) {
1618 StaticRuntimes.push_back(
"asan");
1620 StaticRuntimes.push_back(
"asan_cxx");
1625 StaticRuntimes.push_back(
"rtsan");
1628 StaticRuntimes.push_back(
"memprof");
1630 StaticRuntimes.push_back(
"memprof_cxx");
1635 StaticRuntimes.push_back(
"hwasan_aliases");
1637 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1639 StaticRuntimes.push_back(
"hwasan");
1641 StaticRuntimes.push_back(
"hwasan_cxx");
1645 StaticRuntimes.push_back(
"dfsan");
1647 StaticRuntimes.push_back(
"lsan");
1649 StaticRuntimes.push_back(
"msan");
1651 StaticRuntimes.push_back(
"msan_cxx");
1654 StaticRuntimes.push_back(
"nsan");
1656 StaticRuntimes.push_back(
"tsan");
1658 StaticRuntimes.push_back(
"tsan_cxx");
1661 StaticRuntimes.push_back(
"tysan");
1664 StaticRuntimes.push_back(
"ubsan_minimal");
1666 StaticRuntimes.push_back(
"ubsan_standalone");
1670 NonWholeStaticRuntimes.push_back(
"safestack");
1671 RequiredSymbols.push_back(
"__safestack_init");
1675 StaticRuntimes.push_back(
"cfi");
1677 StaticRuntimes.push_back(
"cfi_diag");
1682 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1685 NonWholeStaticRuntimes.push_back(
"stats");
1686 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1689 StaticRuntimes.push_back(
"scudo_standalone");
1691 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1698 ArgStringList &CmdArgs) {
1701 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1704 NonWholeStaticRuntimes, HelperStaticRuntimes,
1709 for (
auto S : RequiredSymbols) {
1710 CmdArgs.push_back(
"-u");
1711 CmdArgs.push_back(Args.MakeArgString(S));
1716 !Args.hasArg(options::OPT_shared)) {
1722 if (!Args.hasArg(clang::driver::options::OPT_nostdlibxx)) {
1723 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1724 !Args.hasArg(options::OPT_static);
1725 if (OnlyLibstdcxxStatic)
1726 CmdArgs.push_back(
"-Bstatic");
1728 if (OnlyLibstdcxxStatic)
1729 CmdArgs.push_back(
"-Bdynamic");
1733 for (
auto RT : SharedRuntimes)
1735 for (
auto RT : HelperStaticRuntimes)
1737 bool AddExportDynamic =
false;
1738 for (
auto RT : StaticRuntimes) {
1742 for (
auto RT : NonWholeStaticRuntimes) {
1748 if (AddExportDynamic)
1749 CmdArgs.push_back(
"--export-dynamic");
1752 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1756 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1757 <<
"-fsanitize=memtag*" << TC.
getTriple().str();
1760 Args.MakeArgString(
"--android-memtag-mode=" + SanArgs.
getMemtagMode()));
1762 CmdArgs.push_back(
"--android-memtag-heap");
1764 CmdArgs.push_back(
"--android-memtag-stack");
1767 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty();
1772 if (Args.hasArg(options::OPT_shared)) {
1774 CmdArgs.push_back(
"--whole-archive");
1776 CmdArgs.push_back(
"--no-whole-archive");
1780 CmdArgs.push_back(
"--whole-archive");
1782 for (
const auto &Mode : XRay.
modeList())
1784 CmdArgs.push_back(
"--no-whole-archive");
1792 const llvm::opt::ArgList &Args,
1793 ArgStringList &CmdArgs) {
1795 CmdArgs.push_back(
"-lpthread");
1797 CmdArgs.push_back(
"-lrt");
1798 CmdArgs.push_back(
"-lm");
1803 CmdArgs.push_back(
"-ldl");
1808 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1809 return !A->getOption().matches(options::OPT_O0);
1817 auto AddPostfix = [JA](
auto &F) {
1822 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1823 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1827 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1830 Arg *FinalOutput = Args.getLastArg(options::OPT_o, options::OPT__SLASH_o);
1831 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1832 T = FinalOutput->getValue();
1833 llvm::sys::path::remove_filename(
T);
1834 llvm::sys::path::append(
T,
1835 llvm::sys::path::stem(FinalOutput->getValue()));
1837 return Args.MakeArgString(
T);
1843 return Args.MakeArgString(
T);
1847 const JobAction &JA,
const ArgList &Args,
1848 const InputInfo &Output,
const char *OutFile) {
1849 ArgStringList ExtractArgs;
1850 ExtractArgs.push_back(
"--extract-dwo");
1852 ArgStringList StripArgs;
1853 StripArgs.push_back(
"--strip-dwo");
1858 ExtractArgs.push_back(OutFile);
1865 C.addCommand(std::make_unique<Command>(JA,
T,
1867 Exec, ExtractArgs, II, Output));
1870 C.addCommand(std::make_unique<Command>(
1880 Args.ClaimAllArgs(options::OPT_flto_EQ);
1881 Args.ClaimAllArgs(options::OPT_flto);
1882 Args.ClaimAllArgs(options::OPT_fno_lto);
1886 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1887 options::OPT_fcs_profile_generate_EQ,
1888 options::OPT_fno_profile_generate);
1889 if (CSPGOGenerateArg &&
1890 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1891 CSPGOGenerateArg =
nullptr;
1893 return CSPGOGenerateArg;
1897 auto *ProfileUseArg = Args.getLastArg(
1898 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1899 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1900 options::OPT_fno_profile_instr_use);
1902 if (ProfileUseArg &&
1903 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1904 ProfileUseArg =
nullptr;
1906 return ProfileUseArg;
1910 auto *ProfileSampleUseArg = Args.getLastArg(
1911 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
1913 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
1914 options::OPT_fno_profile_sample_use)))
1917 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
1922 case llvm::Reloc::Static:
1924 case llvm::Reloc::PIC_:
1926 case llvm::Reloc::DynamicNoPIC:
1927 return "dynamic-no-pic";
1928 case llvm::Reloc::ROPI:
1930 case llvm::Reloc::RWPI:
1932 case llvm::Reloc::ROPI_RWPI:
1935 llvm_unreachable(
"Unknown Reloc::Model kind");
1942std::tuple<llvm::Reloc::Model, unsigned, bool>
1950 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
1952 bool IsPICLevelTwo = PIC;
1955 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
1958 if (Triple.isAndroid()) {
1959 switch (Triple.getArch()) {
1960 case llvm::Triple::x86:
1961 case llvm::Triple::x86_64:
1963 IsPICLevelTwo =
true;
1973 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
1977 if (Triple.isOSOpenBSD()) {
1979 case llvm::Triple::arm:
1980 case llvm::Triple::aarch64:
1981 case llvm::Triple::mips64:
1982 case llvm::Triple::mips64el:
1983 case llvm::Triple::x86:
1984 case llvm::Triple::x86_64:
1985 IsPICLevelTwo =
false;
1988 case llvm::Triple::ppc:
1989 case llvm::Triple::sparcv9:
1990 IsPICLevelTwo =
true;
2002 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2003 options::OPT_fpic, options::OPT_fno_pic,
2004 options::OPT_fPIE, options::OPT_fno_PIE,
2005 options::OPT_fpie, options::OPT_fno_pie);
2006 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
2007 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
2008 options::OPT_fPIE, options::OPT_fpie)) {
2010 << LastPICArg->getSpelling() << Triple.str();
2011 if (Triple.getArch() == llvm::Triple::x86_64)
2012 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
2013 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2020 Option O = LastPICArg->getOption();
2021 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2022 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2023 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2025 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2027 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
2030 if (EffectiveTriple.isPS()) {
2031 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
2032 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
2033 if (Model !=
"kernel") {
2036 << LastPICArg->getSpelling()
2037 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
2047 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
2053 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
2054 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
2057 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2060 if (!Triple.isOSDarwin())
2062 << A->getSpelling() << Triple.str();
2071 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
2074 bool EmbeddedPISupported;
2075 switch (Triple.getArch()) {
2076 case llvm::Triple::arm:
2077 case llvm::Triple::armeb:
2078 case llvm::Triple::thumb:
2079 case llvm::Triple::thumbeb:
2080 EmbeddedPISupported =
true;
2083 EmbeddedPISupported =
false;
2087 bool ROPI =
false, RWPI =
false;
2088 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
2089 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
2090 if (!EmbeddedPISupported)
2092 << LastROPIArg->getSpelling() << Triple.str();
2095 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2096 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2097 if (!EmbeddedPISupported)
2099 << LastRWPIArg->getSpelling() << Triple.str();
2104 if ((ROPI || RWPI) && (PIC || PIE))
2107 if (Triple.isMIPS()) {
2114 if (ABIName ==
"n64")
2117 if(Args.hasArg(options::OPT_mno_abicalls))
2118 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2121 IsPICLevelTwo =
false;
2125 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2127 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2129 RelocM = llvm::Reloc::ROPI_RWPI;
2131 RelocM = llvm::Reloc::ROPI;
2133 RelocM = llvm::Reloc::RWPI;
2135 return std::make_tuple(RelocM, 0
U,
false);
2139 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
2140 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
2142 const llvm::opt::OptTable &Opts = D.
getOpts();
2143 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
2144 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
2145 D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
2147 return HasStaticPIE;
2167 const ArgList &Args) {
2168 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2169 options::OPT_falign_functions_EQ,
2170 options::OPT_fno_align_functions);
2171 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2174 if (A->getOption().matches(options::OPT_falign_functions))
2178 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2180 << A->getAsString(Args) << A->getValue();
2185 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2186 switch (DebugInfoKind) {
2187 case llvm::codegenoptions::DebugDirectivesOnly:
2188 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2190 case llvm::codegenoptions::DebugLineTablesOnly:
2191 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2193 case llvm::codegenoptions::DebugInfoConstructor:
2194 CmdArgs.push_back(
"-debug-info-kind=constructor");
2196 case llvm::codegenoptions::LimitedDebugInfo:
2197 CmdArgs.push_back(
"-debug-info-kind=limited");
2199 case llvm::codegenoptions::FullDebugInfo:
2200 CmdArgs.push_back(
"-debug-info-kind=standalone");
2202 case llvm::codegenoptions::UnusedTypeInfo:
2203 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2213 assert(A.getOption().matches(options::OPT_gN_Group) &&
2214 "Not a -g option that specifies a debug-info level");
2215 if (A.getOption().matches(options::OPT_g0) ||
2216 A.getOption().matches(options::OPT_ggdb0))
2217 return llvm::codegenoptions::NoDebugInfo;
2218 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2219 A.getOption().matches(options::OPT_ggdb1))
2220 return llvm::codegenoptions::DebugLineTablesOnly;
2221 if (A.getOption().matches(options::OPT_gline_directives_only))
2222 return llvm::codegenoptions::DebugDirectivesOnly;
2223 return llvm::codegenoptions::DebugInfoConstructor;
2227 const ArgList &Args) {
2228 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2234 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 5 ||
2237 << A->getAsString(Args) << A->getValue();
2242 return llvm::StringSwitch<unsigned>(ArgValue)
2243 .Case(
"-gdwarf-2", 2)
2244 .Case(
"-gdwarf-3", 3)
2245 .Case(
"-gdwarf-4", 4)
2246 .Case(
"-gdwarf-5", 5)
2251 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2252 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2253 options::OPT_gdwarf);
2257 const llvm::opt::ArgList &Args) {
2262 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2263 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2264 << GDwarfN->getSpelling() << TC.
getTriple().str();
2266 if (DwarfVersion == 0) {
2268 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2270 return DwarfVersion;
2274 const ArgList &Args, Arg *&Arg) {
2275 Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
2276 options::OPT_gno_split_dwarf);
2277 if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
2280 if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
2283 StringRef
Value = Arg->getValue();
2284 if (
Value ==
"split")
2286 if (
Value ==
"single")
2289 D.
Diag(diag::err_drv_unsupported_option_argument)
2290 << Arg->getSpelling() << Arg->getValue();
2296 assert(A &&
"Expected non-nullptr argument.");
2299 D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
2305 ArgStringList &CmdArgs) {
2306 llvm::Reloc::Model RelocationModel;
2311 if (RelocationModel != llvm::Reloc::Static)
2312 CmdArgs.push_back(
"-KPIC");
2318 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2324 const ArgList &Args) {
2325 if (Args.hasArg(options::OPT_static_libgcc) ||
2326 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2330 if (Args.hasArg(options::OPT_shared_libgcc))
2349 ArgStringList &CmdArgs,
const ArgList &Args) {
2353 CmdArgs.push_back(
"-l:libunwind.a");
2376 CmdArgs.push_back(
"-lgcc_eh");
2378 CmdArgs.push_back(
"-lgcc_s");
2386 CmdArgs.push_back(
"-lunwind");
2388 CmdArgs.push_back(
"-l:libunwind.a");
2391 CmdArgs.push_back(
"-l:libunwind.dll.a");
2393 CmdArgs.push_back(
"-l:libunwind.so");
2397 CmdArgs.push_back(
"-lunwind");
2407 ArgStringList &CmdArgs,
const ArgList &Args) {
2411 CmdArgs.push_back(
"-lgcc");
2415 CmdArgs.push_back(
"-lgcc");
2419 CmdArgs.push_back(
"--as-needed");
2421 CmdArgs.push_back(
"--no-as-needed");
2426 ArgStringList &CmdArgs,
const ArgList &Args) {
2437 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2440 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2441 if (A && A->getValue() != StringRef(
"platform")) {
2442 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2443 << A->getValue() <<
"MSVC";
2453 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2454 !Args.hasArg(options::OPT_static_pie))
2455 CmdArgs.push_back(
"-ldl");
2462 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2468 StringRef SaveStats = A->getValue();
2469 if (SaveStats ==
"obj" && Output.
isFilename()) {
2471 llvm::sys::path::remove_filename(StatsFile);
2472 }
else if (SaveStats !=
"cwd") {
2473 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2477 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2478 llvm::sys::path::append(StatsFile, BaseName);
2479 llvm::sys::path::replace_extension(StatsFile,
"stats");
2491 assert(Flag.front() ==
'-');
2493 Flags.push_back(Flag.str());
2495 Flags.push_back((
"!" + Flag.substr(1)).str());
2500 ArgStringList &CmdArgs,
bool IsLTO,
2501 const StringRef PluginOptPrefix) {
2502 auto addArg = [&, IsLTO](
const Twine &Arg) {
2504 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2505 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2507 CmdArgs.push_back(
"-mllvm");
2508 CmdArgs.push_back(Args.MakeArgString(Arg));
2512 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2513 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2515 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2516 StringRef
Value = A->getValue();
2518 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2519 !llvm::isPowerOf2_64(Boundary)) {
2520 D.
Diag(diag::err_drv_invalid_argument_to_option)
2521 <<
Value << A->getOption().getName();
2523 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2526 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2527 std::string AlignBranch;
2528 for (StringRef
T : A->getValues()) {
2529 if (
T !=
"fused" &&
T !=
"jcc" &&
T !=
"jmp" &&
T !=
"call" &&
2530 T !=
"ret" &&
T !=
"indirect")
2531 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2532 <<
T <<
"fused, jcc, jmp, call, ret, indirect";
2533 if (!AlignBranch.empty())
2537 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2539 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2540 StringRef
Value = A->getValue();
2541 unsigned PrefixSize;
2542 if (
Value.getAsInteger(10, PrefixSize)) {
2543 D.
Diag(diag::err_drv_invalid_argument_to_option)
2544 <<
Value << A->getOption().getName();
2546 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2572 llvm::opt::ArgStringList &CC1Args,
2574 StringRef Lib, StringRef
Arch, StringRef
Target,
2575 bool isBitCodeSDL) {
2578 std::string LibDeviceLoc =
"/libdevice";
2579 std::string LibBcPrefix =
"/libbc-";
2580 std::string LibPrefix =
"/lib";
2597 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2598 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2600 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2601 Twine(Lib +
"-" +
Arch).str(), Twine(Lib).str()}) {
2602 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2603 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2613 const auto *Ext =
".a";
2615 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2616 Twine(Lib +
"-" +
Arch).str()}) {
2617 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2618 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2629 bool FoundSDL =
false;
2630 for (
auto LPath : LibraryPaths) {
2631 for (
auto SDL : SDLs) {
2632 auto FullName = Twine(LPath + SDL).str();
2633 if (llvm::sys::fs::exists(FullName)) {
2634 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2651 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2652 llvm::opt::ArgStringList &CC1Args,
2654 StringRef
Arch, StringRef
Target,
bool isBitCodeSDL) {
2657 if (isBitCodeSDL &&
Arch.contains(
"nvptx"))
2660 bool FoundAOB =
false;
2661 std::string ArchiveOfBundles;
2664 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2665 auto Ext = IsMSVC ?
".lib" :
".a";
2666 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2667 if (llvm::sys::fs::exists(Lib)) {
2668 ArchiveOfBundles = Lib;
2672 Lib.consume_front(
"-l");
2673 for (
auto LPath : LibraryPaths) {
2674 ArchiveOfBundles.clear();
2675 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2676 : IsMSVC ? Lib + Ext
2677 :
"lib" + Lib + Ext)
2679 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2680 auto AOB = Twine(LPath + Prefix + LibFile).str();
2681 if (llvm::sys::fs::exists(AOB)) {
2682 ArchiveOfBundles = AOB;
2695 llvm::file_magic Magic;
2696 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2697 if (EC || Magic != llvm::file_magic::archive)
2700 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2701 std::string OutputLib =
2707 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2711 DeviceTriple +=
'-';
2712 std::string NormalizedTriple =
T.getToolChain().getTriple().normalize(
2713 llvm::Triple::CanonicalForm::FOUR_IDENT);
2714 DeviceTriple += NormalizedTriple;
2716 DeviceTriple +=
'-';
2720 std::string UnbundleArg(
"-unbundle");
2721 std::string TypeArg(
"-type=a");
2722 std::string InputArg(
"-input=" + ArchiveOfBundles);
2723 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2724 std::string OutputArg(
"-output=" + OutputLib);
2726 const char *UBProgram = DriverArgs.MakeArgString(
2727 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2729 ArgStringList UBArgs;
2730 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2731 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2732 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2733 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2734 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2738 std::string AdditionalArgs(
"-allow-missing-bundles");
2739 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2744 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2745 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2747 C.addCommand(std::make_unique<Command>(
2749 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2751 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2758 const llvm::opt::ArgList &DriverArgs,
2759 llvm::opt::ArgStringList &CC1Args,
2761 bool isBitCodeSDL) {
2792 const llvm::opt::ArgList &DriverArgs,
2793 llvm::opt::ArgStringList &CC1Args,
2795 bool isBitCodeSDL) {
2799 std::optional<std::string> LibPath =
2800 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2803 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2804 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2805 for (StringRef Path : Frags)
2806 LibraryPaths.emplace_back(Path.trim());
2810 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2811 LibraryPaths.emplace_back(Search_Dir);
2815 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2816 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2819 llvm::SmallSet<std::string, 16> SDLNames;
2820 static const StringRef HostOnlyArchives[] = {
2821 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2822 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2823 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2824 SDLNames.insert(std::string(
"-l") + SDLName);
2828 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2835 const StringRef LibFileExt =
".lib";
2836 if (!llvm::sys::path::has_extension(
FileName) ||
2838 llvm::sys::path::extension(
FileName).drop_front()) ==
2840 llvm::sys::path::extension(
FileName) == LibFileExt)
2841 SDLNames.insert(Input);
2848 for (
auto SDLName : SDLNames) {
2859static llvm::opt::Arg *
2861 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2865 const llvm::opt::ArgList &Args) {
2866 const unsigned MinCodeObjVer = 4;
2867 const unsigned MaxCodeObjVer = 6;
2870 if (CodeObjArg->getOption().getID() ==
2871 options::OPT_mcode_object_version_EQ) {
2872 unsigned CodeObjVer = MaxCodeObjVer;
2874 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2875 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2876 D.
Diag(diag::err_drv_invalid_int_value)
2877 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2883 const llvm::opt::ArgList &Args) {
2884 unsigned CodeObjVer = 6;
2886 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2891 const Driver &D,
const llvm::opt::ArgList &Args) {
2896 const llvm::opt::ArgList &Args,
2897 llvm::opt::ArgStringList &CmdArgs,
2898 const llvm::Triple &Triple,
bool IsLTO,
2899 const StringRef PluginOptPrefix) {
2900 auto addArg = [&, IsLTO](
const Twine &Arg) {
2902 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2903 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2905 CmdArgs.push_back(
"-mllvm");
2906 CmdArgs.push_back(Args.MakeArgString(Arg));
2910 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2911 options::OPT_mno_outline)) {
2912 if (A->getOption().matches(options::OPT_moutline)) {
2916 if (!(Triple.isARM() || Triple.isThumb() || Triple.isAArch64())) {
2917 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2919 addArg(Twine(
"-enable-machine-outliner"));
2923 addArg(Twine(
"-enable-machine-outliner=never"));
2927 auto *CodeGenDataGenArg =
2928 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
2929 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
2932 if (CodeGenDataGenArg && CodeGenDataUseArg)
2933 D.
Diag(diag::err_drv_argument_not_allowed_with)
2934 << CodeGenDataGenArg->getAsString(Args)
2935 << CodeGenDataUseArg->getAsString(Args);
2939 if (CodeGenDataGenArg)
2940 addArg(Twine(
"-codegen-data-generate"));
2943 if (CodeGenDataUseArg)
2944 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
2948 const llvm::opt::ArgList &DriverArgs,
2949 llvm::opt::ArgStringList &CC1Args,
2950 StringRef BitcodeSuffix,
2951 const llvm::Triple &Triple,
2956 std::optional<std::string> LibPath =
2957 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2960 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2961 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2962 for (StringRef Path : Frags)
2963 LibraryPaths.emplace_back(Path.trim());
2968 LibraryPaths.emplace_back(LibPath);
2972 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
2973 LibraryPaths.emplace_back(P);
2975 OptSpecifier LibomptargetBCPathOpt =
2976 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
2977 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
2978 : options::OPT_libomptarget_spirv_bc_path_EQ;
2980 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
2981 : Triple.isNVPTX() ?
"nvptx"
2983 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
2986 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
2988 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
2989 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
2990 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2993 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2994 CC1Args.push_back(
"-mlink-builtin-bitcode");
2995 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2997 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
2998 << LibOmpTargetFile;
3001 bool FoundBCLibrary =
false;
3003 for (StringRef LibraryPath : LibraryPaths) {
3005 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3006 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3007 CC1Args.push_back(
"-mlink-builtin-bitcode");
3008 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3009 FoundBCLibrary =
true;
3014 if (!FoundBCLibrary)
3015 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
3016 << LibOmpTargetName << ArchPrefix;
3020 const llvm::opt::ArgList &Args,
3021 llvm::opt::ArgStringList &CmdArgs) {
3023 (!Args.hasArg(options::OPT_nostdlib) ||
3024 TC.
getTriple().isKnownWindowsMSVCEnvironment()) &&
3025 !Args.hasArg(options::OPT_no_hip_rt) && !Args.hasArg(options::OPT_r)) {
3029 for (
auto *Arg : Args.filtered(options::OPT_no_hip_rt)) {
3036 const llvm::opt::ArgList &DriverArgs,
3037 llvm::opt::ArgStringList &CC1Args) {
3039 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
3045 llvm::sys::path::append(LibclcPath,
"lib",
"libclc");
3048 StringRef LibclcNamespec(A->getValue());
3049 bool FilenameSearch = LibclcNamespec.consume_front(
":");
3052 if (FilenameSearch && llvm::sys::fs::exists(LibclcTargetFile)) {
3053 CC1Args.push_back(
"-mlink-builtin-bitcode");
3054 CC1Args.push_back(DriverArgs.MakeArgString(LibclcTargetFile));
3057 if (!FilenameSearch)
3058 LibclcTargetFile +=
".bc";
3060 llvm::sys::path::append(LibclcPath, LibclcTargetFile);
3061 if (llvm::sys::fs::exists(LibclcPath)) {
3062 CC1Args.push_back(
"-mlink-builtin-bitcode");
3063 CC1Args.push_back(DriverArgs.MakeArgString(LibclcPath));
3067 D.
Diag(diag::err_drv_libclc_not_found) << LibclcTargetFile;
3073 const llvm::opt::ArgList &Args,
3074 llvm::opt::ArgStringList &CmdArgs,
3075 const llvm::Triple &Triple) {
3076 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3077 options::OPT_mno_outline_atomics)) {
3079 if (!Triple.isAArch64()) {
3080 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3081 << Triple.getArchName() << A->getOption().getName();
3083 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3084 CmdArgs.push_back(
"-target-feature");
3085 CmdArgs.push_back(
"+outline-atomics");
3087 CmdArgs.push_back(
"-target-feature");
3088 CmdArgs.push_back(
"-outline-atomics");
3092 CmdArgs.push_back(
"-target-feature");
3093 CmdArgs.push_back(
"+outline-atomics");
3098 llvm::opt::ArgStringList &CmdArgs) {
3099 if (TCArgs.hasFlag(options::OPT_offload_compress,
3100 options::OPT_no_offload_compress,
false))
3101 CmdArgs.push_back(
"--compress");
3102 if (TCArgs.hasArg(options::OPT_v))
3103 CmdArgs.push_back(
"--verbose");
3104 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3106 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3110 const llvm::Triple &Triple,
3111 const llvm::Reloc::Model &RelocationModel,
3112 llvm::opt::ArgStringList &CmdArgs) {
3113 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3114 StringRef CM = A->getValue();
3116 if (Triple.isOSAIX() && CM ==
"medium")
3118 if (Triple.isAArch64(64)) {
3119 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3120 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3121 RelocationModel != llvm::Reloc::Static)
3122 D.
Diag(diag::err_drv_argument_only_allowed_with)
3123 << A->getAsString(Args) <<
"-fno-pic";
3124 }
else if (Triple.isLoongArch()) {
3125 if (CM ==
"extreme" &&
3126 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3127 D.
Diag(diag::err_drv_argument_not_allowed_with)
3128 << A->getAsString(Args) <<
"-fplt";
3129 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3132 CM = llvm::StringSwitch<StringRef>(CM)
3133 .Case(
"normal",
"small")
3134 .Case(
"extreme",
"large")
3136 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3137 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3138 }
else if (Triple.isRISCV()) {
3140 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3141 D.
Diag(diag::err_drv_argument_not_allowed_with)
3142 << A->getAsString(Args) <<
"-fpic";
3145 else if (CM ==
"medany")
3147 Ok = CM ==
"small" || CM ==
"medium" ||
3148 (CM ==
"large" && Triple.isRISCV64());
3149 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3150 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3151 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3155 }
else if (Triple.isSPARC64()) {
3158 else if (CM ==
"medmid")
3160 else if (CM ==
"medany")
3162 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3163 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3164 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3167 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3169 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3170 << A->getSpelling() << CM << Triple.getTriple();
3174 if (Triple.getArch() == llvm::Triple::x86_64) {
3175 bool IsMediumCM =
false;
3176 bool IsLargeCM =
false;
3177 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3178 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3179 IsLargeCM = StringRef(A->getValue()) ==
"large";
3181 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3182 if (!IsMediumCM && !IsLargeCM) {
3183 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3184 << A->getOption().getRenderName();
3186 A->render(Args, CmdArgs);
3188 }
else if (IsMediumCM) {
3189 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3190 }
else if (IsLargeCM) {
3191 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3197 ArgStringList &CmdArgs) {
3202 Args.getLastArg(options::OPT_fcolor_diagnostics,
3203 options::OPT_fno_color_diagnostics);
3204 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3205 StringRef
Value(A->getValue());
3207 D.
Diag(diag::err_drv_invalid_argument_to_option)
3208 <<
Value << A->getOption().getName();
3212 CmdArgs.push_back(
"-fcolor-diagnostics");
3217 for (; *Arg; ++Arg) {
3223 Res.push_back(
'\\');
3226 Res.push_back(*Arg);
3231 const llvm::opt::ArgList &Args) {
3235 llvm::opt::ArgStringList OriginalArgs;
3236 for (
const auto &Arg : Args)
3237 Arg->render(Args, OriginalArgs);
3241 for (
const char *OriginalArg : OriginalArgs) {
3245 Flags += EscapedArg;
3248 return Args.MakeArgString(Flags);
3252 const llvm::opt::ArgList &Args,
3253 bool &FRecordCommandLine,
3254 bool &GRecordCommandLine) {
3257 const std::string &TripleStr = Triple.getTriple();
3259 FRecordCommandLine =
3260 Args.hasFlag(options::OPT_frecord_command_line,
3261 options::OPT_fno_record_command_line,
false);
3262 GRecordCommandLine =
3263 Args.hasFlag(options::OPT_grecord_command_line,
3264 options::OPT_gno_record_command_line,
false);
3265 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3266 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3267 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3268 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3275 ArgStringList &CmdArgs) {
3276 bool use_fwrapv =
false;
3277 bool use_fwrapv_pointer =
false;
3278 for (
const Arg *A : Args.filtered(
3279 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3280 options::OPT_fwrapv, options::OPT_fno_wrapv,
3281 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3283 switch (A->getOption().getID()) {
3284 case options::OPT_fstrict_overflow:
3286 use_fwrapv_pointer =
false;
3288 case options::OPT_fno_strict_overflow:
3290 use_fwrapv_pointer =
true;
3292 case options::OPT_fwrapv:
3295 case options::OPT_fno_wrapv:
3298 case options::OPT_fwrapv_pointer:
3299 use_fwrapv_pointer =
true;
3301 case options::OPT_fno_wrapv_pointer:
3302 use_fwrapv_pointer =
false;
3308 CmdArgs.push_back(
"-fwrapv");
3309 if (use_fwrapv_pointer)
3310 CmdArgs.push_back(
"-fwrapv-pointer");
3317 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3318 if (A->getOption().matches(options::OPT_O4) ||
3319 A->getOption().matches(options::OPT_Ofast))
3322 if (A->getOption().matches(options::OPT_O0))
3325 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3328 StringRef S(A->getValue());
3336 unsigned OptLevel = 0;
3337 if (S.getAsInteger(10, OptLevel))
3340 return OptLevel > 1;
3347 ArgStringList &CmdArgs) {
3349 OptSpecifier vectorizeAliasOption =
3350 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
3351 if (Args.hasFlag(options::OPT_fvectorize, vectorizeAliasOption,
3352 options::OPT_fno_vectorize, EnableVec))
3353 CmdArgs.push_back(
"-vectorize-loops");
3357 ArgStringList &CmdArgs) {
3359 OptSpecifier SLPVectAliasOption =
3360 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
3361 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
3362 options::OPT_fno_slp_vectorize, EnableSLPVec))
3363 CmdArgs.push_back(
"-vectorize-slp");
3367 ArgStringList &CmdArgs) {
3368 if (Args.hasFlag(options::OPT_floop_interchange,
3369 options::OPT_fno_loop_interchange,
false))
3370 CmdArgs.push_back(
"-floop-interchange");
3376 const llvm::opt::ArgList &Args) {
3377 Arg *A = Args.getLastArg(clang::driver::options::OPT_mprefer_vector_width_EQ);
3381 StringRef
Value = A->getValue();
3382 unsigned Width LLVM_ATTRIBUTE_UNINITIALIZED;
3386 if (
Value !=
"none" &&
Value.getAsInteger(10, Width)) {
3387 Diags.
Report(clang::diag::err_drv_invalid_value)
3388 << A->getOption().getName() <<
Value;
3400 const Arg &A,
size_t &Position) {
3401 const char RefinementStepToken =
':';
3402 Position = In.find(RefinementStepToken);
3403 if (Position != StringRef::npos) {
3404 StringRef Option = A.getOption().getName();
3405 StringRef RefStep = In.substr(Position + 1);
3413 if (RefStep.size() != 1) {
3414 Diags.
Report(diag::err_drv_invalid_value) << Option << RefStep;
3417 char RefStepChar = RefStep[0];
3418 if (RefStepChar <
'0' || RefStepChar >
'9') {
3419 Diags.
Report(diag::err_drv_invalid_value) << Option << RefStep;
3429 const ArgList &Args) {
3430 StringRef DisabledPrefixIn =
"!";
3431 StringRef DisabledPrefixOut =
"!";
3432 StringRef EnabledPrefixOut =
"";
3435 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
3439 unsigned NumOptions = A->getNumValues();
3440 if (NumOptions == 0) {
3446 if (NumOptions == 1) {
3447 StringRef Val = A->getValue(0);
3451 StringRef ValBase = Val.slice(0, RefStepLoc);
3452 if (ValBase ==
"all" || ValBase ==
"none" || ValBase ==
"default") {
3461 llvm::StringMap<bool> OptionStrings;
3462 OptionStrings.insert(std::make_pair(
"divd",
false));
3463 OptionStrings.insert(std::make_pair(
"divf",
false));
3464 OptionStrings.insert(std::make_pair(
"divh",
false));
3465 OptionStrings.insert(std::make_pair(
"vec-divd",
false));
3466 OptionStrings.insert(std::make_pair(
"vec-divf",
false));
3467 OptionStrings.insert(std::make_pair(
"vec-divh",
false));
3468 OptionStrings.insert(std::make_pair(
"sqrtd",
false));
3469 OptionStrings.insert(std::make_pair(
"sqrtf",
false));
3470 OptionStrings.insert(std::make_pair(
"sqrth",
false));
3471 OptionStrings.insert(std::make_pair(
"vec-sqrtd",
false));
3472 OptionStrings.insert(std::make_pair(
"vec-sqrtf",
false));
3473 OptionStrings.insert(std::make_pair(
"vec-sqrth",
false));
3475 for (
unsigned i = 0; i != NumOptions; ++i) {
3476 StringRef Val = A->getValue(i);
3478 bool IsDisabled = Val.starts_with(DisabledPrefixIn);
3481 Val = Val.substr(1);
3487 StringRef ValBase = Val.slice(0, RefStep);
3488 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
3489 if (OptionIter == OptionStrings.end()) {
3491 OptionIter = OptionStrings.find(ValBase.str() +
'f');
3492 if (OptionIter == OptionStrings.end()) {
3494 Diags.
Report(diag::err_drv_unknown_argument) << Val;
3500 if (OptionStrings[ValBase.str() +
'd'] ||
3501 OptionStrings[ValBase.str() +
'h']) {
3502 Diags.
Report(diag::err_drv_invalid_value)
3503 << A->getOption().getName() << Val;
3508 if (OptionIter->second ==
true) {
3510 Diags.
Report(diag::err_drv_invalid_value)
3511 << A->getOption().getName() << Val;
3516 OptionIter->second =
true;
3520 if (ValBase.back() !=
'f' && ValBase.back() !=
'd' &&
3521 ValBase.back() !=
'h') {
3522 OptionStrings[ValBase.str() +
'd'] =
true;
3523 OptionStrings[ValBase.str() +
'h'] =
true;
3527 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
3528 Out = Args.MakeArgString(Out + Prefix + Val);
3529 if (i != NumOptions - 1)
3530 Out = Args.MakeArgString(Out +
",");
3554 llvm_unreachable(
"Fully covered switch above");
3560 if (!ComplexRangeStr.empty())
3561 return "-complex-range=" + ComplexRangeStr;
3562 return ComplexRangeStr;
static bool useLeafFramePointerForTargetByDefault(const llvm::Triple &Triple)
static unsigned ParseDebugDefaultVersion(const ToolChain &TC, const ArgList &Args)
static bool getRefinementStep(StringRef In, clang::DiagnosticsEngine &Diags, const Arg &A, size_t &Position)
static void getWebAssemblyTargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, std::vector< StringRef > &Features)
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
Concrete class used by the front-end to report problems and issues.
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
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.
const FunctionProtoType * T
static constexpr ResponseFileSupport AtFileCurCP()