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 ArgStringList &CmdArgs) {
2275 llvm::Reloc::Model RelocationModel;
2280 if (RelocationModel != llvm::Reloc::Static)
2281 CmdArgs.push_back(
"-KPIC");
2287 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2293 const ArgList &Args) {
2294 if (Args.hasArg(options::OPT_static_libgcc) ||
2295 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2299 if (Args.hasArg(options::OPT_shared_libgcc))
2318 ArgStringList &CmdArgs,
const ArgList &Args) {
2322 CmdArgs.push_back(
"-l:libunwind.a");
2345 CmdArgs.push_back(
"-lgcc_eh");
2347 CmdArgs.push_back(
"-lgcc_s");
2355 CmdArgs.push_back(
"-lunwind");
2357 CmdArgs.push_back(
"-l:libunwind.a");
2360 CmdArgs.push_back(
"-l:libunwind.dll.a");
2362 CmdArgs.push_back(
"-l:libunwind.so");
2366 CmdArgs.push_back(
"-lunwind");
2376 ArgStringList &CmdArgs,
const ArgList &Args) {
2380 CmdArgs.push_back(
"-lgcc");
2384 CmdArgs.push_back(
"-lgcc");
2388 CmdArgs.push_back(
"--as-needed");
2390 CmdArgs.push_back(
"--no-as-needed");
2395 ArgStringList &CmdArgs,
const ArgList &Args) {
2406 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2409 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2410 if (A && A->getValue() != StringRef(
"platform")) {
2411 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2412 << A->getValue() <<
"MSVC";
2422 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2423 !Args.hasArg(options::OPT_static_pie))
2424 CmdArgs.push_back(
"-ldl");
2431 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2437 StringRef SaveStats = A->getValue();
2438 if (SaveStats ==
"obj" && Output.
isFilename()) {
2440 llvm::sys::path::remove_filename(StatsFile);
2441 }
else if (SaveStats !=
"cwd") {
2442 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2446 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2447 llvm::sys::path::append(StatsFile, BaseName);
2448 llvm::sys::path::replace_extension(StatsFile,
"stats");
2460 assert(Flag.front() ==
'-');
2462 Flags.push_back(Flag.str());
2464 Flags.push_back((
"!" + Flag.substr(1)).str());
2469 ArgStringList &CmdArgs,
bool IsLTO,
2470 const StringRef PluginOptPrefix) {
2471 auto addArg = [&, IsLTO](
const Twine &Arg) {
2473 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2474 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2476 CmdArgs.push_back(
"-mllvm");
2477 CmdArgs.push_back(Args.MakeArgString(Arg));
2481 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2482 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2484 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2485 StringRef
Value = A->getValue();
2487 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2488 !llvm::isPowerOf2_64(Boundary)) {
2489 D.
Diag(diag::err_drv_invalid_argument_to_option)
2490 <<
Value << A->getOption().getName();
2492 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2495 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2496 std::string AlignBranch;
2497 for (StringRef
T : A->getValues()) {
2498 if (
T !=
"fused" &&
T !=
"jcc" &&
T !=
"jmp" &&
T !=
"call" &&
2499 T !=
"ret" &&
T !=
"indirect")
2500 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2501 <<
T <<
"fused, jcc, jmp, call, ret, indirect";
2502 if (!AlignBranch.empty())
2506 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2508 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2509 StringRef
Value = A->getValue();
2510 unsigned PrefixSize;
2511 if (
Value.getAsInteger(10, PrefixSize)) {
2512 D.
Diag(diag::err_drv_invalid_argument_to_option)
2513 <<
Value << A->getOption().getName();
2515 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2541 llvm::opt::ArgStringList &CC1Args,
2543 StringRef Lib, StringRef
Arch, StringRef
Target,
2544 bool isBitCodeSDL) {
2547 std::string LibDeviceLoc =
"/libdevice";
2548 std::string LibBcPrefix =
"/libbc-";
2549 std::string LibPrefix =
"/lib";
2566 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2567 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2569 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2570 Twine(Lib +
"-" +
Arch).str(), Twine(Lib).str()}) {
2571 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2572 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2582 const auto *Ext =
".a";
2584 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2585 Twine(Lib +
"-" +
Arch).str()}) {
2586 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2587 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2598 bool FoundSDL =
false;
2599 for (
auto LPath : LibraryPaths) {
2600 for (
auto SDL : SDLs) {
2601 auto FullName = Twine(LPath + SDL).str();
2602 if (llvm::sys::fs::exists(FullName)) {
2603 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2620 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2621 llvm::opt::ArgStringList &CC1Args,
2623 StringRef
Arch, StringRef
Target,
bool isBitCodeSDL) {
2626 if (isBitCodeSDL &&
Arch.contains(
"nvptx"))
2629 bool FoundAOB =
false;
2630 std::string ArchiveOfBundles;
2633 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2634 auto Ext = IsMSVC ?
".lib" :
".a";
2635 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2636 if (llvm::sys::fs::exists(Lib)) {
2637 ArchiveOfBundles = Lib;
2641 Lib.consume_front(
"-l");
2642 for (
auto LPath : LibraryPaths) {
2643 ArchiveOfBundles.clear();
2644 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2645 : IsMSVC ? Lib + Ext
2646 :
"lib" + Lib + Ext)
2648 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2649 auto AOB = Twine(LPath + Prefix + LibFile).str();
2650 if (llvm::sys::fs::exists(AOB)) {
2651 ArchiveOfBundles = AOB;
2664 llvm::file_magic Magic;
2665 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2666 if (EC || Magic != llvm::file_magic::archive)
2669 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2670 std::string OutputLib =
2676 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2680 DeviceTriple +=
'-';
2681 std::string NormalizedTriple =
T.getToolChain().getTriple().normalize(
2682 llvm::Triple::CanonicalForm::FOUR_IDENT);
2683 DeviceTriple += NormalizedTriple;
2685 DeviceTriple +=
'-';
2689 std::string UnbundleArg(
"-unbundle");
2690 std::string TypeArg(
"-type=a");
2691 std::string InputArg(
"-input=" + ArchiveOfBundles);
2692 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2693 std::string OutputArg(
"-output=" + OutputLib);
2695 const char *UBProgram = DriverArgs.MakeArgString(
2696 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2698 ArgStringList UBArgs;
2699 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2700 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2701 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2702 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2703 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2707 std::string AdditionalArgs(
"-allow-missing-bundles");
2708 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2713 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2714 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2716 C.addCommand(std::make_unique<Command>(
2718 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2720 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2727 const llvm::opt::ArgList &DriverArgs,
2728 llvm::opt::ArgStringList &CC1Args,
2730 bool isBitCodeSDL) {
2761 const llvm::opt::ArgList &DriverArgs,
2762 llvm::opt::ArgStringList &CC1Args,
2764 bool isBitCodeSDL) {
2768 std::optional<std::string> LibPath =
2769 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2772 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2773 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2774 for (StringRef Path : Frags)
2775 LibraryPaths.emplace_back(Path.trim());
2779 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2780 LibraryPaths.emplace_back(Search_Dir);
2784 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2785 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2788 llvm::SmallSet<std::string, 16> SDLNames;
2789 static const StringRef HostOnlyArchives[] = {
2790 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2791 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2792 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2793 SDLNames.insert(std::string(
"-l") + SDLName);
2797 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2804 const StringRef LibFileExt =
".lib";
2805 if (!llvm::sys::path::has_extension(
FileName) ||
2807 llvm::sys::path::extension(
FileName).drop_front()) ==
2809 llvm::sys::path::extension(
FileName) == LibFileExt)
2810 SDLNames.insert(Input);
2817 for (
auto SDLName : SDLNames) {
2828static llvm::opt::Arg *
2830 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2834 const llvm::opt::ArgList &Args) {
2835 const unsigned MinCodeObjVer = 4;
2836 const unsigned MaxCodeObjVer = 6;
2839 if (CodeObjArg->getOption().getID() ==
2840 options::OPT_mcode_object_version_EQ) {
2841 unsigned CodeObjVer = MaxCodeObjVer;
2843 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2844 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2845 D.
Diag(diag::err_drv_invalid_int_value)
2846 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2852 const llvm::opt::ArgList &Args) {
2853 unsigned CodeObjVer = 6;
2855 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2860 const Driver &D,
const llvm::opt::ArgList &Args) {
2865 const llvm::opt::ArgList &Args,
2866 llvm::opt::ArgStringList &CmdArgs,
2867 const llvm::Triple &Triple,
bool IsLTO,
2868 const StringRef PluginOptPrefix) {
2869 auto addArg = [&, IsLTO](
const Twine &Arg) {
2871 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2872 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2874 CmdArgs.push_back(
"-mllvm");
2875 CmdArgs.push_back(Args.MakeArgString(Arg));
2879 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2880 options::OPT_mno_outline)) {
2881 if (A->getOption().matches(options::OPT_moutline)) {
2885 if (!(Triple.isARM() || Triple.isThumb() || Triple.isAArch64())) {
2886 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2888 addArg(Twine(
"-enable-machine-outliner"));
2892 addArg(Twine(
"-enable-machine-outliner=never"));
2896 auto *CodeGenDataGenArg =
2897 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
2898 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
2901 if (CodeGenDataGenArg && CodeGenDataUseArg)
2902 D.
Diag(diag::err_drv_argument_not_allowed_with)
2903 << CodeGenDataGenArg->getAsString(Args)
2904 << CodeGenDataUseArg->getAsString(Args);
2908 if (CodeGenDataGenArg)
2909 addArg(Twine(
"-codegen-data-generate"));
2912 if (CodeGenDataUseArg)
2913 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
2917 const llvm::opt::ArgList &DriverArgs,
2918 llvm::opt::ArgStringList &CC1Args,
2919 StringRef BitcodeSuffix,
2920 const llvm::Triple &Triple,
2925 std::optional<std::string> LibPath =
2926 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2929 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2930 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2931 for (StringRef Path : Frags)
2932 LibraryPaths.emplace_back(Path.trim());
2937 LibraryPaths.emplace_back(LibPath);
2941 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
2942 LibraryPaths.emplace_back(P);
2944 OptSpecifier LibomptargetBCPathOpt =
2945 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
2946 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
2947 : options::OPT_libomptarget_spirv_bc_path_EQ;
2949 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
2950 : Triple.isNVPTX() ?
"nvptx"
2952 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
2955 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
2957 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
2958 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
2959 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2962 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2963 CC1Args.push_back(
"-mlink-builtin-bitcode");
2964 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2966 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
2967 << LibOmpTargetFile;
2970 bool FoundBCLibrary =
false;
2972 for (StringRef LibraryPath : LibraryPaths) {
2974 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2975 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2976 CC1Args.push_back(
"-mlink-builtin-bitcode");
2977 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2978 FoundBCLibrary =
true;
2983 if (!FoundBCLibrary)
2984 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
2985 << LibOmpTargetName << ArchPrefix;
2989 const llvm::opt::ArgList &Args,
2990 llvm::opt::ArgStringList &CmdArgs) {
2992 (!Args.hasArg(options::OPT_nostdlib) ||
2993 TC.
getTriple().isKnownWindowsMSVCEnvironment()) &&
2994 !Args.hasArg(options::OPT_no_hip_rt) && !Args.hasArg(options::OPT_r)) {
2998 for (
auto *Arg : Args.filtered(options::OPT_no_hip_rt)) {
3005 const llvm::opt::ArgList &DriverArgs,
3006 llvm::opt::ArgStringList &CC1Args) {
3008 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
3014 llvm::sys::path::append(LibclcPath,
"lib",
"libclc");
3017 StringRef LibclcNamespec(A->getValue());
3018 bool FilenameSearch = LibclcNamespec.consume_front(
":");
3021 if (FilenameSearch && llvm::sys::fs::exists(LibclcTargetFile)) {
3022 CC1Args.push_back(
"-mlink-builtin-bitcode");
3023 CC1Args.push_back(DriverArgs.MakeArgString(LibclcTargetFile));
3026 if (!FilenameSearch)
3027 LibclcTargetFile +=
".bc";
3029 llvm::sys::path::append(LibclcPath, LibclcTargetFile);
3030 if (llvm::sys::fs::exists(LibclcPath)) {
3031 CC1Args.push_back(
"-mlink-builtin-bitcode");
3032 CC1Args.push_back(DriverArgs.MakeArgString(LibclcPath));
3036 D.
Diag(diag::err_drv_libclc_not_found) << LibclcTargetFile;
3042 const llvm::opt::ArgList &Args,
3043 llvm::opt::ArgStringList &CmdArgs,
3044 const llvm::Triple &Triple) {
3045 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3046 options::OPT_mno_outline_atomics)) {
3048 if (!Triple.isAArch64()) {
3049 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3050 << Triple.getArchName() << A->getOption().getName();
3052 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3053 CmdArgs.push_back(
"-target-feature");
3054 CmdArgs.push_back(
"+outline-atomics");
3056 CmdArgs.push_back(
"-target-feature");
3057 CmdArgs.push_back(
"-outline-atomics");
3061 CmdArgs.push_back(
"-target-feature");
3062 CmdArgs.push_back(
"+outline-atomics");
3067 llvm::opt::ArgStringList &CmdArgs) {
3068 if (TCArgs.hasFlag(options::OPT_offload_compress,
3069 options::OPT_no_offload_compress,
false))
3070 CmdArgs.push_back(
"--compress");
3071 if (TCArgs.hasArg(options::OPT_v))
3072 CmdArgs.push_back(
"--verbose");
3073 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3075 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3079 const llvm::Triple &Triple,
3080 const llvm::Reloc::Model &RelocationModel,
3081 llvm::opt::ArgStringList &CmdArgs) {
3082 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3083 StringRef CM = A->getValue();
3085 if (Triple.isOSAIX() && CM ==
"medium")
3087 if (Triple.isAArch64(64)) {
3088 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3089 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3090 RelocationModel != llvm::Reloc::Static)
3091 D.
Diag(diag::err_drv_argument_only_allowed_with)
3092 << A->getAsString(Args) <<
"-fno-pic";
3093 }
else if (Triple.isLoongArch()) {
3094 if (CM ==
"extreme" &&
3095 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3096 D.
Diag(diag::err_drv_argument_not_allowed_with)
3097 << A->getAsString(Args) <<
"-fplt";
3098 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3101 CM = llvm::StringSwitch<StringRef>(CM)
3102 .Case(
"normal",
"small")
3103 .Case(
"extreme",
"large")
3105 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3106 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3107 }
else if (Triple.isRISCV()) {
3109 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3110 D.
Diag(diag::err_drv_argument_not_allowed_with)
3111 << A->getAsString(Args) <<
"-fpic";
3114 else if (CM ==
"medany")
3116 Ok = CM ==
"small" || CM ==
"medium" ||
3117 (CM ==
"large" && Triple.isRISCV64());
3118 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3119 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3120 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3124 }
else if (Triple.isSPARC64()) {
3127 else if (CM ==
"medmid")
3129 else if (CM ==
"medany")
3131 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3132 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3133 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3136 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3138 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3139 << A->getSpelling() << CM << Triple.getTriple();
3143 if (Triple.getArch() == llvm::Triple::x86_64) {
3144 bool IsMediumCM =
false;
3145 bool IsLargeCM =
false;
3146 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3147 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3148 IsLargeCM = StringRef(A->getValue()) ==
"large";
3150 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3151 if (!IsMediumCM && !IsLargeCM) {
3152 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3153 << A->getOption().getRenderName();
3155 A->render(Args, CmdArgs);
3157 }
else if (IsMediumCM) {
3158 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3159 }
else if (IsLargeCM) {
3160 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3166 ArgStringList &CmdArgs) {
3171 Args.getLastArg(options::OPT_fcolor_diagnostics,
3172 options::OPT_fno_color_diagnostics);
3173 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3174 StringRef
Value(A->getValue());
3176 D.
Diag(diag::err_drv_invalid_argument_to_option)
3177 <<
Value << A->getOption().getName();
3181 CmdArgs.push_back(
"-fcolor-diagnostics");
3186 for (; *Arg; ++Arg) {
3192 Res.push_back(
'\\');
3195 Res.push_back(*Arg);
3200 const llvm::opt::ArgList &Args) {
3204 llvm::opt::ArgStringList OriginalArgs;
3205 for (
const auto &Arg : Args)
3206 Arg->render(Args, OriginalArgs);
3210 for (
const char *OriginalArg : OriginalArgs) {
3214 Flags += EscapedArg;
3217 return Args.MakeArgString(Flags);
3221 const llvm::opt::ArgList &Args,
3222 bool &FRecordCommandLine,
3223 bool &GRecordCommandLine) {
3226 const std::string &TripleStr = Triple.getTriple();
3228 FRecordCommandLine =
3229 Args.hasFlag(options::OPT_frecord_command_line,
3230 options::OPT_fno_record_command_line,
false);
3231 GRecordCommandLine =
3232 Args.hasFlag(options::OPT_grecord_command_line,
3233 options::OPT_gno_record_command_line,
false);
3234 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3235 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3236 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3237 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3244 ArgStringList &CmdArgs) {
3245 bool use_fwrapv =
false;
3246 bool use_fwrapv_pointer =
false;
3247 for (
const Arg *A : Args.filtered(
3248 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3249 options::OPT_fwrapv, options::OPT_fno_wrapv,
3250 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3252 switch (A->getOption().getID()) {
3253 case options::OPT_fstrict_overflow:
3255 use_fwrapv_pointer =
false;
3257 case options::OPT_fno_strict_overflow:
3259 use_fwrapv_pointer =
true;
3261 case options::OPT_fwrapv:
3264 case options::OPT_fno_wrapv:
3267 case options::OPT_fwrapv_pointer:
3268 use_fwrapv_pointer =
true;
3270 case options::OPT_fno_wrapv_pointer:
3271 use_fwrapv_pointer =
false;
3277 CmdArgs.push_back(
"-fwrapv");
3278 if (use_fwrapv_pointer)
3279 CmdArgs.push_back(
"-fwrapv-pointer");
3286 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3287 if (A->getOption().matches(options::OPT_O4) ||
3288 A->getOption().matches(options::OPT_Ofast))
3291 if (A->getOption().matches(options::OPT_O0))
3294 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3297 StringRef S(A->getValue());
3305 unsigned OptLevel = 0;
3306 if (S.getAsInteger(10, OptLevel))
3309 return OptLevel > 1;
3316 ArgStringList &CmdArgs) {
3318 OptSpecifier vectorizeAliasOption =
3319 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
3320 if (Args.hasFlag(options::OPT_fvectorize, vectorizeAliasOption,
3321 options::OPT_fno_vectorize, EnableVec))
3322 CmdArgs.push_back(
"-vectorize-loops");
3326 ArgStringList &CmdArgs) {
3328 OptSpecifier SLPVectAliasOption =
3329 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
3330 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
3331 options::OPT_fno_slp_vectorize, EnableSLPVec))
3332 CmdArgs.push_back(
"-vectorize-slp");
3336 ArgStringList &CmdArgs) {
3337 if (Args.hasFlag(options::OPT_floop_interchange,
3338 options::OPT_fno_loop_interchange,
false))
3339 CmdArgs.push_back(
"-floop-interchange");
3345 const llvm::opt::ArgList &Args) {
3346 Arg *A = Args.getLastArg(clang::driver::options::OPT_mprefer_vector_width_EQ);
3350 StringRef
Value = A->getValue();
3351 unsigned Width LLVM_ATTRIBUTE_UNINITIALIZED;
3355 if (
Value !=
"none" &&
Value.getAsInteger(10, Width)) {
3356 Diags.
Report(clang::diag::err_drv_invalid_value)
3357 << A->getOption().getName() <<
Value;
3369 const Arg &A,
size_t &Position) {
3370 const char RefinementStepToken =
':';
3371 Position = In.find(RefinementStepToken);
3372 if (Position != StringRef::npos) {
3373 StringRef Option = A.getOption().getName();
3374 StringRef RefStep = In.substr(Position + 1);
3382 if (RefStep.size() != 1) {
3383 Diags.
Report(diag::err_drv_invalid_value) << Option << RefStep;
3386 char RefStepChar = RefStep[0];
3387 if (RefStepChar <
'0' || RefStepChar >
'9') {
3388 Diags.
Report(diag::err_drv_invalid_value) << Option << RefStep;
3398 const ArgList &Args) {
3399 StringRef DisabledPrefixIn =
"!";
3400 StringRef DisabledPrefixOut =
"!";
3401 StringRef EnabledPrefixOut =
"";
3404 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
3408 unsigned NumOptions = A->getNumValues();
3409 if (NumOptions == 0) {
3415 if (NumOptions == 1) {
3416 StringRef Val = A->getValue(0);
3420 StringRef ValBase = Val.slice(0, RefStepLoc);
3421 if (ValBase ==
"all" || ValBase ==
"none" || ValBase ==
"default") {
3430 llvm::StringMap<bool> OptionStrings;
3431 OptionStrings.insert(std::make_pair(
"divd",
false));
3432 OptionStrings.insert(std::make_pair(
"divf",
false));
3433 OptionStrings.insert(std::make_pair(
"divh",
false));
3434 OptionStrings.insert(std::make_pair(
"vec-divd",
false));
3435 OptionStrings.insert(std::make_pair(
"vec-divf",
false));
3436 OptionStrings.insert(std::make_pair(
"vec-divh",
false));
3437 OptionStrings.insert(std::make_pair(
"sqrtd",
false));
3438 OptionStrings.insert(std::make_pair(
"sqrtf",
false));
3439 OptionStrings.insert(std::make_pair(
"sqrth",
false));
3440 OptionStrings.insert(std::make_pair(
"vec-sqrtd",
false));
3441 OptionStrings.insert(std::make_pair(
"vec-sqrtf",
false));
3442 OptionStrings.insert(std::make_pair(
"vec-sqrth",
false));
3444 for (
unsigned i = 0; i != NumOptions; ++i) {
3445 StringRef Val = A->getValue(i);
3447 bool IsDisabled = Val.starts_with(DisabledPrefixIn);
3450 Val = Val.substr(1);
3456 StringRef ValBase = Val.slice(0, RefStep);
3457 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
3458 if (OptionIter == OptionStrings.end()) {
3460 OptionIter = OptionStrings.find(ValBase.str() +
'f');
3461 if (OptionIter == OptionStrings.end()) {
3463 Diags.
Report(diag::err_drv_unknown_argument) << Val;
3469 if (OptionStrings[ValBase.str() +
'd'] ||
3470 OptionStrings[ValBase.str() +
'h']) {
3471 Diags.
Report(diag::err_drv_invalid_value)
3472 << A->getOption().getName() << Val;
3477 if (OptionIter->second ==
true) {
3479 Diags.
Report(diag::err_drv_invalid_value)
3480 << A->getOption().getName() << Val;
3485 OptionIter->second =
true;
3489 if (ValBase.back() !=
'f' && ValBase.back() !=
'd' &&
3490 ValBase.back() !=
'h') {
3491 OptionStrings[ValBase.str() +
'd'] =
true;
3492 OptionStrings[ValBase.str() +
'h'] =
true;
3496 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
3497 Out = Args.MakeArgString(Out + Prefix + Val);
3498 if (i != NumOptions - 1)
3499 Out = Args.MakeArgString(Out +
",");
3523 llvm_unreachable(
"Fully covered switch above");
3529 if (!ComplexRangeStr.empty())
3530 return "-complex-range=" + ComplexRangeStr;
3531 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()