31#include "clang/Config/config.h"
43#include "llvm/ADT/STLExtras.h"
44#include "llvm/ADT/SmallSet.h"
45#include "llvm/ADT/SmallString.h"
46#include "llvm/ADT/StringExtras.h"
47#include "llvm/ADT/StringSwitch.h"
48#include "llvm/ADT/Twine.h"
49#include "llvm/BinaryFormat/Magic.h"
50#include "llvm/Config/llvm-config.h"
51#include "llvm/Option/Arg.h"
52#include "llvm/Option/ArgList.h"
53#include "llvm/Option/Option.h"
54#include "llvm/Support/CodeGen.h"
55#include "llvm/Support/Compression.h"
56#include "llvm/Support/Debug.h"
57#include "llvm/Support/ErrorHandling.h"
58#include "llvm/Support/FileSystem.h"
59#include "llvm/Support/Path.h"
60#include "llvm/Support/Process.h"
61#include "llvm/Support/Program.h"
62#include "llvm/Support/ScopedPrinter.h"
63#include "llvm/Support/Threading.h"
64#include "llvm/Support/VirtualFileSystem.h"
65#include "llvm/Support/YAMLParser.h"
66#include "llvm/TargetParser/Host.h"
67#include "llvm/TargetParser/TargetParser.h"
76 const llvm::Triple &Triple) {
77 if (Args.hasArg(clang::driver::options::OPT_pg) &&
78 !Args.hasArg(clang::driver::options::OPT_mfentry))
81 if (Triple.isAndroid()) {
82 switch (Triple.getArch()) {
83 case llvm::Triple::aarch64:
84 case llvm::Triple::arm:
85 case llvm::Triple::armeb:
86 case llvm::Triple::thumb:
87 case llvm::Triple::thumbeb:
88 case llvm::Triple::riscv64:
95 switch (Triple.getArch()) {
96 case llvm::Triple::xcore:
97 case llvm::Triple::wasm32:
98 case llvm::Triple::wasm64:
99 case llvm::Triple::msp430:
103 case llvm::Triple::ppc:
104 case llvm::Triple::ppcle:
105 case llvm::Triple::ppc64:
106 case llvm::Triple::ppc64le:
107 case llvm::Triple::riscv32:
108 case llvm::Triple::riscv64:
109 case llvm::Triple::sparc:
110 case llvm::Triple::sparcel:
111 case llvm::Triple::sparcv9:
112 case llvm::Triple::amdgcn:
113 case llvm::Triple::r600:
114 case llvm::Triple::csky:
115 case llvm::Triple::loongarch32:
116 case llvm::Triple::loongarch64:
117 case llvm::Triple::m68k:
123 if (Triple.isOSFuchsia() || Triple.isOSNetBSD()) {
127 if (Triple.isOSLinux() || Triple.isOSHurd()) {
128 switch (Triple.getArch()) {
130 case llvm::Triple::arm:
131 case llvm::Triple::armeb:
132 case llvm::Triple::thumb:
133 case llvm::Triple::thumbeb:
134 case llvm::Triple::mips64:
135 case llvm::Triple::mips64el:
136 case llvm::Triple::mips:
137 case llvm::Triple::mipsel:
138 case llvm::Triple::systemz:
139 case llvm::Triple::x86:
140 case llvm::Triple::x86_64:
147 if (Triple.isOSWindows()) {
148 switch (Triple.getArch()) {
149 case llvm::Triple::x86:
151 case llvm::Triple::x86_64:
152 return Triple.isOSBinFormatMachO();
153 case llvm::Triple::arm:
154 case llvm::Triple::thumb:
168 switch (Triple.getArch()) {
171 case llvm::Triple::arm:
172 case llvm::Triple::thumb:
175 return Triple.isOSDarwin();
181 const llvm::Triple &Triple) {
193 Args.getLastArg(clang::driver::options::OPT_fomit_frame_pointer,
194 clang::driver::options::OPT_fno_omit_frame_pointer);
196 bool OmitFP = A && A->getOption().matches(
197 clang::driver::options::OPT_fomit_frame_pointer);
198 bool NoOmitFP = A && A->getOption().matches(
199 clang::driver::options::OPT_fno_omit_frame_pointer);
201 Args.hasFlag(clang::driver::options::OPT_momit_leaf_frame_pointer,
202 clang::driver::options::OPT_mno_omit_leaf_frame_pointer,
203 Triple.isAArch64() || Triple.isPS() || Triple.isVE() ||
204 (Triple.isAndroid() && Triple.isRISCV64()));
215 const StringRef PluginOptPrefix) {
216 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
217 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
218 "-pass-remarks=" + A->getValue()));
220 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
221 CmdArgs.push_back(Args.MakeArgString(
222 Twine(PluginOptPrefix) +
"-pass-remarks-missed=" + A->getValue()));
224 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
225 CmdArgs.push_back(Args.MakeArgString(
226 Twine(PluginOptPrefix) +
"-pass-remarks-analysis=" + A->getValue()));
230 const llvm::Triple &Triple,
233 const StringRef PluginOptPrefix) {
234 StringRef Format =
"yaml";
235 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
236 Format = A->getValue();
239 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
245 assert(!F.empty() &&
"Cannot determine remarks output name.");
247 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
248 "opt-remarks-filename=" + F +
249 ".opt.ld." + Format));
252 Args.getLastArg(options::OPT_foptimization_record_passes_EQ))
253 CmdArgs.push_back(Args.MakeArgString(
254 Twine(PluginOptPrefix) +
"opt-remarks-passes=" + A->getValue()));
256 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
257 "opt-remarks-format=" + Format.data()));
261 ArgStringList &CmdArgs,
262 const StringRef PluginOptPrefix) {
263 if (Args.hasFlag(options::OPT_fdiagnostics_show_hotness,
264 options::OPT_fno_diagnostics_show_hotness,
false))
265 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
266 "opt-remarks-with-hotness"));
269 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ))
271 Args.MakeArgString(Twine(PluginOptPrefix) +
272 "opt-remarks-hotness-threshold=" + A->getValue()));
277 StringRef Processor) {
281 auto GPUKind =
T.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Processor)
282 : llvm::AMDGPU::parseArchR600(Processor);
283 auto GPUFeatures =
T.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind)
284 : llvm::AMDGPU::getArchAttrR600(GPUKind);
285 if (GPUFeatures & llvm::AMDGPU::FEATURE_WGP)
287 return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode);
292 if (D.
getVFS().exists(Path))
293 Paths.push_back(Path.str());
297 const llvm::Triple &Triple,
299 std::vector<StringRef> &Features,
300 OptSpecifier Group) {
301 std::set<StringRef> Warned;
302 for (
const Arg *A : Args.filtered(Group)) {
303 StringRef Name = A->getOption().getName();
307 assert(Name.starts_with(
"m") &&
"Invalid feature name.");
308 Name = Name.substr(1);
312 if (Warned.count(Name) == 0) {
314 clang::diag::warn_drv_unsupported_option_for_processor)
315 << A->getAsString(Args) << Proc;
321 bool IsNegative = Name.consume_front(
"no-");
323 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
332 for (StringRef Feature : llvm::reverse(Features)) {
333 if (UsedFeatures.insert(Feature.drop_front()).second)
334 UnifiedFeatures.insert(UnifiedFeatures.begin(), Feature);
337 return UnifiedFeatures;
341 const char *ArgName,
const char *EnvVar) {
342 const char *DirList = ::getenv(EnvVar);
343 bool CombinedArg =
false;
348 StringRef Name(ArgName);
349 if (Name.equals(
"-I") || Name.equals(
"-L") || Name.empty())
352 StringRef Dirs(DirList);
356 StringRef::size_type Delim;
357 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
360 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
362 CmdArgs.push_back(ArgName);
363 CmdArgs.push_back(
".");
368 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
370 CmdArgs.push_back(ArgName);
371 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
374 Dirs = Dirs.substr(Delim + 1);
379 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
381 CmdArgs.push_back(ArgName);
382 CmdArgs.push_back(
".");
386 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
388 CmdArgs.push_back(ArgName);
389 CmdArgs.push_back(Args.MakeArgString(Dirs));
395 const ArgList &Args, ArgStringList &CmdArgs,
401 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
408 for (
const auto &II : Inputs) {
412 if (
auto *IA = II.getAction())
422 if (II.isFilename()) {
423 CmdArgs.push_back(II.getFilename());
432 const Arg &A = II.getInputArg();
435 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
437 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
440 A.renderAsInput(Args, CmdArgs);
445 const ToolChain &TC,
const llvm::opt::ArgList &Args,
446 llvm::opt::ArgStringList &CmdArgs) {
452 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
453 StringRef
V = A->getValue();
454 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
455 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
457 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
458 << A->getSpelling() <<
V;
463 std::vector<StringRef> &Features,
464 OptSpecifier OnOpt, OptSpecifier OffOpt,
465 StringRef FeatureName) {
466 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
467 if (A->getOption().matches(OnOpt))
468 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
470 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
476 const ArgList &Args) {
477 Arg *MArch = Args.getLastArg(options::OPT_march_EQ);
478 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
480 return llvm::StringSwitch<std::string>(GPUName)
481 .Cases(
"rv630",
"rv635",
"r600")
482 .Cases(
"rv610",
"rv620",
"rs780",
"rs880")
483 .Case(
"rv740",
"rv770")
484 .Case(
"palm",
"cedar")
485 .Cases(
"sumo",
"sumo2",
"sumo")
486 .Case(
"hemlock",
"cypress")
487 .Case(
"aruba",
"cayman")
488 .Default(GPUName.str());
496 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
497 return A->getValue();
505 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
506 StringRef CPU = A->getValue();
512 return llvm::sys::getHostCPUName();
522 const llvm::Triple &
T,
bool FromAs) {
525 switch (
T.getArch()) {
529 case llvm::Triple::aarch64:
530 case llvm::Triple::aarch64_32:
531 case llvm::Triple::aarch64_be:
534 case llvm::Triple::arm:
535 case llvm::Triple::armeb:
536 case llvm::Triple::thumb:
537 case llvm::Triple::thumbeb: {
538 StringRef MArch, MCPU;
543 case llvm::Triple::avr:
544 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
545 return A->getValue();
548 case llvm::Triple::m68k:
551 case llvm::Triple::mips:
552 case llvm::Triple::mipsel:
553 case llvm::Triple::mips64:
554 case llvm::Triple::mips64el: {
558 return std::string(CPUName);
561 case llvm::Triple::nvptx:
562 case llvm::Triple::nvptx64:
563 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
564 return A->getValue();
567 case llvm::Triple::ppc:
568 case llvm::Triple::ppcle:
569 case llvm::Triple::ppc64:
570 case llvm::Triple::ppc64le:
573 case llvm::Triple::csky:
574 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
575 return A->getValue();
576 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
577 return A->getValue();
580 case llvm::Triple::riscv32:
581 case llvm::Triple::riscv64:
584 case llvm::Triple::bpfel:
585 case llvm::Triple::bpfeb:
586 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
587 return A->getValue();
590 case llvm::Triple::sparc:
591 case llvm::Triple::sparcel:
592 case llvm::Triple::sparcv9:
595 case llvm::Triple::x86:
596 case llvm::Triple::x86_64:
599 case llvm::Triple::hexagon:
603 case llvm::Triple::lanai:
606 case llvm::Triple::systemz:
609 case llvm::Triple::r600:
610 case llvm::Triple::amdgcn:
613 case llvm::Triple::wasm32:
614 case llvm::Triple::wasm64:
617 case llvm::Triple::loongarch32:
618 case llvm::Triple::loongarch64:
624 const llvm::Triple &Triple,
626 std::vector<StringRef> &Features) {
628 options::OPT_m_wasm_Features_Group);
632 const ArgList &Args, ArgStringList &CmdArgs,
633 bool ForAS,
bool IsAux) {
634 std::vector<StringRef> Features;
635 switch (Triple.getArch()) {
638 case llvm::Triple::mips:
639 case llvm::Triple::mipsel:
640 case llvm::Triple::mips64:
641 case llvm::Triple::mips64el:
644 case llvm::Triple::arm:
645 case llvm::Triple::armeb:
646 case llvm::Triple::thumb:
647 case llvm::Triple::thumbeb:
650 case llvm::Triple::ppc:
651 case llvm::Triple::ppcle:
652 case llvm::Triple::ppc64:
653 case llvm::Triple::ppc64le:
656 case llvm::Triple::riscv32:
657 case llvm::Triple::riscv64:
660 case llvm::Triple::systemz:
663 case llvm::Triple::aarch64:
664 case llvm::Triple::aarch64_32:
665 case llvm::Triple::aarch64_be:
668 case llvm::Triple::x86:
669 case llvm::Triple::x86_64:
672 case llvm::Triple::hexagon:
675 case llvm::Triple::wasm32:
676 case llvm::Triple::wasm64:
679 case llvm::Triple::sparc:
680 case llvm::Triple::sparcel:
681 case llvm::Triple::sparcv9:
684 case llvm::Triple::r600:
685 case llvm::Triple::amdgcn:
688 case llvm::Triple::nvptx:
689 case llvm::Triple::nvptx64:
692 case llvm::Triple::m68k:
695 case llvm::Triple::msp430:
698 case llvm::Triple::ve:
701 case llvm::Triple::csky:
704 case llvm::Triple::loongarch32:
705 case llvm::Triple::loongarch64:
711 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
712 CmdArgs.push_back(Feature.data());
717 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
720 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
721 D.
Diag(diag::err_drv_invalid_int_value)
722 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
723 return LtoJobsArg->getValue();
728 return Triple.isPS();
732 const llvm::opt::ArgList &Args) {
734 Arg *A = Args.getLastArg(options::OPT_mtls_dialect_EQ);
736 return Triple.hasDefaultTLSDESC();
737 StringRef
V = A->getValue();
738 bool SupportedArgument =
false, EnableTLSDESC =
false;
739 bool Unsupported = !Triple.isOSBinFormatELF();
740 if (Triple.isRISCV()) {
741 SupportedArgument =
V ==
"desc" ||
V ==
"trad";
742 EnableTLSDESC =
V ==
"desc";
743 }
else if (Triple.isX86()) {
744 SupportedArgument =
V ==
"gnu" ||
V ==
"gnu2";
745 EnableTLSDESC =
V ==
"gnu2";
750 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
751 << A->getSpelling() << Triple.getTriple();
752 }
else if (!SupportedArgument) {
753 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument_for_target)
754 << A->getSpelling() <<
V << Triple.getTriple();
756 return EnableTLSDESC;
760 ArgStringList &CmdArgs,
const InputInfo &Output,
761 const InputInfo &Input,
bool IsThinLTO) {
763 const bool IsOSAIX = Triple.isOSAIX();
764 const bool IsAMDGCN = Triple.isAMDGCN();
767 const bool IsFatLTO = Args.hasArg(options::OPT_ffat_lto_objects);
768 const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
769 if (llvm::sys::path::filename(Linker) !=
"ld.lld" &&
770 llvm::sys::path::stem(Linker) !=
"ld.lld" && !Triple.isOSOpenBSD()) {
774 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
775 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
778 CmdArgs.push_back(
"-plugin");
781 const char *Suffix =
".dll";
782#elif defined(__APPLE__)
783 const char *Suffix =
".dylib";
785 const char *Suffix =
".so";
789 llvm::sys::path::native(Twine(D.
Dir) +
790 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
793 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
798 CmdArgs.push_back(
"--fat-lto-objects");
801 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
802 const char *ExtraDash = IsOSAIX ?
"-" :
"";
803 const char *ParallelismOpt = IsOSAIX ?
"-threads=" :
"jobs=";
808 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
809 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
810 "-generate-arange-section"));
814 Arg *ArgVecLib = Args.getLastArg(options::OPT_fveclib);
815 if (ArgVecLib && ArgVecLib->getNumValues() == 1) {
818 std::optional<StringRef> OptVal =
819 llvm::StringSwitch<std::optional<StringRef>>(ArgVecLib->getValue())
820 .Case(
"Accelerate",
"Accelerate")
821 .Case(
"LIBMVEC",
"LIBMVEC-X86")
822 .Case(
"MASSV",
"MASSV")
823 .Case(
"SVML",
"SVML")
824 .Case(
"SLEEF",
"sleefgnuabi")
825 .Case(
"Darwin_libsystem_m",
"Darwin_libsystem_m")
826 .Case(
"ArmPL",
"ArmPL")
827 .Case(
"none",
"none")
828 .Default(std::nullopt);
831 CmdArgs.push_back(Args.MakeArgString(
832 Twine(PluginOptPrefix) +
"-vector-library=" + OptVal.value()));
839 std::string CPU =
getCPUName(D, Args, Triple);
842 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
844 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
848 if (A->getOption().matches(options::OPT_O4) ||
849 A->getOption().matches(options::OPT_Ofast))
851 else if (A->getOption().matches(options::OPT_O)) {
852 OOpt = A->getValue();
855 else if (OOpt ==
"s" || OOpt ==
"z")
857 }
else if (A->getOption().matches(options::OPT_O0))
861 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"O" + OOpt));
863 CmdArgs.push_back(Args.MakeArgString(Twine(
"--lto-CGO") + OOpt));
867 if (Args.hasArg(options::OPT_gsplit_dwarf))
868 CmdArgs.push_back(Args.MakeArgString(
869 Twine(PluginOptPrefix) +
"dwo_dir=" + Output.
getFilename() +
"_dwo"));
871 if (IsThinLTO && !IsOSAIX)
872 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
873 else if (IsThinLTO && IsOSAIX)
874 CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
879 if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
880 Args.hasArg(options::OPT_fenable_matrix))
882 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-matrix"));
885 if (!Parallelism.empty())
886 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
887 ParallelismOpt + Parallelism));
890 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
891 options::OPT_fno_global_isel)) {
894 CmdArgs.push_back(Args.MakeArgString(
895 Twine(PluginOptPrefix) +
"-global-isel=" +
896 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
901 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
902 if (A->getOption().matches(options::OPT_glldb))
904 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
905 else if (A->getOption().matches(options::OPT_gsce))
907 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
908 else if (A->getOption().matches(options::OPT_gdbx))
910 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
913 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
919 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
923 Arg *A = Args.getLastArg(options::OPT_g_Group);
924 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
925 !A->getOption().matches(options::OPT_ggdb0);
926 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
927 options::OPT_gno_strict_dwarf,
true))
929 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
931 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
932 StringRef
V = A->getValue();
933 if (
V ==
"vec-default")
935 if (
V ==
"vec-extabi") {
937 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
943 bool UseSeparateSections =
946 if (Args.hasFlag(options::OPT_ffunction_sections,
947 options::OPT_fno_function_sections, UseSeparateSections))
949 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
950 else if (Args.hasArg(options::OPT_fno_function_sections))
952 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
954 bool DataSectionsTurnedOff =
false;
955 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
956 UseSeparateSections)) {
958 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
959 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
960 DataSectionsTurnedOff =
true;
962 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
965 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
966 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
967 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
968 options::OPT_mno_xcoff_roptr,
false);
969 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
971 D.
Diag(diag::err_drv_unsupported_opt_for_target)
972 << OptStr << Triple.str();
978 if (DataSectionsTurnedOff)
979 D.
Diag(diag::err_roptr_requires_data_sections);
982 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
987 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
988 options::OPT_fno_split_machine_functions)) {
989 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
990 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
991 "-split-machine-functions"));
995 StringRef FName = A->getValue();
996 if (!llvm::sys::fs::exists(FName))
997 D.
Diag(diag::err_drv_no_such_file) << FName;
999 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1000 "sample-profile=" + FName));
1004 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1005 "cs-profile-generate"));
1006 if (CSPGOGenerateArg->getOption().matches(
1007 options::OPT_fcs_profile_generate_EQ)) {
1009 llvm::sys::path::append(Path,
"default_%m.profraw");
1010 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1011 "cs-profile-path=" + Path));
1014 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1015 "cs-profile-path=default_%m.profraw"));
1018 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1019 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1020 llvm::sys::path::append(Path,
"default.profdata");
1021 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1022 "cs-profile-path=" + Path));
1026 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1028 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1029 "-enable-jmc-instrument"));
1031 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1034 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1035 Triple.hasDefaultEmulatedTLS())) {
1037 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1041 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1043 if (Args.hasFlag(options::OPT_fstack_size_section,
1044 options::OPT_fno_stack_size_section,
false))
1046 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1050 if (!StatsFile.empty())
1052 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1055 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1056 CmdArgs.push_back(Args.MakeArgString(
1057 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1068 Output, PluginOptPrefix);
1074 true, PluginOptPrefix);
1080 ArgStringList &CmdArgs) {
1081 if (Args.hasArg(options::OPT_nogpulib) || Args.hasArg(options::OPT_nolibc))
1087 llvm::sys::path::append(LibCDecls,
"include",
"llvm_libc_wrappers",
1089 bool HasLibC = llvm::sys::fs::exists(LibCDecls) &&
1090 llvm::sys::fs::is_directory(LibCDecls);
1091 if (!Args.hasFlag(options::OPT_gpulibc, options::OPT_nogpulibc, HasLibC))
1096 for (
auto TI = TCRange.first, TE = TCRange.second; TI != TE; ++TI)
1097 ToolChains.push_back(TI->second);
1099 if (llvm::any_of(ToolChains, [](
const ToolChain *TC) {
1102 CmdArgs.push_back(
"-lcgpu-amdgpu");
1103 CmdArgs.push_back(
"-lmgpu-amdgpu");
1105 if (llvm::any_of(ToolChains, [](
const ToolChain *TC) {
1108 CmdArgs.push_back(
"-lcgpu-nvptx");
1109 CmdArgs.push_back(
"-lmgpu-nvptx");
1114 const ArgList &Args,
1115 ArgStringList &CmdArgs) {
1120 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1121 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1125 ArgStringList &CmdArgs) {
1126 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1127 options::OPT_fno_rtlib_add_rpath,
false))
1132 CandidateRPaths.emplace_back(*CandidateRPath);
1134 for (
const auto &CandidateRPath : CandidateRPaths) {
1135 if (TC.
getVFS().exists(CandidateRPath)) {
1136 CmdArgs.push_back(
"-rpath");
1137 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1143 const ToolChain &TC,
const ArgList &Args,
1144 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1146 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1147 options::OPT_fno_openmp,
false))
1156 if (ForceStaticHostRuntime)
1157 CmdArgs.push_back(
"-Bstatic");
1161 CmdArgs.push_back(
"-lomp");
1164 CmdArgs.push_back(
"-lgomp");
1167 CmdArgs.push_back(
"-liomp5");
1173 if (ForceStaticHostRuntime)
1174 CmdArgs.push_back(
"-Bdynamic");
1177 CmdArgs.push_back(
"-lrt");
1179 if (IsOffloadingHost)
1180 CmdArgs.push_back(
"-lomptarget");
1182 if (IsOffloadingHost && !Args.hasArg(options::OPT_nogpulib))
1183 CmdArgs.push_back(
"-lomptarget.devicertl");
1185 if (IsOffloadingHost)
1196 bool WholeArchiveActive =
false;
1197 for (
auto *Arg : Args.filtered(options::OPT_Wl_COMMA)) {
1199 for (StringRef ArgValue : Arg->getValues()) {
1200 if (ArgValue ==
"--whole-archive")
1201 WholeArchiveActive =
true;
1202 if (ArgValue ==
"--no-whole-archive")
1203 WholeArchiveActive =
false;
1208 return WholeArchiveActive;
1213 return Args.hasArg(options::OPT_shared);
1218 return Args.hasArg(options::OPT_static);
1223 llvm::opt::ArgStringList &CmdArgs) {
1224 unsigned RTOptionID = options::OPT__SLASH_MT;
1225 if (
auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
1226 RTOptionID = llvm::StringSwitch<unsigned>(rtl->getValue())
1227 .Case(
"static", options::OPT__SLASH_MT)
1228 .Case(
"static_dbg", options::OPT__SLASH_MTd)
1229 .Case(
"dll", options::OPT__SLASH_MD)
1230 .Case(
"dll_dbg", options::OPT__SLASH_MDd)
1231 .Default(options::OPT__SLASH_MT);
1233 switch (RTOptionID) {
1234 case options::OPT__SLASH_MT:
1235 CmdArgs.push_back(
"/WHOLEARCHIVE:Fortran_main.static.lib");
1237 case options::OPT__SLASH_MTd:
1238 CmdArgs.push_back(
"/WHOLEARCHIVE:Fortran_main.static_dbg.lib");
1240 case options::OPT__SLASH_MD:
1241 CmdArgs.push_back(
"/WHOLEARCHIVE:Fortran_main.dynamic.lib");
1243 case options::OPT__SLASH_MDd:
1244 CmdArgs.push_back(
"/WHOLEARCHIVE:Fortran_main.dynamic_dbg.lib");
1251 llvm::opt::ArgStringList &CmdArgs) {
1263 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
1270 const char *FortranMainLinkFlag =
"-lFortran_main";
1274 for (
const char *arg : CmdArgs) {
1275 if (strncmp(arg, FortranMainLinkFlag, strlen(FortranMainLinkFlag)) == 0)
1276 D.
Diag(diag::warn_drv_deprecated_custom)
1277 << FortranMainLinkFlag
1278 <<
"see the Flang driver documentation for correct usage";
1287 CmdArgs.push_back(
"--whole-archive");
1288 CmdArgs.push_back(FortranMainLinkFlag);
1289 CmdArgs.push_back(
"--no-whole-archive");
1293 CmdArgs.push_back(FortranMainLinkFlag);
1298 llvm::opt::ArgStringList &CmdArgs) {
1302 if (!Args.hasArg(options::OPT_no_fortran_main))
1309 if (!TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
1311 F128LibName.consume_front_insensitive(
"lib");
1312 if (!F128LibName.empty()) {
1313 bool AsNeeded = !TC.
getTriple().isOSAIX();
1314 CmdArgs.push_back(
"-lFortranFloat128Math");
1317 CmdArgs.push_back(Args.MakeArgString(
"-l" + F128LibName));
1321 CmdArgs.push_back(
"-lFortranRuntime");
1322 CmdArgs.push_back(
"-lFortranDecimal");
1327 const llvm::opt::ArgList &Args,
1328 ArgStringList &CmdArgs) {
1335 llvm::sys::path::append(DefaultLibPath,
"lib");
1336 if (TC.
getTriple().isKnownWindowsMSVCEnvironment())
1337 CmdArgs.push_back(Args.MakeArgString(
"-libpath:" + DefaultLibPath));
1339 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1343 ArgStringList &CmdArgs, StringRef Sanitizer,
1344 bool IsShared,
bool IsWhole) {
1347 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1350 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1360 ArgStringList &CmdArgs,
1361 StringRef Sanitizer) {
1366 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1369 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1370 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1377 const llvm::opt::ArgList &Args,
1378 llvm::opt::ArgStringList &CmdArgs,
1381 "AIX linker does not support any form of --as-needed option yet.");
1389 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1390 CmdArgs.push_back(
"-z");
1391 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1393 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1398 const llvm::opt::ArgList &Args,
1399 ArgStringList &CmdArgs) {
1404 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1406 CmdArgs.push_back(
"-lpthread");
1408 CmdArgs.push_back(
"-lrt");
1410 CmdArgs.push_back(
"-lm");
1414 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1415 CmdArgs.push_back(
"-ldl");
1420 CmdArgs.push_back(
"-lexecinfo");
1426 CmdArgs.push_back(
"-lresolv");
1440 SharedRuntimes.push_back(
"asan");
1441 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1442 HelperStaticRuntimes.push_back(
"asan-preinit");
1445 SharedRuntimes.push_back(
"memprof");
1446 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1447 HelperStaticRuntimes.push_back(
"memprof-preinit");
1451 SharedRuntimes.push_back(
"ubsan_minimal");
1453 SharedRuntimes.push_back(
"ubsan_standalone");
1456 SharedRuntimes.push_back(
"scudo_standalone");
1459 SharedRuntimes.push_back(
"tsan");
1462 SharedRuntimes.push_back(
"hwasan_aliases");
1464 SharedRuntimes.push_back(
"hwasan");
1465 if (!Args.hasArg(options::OPT_shared))
1466 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1472 StaticRuntimes.push_back(
"stats_client");
1476 HelperStaticRuntimes.push_back(
"asan_static");
1479 if (Args.hasArg(options::OPT_shared)) {
1488 StaticRuntimes.push_back(
"asan");
1490 StaticRuntimes.push_back(
"asan_cxx");
1494 StaticRuntimes.push_back(
"memprof");
1496 StaticRuntimes.push_back(
"memprof_cxx");
1501 StaticRuntimes.push_back(
"hwasan_aliases");
1503 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1505 StaticRuntimes.push_back(
"hwasan");
1507 StaticRuntimes.push_back(
"hwasan_cxx");
1511 StaticRuntimes.push_back(
"dfsan");
1513 StaticRuntimes.push_back(
"lsan");
1515 StaticRuntimes.push_back(
"msan");
1517 StaticRuntimes.push_back(
"msan_cxx");
1520 StaticRuntimes.push_back(
"tsan");
1522 StaticRuntimes.push_back(
"tsan_cxx");
1526 StaticRuntimes.push_back(
"ubsan_minimal");
1528 StaticRuntimes.push_back(
"ubsan_standalone");
1530 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1534 NonWholeStaticRuntimes.push_back(
"safestack");
1535 RequiredSymbols.push_back(
"__safestack_init");
1539 StaticRuntimes.push_back(
"cfi");
1541 StaticRuntimes.push_back(
"cfi_diag");
1543 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1547 NonWholeStaticRuntimes.push_back(
"stats");
1548 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1551 StaticRuntimes.push_back(
"scudo_standalone");
1553 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1560 ArgStringList &CmdArgs) {
1563 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1566 NonWholeStaticRuntimes, HelperStaticRuntimes,
1572 !Args.hasArg(options::OPT_shared)) {
1578 if (!Args.hasArg(clang::driver::options::OPT_nostdlibxx)) {
1579 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1580 !Args.hasArg(options::OPT_static);
1581 if (OnlyLibstdcxxStatic)
1582 CmdArgs.push_back(
"-Bstatic");
1584 if (OnlyLibstdcxxStatic)
1585 CmdArgs.push_back(
"-Bdynamic");
1589 for (
auto RT : SharedRuntimes)
1591 for (
auto RT : HelperStaticRuntimes)
1593 bool AddExportDynamic =
false;
1594 for (
auto RT : StaticRuntimes) {
1598 for (
auto RT : NonWholeStaticRuntimes) {
1602 for (
auto S : RequiredSymbols) {
1603 CmdArgs.push_back(
"-u");
1604 CmdArgs.push_back(Args.MakeArgString(S));
1608 if (AddExportDynamic)
1609 CmdArgs.push_back(
"--export-dynamic");
1612 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1616 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1617 <<
"-fsanitize=memtag*" << TC.
getTriple().str();
1620 Args.MakeArgString(
"--android-memtag-mode=" + SanArgs.
getMemtagMode()));
1622 CmdArgs.push_back(
"--android-memtag-heap");
1624 CmdArgs.push_back(
"--android-memtag-stack");
1627 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty();
1631 if (Args.hasArg(options::OPT_shared))
1635 CmdArgs.push_back(
"--whole-archive");
1639 CmdArgs.push_back(
"--no-whole-archive");
1647 const llvm::opt::ArgList &Args,
1648 ArgStringList &CmdArgs) {
1650 CmdArgs.push_back(
"-lpthread");
1652 CmdArgs.push_back(
"-lrt");
1653 CmdArgs.push_back(
"-lm");
1658 CmdArgs.push_back(
"-ldl");
1663 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1664 return !A->getOption().matches(options::OPT_O0);
1672 auto AddPostfix = [JA](
auto &F) {
1677 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1678 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1682 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1685 Arg *FinalOutput = Args.getLastArg(options::OPT_o, options::OPT__SLASH_o);
1686 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1687 T = FinalOutput->getValue();
1688 llvm::sys::path::remove_filename(
T);
1689 llvm::sys::path::append(
T,
1690 llvm::sys::path::stem(FinalOutput->getValue()));
1692 return Args.MakeArgString(
T);
1698 return Args.MakeArgString(
T);
1702 const JobAction &JA,
const ArgList &Args,
1703 const InputInfo &Output,
const char *OutFile) {
1704 ArgStringList ExtractArgs;
1705 ExtractArgs.push_back(
"--extract-dwo");
1707 ArgStringList StripArgs;
1708 StripArgs.push_back(
"--strip-dwo");
1713 ExtractArgs.push_back(OutFile);
1720 C.addCommand(std::make_unique<Command>(JA,
T,
1722 Exec, ExtractArgs, II, Output));
1725 C.addCommand(std::make_unique<Command>(
1735 Args.ClaimAllArgs(options::OPT_flto_EQ);
1736 Args.ClaimAllArgs(options::OPT_flto);
1737 Args.ClaimAllArgs(options::OPT_fno_lto);
1741 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1742 options::OPT_fcs_profile_generate_EQ,
1743 options::OPT_fno_profile_generate);
1744 if (CSPGOGenerateArg &&
1745 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1746 CSPGOGenerateArg =
nullptr;
1748 return CSPGOGenerateArg;
1752 auto *ProfileUseArg = Args.getLastArg(
1753 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1754 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1755 options::OPT_fno_profile_instr_use);
1757 if (ProfileUseArg &&
1758 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1759 ProfileUseArg =
nullptr;
1761 return ProfileUseArg;
1765 auto *ProfileSampleUseArg = Args.getLastArg(
1766 options::OPT_fprofile_sample_use, options::OPT_fprofile_sample_use_EQ,
1767 options::OPT_fauto_profile, options::OPT_fauto_profile_EQ,
1768 options::OPT_fno_profile_sample_use, options::OPT_fno_auto_profile);
1770 if (ProfileSampleUseArg &&
1771 (ProfileSampleUseArg->getOption().matches(
1772 options::OPT_fno_profile_sample_use) ||
1773 ProfileSampleUseArg->getOption().matches(options::OPT_fno_auto_profile)))
1776 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ,
1777 options::OPT_fauto_profile_EQ);
1782 case llvm::Reloc::Static:
1784 case llvm::Reloc::PIC_:
1786 case llvm::Reloc::DynamicNoPIC:
1787 return "dynamic-no-pic";
1788 case llvm::Reloc::ROPI:
1790 case llvm::Reloc::RWPI:
1792 case llvm::Reloc::ROPI_RWPI:
1795 llvm_unreachable(
"Unknown Reloc::Model kind");
1802std::tuple<llvm::Reloc::Model, unsigned, bool>
1810 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
1812 bool IsPICLevelTwo = PIC;
1815 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
1818 if (Triple.isAndroid()) {
1819 switch (Triple.getArch()) {
1820 case llvm::Triple::arm:
1821 case llvm::Triple::armeb:
1822 case llvm::Triple::thumb:
1823 case llvm::Triple::thumbeb:
1824 case llvm::Triple::aarch64:
1825 case llvm::Triple::mips:
1826 case llvm::Triple::mipsel:
1827 case llvm::Triple::mips64:
1828 case llvm::Triple::mips64el:
1832 case llvm::Triple::x86:
1833 case llvm::Triple::x86_64:
1835 IsPICLevelTwo =
true;
1844 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
1848 if (Triple.isOSOpenBSD()) {
1850 case llvm::Triple::arm:
1851 case llvm::Triple::aarch64:
1852 case llvm::Triple::mips64:
1853 case llvm::Triple::mips64el:
1854 case llvm::Triple::x86:
1855 case llvm::Triple::x86_64:
1856 IsPICLevelTwo =
false;
1859 case llvm::Triple::ppc:
1860 case llvm::Triple::sparcv9:
1861 IsPICLevelTwo =
true;
1873 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1874 options::OPT_fpic, options::OPT_fno_pic,
1875 options::OPT_fPIE, options::OPT_fno_PIE,
1876 options::OPT_fpie, options::OPT_fno_pie);
1877 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
1878 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
1879 options::OPT_fPIE, options::OPT_fpie)) {
1881 << LastPICArg->getSpelling() << Triple.str();
1882 if (Triple.getArch() == llvm::Triple::x86_64)
1883 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
1884 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
1891 Option O = LastPICArg->getOption();
1892 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
1893 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
1894 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
1896 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
1898 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
1901 if (EffectiveTriple.isPS()) {
1902 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
1903 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
1904 if (Model !=
"kernel") {
1907 << LastPICArg->getSpelling()
1908 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
1918 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
1924 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
1925 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
1928 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
1931 if (!Triple.isOSDarwin())
1933 << A->getSpelling() << Triple.str();
1942 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
1945 bool EmbeddedPISupported;
1946 switch (Triple.getArch()) {
1947 case llvm::Triple::arm:
1948 case llvm::Triple::armeb:
1949 case llvm::Triple::thumb:
1950 case llvm::Triple::thumbeb:
1951 EmbeddedPISupported =
true;
1954 EmbeddedPISupported =
false;
1958 bool ROPI =
false, RWPI =
false;
1959 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
1960 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
1961 if (!EmbeddedPISupported)
1963 << LastROPIArg->getSpelling() << Triple.str();
1966 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
1967 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
1968 if (!EmbeddedPISupported)
1970 << LastRWPIArg->getSpelling() << Triple.str();
1975 if ((ROPI || RWPI) && (PIC || PIE))
1978 if (Triple.isMIPS()) {
1985 if (ABIName ==
"n64")
1988 if(Args.hasArg(options::OPT_mno_abicalls))
1989 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
1992 IsPICLevelTwo =
false;
1996 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
1998 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
2000 RelocM = llvm::Reloc::ROPI_RWPI;
2002 RelocM = llvm::Reloc::ROPI;
2004 RelocM = llvm::Reloc::RWPI;
2006 return std::make_tuple(RelocM, 0
U,
false);
2026 const ArgList &Args) {
2027 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
2028 options::OPT_falign_functions_EQ,
2029 options::OPT_fno_align_functions);
2030 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
2033 if (A->getOption().matches(options::OPT_falign_functions))
2037 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
2039 << A->getAsString(Args) << A->getValue();
2044 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
2045 switch (DebugInfoKind) {
2046 case llvm::codegenoptions::DebugDirectivesOnly:
2047 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
2049 case llvm::codegenoptions::DebugLineTablesOnly:
2050 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
2052 case llvm::codegenoptions::DebugInfoConstructor:
2053 CmdArgs.push_back(
"-debug-info-kind=constructor");
2055 case llvm::codegenoptions::LimitedDebugInfo:
2056 CmdArgs.push_back(
"-debug-info-kind=limited");
2058 case llvm::codegenoptions::FullDebugInfo:
2059 CmdArgs.push_back(
"-debug-info-kind=standalone");
2061 case llvm::codegenoptions::UnusedTypeInfo:
2062 CmdArgs.push_back(
"-debug-info-kind=unused-types");
2072 assert(A.getOption().matches(options::OPT_gN_Group) &&
2073 "Not a -g option that specifies a debug-info level");
2074 if (A.getOption().matches(options::OPT_g0) ||
2075 A.getOption().matches(options::OPT_ggdb0))
2076 return llvm::codegenoptions::NoDebugInfo;
2077 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2078 A.getOption().matches(options::OPT_ggdb1))
2079 return llvm::codegenoptions::DebugLineTablesOnly;
2080 if (A.getOption().matches(options::OPT_gline_directives_only))
2081 return llvm::codegenoptions::DebugDirectivesOnly;
2082 return llvm::codegenoptions::DebugInfoConstructor;
2086 const ArgList &Args) {
2087 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
2093 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 5 ||
2096 << A->getAsString(Args) << A->getValue();
2101 return llvm::StringSwitch<unsigned>(ArgValue)
2102 .Case(
"-gdwarf-2", 2)
2103 .Case(
"-gdwarf-3", 3)
2104 .Case(
"-gdwarf-4", 4)
2105 .Case(
"-gdwarf-5", 5)
2110 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2111 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2112 options::OPT_gdwarf);
2116 const llvm::opt::ArgList &Args) {
2121 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2122 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2123 << GDwarfN->getSpelling() << TC.
getTriple().str();
2125 if (DwarfVersion == 0) {
2127 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2129 return DwarfVersion;
2133 ArgStringList &CmdArgs) {
2134 llvm::Reloc::Model RelocationModel;
2139 if (RelocationModel != llvm::Reloc::Static)
2140 CmdArgs.push_back(
"-KPIC");
2146 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2152 const ArgList &Args) {
2153 if (Args.hasArg(options::OPT_static_libgcc) ||
2154 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2158 if (Args.hasArg(options::OPT_shared_libgcc))
2177 ArgStringList &CmdArgs,
const ArgList &Args) {
2181 CmdArgs.push_back(
"-l:libunwind.a");
2204 CmdArgs.push_back(
"-lgcc_eh");
2206 CmdArgs.push_back(
"-lgcc_s");
2214 CmdArgs.push_back(
"-lunwind");
2216 CmdArgs.push_back(
"-l:libunwind.a");
2219 CmdArgs.push_back(
"-l:libunwind.dll.a");
2221 CmdArgs.push_back(
"-l:libunwind.so");
2225 CmdArgs.push_back(
"-lunwind");
2235 ArgStringList &CmdArgs,
const ArgList &Args) {
2239 CmdArgs.push_back(
"-lgcc");
2243 CmdArgs.push_back(
"-lgcc");
2247 ArgStringList &CmdArgs,
const ArgList &Args) {
2258 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2261 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2262 if (A && A->getValue() != StringRef(
"platform")) {
2263 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2264 << A->getValue() <<
"MSVC";
2274 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2275 !Args.hasArg(options::OPT_static_pie))
2276 CmdArgs.push_back(
"-ldl");
2283 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2289 StringRef SaveStats = A->getValue();
2290 if (SaveStats ==
"obj" && Output.
isFilename()) {
2292 llvm::sys::path::remove_filename(StatsFile);
2293 }
else if (SaveStats !=
"cwd") {
2294 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2298 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2299 llvm::sys::path::append(StatsFile, BaseName);
2300 llvm::sys::path::replace_extension(StatsFile,
"stats");
2312 assert(Flag.front() ==
'-');
2314 Flags.push_back(Flag.str());
2316 Flags.push_back((
"!" + Flag.substr(1)).str());
2321 ArgStringList &CmdArgs,
bool IsLTO,
2322 const StringRef PluginOptPrefix) {
2323 auto addArg = [&, IsLTO](
const Twine &Arg) {
2325 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2326 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2328 CmdArgs.push_back(
"-mllvm");
2329 CmdArgs.push_back(Args.MakeArgString(Arg));
2333 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2334 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2336 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2337 StringRef
Value = A->getValue();
2339 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2340 !llvm::isPowerOf2_64(Boundary)) {
2341 D.
Diag(diag::err_drv_invalid_argument_to_option)
2342 <<
Value << A->getOption().getName();
2344 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2347 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2348 std::string AlignBranch;
2349 for (StringRef
T : A->getValues()) {
2350 if (
T !=
"fused" &&
T !=
"jcc" &&
T !=
"jmp" &&
T !=
"call" &&
2351 T !=
"ret" &&
T !=
"indirect")
2352 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2353 <<
T <<
"fused, jcc, jmp, call, ret, indirect";
2354 if (!AlignBranch.empty())
2358 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2360 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2361 StringRef
Value = A->getValue();
2362 unsigned PrefixSize;
2363 if (
Value.getAsInteger(10, PrefixSize)) {
2364 D.
Diag(diag::err_drv_invalid_argument_to_option)
2365 <<
Value << A->getOption().getName();
2367 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2393 llvm::opt::ArgStringList &CC1Args,
2395 StringRef Lib, StringRef Arch, StringRef
Target,
2396 bool isBitCodeSDL) {
2399 std::string LibDeviceLoc =
"/libdevice";
2400 std::string LibBcPrefix =
"/libbc-";
2401 std::string LibPrefix =
"/lib";
2418 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2419 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2421 for (
auto Suffix : {Twine(Lib +
"-" + Arch +
"-" +
Target).str(),
2422 Twine(Lib +
"-" + Arch).str(), Twine(Lib).str()}) {
2423 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2424 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2434 const auto *Ext =
".a";
2436 for (
auto Suffix : {Twine(Lib +
"-" + Arch +
"-" +
Target).str(),
2437 Twine(Lib +
"-" + Arch).str()}) {
2438 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2439 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2450 bool FoundSDL =
false;
2451 for (
auto LPath : LibraryPaths) {
2452 for (
auto SDL : SDLs) {
2453 auto FullName = Twine(LPath + SDL).str();
2454 if (llvm::sys::fs::exists(FullName)) {
2455 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2472 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2473 llvm::opt::ArgStringList &CC1Args,
2475 StringRef Arch, StringRef
Target,
bool isBitCodeSDL) {
2478 if (isBitCodeSDL && Arch.contains(
"nvptx"))
2481 bool FoundAOB =
false;
2482 std::string ArchiveOfBundles;
2485 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2486 auto Ext = IsMSVC ?
".lib" :
".a";
2487 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2488 if (llvm::sys::fs::exists(Lib)) {
2489 ArchiveOfBundles = Lib;
2493 Lib.consume_front(
"-l");
2494 for (
auto LPath : LibraryPaths) {
2495 ArchiveOfBundles.clear();
2496 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2497 : IsMSVC ? Lib + Ext
2498 :
"lib" + Lib + Ext)
2500 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2501 auto AOB = Twine(LPath + Prefix + LibFile).str();
2502 if (llvm::sys::fs::exists(AOB)) {
2503 ArchiveOfBundles = AOB;
2516 llvm::file_magic Magic;
2517 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2518 if (EC || Magic != llvm::file_magic::archive)
2521 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2522 std::string OutputLib =
2528 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2530 ArgStringList CmdArgs;
2533 DeviceTriple +=
'-';
2534 std::string NormalizedTriple =
T.getToolChain().getTriple().normalize();
2535 DeviceTriple += NormalizedTriple;
2537 DeviceTriple +=
'-';
2541 std::string UnbundleArg(
"-unbundle");
2542 std::string TypeArg(
"-type=a");
2543 std::string InputArg(
"-input=" + ArchiveOfBundles);
2544 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2545 std::string OutputArg(
"-output=" + OutputLib);
2547 const char *UBProgram = DriverArgs.MakeArgString(
2548 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2550 ArgStringList UBArgs;
2551 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2552 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2553 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2554 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2555 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2559 std::string AdditionalArgs(
"-allow-missing-bundles");
2560 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2565 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2566 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2568 C.addCommand(std::make_unique<Command>(
2570 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2572 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2581 const llvm::opt::ArgList &DriverArgs,
2582 llvm::opt::ArgStringList &CC1Args,
2583 StringRef Arch, StringRef
Target,
2584 bool isBitCodeSDL) {
2586 Arch,
Target, isBitCodeSDL);
2615 const llvm::opt::ArgList &DriverArgs,
2616 llvm::opt::ArgStringList &CC1Args,
2617 StringRef Arch, StringRef
Target,
2618 bool isBitCodeSDL) {
2622 std::optional<std::string> LibPath =
2623 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2626 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2627 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2628 for (StringRef Path : Frags)
2629 LibraryPaths.emplace_back(Path.trim());
2633 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2634 LibraryPaths.emplace_back(Search_Dir);
2638 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2639 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2642 llvm::SmallSet<std::string, 16> SDLNames;
2643 static const StringRef HostOnlyArchives[] = {
2644 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2645 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2646 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2647 SDLNames.insert(std::string(
"-l") + SDLName);
2651 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2658 const StringRef LibFileExt =
".lib";
2659 if (!llvm::sys::path::has_extension(
FileName) ||
2661 llvm::sys::path::extension(
FileName).drop_front()) ==
2663 llvm::sys::path::extension(
FileName) == LibFileExt)
2664 SDLNames.insert(Input);
2671 for (
auto SDLName : SDLNames) {
2673 if (!
SDLSearch(D, DriverArgs, CC1Args, LibraryPaths, SDLName, Arch,
Target,
2676 LibraryPaths, SDLName, Arch,
Target,
2682static llvm::opt::Arg *
2684 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2688 const llvm::opt::ArgList &Args) {
2689 const unsigned MinCodeObjVer = 4;
2690 const unsigned MaxCodeObjVer = 6;
2693 if (CodeObjArg->getOption().getID() ==
2694 options::OPT_mcode_object_version_EQ) {
2695 unsigned CodeObjVer = MaxCodeObjVer;
2697 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2698 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2699 D.
Diag(diag::err_drv_invalid_int_value)
2700 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2705 if (CodeObjVer == 6)
2706 D.
Diag(diag::warn_drv_amdgpu_cov6);
2712 const llvm::opt::ArgList &Args) {
2713 unsigned CodeObjVer = 4;
2715 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2720 const Driver &D,
const llvm::opt::ArgList &Args) {
2725 const llvm::opt::ArgList &Args,
2726 llvm::opt::ArgStringList &CmdArgs,
2727 const llvm::Triple &Triple,
bool IsLTO,
2728 const StringRef PluginOptPrefix) {
2729 auto addArg = [&, IsLTO](
const Twine &Arg) {
2731 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2732 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2734 CmdArgs.push_back(
"-mllvm");
2735 CmdArgs.push_back(Args.MakeArgString(Arg));
2739 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2740 options::OPT_mno_outline)) {
2741 if (A->getOption().matches(options::OPT_moutline)) {
2745 if (!(Triple.isARM() || Triple.isThumb() || Triple.isAArch64())) {
2746 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2748 addArg(Twine(
"-enable-machine-outliner"));
2752 addArg(Twine(
"-enable-machine-outliner=never"));
2758 const llvm::opt::ArgList &DriverArgs,
2759 llvm::opt::ArgStringList &CC1Args,
2760 StringRef BitcodeSuffix,
2761 const llvm::Triple &Triple,
2766 std::optional<std::string> LibPath =
2767 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2770 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2771 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2772 for (StringRef Path : Frags)
2773 LibraryPaths.emplace_back(Path.trim());
2778 LibraryPaths.emplace_back(LibPath);
2780 OptSpecifier LibomptargetBCPathOpt =
2781 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
2782 : options::OPT_libomptarget_nvptx_bc_path_EQ;
2784 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu" :
"nvptx";
2785 std::string LibOmpTargetName =
2786 (
"libomptarget-" + ArchPrefix +
"-" + BitcodeSuffix +
".bc").str();
2789 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
2791 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
2792 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
2793 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2796 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2797 CC1Args.push_back(
"-mlink-builtin-bitcode");
2798 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2800 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
2801 << LibOmpTargetFile;
2804 bool FoundBCLibrary =
false;
2806 for (StringRef LibraryPath : LibraryPaths) {
2808 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2809 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2810 CC1Args.push_back(
"-mlink-builtin-bitcode");
2811 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2812 FoundBCLibrary =
true;
2817 if (!FoundBCLibrary)
2818 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
2819 << LibOmpTargetName << ArchPrefix;
2823 const llvm::opt::ArgList &Args,
2824 llvm::opt::ArgStringList &CmdArgs) {
2826 !Args.hasArg(options::OPT_nostdlib) &&
2827 !Args.hasArg(options::OPT_no_hip_rt) && !Args.hasArg(options::OPT_r)) {
2831 for (
auto *Arg : Args.filtered(options::OPT_no_hip_rt)) {
2838 const llvm::opt::ArgList &Args,
2839 llvm::opt::ArgStringList &CmdArgs,
2840 const llvm::Triple &Triple) {
2841 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
2842 options::OPT_mno_outline_atomics)) {
2844 if (!Triple.isAArch64()) {
2845 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
2846 << Triple.getArchName() << A->getOption().getName();
2848 if (A->getOption().matches(options::OPT_moutline_atomics)) {
2849 CmdArgs.push_back(
"-target-feature");
2850 CmdArgs.push_back(
"+outline-atomics");
2852 CmdArgs.push_back(
"-target-feature");
2853 CmdArgs.push_back(
"-outline-atomics");
2857 CmdArgs.push_back(
"-target-feature");
2858 CmdArgs.push_back(
"+outline-atomics");
2863 llvm::opt::ArgStringList &CmdArgs) {
2864 if (TCArgs.hasFlag(options::OPT_offload_compress,
2865 options::OPT_no_offload_compress,
false))
2866 CmdArgs.push_back(
"-compress");
2867 if (TCArgs.hasArg(options::OPT_v))
2868 CmdArgs.push_back(
"-verbose");
2869 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
2871 TCArgs.MakeArgString(Twine(
"-compression-level=") + Arg->getValue()));
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 isWholeArchivePresent(const ArgList &Args)
Determines if –whole-archive is active in the list of arguments.
static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer)
static void addOpenMPDeviceLibC(const Compilation &C, const ArgList &Args, ArgStringList &CmdArgs)
Adds the '-lcgpu' and '-lmgpu' libraries to the compilation to include the LLVM C library for GPUs.
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 void addFortranMain(const ToolChain &TC, const ArgList &Args, llvm::opt::ArgStringList &CmdArgs)
static StringRef getWebAssemblyTargetCPU(const ArgList &Args)
Get the (LLVM) name of the WebAssembly cpu we are targeting.
static bool isStaticLinkage(const ArgList &Args)
Determine if driver is invoked to create a static object library (-shared)
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 bool isSharedLinkage(const ArgList &Args)
Determine if driver is invoked to create a shared object library (-static)
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 void addFortranRuntimeLibsMSVC(const ArgList &Args, llvm::opt::ArgStringList &CmdArgs)
Add Fortran runtime libs for MSVC.
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.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
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.
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...
StringRef getFlangF128MathLibrary() const
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 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 needsCfiDiagRt() const
bool linkRuntimes() const
bool needsUbsanRt() const
bool needsHwasanRt() const
bool hasCrossDsoCfi() const
bool hasMemtagHeap() const
bool needsSafeStackRt() const
bool requiresMinimalRuntime() const
bool hasMemtagStack() const
bool needsDfsanRt() const
bool needsScudoRt() const
const std::string & getMemtagMode() const
bool needsSharedRt() const
bool linkCXXRuntimes() 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()