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 > 6 ||
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)
2247 .Case(
"-gdwarf-6", 6)
2252 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2253 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2254 options::OPT_gdwarf_6, options::OPT_gdwarf);
2258 const llvm::opt::ArgList &Args) {
2263 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2264 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2265 << GDwarfN->getSpelling() << TC.
getTriple().str();
2267 if (DwarfVersion == 0) {
2269 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2271 return DwarfVersion;
2275 const ArgList &Args, Arg *&Arg) {
2276 Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
2277 options::OPT_gno_split_dwarf);
2278 if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
2281 if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
2284 StringRef
Value = Arg->getValue();
2285 if (
Value ==
"split")
2287 if (
Value ==
"single")
2290 D.
Diag(diag::err_drv_unsupported_option_argument)
2291 << Arg->getSpelling() << Arg->getValue();
2297 assert(A &&
"Expected non-nullptr argument.");
2300 D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
2306 ArgStringList &CmdArgs) {
2307 llvm::Reloc::Model RelocationModel;
2312 if (RelocationModel != llvm::Reloc::Static)
2313 CmdArgs.push_back(
"-KPIC");
2319 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2325 const ArgList &Args) {
2326 if (Args.hasArg(options::OPT_static_libgcc) ||
2327 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2331 if (Args.hasArg(options::OPT_shared_libgcc))
2350 ArgStringList &CmdArgs,
const ArgList &Args) {
2354 CmdArgs.push_back(
"-l:libunwind.a");
2377 CmdArgs.push_back(
"-lgcc_eh");
2379 CmdArgs.push_back(
"-lgcc_s");
2387 CmdArgs.push_back(
"-lunwind");
2389 CmdArgs.push_back(
"-l:libunwind.a");
2392 CmdArgs.push_back(
"-l:libunwind.dll.a");
2394 CmdArgs.push_back(
"-l:libunwind.so");
2398 CmdArgs.push_back(
"-lunwind");
2408 ArgStringList &CmdArgs,
const ArgList &Args) {
2412 CmdArgs.push_back(
"-lgcc");
2416 CmdArgs.push_back(
"-lgcc");
2420 CmdArgs.push_back(
"--as-needed");
2422 CmdArgs.push_back(
"--no-as-needed");
2427 ArgStringList &CmdArgs,
const ArgList &Args) {
2438 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2441 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2442 if (A && A->getValue() != StringRef(
"platform")) {
2443 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2444 << A->getValue() <<
"MSVC";
2454 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2455 !Args.hasArg(options::OPT_static_pie))
2456 CmdArgs.push_back(
"-ldl");
2463 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2469 StringRef SaveStats = A->getValue();
2470 if (SaveStats ==
"obj" && Output.
isFilename()) {
2472 llvm::sys::path::remove_filename(StatsFile);
2473 }
else if (SaveStats !=
"cwd") {
2474 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2478 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2479 llvm::sys::path::append(StatsFile, BaseName);
2480 llvm::sys::path::replace_extension(StatsFile,
"stats");
2492 assert(Flag.front() ==
'-');
2494 Flags.push_back(Flag.str());
2496 Flags.push_back((
"!" + Flag.substr(1)).str());
2501 ArgStringList &CmdArgs,
bool IsLTO,
2502 const StringRef PluginOptPrefix) {
2503 auto addArg = [&, IsLTO](
const Twine &Arg) {
2505 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2506 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2508 CmdArgs.push_back(
"-mllvm");
2509 CmdArgs.push_back(Args.MakeArgString(Arg));
2513 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2514 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2516 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2517 StringRef
Value = A->getValue();
2519 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2520 !llvm::isPowerOf2_64(Boundary)) {
2521 D.
Diag(diag::err_drv_invalid_argument_to_option)
2522 <<
Value << A->getOption().getName();
2524 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2527 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2528 std::string AlignBranch;
2529 for (StringRef
T : A->getValues()) {
2530 if (
T !=
"fused" &&
T !=
"jcc" &&
T !=
"jmp" &&
T !=
"call" &&
2531 T !=
"ret" &&
T !=
"indirect")
2532 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2533 <<
T <<
"fused, jcc, jmp, call, ret, indirect";
2534 if (!AlignBranch.empty())
2538 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2540 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2541 StringRef
Value = A->getValue();
2542 unsigned PrefixSize;
2543 if (
Value.getAsInteger(10, PrefixSize)) {
2544 D.
Diag(diag::err_drv_invalid_argument_to_option)
2545 <<
Value << A->getOption().getName();
2547 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2573 llvm::opt::ArgStringList &CC1Args,
2575 StringRef Lib, StringRef
Arch, StringRef
Target,
2576 bool isBitCodeSDL) {
2579 std::string LibDeviceLoc =
"/libdevice";
2580 std::string LibBcPrefix =
"/libbc-";
2581 std::string LibPrefix =
"/lib";
2598 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2599 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2601 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2602 Twine(Lib +
"-" +
Arch).str(), Twine(Lib).str()}) {
2603 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2604 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2614 const auto *Ext =
".a";
2616 for (
auto Suffix : {Twine(Lib +
"-" +
Arch +
"-" +
Target).str(),
2617 Twine(Lib +
"-" +
Arch).str()}) {
2618 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2619 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2630 bool FoundSDL =
false;
2631 for (
auto LPath : LibraryPaths) {
2632 for (
auto SDL : SDLs) {
2633 auto FullName = Twine(LPath + SDL).str();
2634 if (llvm::sys::fs::exists(FullName)) {
2635 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2652 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2653 llvm::opt::ArgStringList &CC1Args,
2655 StringRef
Arch, StringRef
Target,
bool isBitCodeSDL) {
2658 if (isBitCodeSDL &&
Arch.contains(
"nvptx"))
2661 bool FoundAOB =
false;
2662 std::string ArchiveOfBundles;
2665 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2666 auto Ext = IsMSVC ?
".lib" :
".a";
2667 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2668 if (llvm::sys::fs::exists(Lib)) {
2669 ArchiveOfBundles = Lib;
2673 Lib.consume_front(
"-l");
2674 for (
auto LPath : LibraryPaths) {
2675 ArchiveOfBundles.clear();
2676 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2677 : IsMSVC ? Lib + Ext
2678 :
"lib" + Lib + Ext)
2680 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2681 auto AOB = Twine(LPath + Prefix + LibFile).str();
2682 if (llvm::sys::fs::exists(AOB)) {
2683 ArchiveOfBundles = AOB;
2696 llvm::file_magic Magic;
2697 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2698 if (EC || Magic != llvm::file_magic::archive)
2701 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2702 std::string OutputLib =
2708 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2712 DeviceTriple +=
'-';
2713 std::string NormalizedTriple =
T.getToolChain().getTriple().normalize(
2714 llvm::Triple::CanonicalForm::FOUR_IDENT);
2715 DeviceTriple += NormalizedTriple;
2717 DeviceTriple +=
'-';
2721 std::string UnbundleArg(
"-unbundle");
2722 std::string TypeArg(
"-type=a");
2723 std::string InputArg(
"-input=" + ArchiveOfBundles);
2724 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2725 std::string OutputArg(
"-output=" + OutputLib);
2727 const char *UBProgram = DriverArgs.MakeArgString(
2728 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2730 ArgStringList UBArgs;
2731 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2732 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2733 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2734 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2735 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2739 std::string AdditionalArgs(
"-allow-missing-bundles");
2740 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2745 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2746 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2748 C.addCommand(std::make_unique<Command>(
2750 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2752 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2759 const llvm::opt::ArgList &DriverArgs,
2760 llvm::opt::ArgStringList &CC1Args,
2762 bool isBitCodeSDL) {
2793 const llvm::opt::ArgList &DriverArgs,
2794 llvm::opt::ArgStringList &CC1Args,
2796 bool isBitCodeSDL) {
2800 std::optional<std::string> LibPath =
2801 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2804 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2805 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2806 for (StringRef Path : Frags)
2807 LibraryPaths.emplace_back(Path.trim());
2811 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2812 LibraryPaths.emplace_back(Search_Dir);
2816 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2817 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2820 llvm::SmallSet<std::string, 16> SDLNames;
2821 static const StringRef HostOnlyArchives[] = {
2822 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2823 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2824 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2825 SDLNames.insert(std::string(
"-l") + SDLName);
2829 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2836 const StringRef LibFileExt =
".lib";
2837 if (!llvm::sys::path::has_extension(
FileName) ||
2839 llvm::sys::path::extension(
FileName).drop_front()) ==
2841 llvm::sys::path::extension(
FileName) == LibFileExt)
2842 SDLNames.insert(Input);
2849 for (
auto SDLName : SDLNames) {
2860static llvm::opt::Arg *
2862 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2866 const llvm::opt::ArgList &Args) {
2867 const unsigned MinCodeObjVer = 4;
2868 const unsigned MaxCodeObjVer = 6;
2871 if (CodeObjArg->getOption().getID() ==
2872 options::OPT_mcode_object_version_EQ) {
2873 unsigned CodeObjVer = MaxCodeObjVer;
2875 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2876 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2877 D.
Diag(diag::err_drv_invalid_int_value)
2878 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2884 const llvm::opt::ArgList &Args) {
2885 unsigned CodeObjVer = 6;
2887 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2892 const Driver &D,
const llvm::opt::ArgList &Args) {
2897 const llvm::opt::ArgList &Args,
2898 llvm::opt::ArgStringList &CmdArgs,
2899 const llvm::Triple &Triple,
bool IsLTO,
2900 const StringRef PluginOptPrefix) {
2901 auto addArg = [&, IsLTO](
const Twine &Arg) {
2903 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2904 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2906 CmdArgs.push_back(
"-mllvm");
2907 CmdArgs.push_back(Args.MakeArgString(Arg));
2911 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2912 options::OPT_mno_outline)) {
2913 if (A->getOption().matches(options::OPT_moutline)) {
2917 if (!(Triple.isARM() || Triple.isThumb() || Triple.isAArch64())) {
2918 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2920 addArg(Twine(
"-enable-machine-outliner"));
2924 addArg(Twine(
"-enable-machine-outliner=never"));
2928 auto *CodeGenDataGenArg =
2929 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
2930 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
2933 if (CodeGenDataGenArg && CodeGenDataUseArg)
2934 D.
Diag(diag::err_drv_argument_not_allowed_with)
2935 << CodeGenDataGenArg->getAsString(Args)
2936 << CodeGenDataUseArg->getAsString(Args);
2940 if (CodeGenDataGenArg)
2941 addArg(Twine(
"-codegen-data-generate"));
2944 if (CodeGenDataUseArg)
2945 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
2949 const llvm::opt::ArgList &DriverArgs,
2950 llvm::opt::ArgStringList &CC1Args,
2951 StringRef BitcodeSuffix,
2952 const llvm::Triple &Triple,
2957 std::optional<std::string> LibPath =
2958 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2961 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2962 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2963 for (StringRef Path : Frags)
2964 LibraryPaths.emplace_back(Path.trim());
2969 LibraryPaths.emplace_back(LibPath);
2973 llvm::sys::path::append(P,
"..",
"lib", Triple.getTriple());
2974 LibraryPaths.emplace_back(P);
2976 OptSpecifier LibomptargetBCPathOpt =
2977 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
2978 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
2979 : options::OPT_libomptarget_spirv_bc_path_EQ;
2981 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
2982 : Triple.isNVPTX() ?
"nvptx"
2984 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
2987 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
2989 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
2990 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
2991 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2994 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2995 CC1Args.push_back(
"-mlink-builtin-bitcode");
2996 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2998 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
2999 << LibOmpTargetFile;
3002 bool FoundBCLibrary =
false;
3004 for (StringRef LibraryPath : LibraryPaths) {
3006 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
3007 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
3008 CC1Args.push_back(
"-mlink-builtin-bitcode");
3009 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
3010 FoundBCLibrary =
true;
3015 if (!FoundBCLibrary)
3016 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
3017 << LibOmpTargetName << ArchPrefix;
3021 const llvm::opt::ArgList &Args,
3022 llvm::opt::ArgStringList &CmdArgs) {
3024 (!Args.hasArg(options::OPT_nostdlib) ||
3025 TC.
getTriple().isKnownWindowsMSVCEnvironment()) &&
3026 !Args.hasArg(options::OPT_no_hip_rt) && !Args.hasArg(options::OPT_r)) {
3030 for (
auto *Arg : Args.filtered(options::OPT_no_hip_rt)) {
3037 const llvm::opt::ArgList &DriverArgs,
3038 llvm::opt::ArgStringList &CC1Args) {
3040 const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
3046 llvm::sys::path::append(LibclcPath,
"lib",
"libclc");
3049 StringRef LibclcNamespec(A->getValue());
3050 bool FilenameSearch = LibclcNamespec.consume_front(
":");
3053 if (FilenameSearch && llvm::sys::fs::exists(LibclcTargetFile)) {
3054 CC1Args.push_back(
"-mlink-builtin-bitcode");
3055 CC1Args.push_back(DriverArgs.MakeArgString(LibclcTargetFile));
3058 if (!FilenameSearch)
3059 LibclcTargetFile +=
".bc";
3061 llvm::sys::path::append(LibclcPath, LibclcTargetFile);
3062 if (llvm::sys::fs::exists(LibclcPath)) {
3063 CC1Args.push_back(
"-mlink-builtin-bitcode");
3064 CC1Args.push_back(DriverArgs.MakeArgString(LibclcPath));
3068 D.
Diag(diag::err_drv_libclc_not_found) << LibclcTargetFile;
3074 const llvm::opt::ArgList &Args,
3075 llvm::opt::ArgStringList &CmdArgs,
3076 const llvm::Triple &Triple) {
3077 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
3078 options::OPT_mno_outline_atomics)) {
3080 if (!Triple.isAArch64()) {
3081 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
3082 << Triple.getArchName() << A->getOption().getName();
3084 if (A->getOption().matches(options::OPT_moutline_atomics)) {
3085 CmdArgs.push_back(
"-target-feature");
3086 CmdArgs.push_back(
"+outline-atomics");
3088 CmdArgs.push_back(
"-target-feature");
3089 CmdArgs.push_back(
"-outline-atomics");
3093 CmdArgs.push_back(
"-target-feature");
3094 CmdArgs.push_back(
"+outline-atomics");
3099 llvm::opt::ArgStringList &CmdArgs) {
3100 if (TCArgs.hasFlag(options::OPT_offload_compress,
3101 options::OPT_no_offload_compress,
false))
3102 CmdArgs.push_back(
"--compress");
3103 if (TCArgs.hasArg(options::OPT_v))
3104 CmdArgs.push_back(
"--verbose");
3105 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
3107 TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
3111 const llvm::Triple &Triple,
3112 const llvm::Reloc::Model &RelocationModel,
3113 llvm::opt::ArgStringList &CmdArgs) {
3114 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3115 StringRef CM = A->getValue();
3117 if (Triple.isOSAIX() && CM ==
"medium")
3119 if (Triple.isAArch64(64)) {
3120 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
3121 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
3122 RelocationModel != llvm::Reloc::Static)
3123 D.
Diag(diag::err_drv_argument_only_allowed_with)
3124 << A->getAsString(Args) <<
"-fno-pic";
3125 }
else if (Triple.isLoongArch()) {
3126 if (CM ==
"extreme" &&
3127 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
3128 D.
Diag(diag::err_drv_argument_not_allowed_with)
3129 << A->getAsString(Args) <<
"-fplt";
3130 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
3133 CM = llvm::StringSwitch<StringRef>(CM)
3134 .Case(
"normal",
"small")
3135 .Case(
"extreme",
"large")
3137 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
3138 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3139 }
else if (Triple.isRISCV()) {
3141 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
3142 D.
Diag(diag::err_drv_argument_not_allowed_with)
3143 << A->getAsString(Args) <<
"-fpic";
3146 else if (CM ==
"medany")
3148 Ok = CM ==
"small" || CM ==
"medium" ||
3149 (CM ==
"large" && Triple.isRISCV64());
3150 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
3151 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large"}, CM);
3152 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
3156 }
else if (Triple.isSPARC64()) {
3159 else if (CM ==
"medmid")
3161 else if (CM ==
"medany")
3163 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
3164 }
else if (Triple.getArch() == llvm::Triple::lanai) {
3165 Ok = llvm::is_contained({
"small",
"medium",
"large"}, CM);
3168 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
3170 D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
3171 << A->getSpelling() << CM << Triple.getTriple();
3175 if (Triple.getArch() == llvm::Triple::x86_64) {
3176 bool IsMediumCM =
false;
3177 bool IsLargeCM =
false;
3178 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
3179 IsMediumCM = StringRef(A->getValue()) ==
"medium";
3180 IsLargeCM = StringRef(A->getValue()) ==
"large";
3182 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3183 if (!IsMediumCM && !IsLargeCM) {
3184 D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3185 << A->getOption().getRenderName();
3187 A->render(Args, CmdArgs);
3189 }
else if (IsMediumCM) {
3190 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3191 }
else if (IsLargeCM) {
3192 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3198 ArgStringList &CmdArgs) {
3203 Args.getLastArg(options::OPT_fcolor_diagnostics,
3204 options::OPT_fno_color_diagnostics);
3205 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3206 StringRef
Value(A->getValue());
3208 D.
Diag(diag::err_drv_invalid_argument_to_option)
3209 <<
Value << A->getOption().getName();
3213 CmdArgs.push_back(
"-fcolor-diagnostics");
3218 for (; *Arg; ++Arg) {
3224 Res.push_back(
'\\');
3227 Res.push_back(*Arg);
3232 const llvm::opt::ArgList &Args) {
3236 llvm::opt::ArgStringList OriginalArgs;
3237 for (
const auto &Arg : Args)
3238 Arg->render(Args, OriginalArgs);
3242 for (
const char *OriginalArg : OriginalArgs) {
3246 Flags += EscapedArg;
3249 return Args.MakeArgString(Flags);
3253 const llvm::opt::ArgList &Args,
3254 bool &FRecordCommandLine,
3255 bool &GRecordCommandLine) {
3258 const std::string &TripleStr = Triple.getTriple();
3260 FRecordCommandLine =
3261 Args.hasFlag(options::OPT_frecord_command_line,
3262 options::OPT_fno_record_command_line,
false);
3263 GRecordCommandLine =
3264 Args.hasFlag(options::OPT_grecord_command_line,
3265 options::OPT_gno_record_command_line,
false);
3266 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3267 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3268 D.
Diag(diag::err_drv_unsupported_opt_for_target)
3269 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3276 ArgStringList &CmdArgs) {
3277 bool use_fwrapv =
false;
3278 bool use_fwrapv_pointer =
false;
3279 for (
const Arg *A : Args.filtered(
3280 options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3281 options::OPT_fwrapv, options::OPT_fno_wrapv,
3282 options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3284 switch (A->getOption().getID()) {
3285 case options::OPT_fstrict_overflow:
3287 use_fwrapv_pointer =
false;
3289 case options::OPT_fno_strict_overflow:
3291 use_fwrapv_pointer =
true;
3293 case options::OPT_fwrapv:
3296 case options::OPT_fno_wrapv:
3299 case options::OPT_fwrapv_pointer:
3300 use_fwrapv_pointer =
true;
3302 case options::OPT_fno_wrapv_pointer:
3303 use_fwrapv_pointer =
false;
3309 CmdArgs.push_back(
"-fwrapv");
3310 if (use_fwrapv_pointer)
3311 CmdArgs.push_back(
"-fwrapv-pointer");
3318 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3319 if (A->getOption().matches(options::OPT_O4) ||
3320 A->getOption().matches(options::OPT_Ofast))
3323 if (A->getOption().matches(options::OPT_O0))
3326 assert(A->getOption().matches(options::OPT_O) &&
"Must have a -O flag");
3329 StringRef S(A->getValue());
3337 unsigned OptLevel = 0;
3338 if (S.getAsInteger(10, OptLevel))
3341 return OptLevel > 1;
3348 ArgStringList &CmdArgs) {
3350 if (Args.hasFlag(options::OPT_fvectorize, options::OPT_fno_vectorize,
3352 CmdArgs.push_back(
"-vectorize-loops");
3356 ArgStringList &CmdArgs) {
3358 if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize,
3360 CmdArgs.push_back(
"-vectorize-slp");
3364 ArgStringList &CmdArgs) {
3365 if (Args.hasFlag(options::OPT_floop_interchange,
3366 options::OPT_fno_loop_interchange,
false))
3367 CmdArgs.push_back(
"-floop-interchange");
3373 const llvm::opt::ArgList &Args) {
3374 Arg *A = Args.getLastArg(clang::driver::options::OPT_mprefer_vector_width_EQ);
3378 StringRef
Value = A->getValue();
3379 unsigned Width LLVM_ATTRIBUTE_UNINITIALIZED;
3383 if (
Value !=
"none" &&
Value.getAsInteger(10, Width)) {
3384 Diags.
Report(clang::diag::err_drv_invalid_value)
3385 << A->getOption().getName() <<
Value;
3397 const Arg &A,
size_t &Position) {
3398 const char RefinementStepToken =
':';
3399 Position = In.find(RefinementStepToken);
3400 if (Position != StringRef::npos) {
3401 StringRef Option = A.getOption().getName();
3402 StringRef RefStep = In.substr(Position + 1);
3410 if (RefStep.size() != 1) {
3411 Diags.
Report(diag::err_drv_invalid_value) << Option << RefStep;
3414 char RefStepChar = RefStep[0];
3415 if (RefStepChar <
'0' || RefStepChar >
'9') {
3416 Diags.
Report(diag::err_drv_invalid_value) << Option << RefStep;
3426 const ArgList &Args) {
3427 StringRef DisabledPrefixIn =
"!";
3428 StringRef DisabledPrefixOut =
"!";
3429 StringRef EnabledPrefixOut =
"";
3432 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
3436 unsigned NumOptions = A->getNumValues();
3437 if (NumOptions == 0) {
3443 if (NumOptions == 1) {
3444 StringRef Val = A->getValue(0);
3448 StringRef ValBase = Val.slice(0, RefStepLoc);
3449 if (ValBase ==
"all" || ValBase ==
"none" || ValBase ==
"default") {
3458 llvm::StringMap<bool> OptionStrings;
3459 OptionStrings.insert(std::make_pair(
"divd",
false));
3460 OptionStrings.insert(std::make_pair(
"divf",
false));
3461 OptionStrings.insert(std::make_pair(
"divh",
false));
3462 OptionStrings.insert(std::make_pair(
"vec-divd",
false));
3463 OptionStrings.insert(std::make_pair(
"vec-divf",
false));
3464 OptionStrings.insert(std::make_pair(
"vec-divh",
false));
3465 OptionStrings.insert(std::make_pair(
"sqrtd",
false));
3466 OptionStrings.insert(std::make_pair(
"sqrtf",
false));
3467 OptionStrings.insert(std::make_pair(
"sqrth",
false));
3468 OptionStrings.insert(std::make_pair(
"vec-sqrtd",
false));
3469 OptionStrings.insert(std::make_pair(
"vec-sqrtf",
false));
3470 OptionStrings.insert(std::make_pair(
"vec-sqrth",
false));
3472 for (
unsigned i = 0; i != NumOptions; ++i) {
3473 StringRef Val = A->getValue(i);
3475 bool IsDisabled = Val.starts_with(DisabledPrefixIn);
3478 Val = Val.substr(1);
3484 StringRef ValBase = Val.slice(0, RefStep);
3485 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
3486 if (OptionIter == OptionStrings.end()) {
3488 OptionIter = OptionStrings.find(ValBase.str() +
'f');
3489 if (OptionIter == OptionStrings.end()) {
3491 Diags.
Report(diag::err_drv_unknown_argument) << Val;
3497 if (OptionStrings[ValBase.str() +
'd'] ||
3498 OptionStrings[ValBase.str() +
'h']) {
3499 Diags.
Report(diag::err_drv_invalid_value)
3500 << A->getOption().getName() << Val;
3505 if (OptionIter->second ==
true) {
3507 Diags.
Report(diag::err_drv_invalid_value)
3508 << A->getOption().getName() << Val;
3513 OptionIter->second =
true;
3517 if (ValBase.back() !=
'f' && ValBase.back() !=
'd' &&
3518 ValBase.back() !=
'h') {
3519 OptionStrings[ValBase.str() +
'd'] =
true;
3520 OptionStrings[ValBase.str() +
'h'] =
true;
3524 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
3525 Out = Args.MakeArgString(Out + Prefix + Val);
3526 if (i != NumOptions - 1)
3527 Out = Args.MakeArgString(Out +
",");
3551 llvm_unreachable(
"Fully covered switch above");
3557 if (!ComplexRangeStr.empty())
3558 return "-complex-range=" + ComplexRangeStr;
3559 return ComplexRangeStr;
3579 if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
3580 (LastOpt ==
"-fcx-limited-range" && NewOpt ==
"-fno-cx-limited-range") ||
3581 (LastOpt ==
"-fno-cx-limited-range" && NewOpt ==
"-fcx-limited-range") ||
3582 (LastOpt ==
"-fcx-fortran-rules" && NewOpt ==
"-fno-cx-fortran-rules") ||
3583 (LastOpt ==
"-fno-cx-fortran-rules" && NewOpt ==
"-fcx-fortran-rules") ||
3584 (LastOpt ==
"-ffast-math" && NewOpt ==
"-fno-fast-math") ||
3585 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-ffast-math") ||
3586 (LastOpt.starts_with(
"-ffp-model=") && NewOpt ==
"-fno-fast-math") ||
3587 (LastOpt.starts_with(
"-ffp-model=") &&
3588 NewOpt.starts_with(
"-ffp-model=")) ||
3589 (LastOpt.starts_with(
"-fcomplex-arithmetic=") &&
3590 NewOpt.starts_with(
"-fcomplex-arithmetic=")))
3593 D.
Diag(clang::diag::warn_drv_overriding_complex_range)
static bool useLeafFramePointerForTargetByDefault(const llvm::Triple &Triple)
static unsigned ParseDebugDefaultVersion(const ToolChain &TC, const ArgList &Args)
static 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 void emitComplexRangeDiag(const Driver &D, StringRef LastOpt, LangOptions::ComplexRangeKind Range, StringRef NewOpt, LangOptions::ComplexRangeKind NewRange)
static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer)
static bool mustMaintainValidFrameChain(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static llvm::opt::Arg * getAMDGPUCodeObjectArgument(const Driver &D, const llvm::opt::ArgList &Args)
static void collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, SmallVectorImpl< StringRef > &SharedRuntimes, SmallVectorImpl< StringRef > &StaticRuntimes, SmallVectorImpl< StringRef > &NonWholeStaticRuntimes, SmallVectorImpl< StringRef > &HelperStaticRuntimes, SmallVectorImpl< StringRef > &RequiredSymbols)
static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer, bool IsShared, bool IsWhole)
static void AddUnwindLibrary(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
static bool SDLSearch(const Driver &D, const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, const SmallVectorImpl< std::string > &LibraryPaths, StringRef Lib, StringRef Arch, StringRef Target, bool isBitCodeSDL)
SDLSearch: Search for Static Device Library The search for SDL bitcode files is consistent with how s...
static void renderRpassOptions(const ArgList &Args, ArgStringList &CmdArgs, const StringRef PluginOptPrefix)
static StringRef getWebAssemblyTargetCPU(const ArgList &Args)
Get the (LLVM) name of the WebAssembly cpu we are targeting.
static bool framePointerImpliesLeafFramePointer(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static void renderRemarksHotnessOptions(const ArgList &Args, ArgStringList &CmdArgs, const StringRef PluginOptPrefix)
static void GetSDLFromOffloadArchive(Compilation &C, const Driver &D, const Tool &T, const JobAction &JA, const InputInfoList &Inputs, const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, const SmallVectorImpl< std::string > &LibraryPaths, StringRef Lib, StringRef Arch, StringRef Target, bool isBitCodeSDL)
Search if a user provided archive file lib<libname>.a exists in any of the library paths.
static std::string getLanaiTargetCPU(const ArgList &Args)
static void renderRemarksOptions(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple, const InputInfo &Input, const InputInfo &Output, const StringRef PluginOptPrefix)
static bool useFramePointerForTargetByDefault(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static void AddLibgcc(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
static LibGccType getLibGccType(const ToolChain &TC, const Driver &D, const ArgList &Args)
clang::CodeGenOptions::FramePointerKind getFramePointerKind(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static std::string getAMDGPUTargetGPU(const llvm::Triple &T, const ArgList &Args)
Get the (LLVM) name of the AMDGPU gpu we are targeting.
static bool mustUseNonLeafFramePointerForTarget(const llvm::Triple &Triple)
static bool shouldIgnoreUnsupportedTargetFeature(const Arg &TargetFeatureArg, llvm::Triple T, StringRef Processor)
llvm::MachO::Target Target
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()