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()))
163 switch (Triple.getArch()) {
166 case llvm::Triple::arm:
167 case llvm::Triple::thumb:
170 return Triple.isOSDarwin();
177 const llvm::Triple &Triple) {
178 switch (Triple.getArch()) {
181 case llvm::Triple::arm:
182 case llvm::Triple::armeb:
183 case llvm::Triple::thumb:
184 case llvm::Triple::thumbeb:
188 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
189 StringRef
V = A->getValue();
194 case llvm::Triple::aarch64:
198 return Triple.isOSWindows();
205 const llvm::Triple &Triple) {
206 if (Triple.isARM() || Triple.isThumb()) {
210 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
211 StringRef
V = A->getValue();
212 return V ==
"aapcs+leaf";
221 const llvm::Triple &Triple) {
251 Args.hasFlag(clang::driver::options::OPT_fno_omit_frame_pointer,
252 clang::driver::options::OPT_fomit_frame_pointer, DefaultFP);
257 bool EnableLeafFP = Args.hasFlag(
258 clang::driver::options::OPT_mno_omit_leaf_frame_pointer,
259 clang::driver::options::OPT_momit_leaf_frame_pointer, DefaultLeafFP);
274 const StringRef PluginOptPrefix) {
275 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
276 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
277 "-pass-remarks=" + A->getValue()));
279 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
280 CmdArgs.push_back(Args.MakeArgString(
281 Twine(PluginOptPrefix) +
"-pass-remarks-missed=" + A->getValue()));
283 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
284 CmdArgs.push_back(Args.MakeArgString(
285 Twine(PluginOptPrefix) +
"-pass-remarks-analysis=" + A->getValue()));
289 const llvm::Triple &Triple,
292 const StringRef PluginOptPrefix) {
293 StringRef Format =
"yaml";
294 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
295 Format = A->getValue();
299 Args.getLastArg(options::OPT_foptimization_record_file_EQ)) {
302 }
else if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
309 assert(!F.empty() &&
"Cannot determine remarks output name.");
311 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
312 "opt-remarks-filename=" + F +
"opt.ld." +
316 Args.getLastArg(options::OPT_foptimization_record_passes_EQ))
317 CmdArgs.push_back(Args.MakeArgString(
318 Twine(PluginOptPrefix) +
"opt-remarks-passes=" + A->getValue()));
320 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
321 "opt-remarks-format=" + Format.data()));
325 ArgStringList &CmdArgs,
326 const StringRef PluginOptPrefix) {
327 if (Args.hasFlag(options::OPT_fdiagnostics_show_hotness,
328 options::OPT_fno_diagnostics_show_hotness,
false))
329 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
330 "opt-remarks-with-hotness"));
333 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ))
335 Args.MakeArgString(Twine(PluginOptPrefix) +
336 "opt-remarks-hotness-threshold=" + A->getValue()));
341 StringRef Processor) {
345 auto GPUKind =
T.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Processor)
346 : llvm::AMDGPU::parseArchR600(Processor);
347 auto GPUFeatures =
T.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind)
348 : llvm::AMDGPU::getArchAttrR600(GPUKind);
349 if (GPUFeatures & llvm::AMDGPU::FEATURE_WGP)
351 return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode);
356 if (
D.getVFS().exists(
Path))
357 Paths.push_back(
Path.str());
361 const llvm::Triple &Triple,
363 std::vector<StringRef> &Features,
364 OptSpecifier Group) {
365 std::set<StringRef> Warned;
366 for (
const Arg *A : Args.filtered(Group)) {
367 StringRef Name = A->getOption().getName();
371 assert(Name.starts_with(
"m") &&
"Invalid feature name.");
372 Name = Name.substr(1);
376 if (Warned.count(Name) == 0) {
378 clang::diag::warn_drv_unsupported_option_for_processor)
379 << A->getAsString(Args) << Proc;
385 bool IsNegative = Name.consume_front(
"no-");
387 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
395 llvm::DenseSet<StringRef> UsedFeatures;
396 for (StringRef
Feature : llvm::reverse(Features)) {
397 if (UsedFeatures.insert(
Feature.drop_front()).second)
398 UnifiedFeatures.insert(UnifiedFeatures.begin(),
Feature);
401 return UnifiedFeatures;
405 const char *ArgName,
const char *EnvVar) {
406 const char *DirList = ::getenv(EnvVar);
407 bool CombinedArg =
false;
412 StringRef Name(ArgName);
413 if (Name ==
"-I" || Name ==
"-L" || Name.empty())
416 StringRef Dirs(DirList);
420 StringRef::size_type Delim;
421 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
424 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
426 CmdArgs.push_back(ArgName);
427 CmdArgs.push_back(
".");
432 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
434 CmdArgs.push_back(ArgName);
435 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
438 Dirs = Dirs.substr(Delim + 1);
443 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
445 CmdArgs.push_back(ArgName);
446 CmdArgs.push_back(
".");
450 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
452 CmdArgs.push_back(ArgName);
453 CmdArgs.push_back(Args.MakeArgString(Dirs));
459 const ArgList &Args, ArgStringList &CmdArgs,
465 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
472 for (
const auto &II : Inputs) {
476 if (
auto *IA = II.getAction())
486 if (II.isFilename()) {
487 CmdArgs.push_back(II.getFilename());
496 const Arg &A = II.getInputArg();
499 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
501 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
504 else if (A.getOption().matches(options::OPT_rpath) &&
508 A.renderAsInput(Args, CmdArgs);
510 if (
const Arg *A = Args.getLastArg(options::OPT_fveclib)) {
511 const llvm::Triple &Triple = TC.
getTriple();
512 StringRef
V = A->getValue();
513 if (
V ==
"ArmPL" && (Triple.isOSLinux() || Triple.isOSDarwin())) {
531 if (Triple.isOSLinux()) {
532 CmdArgs.push_back(Args.MakeArgString(
"--push-state"));
533 CmdArgs.push_back(Args.MakeArgString(
"--as-needed"));
535 if (!Args.hasArg(options::OPT_nostdlib))
536 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
537 CmdArgs.push_back(Args.MakeArgString(
"-lamath"));
538 if (!Args.hasArg(options::OPT_nostdlib))
539 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
540 if (Triple.isOSLinux())
541 CmdArgs.push_back(Args.MakeArgString(
"--pop-state"));
548 switch (
T.getArch()) {
549 case llvm::Triple::x86:
553 case llvm::Triple::aarch64:
554 if (
T.isOSManagarm())
555 return "aarch64managarm";
558 return "aarch64linux";
559 case llvm::Triple::aarch64_be:
561 return "aarch64elfb";
562 return "aarch64linuxb";
563 case llvm::Triple::arm:
564 case llvm::Triple::thumb:
565 case llvm::Triple::armeb:
566 case llvm::Triple::thumbeb: {
569 return IsBigEndian ?
"armelfb" :
"armelf";
570 return IsBigEndian ?
"armelfb_linux_eabi" :
"armelf_linux_eabi";
572 case llvm::Triple::m68k:
574 case llvm::Triple::ppc:
576 return "elf32ppclinux";
578 case llvm::Triple::ppcle:
580 return "elf32lppclinux";
582 case llvm::Triple::ppc64:
584 case llvm::Triple::ppc64le:
586 case llvm::Triple::riscv32:
587 return "elf32lriscv";
588 case llvm::Triple::riscv64:
589 return "elf64lriscv";
590 case llvm::Triple::sparc:
591 case llvm::Triple::sparcel:
592 return "elf32_sparc";
593 case llvm::Triple::sparcv9:
594 return "elf64_sparc";
595 case llvm::Triple::loongarch32:
596 return "elf32loongarch";
597 case llvm::Triple::loongarch64:
598 return "elf64loongarch";
599 case llvm::Triple::mips:
600 return "elf32btsmip";
601 case llvm::Triple::mipsel:
602 return "elf32ltsmip";
603 case llvm::Triple::mips64:
605 return "elf32btsmipn32";
606 return "elf64btsmip";
607 case llvm::Triple::mips64el:
609 return "elf32ltsmipn32";
610 return "elf64ltsmip";
611 case llvm::Triple::systemz:
613 case llvm::Triple::x86_64:
615 return "elf32_x86_64";
617 case llvm::Triple::ve:
619 case llvm::Triple::csky:
620 return "cskyelf_linux";
627 const ToolChain &TC,
const llvm::opt::ArgList &Args,
628 llvm::opt::ArgStringList &CmdArgs) {
634 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
635 StringRef
V = A->getValue();
636 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
637 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
639 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
640 << A->getSpelling() <<
V;
645 std::vector<StringRef> &Features,
646 OptSpecifier OnOpt, OptSpecifier OffOpt,
647 StringRef FeatureName) {
648 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
649 if (A->getOption().matches(OnOpt))
650 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
652 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
658 const ArgList &Args) {
659 Arg *MArch = Args.getLastArg(options::OPT_march_EQ);
660 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
662 return llvm::StringSwitch<std::string>(GPUName)
663 .Cases(
"rv630",
"rv635",
"r600")
664 .Cases(
"rv610",
"rv620",
"rs780",
"rs880")
665 .Case(
"rv740",
"rv770")
666 .Case(
"palm",
"cedar")
667 .Cases(
"sumo",
"sumo2",
"sumo")
668 .Case(
"hemlock",
"cypress")
669 .Case(
"aruba",
"cayman")
670 .Default(GPUName.str());
678 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
679 return A->getValue();
687 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
688 StringRef CPU = A->getValue();
694 return llvm::sys::getHostCPUName();
704 const llvm::Triple &
T,
bool FromAs) {
707 switch (
T.getArch()) {
711 case llvm::Triple::aarch64:
712 case llvm::Triple::aarch64_32:
713 case llvm::Triple::aarch64_be:
716 case llvm::Triple::arm:
717 case llvm::Triple::armeb:
718 case llvm::Triple::thumb:
719 case llvm::Triple::thumbeb: {
720 StringRef MArch, MCPU;
725 case llvm::Triple::avr:
726 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
727 return A->getValue();
730 case llvm::Triple::m68k:
733 case llvm::Triple::mips:
734 case llvm::Triple::mipsel:
735 case llvm::Triple::mips64:
736 case llvm::Triple::mips64el: {
740 return std::string(CPUName);
743 case llvm::Triple::nvptx:
744 case llvm::Triple::nvptx64:
745 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
746 return A->getValue();
749 case llvm::Triple::ppc:
750 case llvm::Triple::ppcle:
751 case llvm::Triple::ppc64:
752 case llvm::Triple::ppc64le:
753 if (Arg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ))
755 llvm::PPC::getNormalizedPPCTargetCPU(
T, A->getValue()));
756 return std::string(llvm::PPC::getNormalizedPPCTargetCPU(
T));
758 case llvm::Triple::csky:
759 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
760 return A->getValue();
761 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
762 return A->getValue();
765 case llvm::Triple::riscv32:
766 case llvm::Triple::riscv64:
769 case llvm::Triple::bpfel:
770 case llvm::Triple::bpfeb:
771 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
772 return A->getValue();
775 case llvm::Triple::sparc:
776 case llvm::Triple::sparcel:
777 case llvm::Triple::sparcv9:
780 case llvm::Triple::x86:
781 case llvm::Triple::x86_64:
784 case llvm::Triple::hexagon:
788 case llvm::Triple::lanai:
791 case llvm::Triple::systemz:
794 case llvm::Triple::r600:
795 case llvm::Triple::amdgcn:
798 case llvm::Triple::wasm32:
799 case llvm::Triple::wasm64:
802 case llvm::Triple::loongarch32:
803 case llvm::Triple::loongarch64:
806 case llvm::Triple::xtensa:
807 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
808 return A->getValue();
814 const llvm::Triple &Triple,
816 std::vector<StringRef> &Features) {
818 options::OPT_m_wasm_Features_Group);
822 const ArgList &Args, ArgStringList &CmdArgs,
823 bool ForAS,
bool IsAux) {
824 std::vector<StringRef> Features;
825 switch (Triple.getArch()) {
828 case llvm::Triple::mips:
829 case llvm::Triple::mipsel:
830 case llvm::Triple::mips64:
831 case llvm::Triple::mips64el:
834 case llvm::Triple::arm:
835 case llvm::Triple::armeb:
836 case llvm::Triple::thumb:
837 case llvm::Triple::thumbeb:
840 case llvm::Triple::ppc:
841 case llvm::Triple::ppcle:
842 case llvm::Triple::ppc64:
843 case llvm::Triple::ppc64le:
846 case llvm::Triple::riscv32:
847 case llvm::Triple::riscv64:
850 case llvm::Triple::systemz:
853 case llvm::Triple::aarch64:
854 case llvm::Triple::aarch64_32:
855 case llvm::Triple::aarch64_be:
858 case llvm::Triple::x86:
859 case llvm::Triple::x86_64:
862 case llvm::Triple::hexagon:
865 case llvm::Triple::wasm32:
866 case llvm::Triple::wasm64:
869 case llvm::Triple::sparc:
870 case llvm::Triple::sparcel:
871 case llvm::Triple::sparcv9:
874 case llvm::Triple::r600:
875 case llvm::Triple::amdgcn:
878 case llvm::Triple::nvptx:
879 case llvm::Triple::nvptx64:
882 case llvm::Triple::m68k:
885 case llvm::Triple::msp430:
888 case llvm::Triple::ve:
891 case llvm::Triple::csky:
894 case llvm::Triple::loongarch32:
895 case llvm::Triple::loongarch64:
901 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
902 CmdArgs.push_back(
Feature.data());
907 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
910 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
911 D.Diag(diag::err_drv_invalid_int_value)
912 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
913 return LtoJobsArg->getValue();
918 return Triple.isPS();
922 const llvm::opt::ArgList &Args) {
924 Arg *A = Args.getLastArg(options::OPT_mtls_dialect_EQ);
926 return Triple.hasDefaultTLSDESC();
927 StringRef
V = A->getValue();
928 bool SupportedArgument =
false, EnableTLSDESC =
false;
929 bool Unsupported = !Triple.isOSBinFormatELF();
930 if (Triple.isLoongArch() || Triple.isRISCV()) {
931 SupportedArgument =
V ==
"desc" ||
V ==
"trad";
932 EnableTLSDESC =
V ==
"desc";
933 }
else if (Triple.isX86()) {
934 SupportedArgument =
V ==
"gnu" ||
V ==
"gnu2";
935 EnableTLSDESC =
V ==
"gnu2";
940 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
941 << A->getSpelling() << Triple.getTriple();
942 }
else if (!SupportedArgument) {
943 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument_for_target)
944 << A->getSpelling() <<
V << Triple.getTriple();
946 return EnableTLSDESC;
950 ArgStringList &CmdArgs,
const InputInfo &Output,
953 const bool IsOSAIX = Triple.isOSAIX();
954 const bool IsAMDGCN = Triple.isAMDGCN();
955 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ);
958 const bool IsFatLTO = Args.hasFlag(options::OPT_ffat_lto_objects,
959 options::OPT_fno_fat_lto_objects,
false);
960 const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
962 assert(!Inputs.empty() &&
"Must have at least one input.");
964 auto Input = llvm::find_if(
966 if (Input == Inputs.end()) {
969 Input = Inputs.begin();
972 if (Linker !=
"lld" && Linker !=
"lld-link" &&
973 llvm::sys::path::filename(LinkerPath) !=
"ld.lld" &&
974 llvm::sys::path::stem(LinkerPath) !=
"ld.lld" && !Triple.isOSOpenBSD()) {
978 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
979 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
982 CmdArgs.push_back(
"-plugin");
985 const char *Suffix =
".dll";
986#elif defined(__APPLE__)
987 const char *Suffix =
".dylib";
989 const char *Suffix =
".so";
993 llvm::sys::path::native(Twine(
D.Dir) +
994 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
997 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
1002 CmdArgs.push_back(
"--fat-lto-objects");
1004 if (Args.hasArg(options::OPT_flto_partitions_EQ)) {
1006 StringRef A = Args.getLastArgValue(options::OPT_flto_partitions_EQ,
"8");
1007 if (A.getAsInteger(10,
Value) || (
Value < 1)) {
1008 Arg *Arg = Args.getLastArg(options::OPT_flto_partitions_EQ);
1009 D.Diag(diag::err_drv_invalid_int_value)
1010 << Arg->getAsString(Args) << Arg->getValue();
1012 CmdArgs.push_back(Args.MakeArgString(
"--lto-partitions=" + A));
1016 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
1017 const char *ExtraDash = IsOSAIX ?
"-" :
"";
1018 const char *ParallelismOpt = IsOSAIX ?
"-threads=" :
"jobs=";
1023 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
1024 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1025 "-generate-arange-section"));
1029 Arg *ArgVecLib = Args.getLastArg(options::OPT_fveclib);
1030 if (ArgVecLib && ArgVecLib->getNumValues() == 1) {
1033 std::optional<StringRef> OptVal =
1034 llvm::StringSwitch<std::optional<StringRef>>(ArgVecLib->getValue())
1035 .Case(
"Accelerate",
"Accelerate")
1036 .Case(
"libmvec",
"LIBMVEC")
1037 .Case(
"AMDLIBM",
"AMDLIBM")
1038 .Case(
"MASSV",
"MASSV")
1039 .Case(
"SVML",
"SVML")
1040 .Case(
"SLEEF",
"sleefgnuabi")
1041 .Case(
"Darwin_libsystem_m",
"Darwin_libsystem_m")
1042 .Case(
"ArmPL",
"ArmPL")
1043 .Case(
"none",
"none")
1044 .Default(std::nullopt);
1047 CmdArgs.push_back(Args.MakeArgString(
1048 Twine(PluginOptPrefix) +
"-vector-library=" + OptVal.value()));
1058 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
1060 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1064 if (A->getOption().matches(options::OPT_O4) ||
1065 A->getOption().matches(options::OPT_Ofast))
1067 else if (A->getOption().matches(options::OPT_O)) {
1068 OOpt = A->getValue();
1071 else if (OOpt ==
"s" || OOpt ==
"z")
1073 }
else if (A->getOption().matches(options::OPT_O0))
1075 if (!OOpt.empty()) {
1077 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"O" + OOpt));
1079 CmdArgs.push_back(Args.MakeArgString(Twine(
"--lto-CGO") + OOpt));
1083 if (Args.hasArg(options::OPT_gsplit_dwarf)) {
1085 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1092 Args.MakeArgString(Twine(PluginOptPrefix) +
"dwo_dir=" + F +
"dwo"));
1095 if (IsThinLTO && !IsOSAIX)
1096 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
1097 else if (IsThinLTO && IsOSAIX)
1098 CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
1103 if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
1104 Args.hasArg(options::OPT_fenable_matrix))
1106 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-matrix"));
1109 if (!Parallelism.empty())
1110 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1111 ParallelismOpt + Parallelism));
1114 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
1115 options::OPT_fno_global_isel)) {
1118 CmdArgs.push_back(Args.MakeArgString(
1119 Twine(PluginOptPrefix) +
"-global-isel=" +
1120 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
1125 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
1126 if (A->getOption().matches(options::OPT_glldb))
1128 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
1129 else if (A->getOption().matches(options::OPT_gsce))
1131 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
1132 else if (A->getOption().matches(options::OPT_gdbx))
1134 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
1137 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
1143 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
1147 Arg *A = Args.getLastArg(options::OPT_g_Group);
1148 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
1149 !A->getOption().matches(options::OPT_ggdb0);
1150 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
1151 options::OPT_gno_strict_dwarf,
true))
1153 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
1155 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
1156 StringRef
V = A->getValue();
1157 if (
V ==
"vec-default")
1159 if (
V ==
"vec-extabi") {
1161 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
1167 bool UseSeparateSections =
1170 if (Args.hasFlag(options::OPT_ffunction_sections,
1171 options::OPT_fno_function_sections, UseSeparateSections))
1173 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
1174 else if (Args.hasArg(options::OPT_fno_function_sections))
1176 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
1178 bool DataSectionsTurnedOff =
false;
1179 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1180 UseSeparateSections)) {
1182 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
1183 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
1184 DataSectionsTurnedOff =
true;
1186 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
1189 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
1190 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
1191 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
1192 options::OPT_mno_xcoff_roptr,
false);
1193 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
1195 D.Diag(diag::err_drv_unsupported_opt_for_target)
1196 << OptStr << Triple.str();
1202 if (DataSectionsTurnedOff)
1203 D.Diag(diag::err_roptr_requires_data_sections);
1206 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
1211 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
1212 options::OPT_fno_split_machine_functions)) {
1213 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
1214 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1215 "-split-machine-functions"));
1219 StringRef FName = A->getValue();
1220 if (!llvm::sys::fs::exists(FName))
1221 D.Diag(diag::err_drv_no_such_file) << FName;
1223 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1224 "sample-profile=" + FName));
1228 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1229 "cs-profile-generate"));
1230 if (CSPGOGenerateArg->getOption().matches(
1231 options::OPT_fcs_profile_generate_EQ)) {
1233 llvm::sys::path::append(
Path,
"default_%m.profraw");
1234 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1235 "cs-profile-path=" +
Path));
1238 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1239 "cs-profile-path=default_%m.profraw"));
1242 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1243 if (
Path.empty() || llvm::sys::fs::is_directory(
Path))
1244 llvm::sys::path::append(
Path,
"default.profdata");
1245 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1246 "cs-profile-path=" +
Path));
1250 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1252 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1253 "-enable-jmc-instrument"));
1255 D.Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1258 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1259 Triple.hasDefaultEmulatedTLS())) {
1261 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1265 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1267 if (Args.hasFlag(options::OPT_fstack_size_section,
1268 options::OPT_fno_stack_size_section,
false))
1270 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1274 if (!StatsFile.empty())
1276 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1279 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1280 CmdArgs.push_back(Args.MakeArgString(
1281 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1292 Output, PluginOptPrefix);
1298 true, PluginOptPrefix);
1300 bool IsELF = Triple.isOSBinFormatELF();
1302 bool ImplicitMapSyms =
false;
1303 for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
1304 for (StringRef
V : A->getValues()) {
1305 auto Equal =
V.split(
'=');
1306 auto checkArg = [&](
bool ValidTarget,
1307 std::initializer_list<const char *>
Set) {
1309 D.Diag(diag::err_drv_unsupported_opt_for_target)
1310 << (Twine(
"-Wa,") +
Equal.first +
"=").str()
1311 << Triple.getTriple();
1312 }
else if (!llvm::is_contained(
Set,
Equal.second)) {
1313 D.Diag(diag::err_drv_unsupported_option_argument)
1314 << (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
1317 if (
Equal.first ==
"-mmapsyms") {
1318 ImplicitMapSyms =
Equal.second ==
"implicit";
1319 checkArg(IsELF && Triple.isAArch64(), {
"default",
"implicit"});
1320 }
else if (
V ==
"--crel")
1322 else if (
V ==
"--no-crel")
1330 if (IsELF && !Triple.isMIPS()) {
1331 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"-crel"));
1333 D.Diag(diag::err_drv_unsupported_opt_for_target)
1334 <<
"-Wa,--crel" <<
D.getTargetTriple();
1337 if (ImplicitMapSyms)
1339 Args.MakeArgString(Twine(PluginOptPrefix) +
"-implicit-mapsyms"));
1341 if (Args.hasArg(options::OPT_ftime_report))
1343 Args.MakeArgString(Twine(PluginOptPrefix) +
"-time-passes"));
1345 if (Arg *A = Args.getLastArg(options::OPT_fthinlto_distributor_EQ)) {
1347 Args.MakeArgString(
"--thinlto-distributor=" + Twine(A->getValue())));
1349 Args.MakeArgString(
"--thinlto-remote-compiler=" +
1352 for (
auto A : Args.getAllArgValues(options::OPT_Xthinlto_distributor_EQ))
1353 CmdArgs.push_back(Args.MakeArgString(
"--thinlto-distributor-arg=" + A));
1358 const ArgList &Args,
1359 ArgStringList &CmdArgs) {
1364 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1365 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1369 ArgStringList &CmdArgs) {
1370 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1371 options::OPT_fno_rtlib_add_rpath,
false))
1379 CandidateRPaths.emplace_back(*CandidateRPath);
1381 for (
const auto &CandidateRPath : CandidateRPaths) {
1382 if (TC.
getVFS().exists(CandidateRPath)) {
1383 CmdArgs.push_back(
"-rpath");
1384 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1390 const ToolChain &TC,
const ArgList &Args,
1391 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1393 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1394 options::OPT_fno_openmp,
false)) {
1396 if (Args.hasFlag(options::OPT_foffload_via_llvm,
1397 options::OPT_fno_offload_via_llvm,
false))
1398 CmdArgs.push_back(
"-lomptarget");
1408 if (ForceStaticHostRuntime)
1409 CmdArgs.push_back(
"-Bstatic");
1413 CmdArgs.push_back(
"-lomp");
1416 CmdArgs.push_back(
"-lgomp");
1419 CmdArgs.push_back(
"-liomp5");
1425 if (ForceStaticHostRuntime)
1426 CmdArgs.push_back(
"-Bdynamic");
1429 CmdArgs.push_back(
"-lrt");
1431 if (IsOffloadingHost)
1432 CmdArgs.push_back(
"-lomptarget");
1443 const llvm::opt::ArgList &Args,
1444 llvm::opt::ArgStringList &CmdArgs) {
1450 constexpr llvm::StringLiteral Targets(
"--offload-targets=");
1454 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1455 [](
auto TC) { return TC.second->getTripleString(); });
1457 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1461 ArgStringList &CmdArgs, StringRef Sanitizer,
1462 bool IsShared,
bool IsWhole) {
1465 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1468 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1478 ArgStringList &CmdArgs,
1479 StringRef Sanitizer) {
1484 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1487 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1488 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1495 const llvm::opt::ArgList &Args,
1496 llvm::opt::ArgStringList &CmdArgs,
1499 "AIX linker does not support any form of --as-needed option yet.");
1507 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1508 CmdArgs.push_back(
"-z");
1509 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1511 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1516 const llvm::opt::ArgList &Args,
1517 ArgStringList &CmdArgs) {
1522 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1524 CmdArgs.push_back(
"-lpthread");
1526 CmdArgs.push_back(
"-lrt");
1528 CmdArgs.push_back(
"-lm");
1533 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1534 CmdArgs.push_back(
"-ldl");
1538 CmdArgs.push_back(
"-lexecinfo");
1540 CmdArgs.push_back(
"-lbsd");
1546 CmdArgs.push_back(
"-lresolv");
1556 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1561 SharedRuntimes.push_back(
"asan");
1562 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1563 HelperStaticRuntimes.push_back(
"asan-preinit");
1566 SharedRuntimes.push_back(
"memprof");
1567 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1568 HelperStaticRuntimes.push_back(
"memprof-preinit");
1571 SharedRuntimes.push_back(
"nsan");
1574 SharedRuntimes.push_back(
"ubsan_minimal");
1576 SharedRuntimes.push_back(
"ubsan_standalone");
1579 SharedRuntimes.push_back(
"scudo_standalone");
1582 SharedRuntimes.push_back(
"tsan");
1584 SharedRuntimes.push_back(
"tysan");
1587 SharedRuntimes.push_back(
"hwasan_aliases");
1589 SharedRuntimes.push_back(
"hwasan");
1590 if (!Args.hasArg(options::OPT_shared))
1591 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1594 SharedRuntimes.push_back(
"rtsan");
1599 StaticRuntimes.push_back(
"stats_client");
1603 HelperStaticRuntimes.push_back(
"asan_static");
1606 if (Args.hasArg(options::OPT_shared)) {
1615 StaticRuntimes.push_back(
"asan");
1617 StaticRuntimes.push_back(
"asan_cxx");
1622 StaticRuntimes.push_back(
"rtsan");
1625 StaticRuntimes.push_back(
"memprof");
1627 StaticRuntimes.push_back(
"memprof_cxx");
1632 StaticRuntimes.push_back(
"hwasan_aliases");
1634 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1636 StaticRuntimes.push_back(
"hwasan");
1638 StaticRuntimes.push_back(
"hwasan_cxx");
1642 StaticRuntimes.push_back(
"dfsan");
1644 StaticRuntimes.push_back(
"lsan");
1646 StaticRuntimes.push_back(
"msan");
1648 StaticRuntimes.push_back(
"msan_cxx");
1651 StaticRuntimes.push_back(
"nsan");
1653 StaticRuntimes.push_back(
"tsan");
1655 StaticRuntimes.push_back(
"tsan_cxx");
1658 StaticRuntimes.push_back(
"tysan");
1661 StaticRuntimes.push_back(
"ubsan_minimal");
1663 StaticRuntimes.push_back(
"ubsan_standalone");
1667 NonWholeStaticRuntimes.push_back(
"safestack");
1668 RequiredSymbols.push_back(
"__safestack_init");
1672 StaticRuntimes.push_back(
"cfi");
1674 StaticRuntimes.push_back(
"cfi_diag");
1679 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1682 NonWholeStaticRuntimes.push_back(
"stats");
1683 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1686 StaticRuntimes.push_back(
"scudo_standalone");
1688 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1695 ArgStringList &CmdArgs) {
1698 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1701 NonWholeStaticRuntimes, HelperStaticRuntimes,
1706 for (
auto S : RequiredSymbols) {
1707 CmdArgs.push_back(
"-u");
1708 CmdArgs.push_back(Args.MakeArgString(S));
1713 !Args.hasArg(options::OPT_shared)) {
1719 if (!Args.hasArg(clang::driver::options::OPT_nostdlibxx)) {
1720 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1721 !Args.hasArg(options::OPT_static);
1722 if (OnlyLibstdcxxStatic)
1723 CmdArgs.push_back(
"-Bstatic");
1725 if (OnlyLibstdcxxStatic)
1726 CmdArgs.push_back(
"-Bdynamic");
1730 for (
auto RT : SharedRuntimes)
1732 for (
auto RT : HelperStaticRuntimes)
1734 bool AddExportDynamic =
false;
1735 for (
auto RT : StaticRuntimes) {
1739 for (
auto RT : NonWholeStaticRuntimes) {
1745 if (AddExportDynamic)
1746 CmdArgs.push_back(
"--export-dynamic");
1749 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1753 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1754 <<
"-fsanitize=memtag*" << TC.
getTriple().str();
1757 Args.MakeArgString(
"--android-memtag-mode=" + SanArgs.
getMemtagMode()));
1759 CmdArgs.push_back(
"--android-memtag-heap");
1761 CmdArgs.push_back(
"--android-memtag-stack");
1764 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty();
1769 if (Args.hasArg(options::OPT_shared)) {
1771 CmdArgs.push_back(
"--whole-archive");
1773 CmdArgs.push_back(
"--no-whole-archive");
1777 CmdArgs.push_back(
"--whole-archive");
1779 for (
const auto &Mode : XRay.
modeList())
1781 CmdArgs.push_back(
"--no-whole-archive");
1789 const llvm::opt::ArgList &Args,
1790 ArgStringList &CmdArgs) {
1792 CmdArgs.push_back(
"-lpthread");
1794 CmdArgs.push_back(
"-lrt");
1795 CmdArgs.push_back(
"-lm");
1800 CmdArgs.push_back(
"-ldl");
1805 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1806 return !A->getOption().matches(options::OPT_O0);
1814 auto AddPostfix = [JA](
auto &F) {
1819 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1820 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1824 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1827 Arg *FinalOutput = Args.getLastArg(options::OPT_o, options::OPT__SLASH_o);
1828 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1829 T = FinalOutput->getValue();
1830 llvm::sys::path::remove_filename(
T);
1831 llvm::sys::path::append(
T,
1832 llvm::sys::path::stem(FinalOutput->getValue()));
1834 return Args.MakeArgString(
T);
1840 return Args.MakeArgString(
T);
1844 const JobAction &JA,
const ArgList &Args,
1845 const InputInfo &Output,
const char *OutFile) {
1846 ArgStringList ExtractArgs;
1847 ExtractArgs.push_back(
"--extract-dwo");
1849 ArgStringList StripArgs;
1850 StripArgs.push_back(
"--strip-dwo");
1855 ExtractArgs.push_back(OutFile);
1862 C.addCommand(std::make_unique<Command>(JA,
T,
1864 Exec, ExtractArgs, II, Output));
1867 C.addCommand(std::make_unique<Command>(
1877 Args.ClaimAllArgs(options::OPT_flto_EQ);
1878 Args.ClaimAllArgs(options::OPT_flto);
1879 Args.ClaimAllArgs(options::OPT_fno_lto);
1883 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1884 options::OPT_fcs_profile_generate_EQ,
1885 options::OPT_fno_profile_generate);
1886 if (CSPGOGenerateArg &&
1887 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1888 CSPGOGenerateArg =
nullptr;
1890 return CSPGOGenerateArg;
1894 auto *ProfileUseArg = Args.getLastArg(
1895 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1896 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1897 options::OPT_fno_profile_instr_use);
1899 if (ProfileUseArg &&
1900 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1901 ProfileUseArg =
nullptr;
1903 return ProfileUseArg;
1907 auto *ProfileSampleUseArg = Args.getLastArg(
1908 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
1910 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
1911 options::OPT_fno_profile_sample_use)))
1914 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
1919 case llvm::Reloc::Static:
1921 case llvm::Reloc::PIC_:
1923 case llvm::Reloc::DynamicNoPIC:
1924 return "dynamic-no-pic";
1925 case llvm::Reloc::ROPI:
1927 case llvm::Reloc::RWPI:
1929 case llvm::Reloc::ROPI_RWPI:
1932 llvm_unreachable(
"Unknown Reloc::Model kind");
1939std::tuple<llvm::Reloc::Model, unsigned, bool>
1947 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
1949 bool IsPICLevelTwo = PIC;
1952 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
1955 if (Triple.isAndroid()) {
1956 switch (Triple.getArch()) {
1957 case llvm::Triple::x86:
1958 case llvm::Triple::x86_64:
1960 IsPICLevelTwo =
true;
1970 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
1974 if (Triple.isOSOpenBSD()) {
1976 case llvm::Triple::arm:
1977 case llvm::Triple::aarch64:
1978 case llvm::Triple::mips64:
1979 case llvm::Triple::mips64el:
1980 case llvm::Triple::x86:
1981 case llvm::Triple::x86_64:
1982 IsPICLevelTwo =
false;
1985 case llvm::Triple::ppc:
1986 case llvm::Triple::sparcv9:
1987 IsPICLevelTwo =
true;
1999 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2000 options::OPT_fpic, options::OPT_fno_pic,
2001 options::OPT_fPIE, options::OPT_fno_PIE,
2002 options::OPT_fpie, options::OPT_fno_pie);
2003 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
2004 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
2005 options::OPT_fPIE, options::OPT_fpie)) {
2007 << LastPICArg->getSpelling() << Triple.str();
2008 if (Triple.getArch() == llvm::Triple::x86_64)
2009 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
2010 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2017 Option O = LastPICArg->getOption();
2018 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2019 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2020 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2022 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2024 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
2027 if (EffectiveTriple.isPS()) {
2028 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
2029 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
2030 if (Model !=
"kernel") {
2033 << LastPICArg->getSpelling()
2034 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
2044 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
2050 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
2051 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
2054 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2057 if (!Triple.isOSDarwin())
2059 << A->getSpelling() << Triple.str();
2068 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
2071 bool EmbeddedPISupported;
2072 switch (Triple.getArch()) {
2073 case llvm::Triple::arm:
2074 case llvm::Triple::armeb:
2075 case llvm::Triple::thumb:
2076 case llvm::Triple::thumbeb:
2077 EmbeddedPISupported =
true;
2080 EmbeddedPISupported =
false;
2084 bool ROPI =
false, RWPI =
false;
2085 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
2086 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
2087 if (!EmbeddedPISupported)
2089 << LastROPIArg->getSpelling() << Triple.str();
2092 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2093 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2094 if (!EmbeddedPISupported)
2096 << LastRWPIArg->getSpelling() << Triple.str();
2101 if ((ROPI || RWPI) && (PIC || PIE))
2104 if (Triple.isMIPS()) {
2111 if (ABIName ==
"n64")
2114 if(Args.hasArg(options::OPT_mno_abicalls))
2115 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2118 IsPICLevelTwo =
false;
2122 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2124 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2126 RelocM = llvm::Reloc::ROPI_RWPI;
2128 RelocM = llvm::Reloc::ROPI;
2130 RelocM = llvm::Reloc::RWPI;
2132 return std::make_tuple(RelocM, 0
U,
false);
2136 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
2137 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
2139 const llvm::opt::OptTable &Opts =
D.getOpts();
2140 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
2141 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
2142 D.Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
2144 return HasStaticPIE;
2164 const ArgList &Args) {
2165 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2166 options::OPT_falign_functions_EQ,
2167 options::OPT_fno_align_functions);
2168 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2171 if (A->getOption().matches(options::OPT_falign_functions))
2175 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2177 << A->getAsString(Args) << A->getValue();
2182 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2183 switch (DebugInfoKind) {
2184 case llvm::codegenoptions::DebugDirectivesOnly:
2185 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2187 case llvm::codegenoptions::DebugLineTablesOnly:
2188 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2190 case llvm::codegenoptions::DebugInfoConstructor:
2191 CmdArgs.push_back(
"-debug-info-kind=constructor");
2193 case llvm::codegenoptions::LimitedDebugInfo:
2194 CmdArgs.push_back(
"-debug-info-kind=limited");
2196 case llvm::codegenoptions::FullDebugInfo:
2197 CmdArgs.push_back(
"-debug-info-kind=standalone");
2199 case llvm::codegenoptions::UnusedTypeInfo:
2200 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2210 assert(A.getOption().matches(options::OPT_gN_Group) &&
2211 "Not a -g option that specifies a debug-info level");
2212 if (A.getOption().matches(options::OPT_g0) ||
2213 A.getOption().matches(options::OPT_ggdb0))
2214 return llvm::codegenoptions::NoDebugInfo;
2215 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2216 A.getOption().matches(options::OPT_ggdb1))
2217 return llvm::codegenoptions::DebugLineTablesOnly;
2218 if (A.getOption().matches(options::OPT_gline_directives_only))
2219 return llvm::codegenoptions::DebugDirectivesOnly;
2220 return llvm::codegenoptions::DebugInfoConstructor;
2224 const ArgList &Args) {
2225 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2231 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 5 ||
2234 << A->getAsString(Args) << A->getValue();
2239 return llvm::StringSwitch<unsigned>(ArgValue)
2240 .Case(
"-gdwarf-2", 2)
2241 .Case(
"-gdwarf-3", 3)
2242 .Case(
"-gdwarf-4", 4)
2243 .Case(
"-gdwarf-5", 5)
2248 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2249 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2250 options::OPT_gdwarf);
2254 const llvm::opt::ArgList &Args) {
2259 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2260 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2261 << GDwarfN->getSpelling() << TC.
getTriple().str();
2263 if (DwarfVersion == 0) {
2265 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2267 return DwarfVersion;
2271 ArgStringList &CmdArgs) {
2272 llvm::Reloc::Model RelocationModel;
2277 if (RelocationModel != llvm::Reloc::Static)
2278 CmdArgs.push_back(
"-KPIC");
2284 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2290 const ArgList &Args) {
2291 if (Args.hasArg(options::OPT_static_libgcc) ||
2292 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2296 if (Args.hasArg(options::OPT_shared_libgcc))
2315 ArgStringList &CmdArgs,
const ArgList &Args) {
2319 CmdArgs.push_back(
"-l:libunwind.a");
2342 CmdArgs.push_back(
"-lgcc_eh");
2344 CmdArgs.push_back(
"-lgcc_s");
2352 CmdArgs.push_back(
"-lunwind");
2354 CmdArgs.push_back(
"-l:libunwind.a");
2357 CmdArgs.push_back(
"-l:libunwind.dll.a");
2359 CmdArgs.push_back(
"-l:libunwind.so");
2363 CmdArgs.push_back(
"-lunwind");
2373 ArgStringList &CmdArgs,
const ArgList &Args) {
2377 CmdArgs.push_back(
"-lgcc");
2381 CmdArgs.push_back(
"-lgcc");
2384 if (
D.IsFlangMode() && TC.
getArch() == llvm::Triple::aarch64) {
2385 CmdArgs.push_back(
"--as-needed");
2387 CmdArgs.push_back(
"--no-as-needed");
2392 ArgStringList &CmdArgs,
const ArgList &Args) {
2403 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2406 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2407 if (A && A->getValue() != StringRef(
"platform")) {
2408 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2409 << A->getValue() <<
"MSVC";
2419 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2420 !Args.hasArg(options::OPT_static_pie))
2421 CmdArgs.push_back(
"-ldl");
2428 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2429 if (!A && !
D.CCPrintInternalStats)
2434 StringRef SaveStats = A->getValue();
2435 if (SaveStats ==
"obj" && Output.
isFilename()) {
2437 llvm::sys::path::remove_filename(StatsFile);
2438 }
else if (SaveStats !=
"cwd") {
2439 D.Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2443 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2444 llvm::sys::path::append(StatsFile, BaseName);
2445 llvm::sys::path::replace_extension(StatsFile,
"stats");
2447 assert(
D.CCPrintInternalStats);
2448 StatsFile.assign(
D.CCPrintInternalStatReportFilename.empty()
2450 :
D.CCPrintInternalStatReportFilename);
2457 assert(Flag.front() ==
'-');
2459 Flags.push_back(Flag.str());
2461 Flags.push_back((
"!" + Flag.substr(1)).str());
2466 ArgStringList &CmdArgs,
bool IsLTO,
2467 const StringRef PluginOptPrefix) {
2468 auto addArg = [&, IsLTO](
const Twine &Arg) {
2470 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2471 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2473 CmdArgs.push_back(
"-mllvm");
2474 CmdArgs.push_back(Args.MakeArgString(Arg));
2478 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2479 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2481 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2482 StringRef
Value = A->getValue();
2484 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2485 !llvm::isPowerOf2_64(Boundary)) {
2486 D.Diag(diag::err_drv_invalid_argument_to_option)
2487 <<
Value << A->getOption().getName();
2489 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2492 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2493 std::string AlignBranch;
2494 for (StringRef
T : A->getValues()) {
2495 if (
T !=
"fused" &&
T !=
"jcc" &&
T !=
"jmp" &&
T !=
"call" &&
2496 T !=
"ret" &&
T !=
"indirect")
2497 D.Diag(diag::err_drv_invalid_malign_branch_EQ)
2498 <<
T <<
"fused, jcc, jmp, call, ret, indirect";
2499 if (!AlignBranch.empty())
2503 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2505 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2506 StringRef
Value = A->getValue();
2507 unsigned PrefixSize;
2508 if (
Value.getAsInteger(10, PrefixSize)) {
2509 D.Diag(diag::err_drv_invalid_argument_to_option)
2510 <<
Value << A->getOption().getName();
2512 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2538 llvm::opt::ArgStringList &CC1Args,
2540 StringRef Lib, StringRef
Arch, StringRef
Target,
2541 bool isBitCodeSDL) {
2544 std::string LibDeviceLoc =
"/libdevice";
2545 std::string LibBcPrefix =
"/libbc-";
2546 std::string LibPrefix =
"/lib";
2563 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2564 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2566 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2567 Twine(Lib +
"-" +
Arch).str(), Twine(Lib).str()}) {
2568 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2569 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2579 const auto *Ext =
".a";
2581 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2582 Twine(Lib +
"-" +
Arch).str()}) {
2583 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2584 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2595 bool FoundSDL =
false;
2596 for (
auto LPath : LibraryPaths) {
2597 for (
auto SDL : SDLs) {
2598 auto FullName = Twine(LPath + SDL).str();
2599 if (llvm::sys::fs::exists(
FullName)) {
2600 CC1Args.push_back(DriverArgs.MakeArgString(
FullName));
2617 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2618 llvm::opt::ArgStringList &CC1Args,
2620 StringRef
Arch, StringRef
Target,
bool isBitCodeSDL) {
2623 if (isBitCodeSDL &&
Arch.contains(
"nvptx"))
2626 bool FoundAOB =
false;
2627 std::string ArchiveOfBundles;
2629 llvm::Triple Triple(
D.getTargetTriple());
2630 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2631 auto Ext = IsMSVC ?
".lib" :
".a";
2632 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2633 if (llvm::sys::fs::exists(Lib)) {
2634 ArchiveOfBundles = Lib;
2638 Lib.consume_front(
"-l");
2639 for (
auto LPath : LibraryPaths) {
2640 ArchiveOfBundles.clear();
2641 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2642 : IsMSVC ? Lib + Ext
2643 :
"lib" + Lib + Ext)
2645 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2646 auto AOB = Twine(LPath + Prefix + LibFile).str();
2647 if (llvm::sys::fs::exists(AOB)) {
2648 ArchiveOfBundles = AOB;
2661 llvm::file_magic Magic;
2662 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2663 if (EC || Magic != llvm::file_magic::archive)
2666 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2667 std::string OutputLib =
2668 D.GetTemporaryPath(Twine(Prefix + llvm::sys::path::filename(Lib) +
"-" +
2673 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2677 DeviceTriple +=
'-';
2678 std::string NormalizedTriple =
T.getToolChain().getTriple().normalize(
2679 llvm::Triple::CanonicalForm::FOUR_IDENT);
2680 DeviceTriple += NormalizedTriple;
2682 DeviceTriple +=
'-';
2686 std::string UnbundleArg(
"-unbundle");
2687 std::string TypeArg(
"-type=a");
2688 std::string InputArg(
"-input=" + ArchiveOfBundles);
2689 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2690 std::string OutputArg(
"-output=" + OutputLib);
2692 const char *UBProgram = DriverArgs.MakeArgString(
2693 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2695 ArgStringList UBArgs;
2696 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2697 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2698 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2699 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2700 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2704 std::string AdditionalArgs(
"-allow-missing-bundles");
2705 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2710 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2711 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2713 C.addCommand(std::make_unique<Command>(
2715 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2717 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2724 const llvm::opt::ArgList &DriverArgs,
2725 llvm::opt::ArgStringList &CC1Args,
2727 bool isBitCodeSDL) {
2758 const llvm::opt::ArgList &DriverArgs,
2759 llvm::opt::ArgStringList &CC1Args,
2761 bool isBitCodeSDL) {
2765 std::optional<std::string> LibPath =
2766 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2769 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2770 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2771 for (StringRef
Path : Frags)
2772 LibraryPaths.emplace_back(
Path.trim());
2776 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2777 LibraryPaths.emplace_back(Search_Dir);
2781 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2782 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2785 llvm::SmallSet<std::string, 16> SDLNames;
2786 static const StringRef HostOnlyArchives[] = {
2787 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2788 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2789 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2790 SDLNames.insert(std::string(
"-l") + SDLName);
2794 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2801 const StringRef LibFileExt =
".lib";
2802 if (!llvm::sys::path::has_extension(
FileName) ||
2804 llvm::sys::path::extension(
FileName).drop_front()) ==
2806 llvm::sys::path::extension(
FileName) == LibFileExt)
2807 SDLNames.insert(Input);
2814 for (
auto SDLName : SDLNames) {
2825static llvm::opt::Arg *
2827 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2831 const llvm::opt::ArgList &Args) {
2832 const unsigned MinCodeObjVer = 4;
2833 const unsigned MaxCodeObjVer = 6;
2836 if (CodeObjArg->getOption().getID() ==
2837 options::OPT_mcode_object_version_EQ) {
2838 unsigned CodeObjVer = MaxCodeObjVer;
2840 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2841 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2842 D.Diag(diag::err_drv_invalid_int_value)
2843 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2849 const llvm::opt::ArgList &Args) {
2850 unsigned CodeObjVer = 6;
2852 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2857 const Driver &
D,
const llvm::opt::ArgList &Args) {
2862 const llvm::opt::ArgList &Args,
2863 llvm::opt::ArgStringList &CmdArgs,
2864 const llvm::Triple &Triple,
bool IsLTO,
2865 const StringRef PluginOptPrefix) {
2866 auto addArg = [&, IsLTO](
const Twine &Arg) {
2868 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2869 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2871 CmdArgs.push_back(
"-mllvm");
2872 CmdArgs.push_back(Args.MakeArgString(Arg));
2876 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2877 options::OPT_mno_outline)) {
2878 if (A->getOption().matches(options::OPT_moutline)) {
2882 if (!(Triple.isARM() || Triple.isThumb() || Triple.isAArch64())) {
2883 D.Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2885 addArg(Twine(
"-enable-machine-outliner"));
2889 addArg(Twine(
"-enable-machine-outliner=never"));
2893 auto *CodeGenDataGenArg =
2894 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
2895 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
2898 if (CodeGenDataGenArg && CodeGenDataUseArg)
2899 D.Diag(diag::err_drv_argument_not_allowed_with)
2900 << CodeGenDataGenArg->getAsString(Args)
2901 << CodeGenDataUseArg->getAsString(Args);
2905 if (CodeGenDataGenArg)
2906 addArg(Twine(
"-codegen-data-generate"));
2909 if (CodeGenDataUseArg)
2910 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
2914 const llvm::opt::ArgList &DriverArgs,
2915 llvm::opt::ArgStringList &CC1Args,
2916 StringRef BitcodeSuffix,
2917 const llvm::Triple &Triple,
2922 std::optional<std::string> LibPath =
2923 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2926 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2927 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2928 for (StringRef
Path : Frags)
2929 LibraryPaths.emplace_back(
Path.trim());
2934 LibraryPaths.emplace_back(LibPath);
2938 llvm::sys::path::append(
P,
"..",
"lib", Triple.getTriple());
2939 LibraryPaths.emplace_back(
P);
2941 OptSpecifier LibomptargetBCPathOpt =
2942 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
2943 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
2944 : options::OPT_libomptarget_spirv_bc_path_EQ;
2946 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
2947 : Triple.isNVPTX() ?
"nvptx"
2949 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
2952 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
2954 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
2955 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
2956 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2959 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2960 CC1Args.push_back(
"-mlink-builtin-bitcode");
2961 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2963 D.Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
2964 << LibOmpTargetFile;
2967 bool FoundBCLibrary =
false;
2969 for (StringRef LibraryPath : LibraryPaths) {
2971 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2972 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2973 CC1Args.push_back(
"-mlink-builtin-bitcode");
2974 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2975 FoundBCLibrary =
true;
2980 if (!FoundBCLibrary)
2981 D.Diag(diag::err_drv_omp_offload_target_missingbcruntime)
2982 << LibOmpTargetName << ArchPrefix;
2986 const llvm::opt::ArgList &Args,
2987 llvm::opt::ArgStringList &CmdArgs) {
2989 (!Args.hasArg(options::OPT_nostdlib) ||
2990 TC.
getTriple().isKnownWindowsMSVCEnvironment()) &&
2991 !Args.hasArg(options::OPT_no_hip_rt) && !Args.hasArg(options::OPT_r)) {
2995 for (
auto *Arg : Args.filtered(options::OPT_no_hip_rt)) {
3002 const llvm::opt::ArgList &DriverArgs,
3003 llvm::opt::ArgStringList &CC1Args) {
3005 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
3011 llvm::sys::path::append(LibclcPath,
"lib",
"libclc");
3014 StringRef LibclcNamespec(A->getValue());
3015 bool FilenameSearch = LibclcNamespec.consume_front(
":");
3018 if (FilenameSearch && llvm::sys::fs::exists(LibclcTargetFile)) {
3019 CC1Args.push_back(
"-mlink-builtin-bitcode");
3020 CC1Args.push_back(DriverArgs.MakeArgString(LibclcTargetFile));
3023 if (!FilenameSearch)
3024 LibclcTargetFile +=
".bc";
3026 llvm::sys::path::append(LibclcPath, LibclcTargetFile);
3027 if (llvm::sys::fs::exists(LibclcPath)) {
3028 CC1Args.push_back(
"-mlink-builtin-bitcode");
3029 CC1Args.push_back(DriverArgs.MakeArgString(LibclcPath));
3033 D.Diag(diag::err_drv_libclc_not_found) << LibclcTargetFile;
3039 const llvm::opt::ArgList &Args,
3040 llvm::opt::ArgStringList &CmdArgs,
3041 const llvm::Triple &Triple) {
3042 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3043 options::OPT_mno_outline_atomics)) {
3045 if (!Triple.isAArch64()) {
3046 D.Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3047 << Triple.getArchName() << A->getOption().getName();
3049 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3050 CmdArgs.push_back(
"-target-feature");
3051 CmdArgs.push_back(
"+outline-atomics");
3053 CmdArgs.push_back(
"-target-feature");
3054 CmdArgs.push_back(
"-outline-atomics");
3058 CmdArgs.push_back(
"-target-feature");
3059 CmdArgs.push_back(
"+outline-atomics");
3064 llvm::opt::ArgStringList &CmdArgs) {
3065 if (TCArgs.hasFlag(options::OPT_offload_compress,
3066 options::OPT_no_offload_compress,
false))
3067 CmdArgs.push_back(
"--compress");
3068 if (TCArgs.hasArg(options::OPT_v))
3069 CmdArgs.push_back(
"--verbose");
3070 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3072 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3076 const llvm::Triple &Triple,
3077 const llvm::Reloc::Model &RelocationModel,
3078 llvm::opt::ArgStringList &CmdArgs) {
3079 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3080 StringRef CM = A->getValue();
3082 if (Triple.isOSAIX() && CM ==
"medium")
3084 if (Triple.isAArch64(64)) {
3085 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3086 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3087 RelocationModel != llvm::Reloc::Static)
3088 D.Diag(diag::err_drv_argument_only_allowed_with)
3089 << A->getAsString(Args) <<
"-fno-pic";
3090 }
else if (Triple.isLoongArch()) {
3091 if (CM ==
"extreme" &&
3092 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3093 D.Diag(diag::err_drv_argument_not_allowed_with)
3094 << A->getAsString(Args) <<
"-fplt";
3095 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3098 CM = llvm::StringSwitch<StringRef>(CM)
3099 .Case(
"normal",
"small")
3100 .Case(
"extreme",
"large")
3102 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3103 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3104 }
else if (Triple.isRISCV()) {
3106 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3107 D.Diag(diag::err_drv_argument_not_allowed_with)
3108 << A->getAsString(Args) <<
"-fpic";
3111 else if (CM ==
"medany")
3113 Ok = CM ==
"small" || CM ==
"medium" ||
3114 (CM ==
"large" && Triple.isRISCV64());
3115 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3116 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3117 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3121 }
else if (Triple.isSPARC64()) {
3124 else if (CM ==
"medmid")
3126 else if (CM ==
"medany")
3128 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3129 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3130 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3133 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3135 D.Diag(diag::err_drv_unsupported_option_argument_for_target)
3136 << A->getSpelling() << CM << Triple.getTriple();
3140 if (Triple.getArch() == llvm::Triple::x86_64) {
3141 bool IsMediumCM =
false;
3142 bool IsLargeCM =
false;
3143 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3144 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3145 IsLargeCM = StringRef(A->getValue()) ==
"large";
3147 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3148 if (!IsMediumCM && !IsLargeCM) {
3149 D.Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3150 << A->getOption().getRenderName();
3152 A->render(Args, CmdArgs);
3154 }
else if (IsMediumCM) {
3155 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3156 }
else if (IsLargeCM) {
3157 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3163 ArgStringList &CmdArgs) {
3168 Args.getLastArg(options::OPT_fcolor_diagnostics,
3169 options::OPT_fno_color_diagnostics);
3170 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3171 StringRef
Value(A->getValue());
3173 D.Diag(diag::err_drv_invalid_argument_to_option)
3174 <<
Value << A->getOption().getName();
3177 if (
D.getDiags().getDiagnosticOptions().ShowColors)
3178 CmdArgs.push_back(
"-fcolor-diagnostics");
3183 for (; *Arg; ++Arg) {
3189 Res.push_back(
'\\');
3192 Res.push_back(*Arg);
3197 const llvm::opt::ArgList &Args) {
3199 const char *Exec =
D.getClangProgramPath();
3201 llvm::opt::ArgStringList OriginalArgs;
3202 for (
const auto &Arg : Args)
3203 Arg->render(Args, OriginalArgs);
3207 for (
const char *OriginalArg : OriginalArgs) {
3211 Flags += EscapedArg;
3214 return Args.MakeArgString(Flags);
3218 const llvm::opt::ArgList &Args,
3219 bool &FRecordCommandLine,
3220 bool &GRecordCommandLine) {
3223 const std::string &TripleStr = Triple.getTriple();
3225 FRecordCommandLine =
3226 Args.hasFlag(options::OPT_frecord_command_line,
3227 options::OPT_fno_record_command_line,
false);
3228 GRecordCommandLine =
3229 Args.hasFlag(options::OPT_grecord_command_line,
3230 options::OPT_gno_record_command_line,
false);
3231 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3232 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3233 D.Diag(diag::err_drv_unsupported_opt_for_target)
3234 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3241 ArgStringList &CmdArgs) {
3242 bool use_fwrapv =
false;
3243 bool use_fwrapv_pointer =
false;
3244 for (
const Arg *A : Args.filtered(
3245 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3246 options::OPT_fwrapv, options::OPT_fno_wrapv,
3247 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3249 switch (A->getOption().getID()) {
3250 case options::OPT_fstrict_overflow:
3252 use_fwrapv_pointer =
false;
3254 case options::OPT_fno_strict_overflow:
3256 use_fwrapv_pointer =
true;
3258 case options::OPT_fwrapv:
3261 case options::OPT_fno_wrapv:
3264 case options::OPT_fwrapv_pointer:
3265 use_fwrapv_pointer =
true;
3267 case options::OPT_fno_wrapv_pointer:
3268 use_fwrapv_pointer =
false;
3274 CmdArgs.push_back(
"-fwrapv");
3275 if (use_fwrapv_pointer)
3276 CmdArgs.push_back(
"-fwrapv-pointer");
3283 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3284 if (A->getOption().matches(options::OPT_O4) ||
3285 A->getOption().matches(options::OPT_Ofast))
3288 if (A->getOption().matches(options::OPT_O0))
3291 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3294 StringRef S(A->getValue());
3302 unsigned OptLevel = 0;
3303 if (S.getAsInteger(10, OptLevel))
3306 return OptLevel > 1;
3313 ArgStringList &CmdArgs) {
3315 OptSpecifier vectorizeAliasOption =
3316 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
3317 if (Args.hasFlag(options::OPT_fvectorize, vectorizeAliasOption,
3318 options::OPT_fno_vectorize, EnableVec))
3319 CmdArgs.push_back(
"-vectorize-loops");
3323 ArgStringList &CmdArgs) {
3325 OptSpecifier SLPVectAliasOption =
3326 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
3327 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
3328 options::OPT_fno_slp_vectorize, EnableSLPVec))
3329 CmdArgs.push_back(
"-vectorize-slp");
3333 ArgStringList &CmdArgs) {
3334 if (Args.hasFlag(options::OPT_floop_interchange,
3335 options::OPT_fno_loop_interchange,
false))
3336 CmdArgs.push_back(
"-floop-interchange");
3342 const llvm::opt::ArgList &Args) {
3343 Arg *A = Args.getLastArg(clang::driver::options::OPT_mprefer_vector_width_EQ);
3347 StringRef
Value = A->getValue();
3348 unsigned Width LLVM_ATTRIBUTE_UNINITIALIZED;
3352 if (
Value !=
"none" &&
Value.getAsInteger(10, Width)) {
3353 Diags.
Report(clang::diag::err_drv_invalid_value)
3354 << A->getOption().getName() <<
Value;
3366 const Arg &A,
size_t &Position) {
3367 const char RefinementStepToken =
':';
3368 Position = In.find(RefinementStepToken);
3369 if (Position != StringRef::npos) {
3370 StringRef Option = A.getOption().getName();
3371 StringRef RefStep = In.substr(Position + 1);
3379 if (RefStep.size() != 1) {
3380 Diags.
Report(diag::err_drv_invalid_value) << Option << RefStep;
3383 char RefStepChar = RefStep[0];
3384 if (RefStepChar <
'0' || RefStepChar >
'9') {
3385 Diags.
Report(diag::err_drv_invalid_value) << Option << RefStep;
3395 const ArgList &Args) {
3396 StringRef DisabledPrefixIn =
"!";
3397 StringRef DisabledPrefixOut =
"!";
3398 StringRef EnabledPrefixOut =
"";
3401 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
3405 unsigned NumOptions = A->getNumValues();
3406 if (NumOptions == 0) {
3412 if (NumOptions == 1) {
3413 StringRef Val = A->getValue(0);
3417 StringRef ValBase = Val.slice(0, RefStepLoc);
3418 if (ValBase ==
"all" || ValBase ==
"none" || ValBase ==
"default") {
3427 llvm::StringMap<bool> OptionStrings;
3428 OptionStrings.insert(std::make_pair(
"divd",
false));
3429 OptionStrings.insert(std::make_pair(
"divf",
false));
3430 OptionStrings.insert(std::make_pair(
"divh",
false));
3431 OptionStrings.insert(std::make_pair(
"vec-divd",
false));
3432 OptionStrings.insert(std::make_pair(
"vec-divf",
false));
3433 OptionStrings.insert(std::make_pair(
"vec-divh",
false));
3434 OptionStrings.insert(std::make_pair(
"sqrtd",
false));
3435 OptionStrings.insert(std::make_pair(
"sqrtf",
false));
3436 OptionStrings.insert(std::make_pair(
"sqrth",
false));
3437 OptionStrings.insert(std::make_pair(
"vec-sqrtd",
false));
3438 OptionStrings.insert(std::make_pair(
"vec-sqrtf",
false));
3439 OptionStrings.insert(std::make_pair(
"vec-sqrth",
false));
3441 for (
unsigned i = 0; i != NumOptions; ++i) {
3442 StringRef Val = A->getValue(i);
3444 bool IsDisabled = Val.starts_with(DisabledPrefixIn);
3447 Val = Val.substr(1);
3453 StringRef ValBase = Val.slice(0, RefStep);
3454 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
3455 if (OptionIter == OptionStrings.end()) {
3457 OptionIter = OptionStrings.find(ValBase.str() +
'f');
3458 if (OptionIter == OptionStrings.end()) {
3460 Diags.
Report(diag::err_drv_unknown_argument) << Val;
3466 if (OptionStrings[ValBase.str() +
'd'] ||
3467 OptionStrings[ValBase.str() +
'h']) {
3468 Diags.
Report(diag::err_drv_invalid_value)
3469 << A->getOption().getName() << Val;
3474 if (OptionIter->second ==
true) {
3476 Diags.
Report(diag::err_drv_invalid_value)
3477 << A->getOption().getName() << Val;
3482 OptionIter->second =
true;
3486 if (ValBase.back() !=
'f' && ValBase.back() !=
'd' &&
3487 ValBase.back() !=
'h') {
3488 OptionStrings[ValBase.str() +
'd'] =
true;
3489 OptionStrings[ValBase.str() +
'h'] =
true;
3493 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
3494 Out = Args.MakeArgString(Out + Prefix + Val);
3495 if (i != NumOptions - 1)
3496 Out = Args.MakeArgString(Out +
",");
3504 case LangOptions::ComplexRangeKind::CX_Full:
3507 case LangOptions::ComplexRangeKind::CX_Basic:
3510 case LangOptions::ComplexRangeKind::CX_Improved:
3513 case LangOptions::ComplexRangeKind::CX_Promoted:
3524 if (!ComplexRangeStr.empty())
3525 return "-complex-range=" + ComplexRangeStr;
3526 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.
ComplexRangeKind
Controls the various implementations for complex multiplication and.
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...
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
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::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.
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()