32#include "clang/Config/config.h"
44#include "llvm/ADT/STLExtras.h"
45#include "llvm/ADT/SmallSet.h"
46#include "llvm/ADT/SmallString.h"
47#include "llvm/ADT/StringExtras.h"
48#include "llvm/ADT/StringSwitch.h"
49#include "llvm/ADT/Twine.h"
50#include "llvm/BinaryFormat/Magic.h"
51#include "llvm/Config/llvm-config.h"
52#include "llvm/Option/Arg.h"
53#include "llvm/Option/ArgList.h"
54#include "llvm/Option/Option.h"
55#include "llvm/Support/CodeGen.h"
56#include "llvm/Support/Compression.h"
57#include "llvm/Support/Debug.h"
58#include "llvm/Support/ErrorHandling.h"
59#include "llvm/Support/FileSystem.h"
60#include "llvm/Support/Path.h"
61#include "llvm/Support/Process.h"
62#include "llvm/Support/Program.h"
63#include "llvm/Support/ScopedPrinter.h"
64#include "llvm/Support/Threading.h"
65#include "llvm/Support/VirtualFileSystem.h"
66#include "llvm/Support/YAMLParser.h"
67#include "llvm/TargetParser/Host.h"
68#include "llvm/TargetParser/PPCTargetParser.h"
69#include "llvm/TargetParser/TargetParser.h"
78 const llvm::Triple &Triple) {
79 if (Args.hasArg(clang::driver::options::OPT_pg) &&
80 !Args.hasArg(clang::driver::options::OPT_mfentry))
83 if (Triple.isAndroid())
86 switch (Triple.getArch()) {
87 case llvm::Triple::xcore:
88 case llvm::Triple::wasm32:
89 case llvm::Triple::wasm64:
90 case llvm::Triple::msp430:
94 case llvm::Triple::ppc:
95 case llvm::Triple::ppcle:
96 case llvm::Triple::ppc64:
97 case llvm::Triple::ppc64le:
98 case llvm::Triple::riscv32:
99 case llvm::Triple::riscv64:
100 case llvm::Triple::sparc:
101 case llvm::Triple::sparcel:
102 case llvm::Triple::sparcv9:
103 case llvm::Triple::amdgcn:
104 case llvm::Triple::r600:
105 case llvm::Triple::csky:
106 case llvm::Triple::loongarch32:
107 case llvm::Triple::loongarch64:
108 case llvm::Triple::m68k:
114 if (Triple.isOSFuchsia() || Triple.isOSNetBSD()) {
118 if (Triple.isOSLinux() || Triple.isOSHurd()) {
119 switch (Triple.getArch()) {
121 case llvm::Triple::arm:
122 case llvm::Triple::armeb:
123 case llvm::Triple::thumb:
124 case llvm::Triple::thumbeb:
125 case llvm::Triple::mips64:
126 case llvm::Triple::mips64el:
127 case llvm::Triple::mips:
128 case llvm::Triple::mipsel:
129 case llvm::Triple::systemz:
130 case llvm::Triple::x86:
131 case llvm::Triple::x86_64:
138 if (Triple.isOSWindows()) {
139 switch (Triple.getArch()) {
140 case llvm::Triple::x86:
142 case llvm::Triple::x86_64:
143 return Triple.isOSBinFormatMachO();
144 case llvm::Triple::arm:
145 case llvm::Triple::thumb:
162 if (Triple.isAArch64() || Triple.isPS() || Triple.isVE() ||
163 (Triple.isAndroid() && !Triple.isARM()))
170 switch (Triple.getArch()) {
173 case llvm::Triple::arm:
174 case llvm::Triple::thumb:
177 return Triple.isOSDarwin();
184 const llvm::Triple &Triple) {
185 if (Triple.isARM() || Triple.isThumb()) {
189 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
190 StringRef
V = A->getValue();
201 const llvm::Triple &Triple) {
202 if (Triple.isARM() || Triple.isThumb()) {
206 if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
207 StringRef
V = A->getValue();
208 return V ==
"aapcs+leaf";
217 const llvm::Triple &Triple) {
247 Args.hasFlag(clang::driver::options::OPT_fno_omit_frame_pointer,
248 clang::driver::options::OPT_fomit_frame_pointer, DefaultFP);
253 bool EnableLeafFP = Args.hasFlag(
254 clang::driver::options::OPT_mno_omit_leaf_frame_pointer,
255 clang::driver::options::OPT_momit_leaf_frame_pointer, DefaultLeafFP);
270 const StringRef PluginOptPrefix) {
271 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
272 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
273 "-pass-remarks=" + A->getValue()));
275 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
276 CmdArgs.push_back(Args.MakeArgString(
277 Twine(PluginOptPrefix) +
"-pass-remarks-missed=" + A->getValue()));
279 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
280 CmdArgs.push_back(Args.MakeArgString(
281 Twine(PluginOptPrefix) +
"-pass-remarks-analysis=" + A->getValue()));
285 const llvm::Triple &Triple,
288 const StringRef PluginOptPrefix) {
289 StringRef Format =
"yaml";
290 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
291 Format = A->getValue();
294 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
300 assert(!F.empty() &&
"Cannot determine remarks output name.");
302 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
303 "opt-remarks-filename=" + F +
304 ".opt.ld." + Format));
307 Args.getLastArg(options::OPT_foptimization_record_passes_EQ))
308 CmdArgs.push_back(Args.MakeArgString(
309 Twine(PluginOptPrefix) +
"opt-remarks-passes=" + A->getValue()));
311 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
312 "opt-remarks-format=" + Format.data()));
316 ArgStringList &CmdArgs,
317 const StringRef PluginOptPrefix) {
318 if (Args.hasFlag(options::OPT_fdiagnostics_show_hotness,
319 options::OPT_fno_diagnostics_show_hotness,
false))
320 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
321 "opt-remarks-with-hotness"));
324 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ))
326 Args.MakeArgString(Twine(PluginOptPrefix) +
327 "opt-remarks-hotness-threshold=" + A->getValue()));
332 StringRef Processor) {
336 auto GPUKind =
T.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Processor)
337 : llvm::AMDGPU::parseArchR600(Processor);
338 auto GPUFeatures =
T.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind)
339 : llvm::AMDGPU::getArchAttrR600(GPUKind);
340 if (GPUFeatures & llvm::AMDGPU::FEATURE_WGP)
342 return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode);
347 if (
D.getVFS().exists(
Path))
348 Paths.push_back(
Path.str());
352 const llvm::Triple &Triple,
354 std::vector<StringRef> &Features,
355 OptSpecifier Group) {
356 std::set<StringRef> Warned;
357 for (
const Arg *A : Args.filtered(Group)) {
358 StringRef Name = A->getOption().getName();
362 assert(Name.starts_with(
"m") &&
"Invalid feature name.");
363 Name = Name.substr(1);
367 if (Warned.count(Name) == 0) {
369 clang::diag::warn_drv_unsupported_option_for_processor)
370 << A->getAsString(Args) << Proc;
376 bool IsNegative = Name.consume_front(
"no-");
378 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
386 llvm::DenseSet<StringRef> UsedFeatures;
387 for (StringRef Feature : llvm::reverse(Features)) {
388 if (UsedFeatures.insert(Feature.drop_front()).second)
389 UnifiedFeatures.insert(UnifiedFeatures.begin(), Feature);
392 return UnifiedFeatures;
396 const char *ArgName,
const char *EnvVar) {
397 const char *DirList = ::getenv(EnvVar);
398 bool CombinedArg =
false;
403 StringRef Name(ArgName);
404 if (Name ==
"-I" || Name ==
"-L" || Name.empty())
407 StringRef Dirs(DirList);
411 StringRef::size_type Delim;
412 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
415 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
417 CmdArgs.push_back(ArgName);
418 CmdArgs.push_back(
".");
423 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
425 CmdArgs.push_back(ArgName);
426 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
429 Dirs = Dirs.substr(Delim + 1);
434 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
436 CmdArgs.push_back(ArgName);
437 CmdArgs.push_back(
".");
441 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
443 CmdArgs.push_back(ArgName);
444 CmdArgs.push_back(Args.MakeArgString(Dirs));
450 const ArgList &Args, ArgStringList &CmdArgs,
456 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
463 for (
const auto &II : Inputs) {
467 if (
auto *IA = II.getAction())
477 if (II.isFilename()) {
478 CmdArgs.push_back(II.getFilename());
487 const Arg &A = II.getInputArg();
490 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
492 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
495 A.renderAsInput(Args, CmdArgs);
497 if (
const Arg *A = Args.getLastArg(options::OPT_fveclib)) {
498 const llvm::Triple &Triple = TC.
getTriple();
499 StringRef
V = A->getValue();
500 if (
V ==
"ArmPL" && (Triple.isOSLinux() || Triple.isOSDarwin())) {
518 if (Triple.isOSLinux()) {
519 CmdArgs.push_back(Args.MakeArgString(
"--push-state"));
520 CmdArgs.push_back(Args.MakeArgString(
"--as-needed"));
522 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
523 CmdArgs.push_back(Args.MakeArgString(
"-lamath"));
524 CmdArgs.push_back(Args.MakeArgString(
"-lm"));
525 if (Triple.isOSLinux())
526 CmdArgs.push_back(Args.MakeArgString(
"--pop-state"));
533 const ToolChain &TC,
const llvm::opt::ArgList &Args,
534 llvm::opt::ArgStringList &CmdArgs) {
540 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
541 StringRef
V = A->getValue();
542 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
543 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
545 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
546 << A->getSpelling() <<
V;
551 std::vector<StringRef> &Features,
552 OptSpecifier OnOpt, OptSpecifier OffOpt,
553 StringRef FeatureName) {
554 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
555 if (A->getOption().matches(OnOpt))
556 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
558 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
564 const ArgList &Args) {
565 Arg *MArch = Args.getLastArg(options::OPT_march_EQ);
566 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
568 return llvm::StringSwitch<std::string>(GPUName)
569 .Cases(
"rv630",
"rv635",
"r600")
570 .Cases(
"rv610",
"rv620",
"rs780",
"rs880")
571 .Case(
"rv740",
"rv770")
572 .Case(
"palm",
"cedar")
573 .Cases(
"sumo",
"sumo2",
"sumo")
574 .Case(
"hemlock",
"cypress")
575 .Case(
"aruba",
"cayman")
576 .Default(GPUName.str());
584 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
585 return A->getValue();
593 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
594 StringRef CPU = A->getValue();
600 return llvm::sys::getHostCPUName();
610 const llvm::Triple &
T,
bool FromAs) {
613 switch (
T.getArch()) {
617 case llvm::Triple::aarch64:
618 case llvm::Triple::aarch64_32:
619 case llvm::Triple::aarch64_be:
622 case llvm::Triple::arm:
623 case llvm::Triple::armeb:
624 case llvm::Triple::thumb:
625 case llvm::Triple::thumbeb: {
626 StringRef MArch, MCPU;
631 case llvm::Triple::avr:
632 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
633 return A->getValue();
636 case llvm::Triple::m68k:
639 case llvm::Triple::mips:
640 case llvm::Triple::mipsel:
641 case llvm::Triple::mips64:
642 case llvm::Triple::mips64el: {
646 return std::string(CPUName);
649 case llvm::Triple::nvptx:
650 case llvm::Triple::nvptx64:
651 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
652 return A->getValue();
655 case llvm::Triple::ppc:
656 case llvm::Triple::ppcle:
657 case llvm::Triple::ppc64:
658 case llvm::Triple::ppc64le:
659 if (Arg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ))
661 llvm::PPC::getNormalizedPPCTargetCPU(
T, A->getValue()));
662 return std::string(llvm::PPC::getNormalizedPPCTargetCPU(
T));
664 case llvm::Triple::csky:
665 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
666 return A->getValue();
667 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
668 return A->getValue();
671 case llvm::Triple::riscv32:
672 case llvm::Triple::riscv64:
675 case llvm::Triple::bpfel:
676 case llvm::Triple::bpfeb:
677 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
678 return A->getValue();
681 case llvm::Triple::sparc:
682 case llvm::Triple::sparcel:
683 case llvm::Triple::sparcv9:
686 case llvm::Triple::x86:
687 case llvm::Triple::x86_64:
690 case llvm::Triple::hexagon:
694 case llvm::Triple::lanai:
697 case llvm::Triple::systemz:
700 case llvm::Triple::r600:
701 case llvm::Triple::amdgcn:
704 case llvm::Triple::wasm32:
705 case llvm::Triple::wasm64:
708 case llvm::Triple::loongarch32:
709 case llvm::Triple::loongarch64:
712 case llvm::Triple::xtensa:
713 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
714 return A->getValue();
720 const llvm::Triple &Triple,
722 std::vector<StringRef> &Features) {
724 options::OPT_m_wasm_Features_Group);
728 const ArgList &Args, ArgStringList &CmdArgs,
729 bool ForAS,
bool IsAux) {
730 std::vector<StringRef> Features;
731 switch (Triple.getArch()) {
734 case llvm::Triple::mips:
735 case llvm::Triple::mipsel:
736 case llvm::Triple::mips64:
737 case llvm::Triple::mips64el:
740 case llvm::Triple::arm:
741 case llvm::Triple::armeb:
742 case llvm::Triple::thumb:
743 case llvm::Triple::thumbeb:
746 case llvm::Triple::ppc:
747 case llvm::Triple::ppcle:
748 case llvm::Triple::ppc64:
749 case llvm::Triple::ppc64le:
752 case llvm::Triple::riscv32:
753 case llvm::Triple::riscv64:
756 case llvm::Triple::systemz:
759 case llvm::Triple::aarch64:
760 case llvm::Triple::aarch64_32:
761 case llvm::Triple::aarch64_be:
764 case llvm::Triple::x86:
765 case llvm::Triple::x86_64:
768 case llvm::Triple::hexagon:
771 case llvm::Triple::wasm32:
772 case llvm::Triple::wasm64:
775 case llvm::Triple::sparc:
776 case llvm::Triple::sparcel:
777 case llvm::Triple::sparcv9:
780 case llvm::Triple::r600:
781 case llvm::Triple::amdgcn:
784 case llvm::Triple::nvptx:
785 case llvm::Triple::nvptx64:
788 case llvm::Triple::m68k:
791 case llvm::Triple::msp430:
794 case llvm::Triple::ve:
797 case llvm::Triple::csky:
800 case llvm::Triple::loongarch32:
801 case llvm::Triple::loongarch64:
807 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
808 CmdArgs.push_back(Feature.data());
813 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
816 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
817 D.Diag(diag::err_drv_invalid_int_value)
818 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
819 return LtoJobsArg->getValue();
824 return Triple.isPS();
828 const llvm::opt::ArgList &Args) {
830 Arg *A = Args.getLastArg(options::OPT_mtls_dialect_EQ);
832 return Triple.hasDefaultTLSDESC();
833 StringRef
V = A->getValue();
834 bool SupportedArgument =
false, EnableTLSDESC =
false;
835 bool Unsupported = !Triple.isOSBinFormatELF();
836 if (Triple.isLoongArch() || Triple.isRISCV()) {
837 SupportedArgument =
V ==
"desc" ||
V ==
"trad";
838 EnableTLSDESC =
V ==
"desc";
839 }
else if (Triple.isX86()) {
840 SupportedArgument =
V ==
"gnu" ||
V ==
"gnu2";
841 EnableTLSDESC =
V ==
"gnu2";
846 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
847 << A->getSpelling() << Triple.getTriple();
848 }
else if (!SupportedArgument) {
849 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument_for_target)
850 << A->getSpelling() <<
V << Triple.getTriple();
852 return EnableTLSDESC;
856 ArgStringList &CmdArgs,
const InputInfo &Output,
857 const InputInfo &Input,
bool IsThinLTO) {
859 const bool IsOSAIX = Triple.isOSAIX();
860 const bool IsAMDGCN = Triple.isAMDGCN();
863 const bool IsFatLTO = Args.hasArg(options::OPT_ffat_lto_objects);
864 const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
865 if (llvm::sys::path::filename(Linker) !=
"ld.lld" &&
866 llvm::sys::path::stem(Linker) !=
"ld.lld" && !Triple.isOSOpenBSD()) {
870 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
871 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
874 CmdArgs.push_back(
"-plugin");
877 const char *Suffix =
".dll";
878#elif defined(__APPLE__)
879 const char *Suffix =
".dylib";
881 const char *Suffix =
".so";
885 llvm::sys::path::native(Twine(
D.Dir) +
886 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
889 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
894 CmdArgs.push_back(
"--fat-lto-objects");
897 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
898 const char *ExtraDash = IsOSAIX ?
"-" :
"";
899 const char *ParallelismOpt = IsOSAIX ?
"-threads=" :
"jobs=";
904 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
905 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
906 "-generate-arange-section"));
910 Arg *ArgVecLib = Args.getLastArg(options::OPT_fveclib);
911 if (ArgVecLib && ArgVecLib->getNumValues() == 1) {
914 std::optional<StringRef> OptVal =
915 llvm::StringSwitch<std::optional<StringRef>>(ArgVecLib->getValue())
916 .Case(
"Accelerate",
"Accelerate")
917 .Case(
"LIBMVEC",
"LIBMVEC-X86")
918 .Case(
"MASSV",
"MASSV")
919 .Case(
"SVML",
"SVML")
920 .Case(
"SLEEF",
"sleefgnuabi")
921 .Case(
"Darwin_libsystem_m",
"Darwin_libsystem_m")
922 .Case(
"ArmPL",
"ArmPL")
923 .Case(
"none",
"none")
924 .Default(std::nullopt);
927 CmdArgs.push_back(Args.MakeArgString(
928 Twine(PluginOptPrefix) +
"-vector-library=" + OptVal.value()));
938 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
940 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
944 if (A->getOption().matches(options::OPT_O4) ||
945 A->getOption().matches(options::OPT_Ofast))
947 else if (A->getOption().matches(options::OPT_O)) {
948 OOpt = A->getValue();
951 else if (OOpt ==
"s" || OOpt ==
"z")
953 }
else if (A->getOption().matches(options::OPT_O0))
957 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"O" + OOpt));
959 CmdArgs.push_back(Args.MakeArgString(Twine(
"--lto-CGO") + OOpt));
963 if (Args.hasArg(options::OPT_gsplit_dwarf))
964 CmdArgs.push_back(Args.MakeArgString(
965 Twine(PluginOptPrefix) +
"dwo_dir=" + Output.
getFilename() +
"_dwo"));
967 if (IsThinLTO && !IsOSAIX)
968 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
969 else if (IsThinLTO && IsOSAIX)
970 CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
975 if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
976 Args.hasArg(options::OPT_fenable_matrix))
978 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-matrix"));
981 if (!Parallelism.empty())
982 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
983 ParallelismOpt + Parallelism));
986 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
987 options::OPT_fno_global_isel)) {
990 CmdArgs.push_back(Args.MakeArgString(
991 Twine(PluginOptPrefix) +
"-global-isel=" +
992 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
997 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
998 if (A->getOption().matches(options::OPT_glldb))
1000 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
1001 else if (A->getOption().matches(options::OPT_gsce))
1003 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
1004 else if (A->getOption().matches(options::OPT_gdbx))
1006 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
1009 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
1015 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
1019 Arg *A = Args.getLastArg(options::OPT_g_Group);
1020 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
1021 !A->getOption().matches(options::OPT_ggdb0);
1022 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
1023 options::OPT_gno_strict_dwarf,
true))
1025 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
1027 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
1028 StringRef
V = A->getValue();
1029 if (
V ==
"vec-default")
1031 if (
V ==
"vec-extabi") {
1033 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
1039 bool UseSeparateSections =
1042 if (Args.hasFlag(options::OPT_ffunction_sections,
1043 options::OPT_fno_function_sections, UseSeparateSections))
1045 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
1046 else if (Args.hasArg(options::OPT_fno_function_sections))
1048 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
1050 bool DataSectionsTurnedOff =
false;
1051 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
1052 UseSeparateSections)) {
1054 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
1055 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
1056 DataSectionsTurnedOff =
true;
1058 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
1061 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
1062 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
1063 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
1064 options::OPT_mno_xcoff_roptr,
false);
1065 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
1067 D.Diag(diag::err_drv_unsupported_opt_for_target)
1068 << OptStr << Triple.str();
1074 if (DataSectionsTurnedOff)
1075 D.Diag(diag::err_roptr_requires_data_sections);
1078 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
1083 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
1084 options::OPT_fno_split_machine_functions)) {
1085 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
1086 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1087 "-split-machine-functions"));
1091 StringRef FName = A->getValue();
1092 if (!llvm::sys::fs::exists(FName))
1093 D.Diag(diag::err_drv_no_such_file) << FName;
1095 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1096 "sample-profile=" + FName));
1100 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1101 "cs-profile-generate"));
1102 if (CSPGOGenerateArg->getOption().matches(
1103 options::OPT_fcs_profile_generate_EQ)) {
1105 llvm::sys::path::append(
Path,
"default_%m.profraw");
1106 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1107 "cs-profile-path=" +
Path));
1110 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1111 "cs-profile-path=default_%m.profraw"));
1114 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1115 if (
Path.empty() || llvm::sys::fs::is_directory(
Path))
1116 llvm::sys::path::append(
Path,
"default.profdata");
1117 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1118 "cs-profile-path=" +
Path));
1122 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1124 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1125 "-enable-jmc-instrument"));
1127 D.Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1130 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1131 Triple.hasDefaultEmulatedTLS())) {
1133 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1137 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1139 if (Args.hasFlag(options::OPT_fstack_size_section,
1140 options::OPT_fno_stack_size_section,
false))
1142 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1146 if (!StatsFile.empty())
1148 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1151 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1152 CmdArgs.push_back(Args.MakeArgString(
1153 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1164 Output, PluginOptPrefix);
1170 true, PluginOptPrefix);
1172 bool IsELF = Triple.isOSBinFormatELF();
1174 bool ImplicitMapSyms =
false;
1175 for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
1176 for (StringRef
V : A->getValues()) {
1177 auto Equal =
V.split(
'=');
1178 auto checkArg = [&](
bool ValidTarget,
1179 std::initializer_list<const char *>
Set) {
1181 D.Diag(diag::err_drv_unsupported_opt_for_target)
1182 << (Twine(
"-Wa,") +
Equal.first +
"=").str()
1183 << Triple.getTriple();
1184 }
else if (!llvm::is_contained(
Set,
Equal.second)) {
1185 D.Diag(diag::err_drv_unsupported_option_argument)
1186 << (Twine(
"-Wa,") +
Equal.first +
"=").str() <<
Equal.second;
1189 if (
Equal.first ==
"-mmapsyms") {
1190 ImplicitMapSyms =
Equal.second ==
"implicit";
1191 checkArg(IsELF && Triple.isAArch64(), {
"default",
"implicit"});
1192 }
else if (
V ==
"--crel")
1194 else if (
V ==
"--no-crel")
1202 if (IsELF && !Triple.isMIPS()) {
1203 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"-crel"));
1205 D.Diag(diag::err_drv_unsupported_opt_for_target)
1206 <<
"-Wa,--crel" <<
D.getTargetTriple();
1209 if (ImplicitMapSyms)
1211 Args.MakeArgString(Twine(PluginOptPrefix) +
"-implicit-mapsyms"));
1213 if (Args.hasArg(options::OPT_ftime_report))
1215 Args.MakeArgString(Twine(PluginOptPrefix) +
"-time-passes"));
1219 const ArgList &Args,
1220 ArgStringList &CmdArgs) {
1225 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1226 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1230 ArgStringList &CmdArgs) {
1231 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1232 options::OPT_fno_rtlib_add_rpath,
false))
1237 CandidateRPaths.emplace_back(*CandidateRPath);
1239 for (
const auto &CandidateRPath : CandidateRPaths) {
1240 if (TC.
getVFS().exists(CandidateRPath)) {
1241 CmdArgs.push_back(
"-rpath");
1242 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1248 const ToolChain &TC,
const ArgList &Args,
1249 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1251 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1252 options::OPT_fno_openmp,
false)) {
1254 if (Args.hasFlag(options::OPT_foffload_via_llvm,
1255 options::OPT_fno_offload_via_llvm,
false))
1256 CmdArgs.push_back(
"-lomptarget");
1266 if (ForceStaticHostRuntime)
1267 CmdArgs.push_back(
"-Bstatic");
1271 CmdArgs.push_back(
"-lomp");
1274 CmdArgs.push_back(
"-lgomp");
1277 CmdArgs.push_back(
"-liomp5");
1283 if (ForceStaticHostRuntime)
1284 CmdArgs.push_back(
"-Bdynamic");
1287 CmdArgs.push_back(
"-lrt");
1289 if (IsOffloadingHost)
1290 CmdArgs.push_back(
"-lomptarget");
1292 if (IsOffloadingHost && !Args.hasArg(options::OPT_nogpulib))
1293 CmdArgs.push_back(
"-lomptarget.devicertl");
1304 const llvm::opt::ArgList &Args,
1305 llvm::opt::ArgStringList &CmdArgs) {
1311 constexpr llvm::StringLiteral Targets(
"-fopenmp-targets=");
1315 std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
1316 [](
auto TC) { return TC.second->getTripleString(); });
1318 Args.MakeArgString(Twine(Targets) + llvm::join(Triples,
",")));
1323 llvm::opt::ArgStringList &CmdArgs) {
1328 if (!TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
1330 F128LibName.consume_front_insensitive(
"lib");
1331 if (!F128LibName.empty()) {
1332 bool AsNeeded = !TC.
getTriple().isOSAIX();
1333 CmdArgs.push_back(
"-lFortranFloat128Math");
1336 CmdArgs.push_back(Args.MakeArgString(
"-l" + F128LibName));
1340 CmdArgs.push_back(
"-lFortranRuntime");
1341 CmdArgs.push_back(
"-lFortranDecimal");
1346 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1347 options::OPT_fno_openmp,
false)) {
1352 CmdArgs.push_back(
"-latomic");
1357 const llvm::opt::ArgList &Args,
1358 ArgStringList &CmdArgs) {
1365 llvm::sys::path::append(DefaultLibPath,
"lib");
1366 if (TC.
getTriple().isKnownWindowsMSVCEnvironment())
1367 CmdArgs.push_back(Args.MakeArgString(
"-libpath:" + DefaultLibPath));
1369 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1373 ArgStringList &CmdArgs, StringRef Sanitizer,
1374 bool IsShared,
bool IsWhole) {
1377 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1380 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1390 ArgStringList &CmdArgs,
1391 StringRef Sanitizer) {
1396 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1399 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1400 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1407 const llvm::opt::ArgList &Args,
1408 llvm::opt::ArgStringList &CmdArgs,
1411 "AIX linker does not support any form of --as-needed option yet.");
1419 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1420 CmdArgs.push_back(
"-z");
1421 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1423 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1428 const llvm::opt::ArgList &Args,
1429 ArgStringList &CmdArgs) {
1434 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1436 CmdArgs.push_back(
"-lpthread");
1438 CmdArgs.push_back(
"-lrt");
1440 CmdArgs.push_back(
"-lm");
1444 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1445 CmdArgs.push_back(
"-ldl");
1449 CmdArgs.push_back(
"-lexecinfo");
1455 CmdArgs.push_back(
"-lresolv");
1465 assert(!TC.
getTriple().isOSDarwin() &&
"it's not used by Darwin");
1470 SharedRuntimes.push_back(
"asan");
1471 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1472 HelperStaticRuntimes.push_back(
"asan-preinit");
1475 SharedRuntimes.push_back(
"memprof");
1476 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1477 HelperStaticRuntimes.push_back(
"memprof-preinit");
1480 SharedRuntimes.push_back(
"nsan");
1483 SharedRuntimes.push_back(
"ubsan_minimal");
1485 SharedRuntimes.push_back(
"ubsan_standalone");
1488 SharedRuntimes.push_back(
"scudo_standalone");
1491 SharedRuntimes.push_back(
"tsan");
1493 SharedRuntimes.push_back(
"tysan");
1496 SharedRuntimes.push_back(
"hwasan_aliases");
1498 SharedRuntimes.push_back(
"hwasan");
1499 if (!Args.hasArg(options::OPT_shared))
1500 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1503 SharedRuntimes.push_back(
"rtsan");
1508 StaticRuntimes.push_back(
"stats_client");
1512 HelperStaticRuntimes.push_back(
"asan_static");
1515 if (Args.hasArg(options::OPT_shared)) {
1524 StaticRuntimes.push_back(
"asan");
1526 StaticRuntimes.push_back(
"asan_cxx");
1531 StaticRuntimes.push_back(
"rtsan");
1534 StaticRuntimes.push_back(
"memprof");
1536 StaticRuntimes.push_back(
"memprof_cxx");
1541 StaticRuntimes.push_back(
"hwasan_aliases");
1543 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1545 StaticRuntimes.push_back(
"hwasan");
1547 StaticRuntimes.push_back(
"hwasan_cxx");
1551 StaticRuntimes.push_back(
"dfsan");
1553 StaticRuntimes.push_back(
"lsan");
1555 StaticRuntimes.push_back(
"msan");
1557 StaticRuntimes.push_back(
"msan_cxx");
1560 StaticRuntimes.push_back(
"nsan");
1562 StaticRuntimes.push_back(
"tsan");
1564 StaticRuntimes.push_back(
"tsan_cxx");
1567 StaticRuntimes.push_back(
"tysan");
1570 StaticRuntimes.push_back(
"ubsan_minimal");
1572 StaticRuntimes.push_back(
"ubsan_standalone");
1576 NonWholeStaticRuntimes.push_back(
"safestack");
1577 RequiredSymbols.push_back(
"__safestack_init");
1581 StaticRuntimes.push_back(
"cfi");
1583 StaticRuntimes.push_back(
"cfi_diag");
1588 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1591 NonWholeStaticRuntimes.push_back(
"stats");
1592 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1595 StaticRuntimes.push_back(
"scudo_standalone");
1597 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1604 ArgStringList &CmdArgs) {
1607 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1610 NonWholeStaticRuntimes, HelperStaticRuntimes,
1615 for (
auto S : RequiredSymbols) {
1616 CmdArgs.push_back(
"-u");
1617 CmdArgs.push_back(Args.MakeArgString(S));
1622 !Args.hasArg(options::OPT_shared)) {
1628 if (!Args.hasArg(clang::driver::options::OPT_nostdlibxx)) {
1629 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1630 !Args.hasArg(options::OPT_static);
1631 if (OnlyLibstdcxxStatic)
1632 CmdArgs.push_back(
"-Bstatic");
1634 if (OnlyLibstdcxxStatic)
1635 CmdArgs.push_back(
"-Bdynamic");
1639 for (
auto RT : SharedRuntimes)
1641 for (
auto RT : HelperStaticRuntimes)
1643 bool AddExportDynamic =
false;
1644 for (
auto RT : StaticRuntimes) {
1648 for (
auto RT : NonWholeStaticRuntimes) {
1654 if (AddExportDynamic)
1655 CmdArgs.push_back(
"--export-dynamic");
1658 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1662 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1663 <<
"-fsanitize=memtag*" << TC.
getTriple().str();
1666 Args.MakeArgString(
"--android-memtag-mode=" + SanArgs.
getMemtagMode()));
1668 CmdArgs.push_back(
"--android-memtag-heap");
1670 CmdArgs.push_back(
"--android-memtag-stack");
1673 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty();
1677 if (Args.hasArg(options::OPT_shared)) {
1679 CmdArgs.push_back(
"--whole-archive");
1681 CmdArgs.push_back(
"--no-whole-archive");
1685 CmdArgs.push_back(
"--whole-archive");
1689 CmdArgs.push_back(
"--no-whole-archive");
1697 const llvm::opt::ArgList &Args,
1698 ArgStringList &CmdArgs) {
1700 CmdArgs.push_back(
"-lpthread");
1702 CmdArgs.push_back(
"-lrt");
1703 CmdArgs.push_back(
"-lm");
1708 CmdArgs.push_back(
"-ldl");
1713 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1714 return !A->getOption().matches(options::OPT_O0);
1722 auto AddPostfix = [JA](
auto &F) {
1727 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1728 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1732 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1735 Arg *FinalOutput = Args.getLastArg(options::OPT_o, options::OPT__SLASH_o);
1736 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1737 T = FinalOutput->getValue();
1738 llvm::sys::path::remove_filename(
T);
1739 llvm::sys::path::append(
T,
1740 llvm::sys::path::stem(FinalOutput->getValue()));
1742 return Args.MakeArgString(
T);
1748 return Args.MakeArgString(
T);
1752 const JobAction &JA,
const ArgList &Args,
1753 const InputInfo &Output,
const char *OutFile) {
1754 ArgStringList ExtractArgs;
1755 ExtractArgs.push_back(
"--extract-dwo");
1757 ArgStringList StripArgs;
1758 StripArgs.push_back(
"--strip-dwo");
1763 ExtractArgs.push_back(OutFile);
1770 C.addCommand(std::make_unique<Command>(JA,
T,
1772 Exec, ExtractArgs, II, Output));
1775 C.addCommand(std::make_unique<Command>(
1785 Args.ClaimAllArgs(options::OPT_flto_EQ);
1786 Args.ClaimAllArgs(options::OPT_flto);
1787 Args.ClaimAllArgs(options::OPT_fno_lto);
1791 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1792 options::OPT_fcs_profile_generate_EQ,
1793 options::OPT_fno_profile_generate);
1794 if (CSPGOGenerateArg &&
1795 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1796 CSPGOGenerateArg =
nullptr;
1798 return CSPGOGenerateArg;
1802 auto *ProfileUseArg = Args.getLastArg(
1803 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1804 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1805 options::OPT_fno_profile_instr_use);
1807 if (ProfileUseArg &&
1808 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1809 ProfileUseArg =
nullptr;
1811 return ProfileUseArg;
1815 auto *ProfileSampleUseArg = Args.getLastArg(
1816 options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
1818 if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
1819 options::OPT_fno_profile_sample_use)))
1822 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
1827 case llvm::Reloc::Static:
1829 case llvm::Reloc::PIC_:
1831 case llvm::Reloc::DynamicNoPIC:
1832 return "dynamic-no-pic";
1833 case llvm::Reloc::ROPI:
1835 case llvm::Reloc::RWPI:
1837 case llvm::Reloc::ROPI_RWPI:
1840 llvm_unreachable(
"Unknown Reloc::Model kind");
1847std::tuple<llvm::Reloc::Model, unsigned, bool>
1855 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
1857 bool IsPICLevelTwo = PIC;
1860 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
1863 if (Triple.isAndroid()) {
1864 switch (Triple.getArch()) {
1865 case llvm::Triple::x86:
1866 case llvm::Triple::x86_64:
1868 IsPICLevelTwo =
true;
1878 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
1882 if (Triple.isOSOpenBSD()) {
1884 case llvm::Triple::arm:
1885 case llvm::Triple::aarch64:
1886 case llvm::Triple::mips64:
1887 case llvm::Triple::mips64el:
1888 case llvm::Triple::x86:
1889 case llvm::Triple::x86_64:
1890 IsPICLevelTwo =
false;
1893 case llvm::Triple::ppc:
1894 case llvm::Triple::sparcv9:
1895 IsPICLevelTwo =
true;
1907 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1908 options::OPT_fpic, options::OPT_fno_pic,
1909 options::OPT_fPIE, options::OPT_fno_PIE,
1910 options::OPT_fpie, options::OPT_fno_pie);
1911 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
1912 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
1913 options::OPT_fPIE, options::OPT_fpie)) {
1915 << LastPICArg->getSpelling() << Triple.str();
1916 if (Triple.getArch() == llvm::Triple::x86_64)
1917 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
1918 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
1925 Option O = LastPICArg->getOption();
1926 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
1927 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
1928 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
1930 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
1932 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
1935 if (EffectiveTriple.isPS()) {
1936 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
1937 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
1938 if (Model !=
"kernel") {
1941 << LastPICArg->getSpelling()
1942 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
1952 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
1958 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
1959 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
1962 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
1965 if (!Triple.isOSDarwin())
1967 << A->getSpelling() << Triple.str();
1976 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
1979 bool EmbeddedPISupported;
1980 switch (Triple.getArch()) {
1981 case llvm::Triple::arm:
1982 case llvm::Triple::armeb:
1983 case llvm::Triple::thumb:
1984 case llvm::Triple::thumbeb:
1985 EmbeddedPISupported =
true;
1988 EmbeddedPISupported =
false;
1992 bool ROPI =
false, RWPI =
false;
1993 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
1994 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
1995 if (!EmbeddedPISupported)
1997 << LastROPIArg->getSpelling() << Triple.str();
2000 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
2001 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
2002 if (!EmbeddedPISupported)
2004 << LastRWPIArg->getSpelling() << Triple.str();
2009 if ((ROPI || RWPI) && (PIC || PIE))
2012 if (Triple.isMIPS()) {
2019 if (ABIName ==
"n64")
2022 if(Args.hasArg(options::OPT_mno_abicalls))
2023 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
2026 IsPICLevelTwo =
false;
2030 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
2032 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2034 RelocM = llvm::Reloc::ROPI_RWPI;
2036 RelocM = llvm::Reloc::ROPI;
2038 RelocM = llvm::Reloc::RWPI;
2040 return std::make_tuple(RelocM, 0
U,
false);
2060 const ArgList &Args) {
2061 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2062 options::OPT_falign_functions_EQ,
2063 options::OPT_fno_align_functions);
2064 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2067 if (A->getOption().matches(options::OPT_falign_functions))
2071 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2073 << A->getAsString(Args) << A->getValue();
2078 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2079 switch (DebugInfoKind) {
2080 case llvm::codegenoptions::DebugDirectivesOnly:
2081 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2083 case llvm::codegenoptions::DebugLineTablesOnly:
2084 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2086 case llvm::codegenoptions::DebugInfoConstructor:
2087 CmdArgs.push_back(
"-debug-info-kind=constructor");
2089 case llvm::codegenoptions::LimitedDebugInfo:
2090 CmdArgs.push_back(
"-debug-info-kind=limited");
2092 case llvm::codegenoptions::FullDebugInfo:
2093 CmdArgs.push_back(
"-debug-info-kind=standalone");
2095 case llvm::codegenoptions::UnusedTypeInfo:
2096 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2106 assert(A.getOption().matches(options::OPT_gN_Group) &&
2107 "Not a -g option that specifies a debug-info level");
2108 if (A.getOption().matches(options::OPT_g0) ||
2109 A.getOption().matches(options::OPT_ggdb0))
2110 return llvm::codegenoptions::NoDebugInfo;
2111 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2112 A.getOption().matches(options::OPT_ggdb1))
2113 return llvm::codegenoptions::DebugLineTablesOnly;
2114 if (A.getOption().matches(options::OPT_gline_directives_only))
2115 return llvm::codegenoptions::DebugDirectivesOnly;
2116 return llvm::codegenoptions::DebugInfoConstructor;
2120 const ArgList &Args) {
2121 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2127 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 5 ||
2130 << A->getAsString(Args) << A->getValue();
2135 return llvm::StringSwitch<unsigned>(ArgValue)
2136 .Case(
"-gdwarf-2", 2)
2137 .Case(
"-gdwarf-3", 3)
2138 .Case(
"-gdwarf-4", 4)
2139 .Case(
"-gdwarf-5", 5)
2144 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2145 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2146 options::OPT_gdwarf);
2150 const llvm::opt::ArgList &Args) {
2155 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2156 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2157 << GDwarfN->getSpelling() << TC.
getTriple().str();
2159 if (DwarfVersion == 0) {
2161 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2163 return DwarfVersion;
2167 ArgStringList &CmdArgs) {
2168 llvm::Reloc::Model RelocationModel;
2173 if (RelocationModel != llvm::Reloc::Static)
2174 CmdArgs.push_back(
"-KPIC");
2180 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2186 const ArgList &Args) {
2187 if (Args.hasArg(options::OPT_static_libgcc) ||
2188 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2192 if (Args.hasArg(options::OPT_shared_libgcc))
2211 ArgStringList &CmdArgs,
const ArgList &Args) {
2215 CmdArgs.push_back(
"-l:libunwind.a");
2238 CmdArgs.push_back(
"-lgcc_eh");
2240 CmdArgs.push_back(
"-lgcc_s");
2248 CmdArgs.push_back(
"-lunwind");
2250 CmdArgs.push_back(
"-l:libunwind.a");
2253 CmdArgs.push_back(
"-l:libunwind.dll.a");
2255 CmdArgs.push_back(
"-l:libunwind.so");
2259 CmdArgs.push_back(
"-lunwind");
2269 ArgStringList &CmdArgs,
const ArgList &Args) {
2273 CmdArgs.push_back(
"-lgcc");
2277 CmdArgs.push_back(
"-lgcc");
2281 ArgStringList &CmdArgs,
const ArgList &Args) {
2292 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2295 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2296 if (A && A->getValue() != StringRef(
"platform")) {
2297 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2298 << A->getValue() <<
"MSVC";
2308 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2309 !Args.hasArg(options::OPT_static_pie))
2310 CmdArgs.push_back(
"-ldl");
2317 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2318 if (!A && !
D.CCPrintInternalStats)
2323 StringRef SaveStats = A->getValue();
2324 if (SaveStats ==
"obj" && Output.
isFilename()) {
2326 llvm::sys::path::remove_filename(StatsFile);
2327 }
else if (SaveStats !=
"cwd") {
2328 D.Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2332 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2333 llvm::sys::path::append(StatsFile, BaseName);
2334 llvm::sys::path::replace_extension(StatsFile,
"stats");
2336 assert(
D.CCPrintInternalStats);
2337 StatsFile.assign(
D.CCPrintInternalStatReportFilename.empty()
2339 :
D.CCPrintInternalStatReportFilename);
2346 assert(Flag.front() ==
'-');
2348 Flags.push_back(Flag.str());
2350 Flags.push_back((
"!" + Flag.substr(1)).str());
2355 ArgStringList &CmdArgs,
bool IsLTO,
2356 const StringRef PluginOptPrefix) {
2357 auto addArg = [&, IsLTO](
const Twine &Arg) {
2359 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2360 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2362 CmdArgs.push_back(
"-mllvm");
2363 CmdArgs.push_back(Args.MakeArgString(Arg));
2367 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2368 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2370 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2371 StringRef
Value = A->getValue();
2373 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2374 !llvm::isPowerOf2_64(Boundary)) {
2375 D.Diag(diag::err_drv_invalid_argument_to_option)
2376 <<
Value << A->getOption().getName();
2378 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2381 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2382 std::string AlignBranch;
2383 for (StringRef
T : A->getValues()) {
2384 if (
T !=
"fused" &&
T !=
"jcc" &&
T !=
"jmp" &&
T !=
"call" &&
2385 T !=
"ret" &&
T !=
"indirect")
2386 D.Diag(diag::err_drv_invalid_malign_branch_EQ)
2387 <<
T <<
"fused, jcc, jmp, call, ret, indirect";
2388 if (!AlignBranch.empty())
2392 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2394 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2395 StringRef
Value = A->getValue();
2396 unsigned PrefixSize;
2397 if (
Value.getAsInteger(10, PrefixSize)) {
2398 D.Diag(diag::err_drv_invalid_argument_to_option)
2399 <<
Value << A->getOption().getName();
2401 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2427 llvm::opt::ArgStringList &CC1Args,
2429 StringRef Lib, StringRef Arch, StringRef
Target,
2430 bool isBitCodeSDL) {
2433 std::string LibDeviceLoc =
"/libdevice";
2434 std::string LibBcPrefix =
"/libbc-";
2435 std::string LibPrefix =
"/lib";
2452 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2453 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2455 for (
auto Suffix : {Twine(Lib +
"-" + Arch +
"-" +
Target).str(),
2456 Twine(Lib +
"-" + Arch).str(), Twine(Lib).str()}) {
2457 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2458 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2468 const auto *Ext =
".a";
2470 for (
auto Suffix : {Twine(Lib +
"-" + Arch +
"-" +
Target).str(),
2471 Twine(Lib +
"-" + Arch).str()}) {
2472 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2473 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2484 bool FoundSDL =
false;
2485 for (
auto LPath : LibraryPaths) {
2486 for (
auto SDL : SDLs) {
2487 auto FullName = Twine(LPath + SDL).str();
2488 if (llvm::sys::fs::exists(
FullName)) {
2489 CC1Args.push_back(DriverArgs.MakeArgString(
FullName));
2506 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2507 llvm::opt::ArgStringList &CC1Args,
2509 StringRef Arch, StringRef
Target,
bool isBitCodeSDL) {
2512 if (isBitCodeSDL && Arch.contains(
"nvptx"))
2515 bool FoundAOB =
false;
2516 std::string ArchiveOfBundles;
2518 llvm::Triple Triple(
D.getTargetTriple());
2519 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2520 auto Ext = IsMSVC ?
".lib" :
".a";
2521 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2522 if (llvm::sys::fs::exists(Lib)) {
2523 ArchiveOfBundles = Lib;
2527 Lib.consume_front(
"-l");
2528 for (
auto LPath : LibraryPaths) {
2529 ArchiveOfBundles.clear();
2530 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2531 : IsMSVC ? Lib + Ext
2532 :
"lib" + Lib + Ext)
2534 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2535 auto AOB = Twine(LPath + Prefix + LibFile).str();
2536 if (llvm::sys::fs::exists(AOB)) {
2537 ArchiveOfBundles = AOB;
2550 llvm::file_magic Magic;
2551 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2552 if (EC || Magic != llvm::file_magic::archive)
2555 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2556 std::string OutputLib =
2557 D.GetTemporaryPath(Twine(Prefix + llvm::sys::path::filename(Lib) +
"-" +
2562 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2564 ArgStringList CmdArgs;
2567 DeviceTriple +=
'-';
2568 std::string NormalizedTriple =
T.getToolChain().getTriple().normalize();
2569 DeviceTriple += NormalizedTriple;
2571 DeviceTriple +=
'-';
2575 std::string UnbundleArg(
"-unbundle");
2576 std::string TypeArg(
"-type=a");
2577 std::string InputArg(
"-input=" + ArchiveOfBundles);
2578 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2579 std::string OutputArg(
"-output=" + OutputLib);
2581 const char *UBProgram = DriverArgs.MakeArgString(
2582 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2584 ArgStringList UBArgs;
2585 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2586 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2587 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2588 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2589 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2593 std::string AdditionalArgs(
"-allow-missing-bundles");
2594 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2599 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2600 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2602 C.addCommand(std::make_unique<Command>(
2604 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2606 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2615 const llvm::opt::ArgList &DriverArgs,
2616 llvm::opt::ArgStringList &CC1Args,
2617 StringRef Arch, StringRef
Target,
2618 bool isBitCodeSDL) {
2620 Arch,
Target, isBitCodeSDL);
2649 const llvm::opt::ArgList &DriverArgs,
2650 llvm::opt::ArgStringList &CC1Args,
2651 StringRef Arch, StringRef
Target,
2652 bool isBitCodeSDL) {
2656 std::optional<std::string> LibPath =
2657 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2660 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2661 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2662 for (StringRef
Path : Frags)
2663 LibraryPaths.emplace_back(
Path.trim());
2667 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2668 LibraryPaths.emplace_back(Search_Dir);
2672 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2673 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2676 llvm::SmallSet<std::string, 16> SDLNames;
2677 static const StringRef HostOnlyArchives[] = {
2678 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2679 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2680 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2681 SDLNames.insert(std::string(
"-l") + SDLName);
2685 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2692 const StringRef LibFileExt =
".lib";
2693 if (!llvm::sys::path::has_extension(
FileName) ||
2695 llvm::sys::path::extension(
FileName).drop_front()) ==
2697 llvm::sys::path::extension(
FileName) == LibFileExt)
2698 SDLNames.insert(Input);
2705 for (
auto SDLName : SDLNames) {
2707 if (!
SDLSearch(
D, DriverArgs, CC1Args, LibraryPaths, SDLName, Arch,
Target,
2710 LibraryPaths, SDLName, Arch,
Target,
2716static llvm::opt::Arg *
2718 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2722 const llvm::opt::ArgList &Args) {
2723 const unsigned MinCodeObjVer = 4;
2724 const unsigned MaxCodeObjVer = 6;
2727 if (CodeObjArg->getOption().getID() ==
2728 options::OPT_mcode_object_version_EQ) {
2729 unsigned CodeObjVer = MaxCodeObjVer;
2731 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2732 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2733 D.Diag(diag::err_drv_invalid_int_value)
2734 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2739 if (CodeObjVer == 6)
2740 D.Diag(diag::warn_drv_amdgpu_cov6);
2746 const llvm::opt::ArgList &Args) {
2747 unsigned CodeObjVer = 5;
2749 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2754 const Driver &
D,
const llvm::opt::ArgList &Args) {
2759 const llvm::opt::ArgList &Args,
2760 llvm::opt::ArgStringList &CmdArgs,
2761 const llvm::Triple &Triple,
bool IsLTO,
2762 const StringRef PluginOptPrefix) {
2763 auto addArg = [&, IsLTO](
const Twine &Arg) {
2765 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2766 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2768 CmdArgs.push_back(
"-mllvm");
2769 CmdArgs.push_back(Args.MakeArgString(Arg));
2773 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2774 options::OPT_mno_outline)) {
2775 if (A->getOption().matches(options::OPT_moutline)) {
2779 if (!(Triple.isARM() || Triple.isThumb() || Triple.isAArch64())) {
2780 D.Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2782 addArg(Twine(
"-enable-machine-outliner"));
2786 addArg(Twine(
"-enable-machine-outliner=never"));
2790 auto *CodeGenDataGenArg =
2791 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
2792 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
2795 if (CodeGenDataGenArg && CodeGenDataUseArg)
2796 D.Diag(diag::err_drv_argument_not_allowed_with)
2797 << CodeGenDataGenArg->getAsString(Args)
2798 << CodeGenDataUseArg->getAsString(Args);
2802 if (CodeGenDataGenArg)
2803 addArg(Twine(
"-codegen-data-generate"));
2806 if (CodeGenDataUseArg)
2807 addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
2811 const llvm::opt::ArgList &DriverArgs,
2812 llvm::opt::ArgStringList &CC1Args,
2813 StringRef BitcodeSuffix,
2814 const llvm::Triple &Triple,
2819 std::optional<std::string> LibPath =
2820 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2823 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2824 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2825 for (StringRef
Path : Frags)
2826 LibraryPaths.emplace_back(
Path.trim());
2831 LibraryPaths.emplace_back(LibPath);
2833 OptSpecifier LibomptargetBCPathOpt =
2834 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
2835 : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
2836 : options::OPT_libomptarget_spirv_bc_path_EQ;
2838 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu"
2839 : Triple.isNVPTX() ?
"nvptx"
2841 std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix +
".bc").str();
2844 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
2846 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
2847 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
2848 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2851 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2852 CC1Args.push_back(
"-mlink-builtin-bitcode");
2853 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2855 D.Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
2856 << LibOmpTargetFile;
2859 bool FoundBCLibrary =
false;
2861 for (StringRef LibraryPath : LibraryPaths) {
2863 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2864 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2865 CC1Args.push_back(
"-mlink-builtin-bitcode");
2866 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2867 FoundBCLibrary =
true;
2872 if (!FoundBCLibrary)
2873 D.Diag(diag::err_drv_omp_offload_target_missingbcruntime)
2874 << LibOmpTargetName << ArchPrefix;
2878 const llvm::opt::ArgList &Args,
2879 llvm::opt::ArgStringList &CmdArgs) {
2881 !Args.hasArg(options::OPT_nostdlib) &&
2882 !Args.hasArg(options::OPT_no_hip_rt) && !Args.hasArg(options::OPT_r)) {
2886 for (
auto *Arg : Args.filtered(options::OPT_no_hip_rt)) {
2893 const llvm::opt::ArgList &Args,
2894 llvm::opt::ArgStringList &CmdArgs,
2895 const llvm::Triple &Triple) {
2896 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
2897 options::OPT_mno_outline_atomics)) {
2899 if (!Triple.isAArch64()) {
2900 D.Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
2901 << Triple.getArchName() << A->getOption().getName();
2903 if (A->getOption().matches(options::OPT_moutline_atomics)) {
2904 CmdArgs.push_back(
"-target-feature");
2905 CmdArgs.push_back(
"+outline-atomics");
2907 CmdArgs.push_back(
"-target-feature");
2908 CmdArgs.push_back(
"-outline-atomics");
2912 CmdArgs.push_back(
"-target-feature");
2913 CmdArgs.push_back(
"+outline-atomics");
2918 llvm::opt::ArgStringList &CmdArgs) {
2919 if (TCArgs.hasFlag(options::OPT_offload_compress,
2920 options::OPT_no_offload_compress,
false))
2921 CmdArgs.push_back(
"-compress");
2922 if (TCArgs.hasArg(options::OPT_v))
2923 CmdArgs.push_back(
"-verbose");
2924 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
2926 TCArgs.MakeArgString(Twine(
"-compression-level=") + Arg->getValue()));
2930 const llvm::Triple &Triple,
2931 const llvm::Reloc::Model &RelocationModel,
2932 llvm::opt::ArgStringList &CmdArgs) {
2933 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
2934 StringRef CM = A->getValue();
2936 if (Triple.isOSAIX() && CM ==
"medium")
2938 if (Triple.isAArch64(64)) {
2939 Ok = CM ==
"tiny" || CM ==
"small" || CM ==
"large";
2940 if (CM ==
"large" && !Triple.isOSBinFormatMachO() &&
2941 RelocationModel != llvm::Reloc::Static)
2942 D.Diag(diag::err_drv_argument_only_allowed_with)
2943 << A->getAsString(Args) <<
"-fno-pic";
2944 }
else if (Triple.isLoongArch()) {
2945 if (CM ==
"extreme" &&
2946 Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt,
false))
2947 D.Diag(diag::err_drv_argument_not_allowed_with)
2948 << A->getAsString(Args) <<
"-fplt";
2949 Ok = CM ==
"normal" || CM ==
"medium" || CM ==
"extreme";
2952 CM = llvm::StringSwitch<StringRef>(CM)
2953 .Case(
"normal",
"small")
2954 .Case(
"extreme",
"large")
2956 }
else if (Triple.isPPC64() || Triple.isOSAIX()) {
2957 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
2958 }
else if (Triple.isRISCV()) {
2960 if (CM ==
"large" && RelocationModel != llvm::Reloc::Static)
2961 D.Diag(diag::err_drv_argument_not_allowed_with)
2962 << A->getAsString(Args) <<
"-fpic";
2965 else if (CM ==
"medany")
2967 Ok = CM ==
"small" || CM ==
"medium" ||
2968 (CM ==
"large" && Triple.isRISCV64());
2969 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
2970 Ok = llvm::is_contained({
"small",
"kernel",
"medium",
"large",
"tiny"},
2972 }
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
2976 }
else if (Triple.isSPARC64()) {
2979 else if (CM ==
"medmid")
2981 else if (CM ==
"medany")
2983 Ok = CM ==
"small" || CM ==
"medium" || CM ==
"large";
2986 CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
2988 D.Diag(diag::err_drv_unsupported_option_argument_for_target)
2989 << A->getSpelling() << CM << Triple.getTriple();
2993 if (Triple.getArch() == llvm::Triple::x86_64) {
2994 bool IsMediumCM =
false;
2995 bool IsLargeCM =
false;
2996 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
2997 IsMediumCM = StringRef(A->getValue()) ==
"medium";
2998 IsLargeCM = StringRef(A->getValue()) ==
"large";
3000 if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
3001 if (!IsMediumCM && !IsLargeCM) {
3002 D.Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
3003 << A->getOption().getRenderName();
3005 A->render(Args, CmdArgs);
3007 }
else if (IsMediumCM) {
3008 CmdArgs.push_back(
"-mlarge-data-threshold=65536");
3009 }
else if (IsLargeCM) {
3010 CmdArgs.push_back(
"-mlarge-data-threshold=0");
3016 ArgStringList &CmdArgs) {
3021 Args.getLastArg(options::OPT_fcolor_diagnostics,
3022 options::OPT_fno_color_diagnostics);
3023 if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
3024 StringRef
Value(A->getValue());
3026 D.Diag(diag::err_drv_invalid_argument_to_option)
3027 <<
Value << A->getOption().getName();
3030 if (
D.getDiags().getDiagnosticOptions().ShowColors)
3031 CmdArgs.push_back(
"-fcolor-diagnostics");
3036 for (; *Arg; ++Arg) {
3042 Res.push_back(
'\\');
3045 Res.push_back(*Arg);
3050 const llvm::opt::ArgList &Args) {
3052 const char *Exec =
D.getClangProgramPath();
3054 llvm::opt::ArgStringList OriginalArgs;
3055 for (
const auto &Arg : Args)
3056 Arg->render(Args, OriginalArgs);
3060 for (
const char *OriginalArg : OriginalArgs) {
3064 Flags += EscapedArg;
3067 return Args.MakeArgString(Flags);
3071 const llvm::opt::ArgList &Args,
3072 bool &FRecordCommandLine,
3073 bool &GRecordCommandLine) {
3076 const std::string &TripleStr = Triple.getTriple();
3078 FRecordCommandLine =
3079 Args.hasFlag(options::OPT_frecord_command_line,
3080 options::OPT_fno_record_command_line,
false);
3081 GRecordCommandLine =
3082 Args.hasFlag(options::OPT_grecord_command_line,
3083 options::OPT_gno_record_command_line,
false);
3084 if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3085 !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3086 D.Diag(diag::err_drv_unsupported_opt_for_target)
3087 << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3094 ArgStringList &CmdArgs) {
3097 bool StrictOverflow = Args.hasFlag(options::OPT_fstrict_overflow,
3098 options::OPT_fno_strict_overflow,
true);
3099 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
3100 if (A->getOption().matches(options::OPT_fwrapv))
3101 CmdArgs.push_back(
"-fwrapv");
3102 }
else if (!StrictOverflow) {
3103 CmdArgs.push_back(
"-fwrapv");
3105 if (Arg *A = Args.getLastArg(options::OPT_fwrapv_pointer,
3106 options::OPT_fno_wrapv_pointer)) {
3107 if (A->getOption().matches(options::OPT_fwrapv_pointer))
3108 CmdArgs.push_back(
"-fwrapv-pointer");
3109 }
else if (!StrictOverflow) {
3110 CmdArgs.push_back(
"-fwrapv-pointer");
static bool useLeafFramePointerForTargetByDefault(const llvm::Triple &Triple)
static unsigned ParseDebugDefaultVersion(const ToolChain &TC, const ArgList &Args)
static void getWebAssemblyTargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, std::vector< StringRef > &Features)
static 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)
Defines the clang::LangOptions interface.
llvm::MachO::Target Target
Defines types useful for describing an Objective-C runtime.
Defines version macros and version-related utility functions for Clang.
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.
DiagnosticBuilder Diag(unsigned DiagID) const
StringRef getFlangF128MathLibrary() 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 needsCfiDiagRt() const
bool linkRuntimes() const
bool needsUbsanRt() const
bool needsHwasanRt() const
bool hasCrossDsoCfi() 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
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()