13#include "clang/Config/config.h"
19#include "llvm/ADT/StringSwitch.h"
20#include "llvm/Option/ArgList.h"
21#include "llvm/ProfileData/InstrProf.h"
22#include "llvm/ProfileData/MemProf.h"
23#include "llvm/Support/Path.h"
24#include "llvm/Support/Threading.h"
25#include "llvm/Support/VirtualFileSystem.h"
26#include "llvm/TargetParser/TargetParser.h"
27#include "llvm/TargetParser/Triple.h"
37 return VersionTuple(13, 1);
53 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
54 .Cases({
"i386",
"i486",
"i486SX",
"i586",
"i686"}, llvm::Triple::x86)
55 .Cases({
"pentium",
"pentpro",
"pentIIm3",
"pentIIm5",
"pentium4"},
57 .Cases({
"x86_64",
"x86_64h"}, llvm::Triple::x86_64)
59 .Cases({
"arm",
"armv4t",
"armv5",
"armv6",
"armv6m"}, llvm::Triple::arm)
60 .Cases({
"armv7",
"armv7em",
"armv7k",
"armv7m"}, llvm::Triple::arm)
61 .Cases({
"armv7s",
"xscale"}, llvm::Triple::arm)
62 .Cases({
"arm64",
"arm64e"}, llvm::Triple::aarch64)
63 .Case(
"arm64_32", llvm::Triple::aarch64_32)
64 .Case(
"r600", llvm::Triple::r600)
65 .Case(
"amdgcn", llvm::Triple::amdgcn)
66 .Case(
"nvptx", llvm::Triple::nvptx)
67 .Case(
"nvptx64", llvm::Triple::nvptx64)
68 .Case(
"amdil", llvm::Triple::amdil)
69 .Case(
"spir", llvm::Triple::spir)
70 .Default(llvm::Triple::UnknownArch);
74 const ArgList &Args) {
75 const llvm::Triple::ArchType
Arch = getArchTypeForMachOArchName(Str);
76 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Str);
78 if (
Arch != llvm::Triple::UnknownArch)
81 if (ArchKind == llvm::ARM::ArchKind::ARMV6M ||
82 ArchKind == llvm::ARM::ArchKind::ARMV7M ||
83 ArchKind == llvm::ARM::ArchKind::ARMV7EM) {
85 if (
T.getOS() == llvm::Triple::IOS)
86 for (Arg *A : Args.filtered(options::OPT_mios_version_min_EQ))
87 A->ignoreTargetSpecific();
88 if (
T.getOS() == llvm::Triple::WatchOS)
89 for (Arg *A : Args.filtered(options::OPT_mwatchos_version_min_EQ))
90 A->ignoreTargetSpecific();
91 if (
T.getOS() == llvm::Triple::TvOS)
92 for (Arg *A : Args.filtered(options::OPT_mtvos_version_min_EQ))
93 A->ignoreTargetSpecific();
95 T.setOS(llvm::Triple::UnknownOS);
96 T.setObjectFormat(llvm::Triple::MachO);
104 const char *LinkingOutput)
const {
107 ArgStringList CmdArgs;
109 assert(Inputs.size() == 1 &&
"Unexpected number of inputs.");
113 const Action *SourceAction = &JA;
115 assert(!SourceAction->
getInputs().empty() &&
"unexpected root action!");
116 SourceAction = SourceAction->
getInputs()[0];
124 if (Args.hasArg(options::OPT_fno_integrated_as)) {
125 if (!(
T.isMacOSX() &&
T.isMacOSXVersionLT(10, 7)))
126 CmdArgs.push_back(
"-Q");
130 if (SourceAction->
getType() == types::TY_Asm ||
131 SourceAction->
getType() == types::TY_PP_Asm) {
132 if (Args.hasArg(options::OPT_gstabs))
133 CmdArgs.push_back(
"--gstabs");
134 else if (Args.hasArg(options::OPT_g_Group))
135 CmdArgs.push_back(
"-g");
142 if (
T.isX86() || Args.hasArg(options::OPT_force__cpusubtype__ALL))
143 CmdArgs.push_back(
"-force_cpusubtype_ALL");
146 (((Args.hasArg(options::OPT_mkernel) ||
147 Args.hasArg(options::OPT_fapple_kext)) &&
149 Args.hasArg(options::OPT_static)))
150 CmdArgs.push_back(
"-static");
152 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
154 assert(Output.
isFilename() &&
"Unexpected lipo output.");
155 CmdArgs.push_back(
"-o");
158 assert(Input.
isFilename() &&
"Invalid input.");
163 const char *Exec = Args.MakeArgString(
getToolChain().GetProgramPath(
"as"));
165 Exec, CmdArgs, Inputs, Output));
168void darwin::MachOTool::anchor() {}
171 ArgStringList &CmdArgs)
const {
175 CmdArgs.push_back(
"-arch");
176 CmdArgs.push_back(Args.MakeArgString(ArchName));
179 if (ArchName ==
"arm")
180 CmdArgs.push_back(
"-force_cpusubtype_ALL");
183bool darwin::Linker::NeedsTempPath(
const InputInfoList &Inputs)
const {
187 for (
const auto &Input : Inputs)
188 if (Input.getType() != types::TY_Object)
202 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
203 if (A->getOption().matches(options::OPT_O0))
205 if (A->getOption().matches(options::OPT_O))
206 return llvm::StringSwitch<bool>(A->getValue())
212 if (!IsLinkerOnlyAction)
217void darwin::Linker::AddLinkArgs(Compilation &
C,
const ArgList &Args,
218 ArgStringList &CmdArgs,
220 VersionTuple Version,
bool LinkerIsLLD,
221 bool UsePlatformVersion)
const {
222 const Driver &D = getToolChain().getDriver();
223 const toolchains::MachO &MachOTC = getMachOToolChain();
227 if ((Version >= VersionTuple(100) || LinkerIsLLD) &&
228 !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
229 CmdArgs.push_back(
"-demangle");
231 if (Args.hasArg(options::OPT_rdynamic) &&
232 (Version >= VersionTuple(137) || LinkerIsLLD))
233 CmdArgs.push_back(
"-export_dynamic");
237 if (Args.hasFlag(options::OPT_fapplication_extension,
238 options::OPT_fno_application_extension,
false))
239 CmdArgs.push_back(
"-application_extension");
241 if (D.
isUsingLTO() && (Version >= VersionTuple(116) || LinkerIsLLD) &&
242 NeedsTempPath(Inputs)) {
243 std::string TmpPathName;
254 if (!TmpPathName.empty()) {
255 auto *TmpPath =
C.getArgs().MakeArgString(TmpPathName);
256 C.addTempFile(TmpPath);
257 CmdArgs.push_back(
"-object_path_lto");
258 CmdArgs.push_back(TmpPath);
271 if (Version >= VersionTuple(133) && !LinkerIsLLD) {
273 StringRef P = llvm::sys::path::parent_path(D.
Dir);
274 SmallString<128> LibLTOPath(P);
275 llvm::sys::path::append(LibLTOPath,
"lib");
276 llvm::sys::path::append(LibLTOPath,
"libLTO.dylib");
277 CmdArgs.push_back(
"-lto_library");
278 CmdArgs.push_back(
C.getArgs().MakeArgString(LibLTOPath));
284 if (Version >= VersionTuple(262) &&
286 CmdArgs.push_back(
"-no_deduplicate");
289 Args.AddAllArgs(CmdArgs, options::OPT_static);
290 if (!Args.hasArg(options::OPT_static))
291 CmdArgs.push_back(
"-dynamic");
292 if (Args.hasArg(options::OPT_fgnu_runtime)) {
297 if (!Args.hasArg(options::OPT_dynamiclib)) {
298 AddMachOArch(Args, CmdArgs);
300 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
302 Args.AddLastArg(CmdArgs, options::OPT_bundle);
303 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
304 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
307 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
308 (A = Args.getLastArg(options::OPT_current__version)) ||
309 (A = Args.getLastArg(options::OPT_install__name)))
310 D.
Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
313 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
314 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
315 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
317 CmdArgs.push_back(
"-dylib");
320 if ((A = Args.getLastArg(options::OPT_bundle)) ||
321 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
322 (A = Args.getLastArg(options::OPT_client__name)) ||
323 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
324 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
325 (A = Args.getLastArg(options::OPT_private__bundle)))
326 D.
Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
329 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
330 "-dylib_compatibility_version");
331 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
332 "-dylib_current_version");
334 AddMachOArch(Args, CmdArgs);
336 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
337 "-dylib_install_name");
340 Args.AddLastArg(CmdArgs, options::OPT_all__load);
341 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
342 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
344 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
345 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
346 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
347 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
348 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
349 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
350 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
351 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
352 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
353 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
354 Args.AddAllArgs(CmdArgs, options::OPT_init);
357 if (Version >= VersionTuple(520) || LinkerIsLLD || UsePlatformVersion)
362 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
363 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
364 Args.AddLastArg(CmdArgs, options::OPT_single__module);
365 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
366 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
369 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
370 options::OPT_fno_pie, options::OPT_fno_PIE)) {
371 if (A->getOption().matches(options::OPT_fpie) ||
372 A->getOption().matches(options::OPT_fPIE))
373 CmdArgs.push_back(
"-pie");
375 CmdArgs.push_back(
"-no_pie");
379 if (
C.getDriver().embedBitcodeEnabled()) {
382 CmdArgs.push_back(
"-bitcode_bundle");
384 if (
C.getDriver().embedBitcodeMarkerOnly() &&
385 Version >= VersionTuple(278)) {
386 CmdArgs.push_back(
"-bitcode_process_mode");
387 CmdArgs.push_back(
"marker");
390 D.
Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
394 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
395 options::OPT_fno_global_isel)) {
396 if (A->getOption().matches(options::OPT_fglobal_isel)) {
397 CmdArgs.push_back(
"-mllvm");
398 CmdArgs.push_back(
"-global-isel");
400 CmdArgs.push_back(
"-mllvm");
401 CmdArgs.push_back(
"-global-isel-abort=0");
405 if (Args.hasArg(options::OPT_mkernel) ||
406 Args.hasArg(options::OPT_fapple_kext) ||
407 Args.hasArg(options::OPT_ffreestanding)) {
408 CmdArgs.push_back(
"-mllvm");
409 CmdArgs.push_back(
"-disable-atexit-based-global-dtor-lowering");
412 Args.AddLastArg(CmdArgs, options::OPT_prebind);
413 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
414 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
415 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
416 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
417 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
418 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
419 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
420 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
421 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
422 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
423 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
424 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
425 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
426 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
427 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
433 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
434 CmdArgs.push_back(
"-syslibroot");
435 CmdArgs.push_back(A->getValue());
436 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
437 CmdArgs.push_back(
"-syslibroot");
438 CmdArgs.push_back(A->getValue());
439 }
else if (StringRef sysroot =
C.getSysRoot(); sysroot !=
"") {
440 CmdArgs.push_back(
"-syslibroot");
441 CmdArgs.push_back(
C.getArgs().MakeArgString(sysroot));
444 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
445 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
446 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
447 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
448 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
449 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
450 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
451 Args.AddAllArgs(CmdArgs, options::OPT_y);
452 Args.AddLastArg(CmdArgs, options::OPT_w);
453 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
454 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
455 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
456 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
457 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
458 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
459 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
460 Args.AddLastArg(CmdArgs, options::OPT_why_load);
461 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
462 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
463 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
464 Args.AddLastArg(CmdArgs, options::OPT_Mach);
468 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
470 : CSPGOGenerateArg->getValue());
471 llvm::sys::path::append(Path,
"default_%m.profraw");
472 CmdArgs.push_back(
"--cs-profile-generate");
473 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
475 SmallString<128> Path(
476 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
477 if (Path.empty() || llvm::sys::fs::is_directory(Path))
478 llvm::sys::path::append(Path,
"default.profdata");
479 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
482 auto *CodeGenDataGenArg =
483 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
484 if (CodeGenDataGenArg)
486 Args.MakeArgString(Twine(
"--codegen-data-generate-path=") +
487 CodeGenDataGenArg->getValue()));
494 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
497 return Args.hasArg(options::OPT_fobjc_link_runtime);
501 const llvm::Triple &Triple) {
506 Args.getAllArgValues(options::OPT_arch).size() > 1;
507 bool hasExplicitOutputFile =
508 Args.getLastArg(options::OPT_foptimization_record_file_EQ);
510 D.
Diag(diag::err_drv_invalid_output_with_multiple_archs)
511 <<
"-foptimization-record-file";
518 const llvm::Triple &Triple,
520 StringRef Format =
"yaml";
521 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
522 Format = A->getValue();
524 CmdArgs.push_back(
"-mllvm");
525 CmdArgs.push_back(
"-lto-pass-remarks-output");
526 CmdArgs.push_back(
"-mllvm");
528 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
530 CmdArgs.push_back(A->getValue());
532 assert(Output.
isFilename() &&
"Unexpected ld output.");
538 CmdArgs.push_back(Args.MakeArgString(F));
542 Args.getLastArg(options::OPT_foptimization_record_passes_EQ)) {
543 CmdArgs.push_back(
"-mllvm");
545 std::string(
"-lto-pass-remarks-filter=") + A->getValue();
546 CmdArgs.push_back(Args.MakeArgString(Passes));
549 if (!Format.empty()) {
550 CmdArgs.push_back(
"-mllvm");
551 Twine FormatArg = Twine(
"-lto-pass-remarks-format=") + Format;
552 CmdArgs.push_back(Args.MakeArgString(FormatArg));
556 CmdArgs.push_back(
"-mllvm");
557 CmdArgs.push_back(
"-lto-pass-remarks-with-hotness");
560 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
561 CmdArgs.push_back(
"-mllvm");
563 std::string(
"-lto-pass-remarks-hotness-threshold=") + A->getValue();
564 CmdArgs.push_back(Args.MakeArgString(Opt));
573 const char *LinkingOutput)
const {
574 assert(Output.
getType() == types::TY_Image &&
"Invalid linker output type.");
580 llvm::opt::ArgStringList InputFileList;
585 ArgStringList CmdArgs;
591 Args.MakeArgString(
getToolChain().GetLinkerPath(&LinkerIsLLD));
594 bool UsePlatformVersion =
getToolChain().getTriple().isXROS();
598 AddLinkArgs(
C, Args, CmdArgs, Inputs, Version, LinkerIsLLD,
608 Args.getLastArg(options::OPT_moutline, options::OPT_mno_outline)) {
609 if (A->getOption().matches(options::OPT_moutline)) {
611 CmdArgs.push_back(
"-mllvm");
612 CmdArgs.push_back(
"-enable-machine-outliner");
618 CmdArgs.push_back(
"-mllvm");
619 CmdArgs.push_back(
"-enable-machine-outliner=never");
626 CmdArgs.push_back(
"-mllvm");
627 CmdArgs.push_back(
"-enable-linkonceodr-outlining");
630 auto *CodeGenDataGenArg =
631 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
632 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
636 if (CodeGenDataGenArg && CodeGenDataUseArg)
637 D.
Diag(diag::err_drv_argument_not_allowed_with)
638 << CodeGenDataGenArg->getAsString(Args)
639 << CodeGenDataUseArg->getAsString(Args);
643 if (CodeGenDataGenArg) {
644 CmdArgs.push_back(
"-mllvm");
645 CmdArgs.push_back(
"-codegen-data-generate");
649 if (CodeGenDataUseArg) {
650 CmdArgs.push_back(
"-mllvm");
651 CmdArgs.push_back(Args.MakeArgString(Twine(
"-codegen-data-use-path=") +
652 CodeGenDataUseArg->getValue()));
658 if (!StatsFile.empty()) {
659 CmdArgs.push_back(
"-mllvm");
660 CmdArgs.push_back(Args.MakeArgString(
"-lto-stats-file=" + StatsFile.str()));
665 Args.addAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
666 options::OPT_Z_Flag, options::OPT_u_Group});
671 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
672 CmdArgs.push_back(
"-ObjC");
674 CmdArgs.push_back(
"-o");
677 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
680 Args.AddAllArgs(CmdArgs, options::OPT_L);
685 for (
const auto &II : Inputs) {
686 if (!II.isFilename()) {
691 if (InputFileList.size() > 0)
697 InputFileList.push_back(II.getFilename());
703 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
704 getToolChain().addFortranRuntimeLibraryPath(Args, CmdArgs);
708 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
712 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
716 CmdArgs.push_back(
"-framework");
717 CmdArgs.push_back(
"Foundation");
719 CmdArgs.push_back(
"-lobjc");
723 CmdArgs.push_back(
"-arch_multiple");
724 CmdArgs.push_back(
"-final_output");
725 CmdArgs.push_back(LinkingOutput);
728 if (Args.hasArg(options::OPT_fnested_functions))
729 CmdArgs.push_back(
"-allow_stack_execute");
734 if (!Parallelism.empty()) {
735 CmdArgs.push_back(
"-mllvm");
736 unsigned NumThreads =
737 llvm::get_threadpool_strategy(Parallelism)->compute_thread_count();
738 CmdArgs.push_back(Args.MakeArgString(
"-threads=" + Twine(NumThreads)));
744 bool NoStdOrDefaultLibs =
745 Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
746 bool ForceLinkBuiltins = Args.hasArg(options::OPT_fapple_link_rtlib);
747 if (!NoStdOrDefaultLibs || ForceLinkBuiltins) {
752 if (NoStdOrDefaultLibs && ForceLinkBuiltins) {
760 Args.ClaimAllArgs(options::OPT_pthread);
761 Args.ClaimAllArgs(options::OPT_pthreads);
765 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
769 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
770 Args.AddAllArgs(CmdArgs, options::OPT_F);
773 for (
const Arg *A : Args.filtered(options::OPT_iframework))
774 CmdArgs.push_back(Args.MakeArgString(std::string(
"-F") + A->getValue()));
776 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
777 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
778 if (A->getValue() == StringRef(
"Accelerate")) {
779 CmdArgs.push_back(
"-framework");
780 CmdArgs.push_back(
"Accelerate");
789 bool NonStandardSearchPath =
false;
791 if (Triple.isDriverKit()) {
793 NonStandardSearchPath =
794 Version.getMajor() < 605 ||
795 (Version.getMajor() == 605 && Version.getMinor().value_or(0) < 1);
800 if (NonStandardSearchPath) {
801 if (
auto *Sysroot = Args.getLastArg(options::OPT_isysroot)) {
802 auto AddSearchPath = [&](StringRef Flag, StringRef SearchPath) {
805 llvm::sys::path::append(P, SearchPath);
807 CmdArgs.push_back(Args.MakeArgString(Flag + P));
810 AddSearchPath(
"-L",
"/usr/lib");
811 AddSearchPath(
"-F",
"/System/Library/Frameworks");
817 if (Version >= VersionTuple(705) || LinkerIsLLD) {
825 std::unique_ptr<Command> Cmd = std::make_unique<Command>(
826 JA, *
this, ResponseSupport, Exec, CmdArgs, Inputs, Output);
827 Cmd->setInputFileList(std::move(InputFileList));
828 C.addCommand(std::move(Cmd));
835 const char *LinkingOutput)
const {
839 Args.ClaimAllArgs(options::OPT_g_Group);
841 Args.ClaimAllArgs(options::OPT_emit_llvm);
844 Args.ClaimAllArgs(options::OPT_w);
846 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
849 ArgStringList CmdArgs;
851 CmdArgs.push_back(
"-static");
852 CmdArgs.push_back(
"-D");
853 CmdArgs.push_back(
"-no_warning_for_no_symbols");
854 CmdArgs.push_back(
"-o");
857 for (
const auto &II : Inputs) {
858 if (II.isFilename()) {
859 CmdArgs.push_back(II.getFilename());
866 if (Output.
isFilename() && llvm::sys::fs::exists(OutputFileName)) {
867 if (std::error_code EC = llvm::sys::fs::remove(OutputFileName)) {
868 D.
Diag(diag::err_drv_unable_to_remove_file) << EC.message();
873 const char *Exec = Args.MakeArgString(
getToolChain().GetStaticLibToolPath());
874 C.addCommand(std::make_unique<Command>(JA, *
this,
876 Exec, CmdArgs, Inputs, Output));
883 const char *LinkingOutput)
const {
884 ArgStringList CmdArgs;
886 CmdArgs.push_back(
"-create");
887 assert(Output.
isFilename() &&
"Unexpected lipo output.");
889 CmdArgs.push_back(
"-output");
892 for (
const auto &II : Inputs) {
893 assert(II.isFilename() &&
"Unexpected lipo input.");
894 CmdArgs.push_back(II.getFilename());
897 StringRef LipoName = Args.getLastArgValue(options::OPT_fuse_lipo_EQ,
"lipo");
899 Args.MakeArgString(
getToolChain().GetProgramPath(LipoName.data()));
901 Exec, CmdArgs, Inputs, Output));
908 const char *LinkingOutput)
const {
909 ArgStringList CmdArgs;
911 CmdArgs.push_back(
"-o");
914 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
916 assert(Input.
isFilename() &&
"Unexpected dsymutil input.");
920 Args.MakeArgString(
getToolChain().GetProgramPath(
"dsymutil"));
922 Exec, CmdArgs, Inputs, Output));
929 const char *LinkingOutput)
const {
930 ArgStringList CmdArgs;
931 CmdArgs.push_back(
"--verify");
932 CmdArgs.push_back(
"--debug-info");
933 CmdArgs.push_back(
"--eh-frame");
934 CmdArgs.push_back(
"--quiet");
936 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
938 assert(Input.
isFilename() &&
"Unexpected verify input");
944 Args.MakeArgString(
getToolChain().GetProgramPath(
"dwarfdump"));
946 Exec, CmdArgs, Inputs, Output));
968 if (Ty == types::TY_PP_Asm)
969 return types::TY_Asm;
989 auto T = llvm::Triple(Twine(
"arm64-apple-") +
990 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
1012 ArgStringList &CC1Args)
const {
1017 ArgStringList &CC1Args)
const {
1022 ArgStringList &CC1Args)
const {
1031 return llvm::StringSwitch<const char *>(
Arch)
1032 .Case(
"armv6k",
"armv6")
1033 .Case(
"armv6m",
"armv6m")
1034 .Case(
"armv5tej",
"armv5")
1035 .Case(
"xscale",
"xscale")
1036 .Case(
"armv4t",
"armv4t")
1037 .Case(
"armv7",
"armv7")
1038 .Cases({
"armv7a",
"armv7-a"},
"armv7")
1039 .Cases({
"armv7r",
"armv7-r"},
"armv7")
1040 .Cases({
"armv7em",
"armv7e-m"},
"armv7em")
1041 .Cases({
"armv7k",
"armv7-k"},
"armv7k")
1042 .Cases({
"armv7m",
"armv7-m"},
"armv7m")
1043 .Cases({
"armv7s",
"armv7-s"},
"armv7s")
1048 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseCPUArch(CPU);
1049 if (ArchKind == llvm::ARM::ArchKind::INVALID)
1051 StringRef
Arch = llvm::ARM::getArchName(ArchKind);
1055 if (
Arch.starts_with(
"armv5"))
1058 else if (
Arch.starts_with(
"armv6") && !
Arch.ends_with(
"6m"))
1061 else if (
Arch.ends_with(
"v7a"))
1071 case llvm::Triple::aarch64_32:
1074 case llvm::Triple::aarch64: {
1080 case llvm::Triple::thumb:
1081 case llvm::Triple::arm:
1082 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1086 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1095 if (LinkerVersion) {
1097 VersionTuple NewLinkerVersion;
1098 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ))
1099 (void)NewLinkerVersion.tryParse(A->getValue());
1100 assert(NewLinkerVersion == LinkerVersion);
1102 return *LinkerVersion;
1105 VersionTuple NewLinkerVersion;
1106 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ))
1107 if (NewLinkerVersion.tryParse(A->getValue()))
1109 << A->getAsString(Args);
1111 LinkerVersion = NewLinkerVersion;
1112 return *LinkerVersion;
1121void Darwin::VerifyTripleForSDK(
const llvm::opt::ArgList &Args,
1122 const llvm::Triple Triple)
const {
1124 if (!
SDKInfo->supportsTriple(Triple))
1126 <<
SDKInfo->getDisplayName() << Triple.getTriple();
1127 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
1128 const char *isysroot = A->getValue();
1131 size_t StartVer = SDK.find_first_of(
"0123456789");
1132 StringRef SDKName = SDK.slice(0, StartVer);
1133 bool supported =
true;
1134 if (Triple.isWatchOS())
1135 supported = SDKName.starts_with(
"Watch");
1136 else if (Triple.isTvOS())
1137 supported = SDKName.starts_with(
"AppleTV");
1138 else if (Triple.isDriverKit())
1139 supported = SDKName.starts_with(
"DriverKit");
1140 else if (Triple.isiOS())
1141 supported = SDKName.starts_with(
"iPhone");
1142 else if (Triple.isMacOSX())
1143 supported = SDKName.starts_with(
"MacOSX");
1145 llvm::reportFatalUsageError(Twine(
"SDK at '") + isysroot +
1146 "' missing SDKSettings.json.");
1150 << SDKName << Triple.getTriple();
1162 return Triple.getTriple();
1174 Str += llvm::Triple::getOSTypeName(llvm::Triple::XROS);
1178 Triple.setOSName(Str);
1180 VerifyTripleForSDK(Args, Triple);
1182 return Triple.getTriple();
1194 return Dsymutil.get();
1198 return VerifyDebug.get();
1215 const ArgList &Args)
1216 :
Darwin(D, Triple, Args) {}
1220 CC1Args.push_back(
"-Wundef-prefix=TARGET_OS_");
1221 CC1Args.push_back(
"-Werror=undef-prefix");
1227 CC1Args.push_back(
"-Wdeprecated-objc-isa-usage");
1228 CC1Args.push_back(
"-Werror=deprecated-objc-isa-usage");
1233 CC1Args.push_back(
"-Werror=implicit-function-declaration");
1238 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
1248 static constexpr llvm::StringLiteral XcodeAppSuffix(
1249 ".app/Contents/Developer");
1250 size_t Index = PathIntoXcode.find(XcodeAppSuffix);
1251 if (Index == StringRef::npos)
1253 return PathIntoXcode.take_front(Index + XcodeAppSuffix.size());
1257 ArgStringList &CmdArgs)
const {
1276 llvm::sys::path::remove_filename(P);
1277 llvm::sys::path::remove_filename(P);
1278 llvm::sys::path::append(P,
"lib",
"arc");
1284 if (!
getVFS().exists(P)) {
1285 auto updatePath = [&](
const Arg *A) {
1289 if (XcodePathForSDK.empty())
1292 P = XcodePathForSDK;
1293 llvm::sys::path::append(P,
"Toolchains/XcodeDefault.xctoolchain/usr",
1295 return getVFS().exists(P);
1298 bool updated =
false;
1299 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot))
1300 updated = updatePath(A);
1303 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1308 CmdArgs.push_back(
"-force_load");
1309 llvm::sys::path::append(P,
"libarclite_");
1312 P +=
"watchsimulator";
1316 P +=
"appletvsimulator";
1320 P +=
"iphonesimulator";
1328 getDriver().
Diag(clang::diag::err_drv_darwin_sdk_missing_arclite) << P;
1330 CmdArgs.push_back(Args.MakeArgString(P));
1352 bool IsShared)
const {
1360 const char *LibArg = Args.MakeArgString(P);
1361 CmdArgs.push_back(LibArg);
1369 assert(StringRef(P).ends_with(
".dylib") &&
"must be a dynamic library");
1373 CmdArgs.push_back(
"-rpath");
1374 CmdArgs.push_back(
"@executable_path");
1378 CmdArgs.push_back(
"-rpath");
1379 CmdArgs.push_back(Args.MakeArgString(llvm::sys::path::parent_path(P)));
1386 "it doesn't make sense to ask for the compiler-rt library name as an "
1390 if (Component !=
"builtins") {
1391 MachOLibName +=
'.';
1392 MachOLibName += Component;
1397 llvm::sys::path::append(FullPath,
"lib",
"darwin",
"macho_embedded",
1399 return std::string(FullPath);
1405 "it doesn't make sense to ask for the compiler-rt library name as an "
1409 if (Component !=
"builtins") {
1410 DarwinLibName += Component;
1411 DarwinLibName +=
'_';
1417 llvm::sys::path::append(FullPath,
"lib",
"darwin", DarwinLibName);
1418 return std::string(FullPath);
1423 auto BeginSDK = llvm::sys::path::rbegin(isysroot);
1424 auto EndSDK = llvm::sys::path::rend(isysroot);
1425 for (
auto IT = BeginSDK; IT != EndSDK; ++IT) {
1426 StringRef SDK = *IT;
1427 if (SDK.consume_back(
".sdk"))
1454 llvm_unreachable(
"Unsupported platform");
1459 for (Arg *A : Args) {
1460 if (A->getOption().matches(options::OPT_exported__symbols__list))
1462 if (!A->getOption().matches(options::OPT_Wl_COMMA) &&
1463 !A->getOption().matches(options::OPT_Xlinker))
1465 if (A->containsValue(
"-exported_symbols_list") ||
1466 A->containsValue(
"-exported_symbol"))
1474 CmdArgs.push_back(
"-exported_symbol");
1475 CmdArgs.push_back(Symbol);
1485 StringRef Segment, StringRef Section) {
1486 for (
const char *A : {
"-sectalign", Args.MakeArgString(Segment),
1487 Args.MakeArgString(Section),
"0x4000"})
1488 CmdArgs.push_back(A);
1492 ArgStringList &CmdArgs)
const {
1521 for (
auto IPSK : {llvm::IPSK_cnts, llvm::IPSK_bitmap, llvm::IPSK_data}) {
1523 Args, CmdArgs,
"__DATA",
1524 llvm::getInstrProfSectionName(IPSK, llvm::Triple::MachO,
1530void DarwinClang::AddLinkSanitizerLibArgs(
const ArgList &Args,
1531 ArgStringList &CmdArgs,
1532 StringRef Sanitizer,
1533 bool Shared)
const {
1539 const ArgList &Args)
const {
1540 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
1541 StringRef
Value = A->getValue();
1542 if (
Value !=
"compiler-rt" &&
Value !=
"platform")
1543 getDriver().
Diag(clang::diag::err_drv_unsupported_rtlib_for_platform)
1544 <<
Value <<
"darwin";
1551 ArgStringList &CmdArgs,
1552 bool ForceLinkBuiltinRT)
const {
1558 if (Args.hasArg(options::OPT_static) ||
1559 Args.hasArg(options::OPT_fapple_kext) ||
1560 Args.hasArg(options::OPT_mkernel)) {
1561 if (ForceLinkBuiltinRT)
1569 if (
const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
1570 getDriver().
Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
1577 const char *sanitizer =
nullptr;
1579 sanitizer =
"UndefinedBehaviorSanitizer";
1581 sanitizer =
"RealtimeSanitizer";
1583 sanitizer =
"AddressSanitizer";
1585 sanitizer =
"ThreadSanitizer";
1588 getDriver().
Diag(diag::err_drv_unsupported_static_sanitizer_darwin)
1597 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan_abi",
false);
1600 "Static sanitizer runtimes not supported");
1601 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan");
1606 "Static sanitizer runtimes not supported");
1607 AddLinkSanitizerLibArgs(Args, CmdArgs,
"rtsan");
1610 AddLinkSanitizerLibArgs(Args, CmdArgs,
"lsan");
1613 "Static sanitizer runtimes not supported");
1614 AddLinkSanitizerLibArgs(
1620 "Static sanitizer runtimes not supported");
1621 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tsan");
1624 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tysan");
1625 if (Sanitize.
needsFuzzer() && !Args.hasArg(options::OPT_dynamiclib)) {
1626 AddLinkSanitizerLibArgs(Args, CmdArgs,
"fuzzer",
false);
1638 AddLinkSanitizerLibArgs(Args, CmdArgs,
"stats");
1646 llvm::memprof::getMemprofOptionsSymbolDarwinLinkageName().data());
1656 CmdArgs.push_back(
"-framework");
1657 CmdArgs.push_back(
"DriverKit");
1663 CmdArgs.push_back(
"-lSystem");
1675 CmdArgs.push_back(
"-lgcc_s.1");
1684 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
1685 if (!SystemTriple.isMacOSX())
1686 return std::string(MacOSSDKVersion);
1687 VersionTuple SystemVersion;
1688 SystemTriple.getMacOSXVersion(SystemVersion);
1690 unsigned Major, Minor, Micro;
1694 return std::string(MacOSSDKVersion);
1695 VersionTuple SDKVersion(Major, Minor, Micro);
1697 if (SDKVersion > SystemVersion)
1698 return SystemVersion.getAsString();
1699 return std::string(MacOSSDKVersion);
1706struct DarwinPlatform {
1715 DeploymentTargetEnv,
1725 DarwinPlatformKind getPlatform()
const {
return Platform; }
1727 DarwinEnvironmentKind getEnvironment()
const {
return Environment; }
1729 void setEnvironment(DarwinEnvironmentKind Kind) {
1731 InferSimulatorFromArch =
false;
1734 const VersionTuple getOSVersion()
const {
1735 return UnderlyingOSVersion.value_or(VersionTuple());
1738 VersionTuple takeOSVersion() {
1739 assert(UnderlyingOSVersion.has_value() &&
1740 "attempting to get an unset OS version");
1741 VersionTuple
Result = *UnderlyingOSVersion;
1742 UnderlyingOSVersion.reset();
1745 bool isValidOSVersion()
const {
1746 return llvm::Triple::isValidVersionForOS(getOSFromPlatform(Platform),
1750 VersionTuple getCanonicalOSVersion()
const {
1751 return llvm::Triple::getCanonicalVersionForOS(
1752 getOSFromPlatform(Platform), getOSVersion(),
true);
1755 void setOSVersion(
const VersionTuple &Version) {
1756 UnderlyingOSVersion = Version;
1759 bool hasOSVersion()
const {
return UnderlyingOSVersion.has_value(); }
1761 VersionTuple getZipperedOSVersion()
const {
1762 assert(Environment == DarwinEnvironmentKind::MacCatalyst &&
1763 "zippered target version is specified only for Mac Catalyst");
1764 return ZipperedOSVersion;
1768 bool isExplicitlySpecified()
const {
return Kind <= DeploymentTargetEnv; }
1771 bool canInferSimulatorFromArch()
const {
return InferSimulatorFromArch; }
1773 const std::optional<llvm::Triple> &getTargetVariantTriple()
const {
1774 return TargetVariantTriple;
1778 void addOSVersionMinArgument(DerivedArgList &Args,
const OptTable &Opts) {
1782 assert(Kind != TargetArg && Kind != MTargetOSArg && Kind != OSVersionArg &&
1786 case DarwinPlatformKind::MacOS:
1787 Opt = options::OPT_mmacos_version_min_EQ;
1789 case DarwinPlatformKind::IPhoneOS:
1790 Opt = options::OPT_mios_version_min_EQ;
1792 case DarwinPlatformKind::TvOS:
1793 Opt = options::OPT_mtvos_version_min_EQ;
1795 case DarwinPlatformKind::WatchOS:
1796 Opt = options::OPT_mwatchos_version_min_EQ;
1798 case DarwinPlatformKind::XROS:
1801 case DarwinPlatformKind::DriverKit:
1805 Arg = Args.MakeJoinedArg(
nullptr, Opts.getOption(Opt), OSVersionStr);
1811 std::string
getAsString(DerivedArgList &Args,
const OptTable &Opts) {
1817 assert(Arg &&
"OS version argument not yet inferred");
1818 return Arg->getAsString(Args);
1819 case DeploymentTargetEnv:
1820 return (llvm::Twine(EnvVarName) +
"=" + OSVersionStr).str();
1821 case InferredFromSDK:
1822 case InferredFromArch:
1823 llvm_unreachable(
"Cannot print arguments for inferred OS version");
1825 llvm_unreachable(
"Unsupported Darwin Source Kind");
1829 std::string getInferredSource() {
1830 assert(!isExplicitlySpecified() &&
"OS version was not inferred");
1831 return InferredSource.str();
1834 void setEnvironment(llvm::Triple::EnvironmentType EnvType,
1835 const VersionTuple &OSVersion,
1836 const std::optional<DarwinSDKInfo> &SDKInfo) {
1838 case llvm::Triple::Simulator:
1839 Environment = DarwinEnvironmentKind::Simulator;
1841 case llvm::Triple::MacABI: {
1842 Environment = DarwinEnvironmentKind::MacCatalyst;
1844 ZipperedOSVersion = VersionTuple(10, 15);
1845 if (hasOSVersion() && SDKInfo) {
1846 if (
const auto *MacCatalystToMacOSMapping = SDKInfo->getVersionMapping(
1848 if (
auto MacOSVersion = MacCatalystToMacOSMapping->map(
1849 OSVersion, ZipperedOSVersion, std::nullopt)) {
1850 ZipperedOSVersion = *MacOSVersion;
1857 if (TargetVariantTriple) {
1858 auto TargetVariantVersion = TargetVariantTriple->getOSVersion();
1859 if (TargetVariantVersion.getMajor()) {
1860 if (TargetVariantVersion < ZipperedOSVersion)
1861 ZipperedOSVersion = TargetVariantVersion;
1871 static DarwinPlatform
1872 createFromTarget(
const llvm::Triple &TT, Arg *A,
1873 std::optional<llvm::Triple> TargetVariantTriple,
1874 const std::optional<DarwinSDKInfo> &SDKInfo) {
1875 DarwinPlatform
Result(TargetArg, getPlatformFromOS(TT.getOS()),
1876 TT.getOSVersion(), A);
1877 VersionTuple OsVersion = TT.getOSVersion();
1878 Result.TargetVariantTriple = TargetVariantTriple;
1879 Result.setEnvironment(TT.getEnvironment(), OsVersion, SDKInfo);
1882 static DarwinPlatform
1883 createFromMTargetOS(llvm::Triple::OSType OS, VersionTuple OSVersion,
1884 llvm::Triple::EnvironmentType Environment, Arg *A,
1885 const std::optional<DarwinSDKInfo> &SDKInfo) {
1886 DarwinPlatform
Result(MTargetOSArg, getPlatformFromOS(OS), OSVersion, A);
1887 Result.InferSimulatorFromArch =
false;
1888 Result.setEnvironment(Environment, OSVersion, SDKInfo);
1891 static DarwinPlatform createOSVersionArg(DarwinPlatformKind Platform, Arg *A,
1893 DarwinPlatform
Result{OSVersionArg, Platform,
1894 getVersionFromString(A->getValue()), A};
1896 Result.Environment = DarwinEnvironmentKind::Simulator;
1899 static DarwinPlatform createDeploymentTargetEnv(DarwinPlatformKind Platform,
1900 StringRef EnvVarName,
1901 StringRef OSVersion) {
1902 DarwinPlatform
Result(DeploymentTargetEnv, Platform,
1903 getVersionFromString(OSVersion));
1904 Result.EnvVarName = EnvVarName;
1907 static DarwinPlatform createFromSDKInfo(StringRef SDKRoot,
1908 const DarwinSDKInfo &SDKInfo) {
1909 const DarwinSDKInfo::SDKPlatformInfo PlatformInfo =
1911 DarwinPlatform
Result(InferredFromSDK,
1912 getPlatformFromOS(PlatformInfo.
getOS()),
1915 Result.InferSimulatorFromArch =
false;
1916 Result.InferredSource = SDKRoot;
1919 static DarwinPlatform createFromSDK(StringRef SDKRoot,
1920 DarwinPlatformKind Platform,
1922 bool IsSimulator =
false) {
1923 DarwinPlatform
Result(InferredFromSDK, Platform,
1924 getVersionFromString(
Value));
1926 Result.Environment = DarwinEnvironmentKind::Simulator;
1927 Result.InferSimulatorFromArch =
false;
1928 Result.InferredSource = SDKRoot;
1931 static DarwinPlatform createFromArch(StringRef
Arch, llvm::Triple::OSType OS,
1932 VersionTuple Version) {
1934 DarwinPlatform(InferredFromArch, getPlatformFromOS(OS), Version);
1942 DarwinSDKInfo inferSDKInfo() {
1943 assert(Kind == InferredFromSDK &&
"can infer SDK info only");
1944 llvm::Triple::OSType
OS = getOSFromPlatform(Platform);
1945 llvm::Triple::EnvironmentType EnvironmentType =
1946 getEnvTypeFromEnvKind(Environment);
1947 StringRef PlatformPrefix =
1948 (Platform == DarwinPlatformKind::DriverKit) ?
"/System/DriverKit" :
"";
1949 return DarwinSDKInfo(
"", OS, EnvironmentType, getOSVersion(),
1950 getDisplayName(Platform, Environment, getOSVersion()),
1952 VersionTuple(getOSVersion().getMajor(), 0, 99),
1953 {DarwinSDKInfo::SDKPlatformInfo(
1954 llvm::Triple::Apple, OS, EnvironmentType,
1955 llvm::Triple::MachO, PlatformPrefix)});
1959 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform, Arg *Argument)
1961 Arguments({Argument, VersionTuple().getAsString()}) {}
1962 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform,
1963 VersionTuple
Value, Arg *Argument =
nullptr)
1967 UnderlyingOSVersion =
Value;
1970 static VersionTuple getVersionFromString(
const StringRef Input) {
1971 llvm::VersionTuple Version;
1972 bool IsValid = !Version.tryParse(Input);
1973 assert(IsValid &&
"unable to convert input version to version tuple");
1978 static DarwinPlatformKind getPlatformFromOS(llvm::Triple::OSType OS) {
1980 case llvm::Triple::Darwin:
1981 case llvm::Triple::MacOSX:
1982 return DarwinPlatformKind::MacOS;
1983 case llvm::Triple::IOS:
1984 return DarwinPlatformKind::IPhoneOS;
1985 case llvm::Triple::TvOS:
1986 return DarwinPlatformKind::TvOS;
1987 case llvm::Triple::WatchOS:
1988 return DarwinPlatformKind::WatchOS;
1989 case llvm::Triple::XROS:
1990 return DarwinPlatformKind::XROS;
1991 case llvm::Triple::DriverKit:
1992 return DarwinPlatformKind::DriverKit;
1994 llvm_unreachable(
"Unable to infer Darwin variant");
1998 static llvm::Triple::OSType getOSFromPlatform(DarwinPlatformKind Platform) {
2000 case DarwinPlatformKind::MacOS:
2001 return llvm::Triple::MacOSX;
2002 case DarwinPlatformKind::IPhoneOS:
2003 return llvm::Triple::IOS;
2004 case DarwinPlatformKind::TvOS:
2005 return llvm::Triple::TvOS;
2006 case DarwinPlatformKind::WatchOS:
2007 return llvm::Triple::WatchOS;
2008 case DarwinPlatformKind::DriverKit:
2009 return llvm::Triple::DriverKit;
2010 case DarwinPlatformKind::XROS:
2011 return llvm::Triple::XROS;
2013 llvm_unreachable(
"Unknown DarwinPlatformKind enum");
2016 static DarwinEnvironmentKind
2017 getEnvKindFromEnvType(llvm::Triple::EnvironmentType EnvironmentType) {
2018 switch (EnvironmentType) {
2019 case llvm::Triple::UnknownEnvironment:
2020 return DarwinEnvironmentKind::NativeEnvironment;
2021 case llvm::Triple::Simulator:
2022 return DarwinEnvironmentKind::Simulator;
2023 case llvm::Triple::MacABI:
2024 return DarwinEnvironmentKind::MacCatalyst;
2026 llvm_unreachable(
"Unable to infer Darwin environment");
2030 static llvm::Triple::EnvironmentType
2031 getEnvTypeFromEnvKind(DarwinEnvironmentKind EnvironmentKind) {
2032 switch (EnvironmentKind) {
2033 case DarwinEnvironmentKind::NativeEnvironment:
2034 return llvm::Triple::UnknownEnvironment;
2035 case DarwinEnvironmentKind::Simulator:
2036 return llvm::Triple::Simulator;
2037 case DarwinEnvironmentKind::MacCatalyst:
2038 return llvm::Triple::MacABI;
2040 llvm_unreachable(
"Unknown DarwinEnvironmentKind enum");
2043 static std::string getDisplayName(DarwinPlatformKind TargetPlatform,
2044 DarwinEnvironmentKind TargetEnvironment,
2045 VersionTuple Version) {
2046 SmallVector<std::string, 3> Components;
2047 switch (TargetPlatform) {
2048 case DarwinPlatformKind::MacOS:
2049 Components.push_back(
"macOS");
2051 case DarwinPlatformKind::IPhoneOS:
2052 Components.push_back(
"iOS");
2054 case DarwinPlatformKind::TvOS:
2055 Components.push_back(
"tvOS");
2057 case DarwinPlatformKind::WatchOS:
2058 Components.push_back(
"watchOS");
2060 case DarwinPlatformKind::DriverKit:
2061 Components.push_back(
"DriverKit");
2064 llvm::reportFatalUsageError(Twine(
"Platform: '") +
2065 std::to_string(TargetPlatform) +
2066 "' is unsupported when inferring SDK Info.");
2068 switch (TargetEnvironment) {
2069 case DarwinEnvironmentKind::NativeEnvironment:
2071 case DarwinEnvironmentKind::Simulator:
2072 Components.push_back(
"Simulator");
2075 llvm::reportFatalUsageError(Twine(
"Environment: '") +
2076 std::to_string(TargetEnvironment) +
2077 "' is unsupported when inferring SDK Info.");
2079 Components.push_back(Version.getAsString());
2080 return join(Components,
" ");
2084 DarwinPlatformKind Platform;
2085 DarwinEnvironmentKind Environment = DarwinEnvironmentKind::NativeEnvironment;
2089 VersionTuple ZipperedOSVersion;
2094 std::optional<VersionTuple> UnderlyingOSVersion;
2095 bool InferSimulatorFromArch =
true;
2096 std::pair<Arg *, std::string>
Arguments;
2097 StringRef EnvVarName;
2100 StringRef InferredSource;
2103 std::optional<llvm::Triple> TargetVariantTriple;
2108std::optional<DarwinPlatform>
2109getDeploymentTargetFromOSVersionArg(DerivedArgList &Args,
2110 const Driver &TheDriver) {
2111 Arg *macOSVersion = Args.getLastArg(options::OPT_mmacos_version_min_EQ);
2112 Arg *iOSVersion = Args.getLastArg(options::OPT_mios_version_min_EQ,
2113 options::OPT_mios_simulator_version_min_EQ);
2115 Args.getLastArg(options::OPT_mtvos_version_min_EQ,
2116 options::OPT_mtvos_simulator_version_min_EQ);
2117 Arg *WatchOSVersion =
2118 Args.getLastArg(options::OPT_mwatchos_version_min_EQ,
2119 options::OPT_mwatchos_simulator_version_min_EQ);
2121 auto GetDarwinPlatform =
2122 [&](DarwinPlatform::DarwinPlatformKind Platform, Arg *VersionArg,
2123 bool IsSimulator) -> std::optional<DarwinPlatform> {
2124 if (StringRef(VersionArg->getValue()).empty()) {
2125 TheDriver.
Diag(diag::err_drv_missing_version_number)
2126 << VersionArg->getAsString(Args);
2127 return std::nullopt;
2129 return DarwinPlatform::createOSVersionArg(Platform, VersionArg,
2134 if (iOSVersion || TvOSVersion || WatchOSVersion) {
2135 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2136 << macOSVersion->getAsString(Args)
2137 << (iOSVersion ? iOSVersion
2138 : TvOSVersion ? TvOSVersion : WatchOSVersion)
2144 }
else if (iOSVersion) {
2145 if (TvOSVersion || WatchOSVersion) {
2146 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2147 << iOSVersion->getAsString(Args)
2148 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->
getAsString(Args);
2151 iOSVersion->getOption().getID() ==
2152 options::OPT_mios_simulator_version_min_EQ);
2153 }
else if (TvOSVersion) {
2154 if (WatchOSVersion) {
2155 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2156 << TvOSVersion->getAsString(Args)
2157 << WatchOSVersion->getAsString(Args);
2160 TvOSVersion->getOption().getID() ==
2161 options::OPT_mtvos_simulator_version_min_EQ);
2162 }
else if (WatchOSVersion)
2163 return GetDarwinPlatform(
2165 WatchOSVersion->getOption().getID() ==
2166 options::OPT_mwatchos_simulator_version_min_EQ);
2167 return std::nullopt;
2172std::optional<DarwinPlatform>
2173getDeploymentTargetFromEnvironmentVariables(
const Driver &TheDriver,
2174 const llvm::Triple &Triple) {
2176 const char *EnvVars[] = {
2177 "MACOSX_DEPLOYMENT_TARGET",
2178 "IPHONEOS_DEPLOYMENT_TARGET",
2179 "TVOS_DEPLOYMENT_TARGET",
2180 "WATCHOS_DEPLOYMENT_TARGET",
2181 "DRIVERKIT_DEPLOYMENT_TARGET",
2182 "XROS_DEPLOYMENT_TARGET"
2185 "Missing platform");
2186 for (
const auto &I : llvm::enumerate(llvm::ArrayRef(EnvVars))) {
2187 if (
char *Env = ::getenv(I.value()))
2188 Targets[I.index()] = Env;
2197 if (Triple.getArch() == llvm::Triple::arm ||
2198 Triple.getArch() == llvm::Triple::aarch64 ||
2199 Triple.getArch() == llvm::Triple::thumb)
2206 unsigned FirstTarget = std::size(Targets);
2207 for (
unsigned I = 0; I != std::size(Targets); ++I) {
2208 if (Targets[I].empty())
2210 if (FirstTarget == std::size(Targets))
2213 TheDriver.
Diag(diag::err_drv_conflicting_deployment_targets)
2214 << Targets[FirstTarget] << Targets[I];
2218 for (
const auto &
Target : llvm::enumerate(llvm::ArrayRef(Targets))) {
2219 if (!
Target.value().empty())
2220 return DarwinPlatform::createDeploymentTargetEnv(
2224 return std::nullopt;
2230std::optional<DarwinPlatform>
2231inferDeploymentTargetFromSDK(DerivedArgList &Args,
2232 const std::optional<DarwinSDKInfo> &SDKInfo) {
2233 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2235 return std::nullopt;
2236 StringRef isysroot = A->getValue();
2238 return DarwinPlatform::createFromSDKInfo(isysroot, *SDKInfo);
2242 return std::nullopt;
2244 std::string Version;
2247 size_t StartVer = SDK.find_first_of(
"0123456789");
2248 size_t EndVer = SDK.find_last_of(
"0123456789");
2249 if (StartVer != StringRef::npos && EndVer > StartVer)
2250 Version = std::string(SDK.slice(StartVer, EndVer + 1));
2251 if (Version.empty())
2252 return std::nullopt;
2254 if (SDK.starts_with(
"iPhoneOS") || SDK.starts_with(
"iPhoneSimulator"))
2255 return DarwinPlatform::createFromSDK(
2257 SDK.starts_with(
"iPhoneSimulator"));
2258 else if (SDK.starts_with(
"MacOSX"))
2259 return DarwinPlatform::createFromSDK(isysroot,
Darwin::MacOS,
2261 else if (SDK.starts_with(
"WatchOS") || SDK.starts_with(
"WatchSimulator"))
2262 return DarwinPlatform::createFromSDK(
2264 SDK.starts_with(
"WatchSimulator"));
2265 else if (SDK.starts_with(
"AppleTVOS") || SDK.starts_with(
"AppleTVSimulator"))
2266 return DarwinPlatform::createFromSDK(
2268 SDK.starts_with(
"AppleTVSimulator"));
2269 else if (SDK.starts_with(
"DriverKit"))
2271 return std::nullopt;
2275VersionTuple getInferredOSVersion(llvm::Triple::OSType OS,
2276 const llvm::Triple &Triple,
2277 const Driver &TheDriver) {
2278 VersionTuple OsVersion;
2279 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
2281 case llvm::Triple::Darwin:
2282 case llvm::Triple::MacOSX:
2285 if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
2286 !Triple.getOSMajorVersion())
2287 SystemTriple.getMacOSXVersion(OsVersion);
2288 else if (!Triple.getMacOSXVersion(OsVersion))
2289 TheDriver.
Diag(diag::err_drv_invalid_darwin_version)
2290 << Triple.getOSName();
2292 case llvm::Triple::IOS:
2293 if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
2294 OsVersion = VersionTuple(13, 1);
2296 OsVersion = Triple.getiOSVersion();
2298 case llvm::Triple::TvOS:
2299 OsVersion = Triple.getOSVersion();
2301 case llvm::Triple::WatchOS:
2302 OsVersion = Triple.getWatchOSVersion();
2304 case llvm::Triple::XROS:
2305 OsVersion = Triple.getOSVersion();
2306 if (!OsVersion.getMajor())
2307 OsVersion = OsVersion.withMajorReplaced(1);
2309 case llvm::Triple::DriverKit:
2310 OsVersion = Triple.getDriverKitVersion();
2313 llvm_unreachable(
"Unexpected OS type");
2320std::optional<DarwinPlatform>
2321inferDeploymentTargetFromArch(DerivedArgList &Args,
const Darwin &Toolchain,
2322 const llvm::Triple &Triple,
2323 const Driver &TheDriver) {
2324 llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS;
2327 if (MachOArchName ==
"arm64" || MachOArchName ==
"arm64e")
2328 OSTy = llvm::Triple::MacOSX;
2329 else if (MachOArchName ==
"armv7" || MachOArchName ==
"armv7s" ||
2330 MachOArchName ==
"armv6")
2331 OSTy = llvm::Triple::IOS;
2332 else if (MachOArchName ==
"armv7k" || MachOArchName ==
"arm64_32")
2333 OSTy = llvm::Triple::WatchOS;
2334 else if (MachOArchName !=
"armv6m" && MachOArchName !=
"armv7m" &&
2335 MachOArchName !=
"armv7em")
2336 OSTy = llvm::Triple::MacOSX;
2337 if (OSTy == llvm::Triple::UnknownOS)
2338 return std::nullopt;
2339 return DarwinPlatform::createFromArch(
2340 MachOArchName, OSTy, getInferredOSVersion(OSTy, Triple, TheDriver));
2344std::optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
2345 DerivedArgList &Args,
const llvm::Triple &Triple,
const Driver &TheDriver,
2346 const std::optional<DarwinSDKInfo> &SDKInfo) {
2347 if (!Args.hasArg(options::OPT_target))
2348 return std::nullopt;
2349 if (Triple.getOS() == llvm::Triple::Darwin ||
2350 Triple.getOS() == llvm::Triple::UnknownOS)
2351 return std::nullopt;
2352 std::optional<llvm::Triple> TargetVariantTriple;
2353 for (
const Arg *A : Args.filtered(options::OPT_darwin_target_variant)) {
2354 llvm::Triple TVT(A->getValue());
2356 if ((Triple.getArch() == llvm::Triple::aarch64 ||
2357 TVT.getArchName() == Triple.getArchName()) &&
2358 TVT.getArch() == Triple.getArch() &&
2359 TVT.getSubArch() == Triple.getSubArch() &&
2360 TVT.getVendor() == Triple.getVendor()) {
2361 if (TargetVariantTriple)
2366 if ((Triple.isMacOSX() && TVT.getOS() == llvm::Triple::IOS &&
2367 TVT.isMacCatalystEnvironment()) ||
2368 (TVT.isMacOSX() && Triple.getOS() == llvm::Triple::IOS &&
2369 Triple.isMacCatalystEnvironment())) {
2370 TargetVariantTriple = TVT;
2373 TheDriver.
Diag(diag::err_drv_target_variant_invalid)
2374 << A->getSpelling() << A->getValue();
2377 DarwinPlatform PlatformAndVersion = DarwinPlatform::createFromTarget(
2378 Triple, Args.getLastArg(options::OPT_target), TargetVariantTriple,
2381 return PlatformAndVersion;
2385std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2386 DerivedArgList &Args,
const Driver &TheDriver,
2387 const std::optional<DarwinSDKInfo> &SDKInfo) {
2388 auto *A = Args.getLastArg(options::OPT_mtargetos_EQ);
2390 return std::nullopt;
2391 llvm::Triple TT(llvm::Twine(
"unknown-apple-") + A->getValue());
2392 switch (TT.getOS()) {
2393 case llvm::Triple::MacOSX:
2394 case llvm::Triple::IOS:
2395 case llvm::Triple::TvOS:
2396 case llvm::Triple::WatchOS:
2397 case llvm::Triple::XROS:
2400 TheDriver.
Diag(diag::err_drv_invalid_os_in_arg)
2401 << TT.getOSName() << A->getAsString(Args);
2402 return std::nullopt;
2405 VersionTuple Version = TT.getOSVersion();
2406 if (!Version.getMajor()) {
2407 TheDriver.
Diag(diag::err_drv_invalid_version_number)
2408 << A->getAsString(Args);
2409 return std::nullopt;
2411 return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
2412 TT.getEnvironment(), A, SDKInfo);
2415std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS,
2416 const ArgList &Args,
2417 const Driver &TheDriver) {
2418 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2420 return std::nullopt;
2421 StringRef isysroot = A->getValue();
2423 if (!SDKInfoOrErr) {
2424 llvm::consumeError(SDKInfoOrErr.takeError());
2425 TheDriver.
Diag(diag::warn_drv_darwin_sdk_invalid_settings);
2426 return std::nullopt;
2428 return *SDKInfoOrErr;
2433void Darwin::AddDeploymentTarget(DerivedArgList &Args)
const {
2439 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2441 if (!
getVFS().exists(A->getValue()))
2442 getDriver().
Diag(clang::diag::warn_missing_sysroot) << A->getValue();
2444 if (
char *env = ::getenv(
"SDKROOT")) {
2447 if (llvm::sys::path::is_absolute(env) &&
getVFS().exists(env) &&
2448 StringRef(env) !=
"/") {
2449 Args.append(Args.MakeSeparateArg(
2450 nullptr, Opts.getOption(options::OPT_isysroot), env));
2460 std::optional<DarwinPlatform> PlatformAndVersion =
2462 if (PlatformAndVersion) {
2464 if (
const auto *MTargetOSArg = Args.getLastArg(options::OPT_mtargetos_EQ)) {
2465 std::string TargetArgStr = PlatformAndVersion->getAsString(Args, Opts);
2466 std::string MTargetOSArgStr = MTargetOSArg->getAsString(Args);
2468 << TargetArgStr << MTargetOSArgStr;
2471 bool TripleProvidedOSVersion = PlatformAndVersion->hasOSVersion();
2472 if (!TripleProvidedOSVersion)
2473 PlatformAndVersion->setOSVersion(
2476 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2477 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2478 if (PlatformAndVersionFromOSVersionArg) {
2479 unsigned TargetMajor, TargetMinor, TargetMicro;
2481 unsigned ArgMajor, ArgMinor, ArgMicro;
2483 if (PlatformAndVersion->getPlatform() !=
2484 PlatformAndVersionFromOSVersionArg->getPlatform() ||
2486 PlatformAndVersion->getOSVersion().getAsString(), TargetMajor,
2487 TargetMinor, TargetMicro, TargetExtra) &&
2489 PlatformAndVersionFromOSVersionArg->getOSVersion().getAsString(),
2490 ArgMajor, ArgMinor, ArgMicro, ArgExtra) &&
2491 (VersionTuple(TargetMajor, TargetMinor, TargetMicro) !=
2492 VersionTuple(ArgMajor, ArgMinor, ArgMicro) ||
2493 TargetExtra != ArgExtra))) {
2496 if (PlatformAndVersion->getPlatform() ==
2497 PlatformAndVersionFromOSVersionArg->getPlatform() &&
2498 !TripleProvidedOSVersion) {
2499 PlatformAndVersion->setOSVersion(
2500 PlatformAndVersionFromOSVersionArg->getOSVersion());
2504 std::string OSVersionArg =
2505 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2506 std::string TargetArg = PlatformAndVersion->getAsString(Args, Opts);
2508 << OSVersionArg << TargetArg;
2512 }
else if ((PlatformAndVersion = getDeploymentTargetFromMTargetOSArg(
2516 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2517 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2518 if (PlatformAndVersionFromOSVersionArg) {
2519 std::string MTargetOSArgStr = PlatformAndVersion->getAsString(Args, Opts);
2520 std::string OSVersionArgStr =
2521 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2523 << MTargetOSArgStr << OSVersionArgStr;
2527 PlatformAndVersion = getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2530 if (!PlatformAndVersion) {
2531 PlatformAndVersion =
2533 if (PlatformAndVersion) {
2535 std::optional<DarwinPlatform> SDKTarget =
2536 inferDeploymentTargetFromSDK(Args,
SDKInfo);
2538 PlatformAndVersion->setEnvironment(SDKTarget->getEnvironment());
2544 if (!PlatformAndVersion) {
2545 PlatformAndVersion = inferDeploymentTargetFromSDK(Args,
SDKInfo);
2548 if (PlatformAndVersion && !
SDKInfo)
2549 SDKInfo = PlatformAndVersion->inferSDKInfo();
2553 if (!PlatformAndVersion)
2554 PlatformAndVersion =
2558 assert(PlatformAndVersion &&
"Unable to infer Darwin variant");
2559 if (!PlatformAndVersion->isValidOSVersion()) {
2560 if (PlatformAndVersion->isExplicitlySpecified())
2562 << PlatformAndVersion->getAsString(Args, Opts);
2564 getDriver().
Diag(diag::err_drv_invalid_version_number_inferred)
2565 << PlatformAndVersion->getOSVersion().getAsString()
2566 << PlatformAndVersion->getInferredSource();
2571 VersionTuple CanonicalVersion = PlatformAndVersion->getCanonicalOSVersion();
2572 if (CanonicalVersion != PlatformAndVersion->getOSVersion()) {
2573 getDriver().
Diag(diag::warn_drv_overriding_deployment_version)
2574 << PlatformAndVersion->getOSVersion().getAsString()
2575 << CanonicalVersion.getAsString();
2576 PlatformAndVersion->setOSVersion(CanonicalVersion);
2579 PlatformAndVersion->addOSVersionMinArgument(Args, Opts);
2582 unsigned Major, Minor, Micro;
2585 const unsigned MajorVersionLimit = 1000;
2586 const VersionTuple OSVersion = PlatformAndVersion->takeOSVersion();
2587 const std::string OSVersionStr = OSVersion.getAsString();
2589 if (Platform ==
MacOS) {
2592 HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
2595 << PlatformAndVersion->getAsString(Args, Opts);
2599 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2601 << PlatformAndVersion->getAsString(Args, Opts);
2603 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst &&
2604 (Major < 13 || (Major == 13 && Minor < 1))) {
2606 << PlatformAndVersion->getAsString(Args, Opts);
2613 if (
getTriple().isArch32Bit() && Major >= 11) {
2615 if (PlatformAndVersion->isExplicitlySpecified()) {
2616 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst)
2617 getDriver().
Diag(diag::err_invalid_macos_32bit_deployment_target);
2620 << PlatformAndVersion->getAsString(Args, Opts);
2628 }
else if (Platform ==
TvOS) {
2631 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2633 << PlatformAndVersion->getAsString(Args, Opts);
2634 }
else if (Platform ==
WatchOS) {
2637 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2639 << PlatformAndVersion->getAsString(Args, Opts);
2643 HadExtra || Major < 19 || Major >= MajorVersionLimit || Minor >= 100 ||
2646 << PlatformAndVersion->getAsString(Args, Opts);
2647 }
else if (Platform ==
XROS) {
2650 HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2653 << PlatformAndVersion->getAsString(Args, Opts);
2655 llvm_unreachable(
"unknown kind of Darwin platform");
2661 PlatformAndVersion->canInferSimulatorFromArch() &&
getTriple().isX86())
2664 VersionTuple ZipperedOSVersion;
2666 ZipperedOSVersion = PlatformAndVersion->getZipperedOSVersion();
2667 setTarget(Platform, Environment, Major, Minor, Micro, ZipperedOSVersion);
2679 return !
SDKInfo->getPlatformPrefix(
T).empty();
2688 const llvm::Triple &
T)
const {
2690 const StringRef PlatformPrefix =
SDKInfo->getPlatformPrefix(
T);
2691 if (!PlatformPrefix.empty())
2692 llvm::sys::path::append(Path, PlatformPrefix);
2693 }
else if (
T.isDriverKit()) {
2696 llvm::sys::path::append(Path,
"System",
"DriverKit");
2705 if (DriverArgs.hasArg(options::OPT_isysroot))
2706 Path = DriverArgs.getLastArgValue(options::OPT_isysroot);
2717 const llvm::opt::ArgList &DriverArgs,
2718 llvm::opt::ArgStringList &CC1Args)
const {
2723 bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc);
2724 bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc);
2725 bool NoBuiltinInc = DriverArgs.hasFlag(
2726 options::OPT_nobuiltininc, options::OPT_ibuiltininc,
false);
2727 bool ForceBuiltinInc = DriverArgs.hasFlag(
2728 options::OPT_ibuiltininc, options::OPT_nobuiltininc,
false);
2731 if (!NoStdInc && !NoStdlibInc) {
2733 llvm::sys::path::append(P,
"usr",
"local",
"include");
2738 if (!(NoStdInc && !ForceBuiltinInc) && !NoBuiltinInc) {
2740 llvm::sys::path::append(P,
"include");
2744 if (NoStdInc || NoStdlibInc)
2748 llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
2749 if (!CIncludeDirs.empty()) {
2751 CIncludeDirs.split(dirs,
":");
2752 for (llvm::StringRef dir : dirs) {
2753 llvm::StringRef Prefix =
2754 llvm::sys::path::is_absolute(dir) ?
"" : llvm::StringRef(Sysroot);
2760 llvm::sys::path::append(P,
"usr",
"include");
2766 const llvm::opt::ArgList &DriverArgs,
2767 llvm::opt::ArgStringList &CC1Args)
const {
2770 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc))
2779 llvm::sys::path::append(P1,
"System",
"Library",
"Frameworks");
2780 llvm::sys::path::append(P2,
"System",
"Library",
"SubFrameworks");
2781 llvm::sys::path::append(P3,
"Library",
"Frameworks");
2785bool DarwinClang::AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
2786 llvm::opt::ArgStringList &CC1Args,
2788 llvm::StringRef Version,
2789 llvm::StringRef ArchDir,
2790 llvm::StringRef BitDir)
const {
2791 llvm::sys::path::append(
Base, Version);
2799 if (!ArchDir.empty())
2800 llvm::sys::path::append(P, ArchDir);
2801 if (!BitDir.empty())
2802 llvm::sys::path::append(P, BitDir);
2809 llvm::sys::path::append(P,
"backward");
2817 const llvm::opt::ArgList &DriverArgs,
2818 llvm::opt::ArgStringList &CC1Args)
const {
2826 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
2827 options::OPT_nostdincxx))
2848 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
2849 if (
getVFS().exists(InstallBin)) {
2852 }
else if (DriverArgs.hasArg(options::OPT_v)) {
2853 llvm::errs() <<
"ignoring nonexistent directory \"" << InstallBin
2859 llvm::sys::path::append(SysrootUsr,
"usr",
"include",
"c++",
"v1");
2860 if (
getVFS().exists(SysrootUsr)) {
2863 }
else if (DriverArgs.hasArg(options::OPT_v)) {
2864 llvm::errs() <<
"ignoring nonexistent directory \"" << SysrootUsr
2873 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args);
2878void AppleMachO::AddGnuCPlusPlusIncludePaths(
2879 const llvm::opt::ArgList &DriverArgs,
2880 llvm::opt::ArgStringList &CC1Args)
const {}
2882void DarwinClang::AddGnuCPlusPlusIncludePaths(
2883 const llvm::opt::ArgList &DriverArgs,
2884 llvm::opt::ArgStringList &CC1Args)
const {
2886 llvm::sys::path::append(UsrIncludeCxx,
"usr",
"include",
"c++");
2888 llvm::Triple::ArchType arch =
getTriple().getArch();
2889 bool IsBaseFound =
true;
2894 case llvm::Triple::x86:
2895 case llvm::Triple::x86_64:
2896 IsBaseFound = AddGnuCPlusPlusIncludePaths(
2897 DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
"i686-apple-darwin10",
2898 arch == llvm::Triple::x86_64 ?
"x86_64" :
"");
2899 IsBaseFound |= AddGnuCPlusPlusIncludePaths(
2900 DriverArgs, CC1Args, UsrIncludeCxx,
"4.0.0",
"i686-apple-darwin8",
"");
2903 case llvm::Triple::arm:
2904 case llvm::Triple::thumb:
2906 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2907 "arm-apple-darwin10",
"v7");
2909 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2910 "arm-apple-darwin10",
"v6");
2913 case llvm::Triple::aarch64:
2915 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2916 "arm64-apple-darwin10",
"");
2926 ArgStringList &CmdArgs)
const {
2931 CmdArgs.push_back(
"-lc++");
2932 if (Args.hasArg(options::OPT_fexperimental_library))
2933 CmdArgs.push_back(
"-lc++experimental");
2943 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2945 llvm::sys::path::append(P,
"usr",
"lib",
"libstdc++.dylib");
2947 if (!
getVFS().exists(P)) {
2948 llvm::sys::path::remove_filename(P);
2949 llvm::sys::path::append(P,
"libstdc++.6.dylib");
2950 if (
getVFS().exists(P)) {
2951 CmdArgs.push_back(Args.MakeArgString(P));
2960 if (!
getVFS().exists(
"/usr/lib/libstdc++.dylib") &&
2961 getVFS().exists(
"/usr/lib/libstdc++.6.dylib")) {
2962 CmdArgs.push_back(
"/usr/lib/libstdc++.6.dylib");
2967 CmdArgs.push_back(
"-lstdc++");
2973 ArgStringList &CmdArgs)
const {
2979 llvm::sys::path::append(P,
"lib",
"darwin");
2983 llvm::sys::path::append(P,
"libclang_rt.cc_kext_watchos.a");
2985 llvm::sys::path::append(P,
"libclang_rt.cc_kext_tvos.a");
2987 llvm::sys::path::append(P,
"libclang_rt.cc_kext_ios.a");
2991 llvm::sys::path::append(
2992 P, llvm::Twine(
"libclang_rt.cc_kext_") +
2993 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
".a");
2995 llvm::sys::path::append(P,
"libclang_rt.cc_kext.a");
3001 CmdArgs.push_back(Args.MakeArgString(P));
3005 StringRef BoundArch,
3007 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
3017 for (Arg *A : Args) {
3026 case options::OPT_mkernel:
3027 case options::OPT_fapple_kext:
3029 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
3032 case options::OPT_dependency_file:
3033 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
3036 case options::OPT_gfull:
3037 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3039 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
3042 case options::OPT_gused:
3043 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3045 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
3048 case options::OPT_shared:
3049 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
3052 case options::OPT_fconstant_cfstrings:
3053 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
3056 case options::OPT_fno_constant_cfstrings:
3057 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
3060 case options::OPT_Wnonportable_cfstrings:
3062 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
3065 case options::OPT_Wno_nonportable_cfstrings:
3067 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
3074 if (!BoundArch.empty()) {
3075 StringRef Name = BoundArch;
3076 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
3077 const Option MArch = Opts.getOption(options::OPT_march_EQ);
3083 else if (Name ==
"ppc601")
3084 DAL->AddJoinedArg(
nullptr, MCpu,
"601");
3085 else if (Name ==
"ppc603")
3086 DAL->AddJoinedArg(
nullptr, MCpu,
"603");
3087 else if (Name ==
"ppc604")
3088 DAL->AddJoinedArg(
nullptr, MCpu,
"604");
3089 else if (Name ==
"ppc604e")
3090 DAL->AddJoinedArg(
nullptr, MCpu,
"604e");
3091 else if (Name ==
"ppc750")
3092 DAL->AddJoinedArg(
nullptr, MCpu,
"750");
3093 else if (Name ==
"ppc7400")
3094 DAL->AddJoinedArg(
nullptr, MCpu,
"7400");
3095 else if (Name ==
"ppc7450")
3096 DAL->AddJoinedArg(
nullptr, MCpu,
"7450");
3097 else if (Name ==
"ppc970")
3098 DAL->AddJoinedArg(
nullptr, MCpu,
"970");
3100 else if (Name ==
"ppc64" || Name ==
"ppc64le")
3101 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3103 else if (Name ==
"i386")
3105 else if (Name ==
"i486")
3106 DAL->AddJoinedArg(
nullptr, MArch,
"i486");
3107 else if (Name ==
"i586")
3108 DAL->AddJoinedArg(
nullptr, MArch,
"i586");
3109 else if (Name ==
"i686")
3110 DAL->AddJoinedArg(
nullptr, MArch,
"i686");
3111 else if (Name ==
"pentium")
3112 DAL->AddJoinedArg(
nullptr, MArch,
"pentium");
3113 else if (Name ==
"pentium2")
3114 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3115 else if (Name ==
"pentpro")
3116 DAL->AddJoinedArg(
nullptr, MArch,
"pentiumpro");
3117 else if (Name ==
"pentIIm3")
3118 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3120 else if (Name ==
"x86_64" || Name ==
"x86_64h")
3121 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3123 else if (Name ==
"arm")
3124 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3125 else if (Name ==
"armv4t")
3126 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3127 else if (Name ==
"armv5")
3128 DAL->AddJoinedArg(
nullptr, MArch,
"armv5tej");
3129 else if (Name ==
"xscale")
3130 DAL->AddJoinedArg(
nullptr, MArch,
"xscale");
3131 else if (Name ==
"armv6")
3132 DAL->AddJoinedArg(
nullptr, MArch,
"armv6k");
3133 else if (Name ==
"armv6m")
3134 DAL->AddJoinedArg(
nullptr, MArch,
"armv6m");
3135 else if (Name ==
"armv7")
3136 DAL->AddJoinedArg(
nullptr, MArch,
"armv7a");
3137 else if (Name ==
"armv7em")
3138 DAL->AddJoinedArg(
nullptr, MArch,
"armv7em");
3139 else if (Name ==
"armv7k")
3140 DAL->AddJoinedArg(
nullptr, MArch,
"armv7k");
3141 else if (Name ==
"armv7m")
3142 DAL->AddJoinedArg(
nullptr, MArch,
"armv7m");
3143 else if (Name ==
"armv7s")
3144 DAL->AddJoinedArg(
nullptr, MArch,
"armv7s");
3151 ArgStringList &CmdArgs,
3152 bool ForceLinkBuiltinRT)
const {
3161 CompilerRT += Args.hasArg(options::OPT_fPIC) ?
"_pic" :
"_static";
3167 llvm::Triple::OSType OS;
3173 OS = llvm::Triple::MacOSX;
3176 OS = llvm::Triple::IOS;
3179 OS = llvm::Triple::TvOS;
3182 OS = llvm::Triple::WatchOS;
3200 switch (SDKInfo->getEnvironment()) {
3201 case llvm::Triple::UnknownEnvironment:
3202 case llvm::Triple::Simulator:
3203 case llvm::Triple::MacABI:
3212 VersionTuple SDKVersion = SDKInfo->getVersion();
3213 switch (SDKInfo->getOS()) {
3216 case llvm::Triple::MacOSX:
3217 return SDKVersion >= VersionTuple(15U);
3218 case llvm::Triple::IOS:
3219 return SDKVersion >= VersionTuple(18U);
3220 case llvm::Triple::TvOS:
3221 return SDKVersion >= VersionTuple(18U);
3222 case llvm::Triple::WatchOS:
3223 return SDKVersion >= VersionTuple(11U);
3224 case llvm::Triple::XROS:
3225 return SDKVersion >= VersionTuple(2U);
3233static inline llvm::VersionTuple
3238 case llvm::Triple::Darwin:
3239 case llvm::Triple::MacOSX:
3240 return llvm::VersionTuple(10U, 12U);
3241 case llvm::Triple::IOS:
3242 case llvm::Triple::TvOS:
3243 return llvm::VersionTuple(10U);
3244 case llvm::Triple::WatchOS:
3245 return llvm::VersionTuple(3U);
3248 llvm_unreachable(
"Unexpected OS");
3252 llvm::Triple::OSType OS;
3258 OS = llvm::Triple::MacOSX;
3261 OS = llvm::Triple::IOS;
3264 OS = llvm::Triple::TvOS;
3267 OS = llvm::Triple::WatchOS;
3279 llvm::opt::ArgStringList &CC1Args,
3288 if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3289 options::OPT_fno_ptrauth_calls))
3290 CC1Args.push_back(
"-fptrauth-calls");
3291 if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3292 options::OPT_fno_ptrauth_returns))
3293 CC1Args.push_back(
"-fptrauth-returns");
3294 if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3295 options::OPT_fno_ptrauth_intrinsics))
3296 CC1Args.push_back(
"-fptrauth-intrinsics");
3297 if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3298 options::OPT_fno_ptrauth_indirect_gotos))
3299 CC1Args.push_back(
"-fptrauth-indirect-gotos");
3300 if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3301 options::OPT_fno_ptrauth_auth_traps))
3302 CC1Args.push_back(
"-fptrauth-auth-traps");
3305 if (!DriverArgs.hasArg(
3306 options::OPT_fptrauth_vtable_pointer_address_discrimination,
3307 options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
3308 CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
3309 if (!DriverArgs.hasArg(
3310 options::OPT_fptrauth_vtable_pointer_type_discrimination,
3311 options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
3312 CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
3315 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
3316 options::OPT_fno_ptrauth_objc_isa))
3317 CC1Args.push_back(
"-fptrauth-objc-isa");
3318 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
3319 options::OPT_fno_ptrauth_objc_class_ro))
3320 CC1Args.push_back(
"-fptrauth-objc-class-ro");
3321 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
3322 options::OPT_fno_ptrauth_objc_interface_sel))
3323 CC1Args.push_back(
"-fptrauth-objc-interface-sel");
3328 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3335 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
3336 options::OPT_fno_aligned_allocation) &&
3338 CC1Args.push_back(
"-faligned-alloc-unavailable");
3342 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
3343 options::OPT_fno_sized_deallocation) &&
3345 CC1Args.push_back(
"-fno-sized-deallocation");
3352 if (!
SDKInfo->getFilePath().empty()) {
3354 ExtraDepOpt +=
SDKInfo->getFilePath();
3355 CC1Args.push_back(DriverArgs.MakeArgString(ExtraDepOpt));
3361 CC1Args.push_back(
"-fcompatibility-qualified-id-block-type-checking");
3365 if (!DriverArgs.getLastArgNoClaim(
3366 options::OPT_fvisibility_inlines_hidden_static_local_var,
3367 options::OPT_fno_visibility_inlines_hidden_static_local_var))
3368 CC1Args.push_back(
"-fvisibility-inlines-hidden-static-local-var");
3382 CC1Args.push_back(
"-fbuiltin-headers-in-system-modules");
3384 if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
3385 options::OPT_fno_define_target_os_macros))
3386 CC1Args.push_back(
"-fdefine-target-os-macros");
3390 !DriverArgs.hasFlag(options::OPT_fmodulemap_allow_subdirectory_search,
3391 options::OPT_fno_modulemap_allow_subdirectory_search,
3393 bool RequiresSubdirectorySearch;
3394 VersionTuple SDKVersion =
SDKInfo->getVersion();
3397 RequiresSubdirectorySearch =
true;
3400 RequiresSubdirectorySearch = SDKVersion < VersionTuple(15, 0);
3404 RequiresSubdirectorySearch = SDKVersion < VersionTuple(18, 0);
3407 RequiresSubdirectorySearch = SDKVersion < VersionTuple(11, 0);
3410 RequiresSubdirectorySearch = SDKVersion < VersionTuple(2, 0);
3413 if (!RequiresSubdirectorySearch)
3414 CC1Args.push_back(
"-fno-modulemap-allow-subdirectory-search");
3419 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1ASArgs)
const {
3421 CC1ASArgs.push_back(
"-darwin-target-variant-triple");
3428 auto EmitTargetSDKVersionArg = [&](
const VersionTuple &
V) {
3430 llvm::raw_string_ostream OS(Arg);
3431 OS <<
"-target-sdk-version=" <<
V;
3432 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3436 if (
const auto *MacOStoMacCatalystMapping =
SDKInfo->getVersionMapping(
3438 std::optional<VersionTuple> SDKVersion = MacOStoMacCatalystMapping->map(
3441 EmitTargetSDKVersionArg(
3445 EmitTargetSDKVersionArg(
SDKInfo->getVersion());
3453 llvm::raw_string_ostream OS(Arg);
3454 OS <<
"-darwin-target-variant-sdk-version=" <<
SDKInfo->getVersion();
3455 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3456 }
else if (
const auto *MacOStoMacCatalystMapping =
3459 if (std::optional<VersionTuple> SDKVersion =
3460 MacOStoMacCatalystMapping->map(
3464 llvm::raw_string_ostream OS(Arg);
3465 OS <<
"-darwin-target-variant-sdk-version=" << *SDKVersion;
3466 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3477 DerivedArgList *DAL =
3481 if (BoundArch.empty())
3487 AddDeploymentTarget(*DAL);
3495 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
3498 if (A->getOption().getID() != options::OPT_mkernel &&
3499 A->getOption().getID() != options::OPT_fapple_kext)
3501 assert(it != ie &&
"unexpected argument translation");
3503 assert(A->getOption().getID() == options::OPT_static &&
3504 "missing expected -static argument");
3511 if ((
Arch == llvm::Triple::arm ||
Arch == llvm::Triple::thumb)) {
3512 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
3513 options::OPT_fno_omit_frame_pointer,
false))
3514 getDriver().
Diag(clang::diag::warn_drv_unsupported_opt_for_target)
3515 <<
"-fomit-frame-pointer" << BoundArch;
3524 if (
getArch() == llvm::Triple::x86_64 ||
3526 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
3528 return (
getArch() == llvm::Triple::aarch64 ||
3529 getArch() == llvm::Triple::aarch64_32)
3537 if (
const char *S = ::getenv(
"RC_DEBUG_OPTIONS"))
3538 return S[0] !=
'\0';
3543 if (
const char *S = ::getenv(
"RC_DEBUG_PREFIX_MAP"))
3552 return llvm::ExceptionHandling::None;
3556 if (Triple.isWatchABI())
3557 return llvm::ExceptionHandling::DwarfCFI;
3559 return llvm::ExceptionHandling::SjLj;
3574 return (
getArch() == llvm::Triple::x86_64 ||
3575 getArch() == llvm::Triple::aarch64);
3584 ArgStringList &CmdArgs)
const {
3587 assert(!
isTargetXROS() &&
"xrOS always uses -platform-version");
3590 CmdArgs.push_back(
"-watchos_version_min");
3592 CmdArgs.push_back(
"-watchos_simulator_version_min");
3594 CmdArgs.push_back(
"-tvos_version_min");
3596 CmdArgs.push_back(
"-tvos_simulator_version_min");
3598 CmdArgs.push_back(
"-driverkit_version_min");
3600 CmdArgs.push_back(
"-ios_simulator_version_min");
3602 CmdArgs.push_back(
"-iphoneos_version_min");
3604 CmdArgs.push_back(
"-maccatalyst_version_min");
3607 CmdArgs.push_back(
"-macosx_version_min");
3613 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3616 VersionTuple VariantTargetVersion;
3618 CmdArgs.push_back(
"-macosx_version_min");
3623 "unexpected target variant triple");
3624 CmdArgs.push_back(
"-maccatalyst_version_min");
3627 VersionTuple MinTgtVers =
3629 if (MinTgtVers.getMajor() && MinTgtVers > VariantTargetVersion)
3630 VariantTargetVersion = MinTgtVers;
3631 CmdArgs.push_back(Args.MakeArgString(VariantTargetVersion.getAsString()));
3642 return "mac catalyst";
3653 llvm_unreachable(
"invalid platform");
3657 llvm::opt::ArgStringList &CmdArgs)
const {
3658 auto EmitPlatformVersionArg =
3661 const llvm::Triple &TT) {
3664 CmdArgs.push_back(
"-platform_version");
3665 std::string PlatformName =
3668 PlatformName +=
"-simulator";
3669 CmdArgs.push_back(Args.MakeArgString(PlatformName));
3678 VersionTuple MinTgtVers = TT.getMinimumSupportedOSVersion();
3681 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3686 std::optional<VersionTuple> iOSSDKVersion;
3688 if (
const auto *MacOStoMacCatalystMapping =
3691 iOSSDKVersion = MacOStoMacCatalystMapping->map(
3692 SDKInfo->getVersion().withoutBuild(),
3696 CmdArgs.push_back(Args.MakeArgString(
3697 (iOSSDKVersion ? *iOSSDKVersion
3704 VersionTuple SDKVersion =
SDKInfo->getVersion().withoutBuild();
3705 if (!SDKVersion.getMinor())
3706 SDKVersion = VersionTuple(SDKVersion.getMajor(), 0);
3707 CmdArgs.push_back(Args.MakeArgString(SDKVersion.getAsString()));
3718 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3727 VersionTuple TargetVariantVersion;
3735 "unexpected target variant triple");
3740 EmitPlatformVersionArg(TargetVariantVersion, Platform, Environment,
3746 ArgStringList &CmdArgs) {
3750 CmdArgs.push_back(
"-ldylib1.o");
3757 CmdArgs.push_back(
"-ldylib1.o");
3759 CmdArgs.push_back(
"-ldylib1.10.5.o");
3764 ArgStringList &CmdArgs) {
3765 if (Args.hasArg(options::OPT_static))
3770 CmdArgs.push_back(
"-lbundle1.o");
3775 ArgStringList &CmdArgs) {
3777 if (Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_object) ||
3778 Args.hasArg(options::OPT_preload)) {
3779 CmdArgs.push_back(
"-lgcrt0.o");
3781 CmdArgs.push_back(
"-lgcrt1.o");
3791 CmdArgs.push_back(
"-no_new_main");
3793 D.
getDriver().
Diag(diag::err_drv_clang_unsupported_opt_pg_darwin)
3799 ArgStringList &CmdArgs) {
3802 if (D.
getArch() == llvm::Triple::aarch64)
3805 CmdArgs.push_back(
"-lcrt1.o");
3807 CmdArgs.push_back(
"-lcrt1.3.1.o");
3814 CmdArgs.push_back(
"-lcrt1.o");
3816 CmdArgs.push_back(
"-lcrt1.10.5.o");
3818 CmdArgs.push_back(
"-lcrt1.10.6.o");
3823 ArgStringList &CmdArgs)
const {
3825 if (Args.hasArg(options::OPT_dynamiclib))
3827 else if (Args.hasArg(options::OPT_bundle))
3831 else if (Args.hasArg(options::OPT_static) ||
3832 Args.hasArg(options::OPT_object) ||
3833 Args.hasArg(options::OPT_preload))
3834 CmdArgs.push_back(
"-lcrt0.o");
3838 if (
isTargetMacOS() && Args.hasArg(options::OPT_shared_libgcc) &&
3840 const char *Str = Args.MakeArgString(
GetFilePath(
"crt3.o"));
3841 CmdArgs.push_back(Str);
3853 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
3854 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
3856 Res |= SanitizerKind::Address;
3857 Res |= SanitizerKind::PointerCompare;
3858 Res |= SanitizerKind::PointerSubtract;
3859 Res |= SanitizerKind::Realtime;
3860 Res |= SanitizerKind::Leak;
3861 Res |= SanitizerKind::Fuzzer;
3862 Res |= SanitizerKind::FuzzerNoLink;
3863 Res |= SanitizerKind::ObjCCast;
3870 Res |= SanitizerKind::Vptr;
3872 if ((IsX86_64 || IsAArch64) &&
3875 Res |= SanitizerKind::Thread;
3879 Res |= SanitizerKind::Type;
3883 Res |= SanitizerKind::NumericalStability;
Defines a function that returns the minimum OS versions supporting C++17's aligned allocation functio...
static bool hasMultipleInvocations(const llvm::Triple &Triple, const ArgList &Args)
static bool checkRemarksOptions(const Driver &D, const ArgList &Args, const llvm::Triple &Triple)
static void renderRemarksOptions(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple, const InputInfo &Input, const InputInfo &Output, const JobAction &JA)
static bool sdkSupportsBuiltinModules(const std::optional< DarwinSDKInfo > &SDKInfo)
static void addPgProfilingLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static const char * ArmMachOArchName(StringRef Arch)
static bool shouldLinkerNotDedup(bool IsLinkerOnlyAction, const ArgList &Args)
Pass -no_deduplicate to ld64 under certain conditions:
static bool hasExportSymbolDirective(const ArgList &Args)
Check if the link command contains a symbol export directive.
static void addDefaultCRTLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static void addBundleLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static llvm::VersionTuple sizedDeallocMinVersion(llvm::Triple::OSType OS)
static VersionTuple minimumMacCatalystDeploymentTarget()
static std::string getSystemOrSDKMacOSVersion(StringRef MacOSSDKVersion)
Returns the most appropriate macOS target version for the current process.
static void addDynamicLibLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static bool isObjCRuntimeLinked(const ArgList &Args)
Determine whether we are linking the ObjC runtime.
static const char * getPlatformName(Darwin::DarwinPlatformKind Platform, Darwin::DarwinEnvironmentKind Environment)
static const char * ArmMachOArchNameCPU(StringRef CPU)
static void addExportedSymbol(ArgStringList &CmdArgs, const char *Symbol)
Add an export directive for Symbol to the link command.
static StringRef getXcodeDeveloperPath(StringRef PathIntoXcode)
Take a path that speculatively points into Xcode and return the XCODE/Contents/Developer path if it i...
static void addSectalignToPage(const ArgList &Args, ArgStringList &CmdArgs, StringRef Segment, StringRef Section)
Add a sectalign directive for Segment and Section to the maximum expected page size for Darwin.
Defines types useful for describing an Objective-C runtime.
const SDKPlatformInfo & getCanonicalPlatformInfo() const
const llvm::VersionTuple & getVersion() const
The basic abstraction for the target Objective-C runtime.
bool hasNativeARC() const
Does this runtime natively provide the ARC entrypoints?
bool hasSubscripting() const
Does this runtime directly support the subscripting methods?
@ MacOSX
'macosx' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the non-fragile AB...
@ FragileMacOSX
'macosx-fragile' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the fragil...
@ iOS
'ios' is the Apple-provided NeXT-derived runtime on iOS or the iOS simulator; it is always non-fragil...
@ WatchOS
'watchos' is a variant of iOS for Apple's watchOS.
The base class of the type hierarchy.
Action - Represent an abstract compilation step to perform.
types::ID getType() const
ActionClass getKind() const
@ VerifyDebugInfoJobClass
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 SysRoot
sysroot, if present
std::string GetTemporaryDirectory(StringRef Prefix) const
GetTemporaryDirectory - Return the pathname of a temporary directory to use as part of compilation; t...
DiagnosticBuilder Diag(unsigned DiagID) const
static bool GetReleaseVersion(StringRef Str, unsigned &Major, unsigned &Minor, unsigned &Micro, bool &HadExtra)
GetReleaseVersion - Parse (([0-9]+)(.
const llvm::opt::OptTable & getOpts() 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.
bool isUsingLTO() const
Returns true if we are performing any kind of LTO.
LTOKind getLTOMode() const
Get the specific kind of LTO being performed.
bool needsStatsRt() const
bool needsMemProfRt() const
bool linkRuntimes() const
bool needsUbsanRt() const
bool needsRtsanRt() const
bool requiresMinimalRuntime() const
bool needsSharedRt() const
bool needsTysanRt() const
bool needsStableAbi() const
const char * getTypeTempSuffix(ID Id, bool CLStyle=false)
getTypeTempSuffix - Return the suffix to use when creating a temp file of this type,...
SmallVector< InputInfo, 4 > InputInfoList
bool willEmitRemarks(const llvm::opt::ArgList &Args)
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
The JSON file list parser is used to communicate input to InstallAPI.
Expected< std::optional< DarwinSDKInfo > > parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath)
Parse the SDK information from the SDKSettings.json file.
@ Result
The result type of a method or function.
const FunctionProtoType * T
llvm::VersionTuple alignedAllocMinVersion(llvm::Triple::OSType OS)
llvm::StringRef getAsString(SyncScope S)
bool(*)(llvm::ArrayRef< const char * >, llvm::raw_ostream &, llvm::raw_ostream &, bool, bool) Driver
static constexpr OSEnvPair macCatalystToMacOSPair()
Returns the os-environment mapping pair that's used to represent the Mac Catalyst -> macOS version ma...
static constexpr OSEnvPair macOStoMacCatalystPair()
Returns the os-environment mapping pair that's used to represent the macOS -> Mac Catalyst version ma...
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
static constexpr ResponseFileSupport AtFileUTF8()