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"
30#ifdef CLANG_USE_XCSELECT
41 return VersionTuple(13, 1);
57 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
58 .Cases({
"i386",
"i486",
"i486SX",
"i586",
"i686"}, llvm::Triple::x86)
59 .Cases({
"pentium",
"pentpro",
"pentIIm3",
"pentIIm5",
"pentium4"},
61 .Cases({
"x86_64",
"x86_64h"}, llvm::Triple::x86_64)
63 .Cases({
"arm",
"armv4t",
"armv5",
"armv6",
"armv6m"}, llvm::Triple::arm)
64 .Cases({
"armv7",
"armv7em",
"armv7k",
"armv7m"}, llvm::Triple::arm)
65 .Cases({
"armv7s",
"xscale"}, llvm::Triple::arm)
66 .Cases({
"armv8m.base",
"armv8m.main",
"armv8.1m.main"}, llvm::Triple::arm)
67 .Cases({
"arm64",
"arm64e"}, llvm::Triple::aarch64)
68 .Case(
"arm64_32", llvm::Triple::aarch64_32)
69 .Cases({
"amdgpu",
"amdgcn"}, llvm::Triple::amdgpu)
70 .Case(
"r600", llvm::Triple::r600)
71 .Case(
"nvptx", llvm::Triple::nvptx)
72 .Case(
"nvptx64", llvm::Triple::nvptx64)
73 .Case(
"amdil", llvm::Triple::amdil)
74 .Case(
"spir", llvm::Triple::spir)
75 .Default(llvm::Triple::UnknownArch);
79 const ArgList &Args) {
80 const llvm::Triple::ArchType
Arch = getArchTypeForMachOArchName(Str);
81 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Str);
83 if (
Arch != llvm::Triple::UnknownArch)
89 if ((
T.getOS() != llvm::Triple::Firmware) &&
90 (ArchKind == llvm::ARM::ArchKind::ARMV6M ||
91 ArchKind == llvm::ARM::ArchKind::ARMV7M ||
92 ArchKind == llvm::ARM::ArchKind::ARMV7EM ||
93 ArchKind == llvm::ARM::ArchKind::ARMV8MBaseline ||
94 ArchKind == llvm::ARM::ArchKind::ARMV8MMainline ||
95 ArchKind == llvm::ARM::ArchKind::ARMV8_1MMainline)) {
97 if (
T.getOS() == llvm::Triple::IOS)
98 for (Arg *A : Args.filtered(options::OPT_mios_version_min_EQ))
99 A->ignoreTargetSpecific();
100 if (
T.getOS() == llvm::Triple::WatchOS)
101 for (Arg *A : Args.filtered(options::OPT_mwatchos_version_min_EQ))
102 A->ignoreTargetSpecific();
103 if (
T.getOS() == llvm::Triple::TvOS)
104 for (Arg *A : Args.filtered(options::OPT_mtvos_version_min_EQ))
105 A->ignoreTargetSpecific();
107 T.setOS(llvm::Triple::UnknownOS);
108 T.setObjectFormat(llvm::Triple::MachO);
116 const char *LinkingOutput)
const {
119 ArgStringList CmdArgs;
121 assert(Inputs.size() == 1 &&
"Unexpected number of inputs.");
125 const Action *SourceAction = &JA;
127 assert(!SourceAction->
getInputs().empty() &&
"unexpected root action!");
128 SourceAction = SourceAction->
getInputs()[0];
136 if (Args.hasArg(options::OPT_fno_integrated_as)) {
137 if (!(
T.isMacOSX() &&
T.isMacOSXVersionLT(10, 7)))
138 CmdArgs.push_back(
"-Q");
142 if (SourceAction->
getType() == types::TY_Asm ||
143 SourceAction->
getType() == types::TY_PP_Asm) {
144 if (Args.hasArg(options::OPT_gstabs))
145 CmdArgs.push_back(
"--gstabs");
146 else if (Args.hasArg(options::OPT_g_Group))
147 CmdArgs.push_back(
"-g");
154 if (
T.isX86() || Args.hasArg(options::OPT_force__cpusubtype__ALL))
155 CmdArgs.push_back(
"-force_cpusubtype_ALL");
158 (((Args.hasArg(options::OPT_mkernel) ||
159 Args.hasArg(options::OPT_fapple_kext)) &&
161 Args.hasArg(options::OPT_static)))
162 CmdArgs.push_back(
"-static");
164 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
166 assert(Output.
isFilename() &&
"Unexpected lipo output.");
167 CmdArgs.push_back(
"-o");
170 assert(Input.
isFilename() &&
"Invalid input.");
175 const char *Exec = Args.MakeArgString(
getToolChain().GetProgramPath(
"as"));
177 Exec, CmdArgs, Inputs, Output));
180void darwin::MachOTool::anchor() {}
183 ArgStringList &CmdArgs)
const {
187 CmdArgs.push_back(
"-arch");
188 CmdArgs.push_back(Args.MakeArgString(ArchName));
191 if (ArchName ==
"arm")
192 CmdArgs.push_back(
"-force_cpusubtype_ALL");
196 ArgStringList &CmdArgs)
const {
206 CmdArgs.push_back(
"-arch_only");
207 CmdArgs.push_back(Args.MakeArgString(ArchName));
211 ArgStringList &CmdArgs) {
216 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
217 CmdArgs.push_back(
"-syslibroot");
218 CmdArgs.push_back(A->getValue());
219 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
220 CmdArgs.push_back(
"-syslibroot");
221 CmdArgs.push_back(A->getValue());
222 }
else if (StringRef sysroot =
C.getSysRoot(); sysroot !=
"") {
223 CmdArgs.push_back(
"-syslibroot");
224 CmdArgs.push_back(
C.getArgs().MakeArgString(sysroot));
228bool darwin::Linker::NeedsTempPath(
const InputInfoList &Inputs)
const {
232 for (
const auto &Input : Inputs)
233 if (Input.getType() != types::TY_Object)
247 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
248 if (A->getOption().matches(options::OPT_O0))
250 if (A->getOption().matches(options::OPT_O))
251 return llvm::StringSwitch<bool>(A->getValue())
257 if (!IsLinkerOnlyAction)
262void darwin::Linker::AddLinkArgs(Compilation &
C,
const ArgList &Args,
263 ArgStringList &CmdArgs,
265 VersionTuple Version,
bool LinkerIsLLD,
266 bool UsePlatformVersion)
const {
267 const Driver &D = getToolChain().getDriver();
268 const toolchains::MachO &MachOTC = getMachOToolChain();
272 if ((Version >= VersionTuple(100) || LinkerIsLLD) &&
273 !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
274 CmdArgs.push_back(
"-demangle");
276 if (Args.hasArg(options::OPT_rdynamic) &&
277 (Version >= VersionTuple(137) || LinkerIsLLD))
278 CmdArgs.push_back(
"-export_dynamic");
282 if (Args.hasFlag(options::OPT_fapplication_extension,
283 options::OPT_fno_application_extension,
false))
284 CmdArgs.push_back(
"-application_extension");
286 if (
auto LTO = getToolChain().getLTOMode(Args);
287 LTO !=
LTOK_None && (Version >= VersionTuple(116) || LinkerIsLLD) &&
288 NeedsTempPath(Inputs)) {
289 std::string TmpPathName;
300 if (!TmpPathName.empty()) {
301 auto *TmpPath =
C.getArgs().MakeArgString(TmpPathName);
302 C.addTempFile(TmpPath);
303 CmdArgs.push_back(
"-object_path_lto");
304 CmdArgs.push_back(TmpPath);
317 if (Version >= VersionTuple(133) && !LinkerIsLLD) {
319 StringRef P = llvm::sys::path::parent_path(D.
Dir);
320 SmallString<128> LibLTOPath(P);
321 llvm::sys::path::append(LibLTOPath,
"lib");
322 llvm::sys::path::append(LibLTOPath,
"libLTO.dylib");
323 CmdArgs.push_back(
"-lto_library");
324 CmdArgs.push_back(
C.getArgs().MakeArgString(LibLTOPath));
330 if (Version >= VersionTuple(262) &&
332 CmdArgs.push_back(
"-no_deduplicate");
335 Args.AddAllArgs(CmdArgs, options::OPT_static);
336 if (!Args.hasArg(options::OPT_static))
337 CmdArgs.push_back(
"-dynamic");
338 if (Args.hasArg(options::OPT_fgnu_runtime)) {
343 if (!Args.hasArg(options::OPT_dynamiclib)) {
344 AddMachOArch(Args, CmdArgs);
346 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
348 Args.AddLastArg(CmdArgs, options::OPT_bundle);
349 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
350 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
353 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
354 (A = Args.getLastArg(options::OPT_current__version)) ||
355 (A = Args.getLastArg(options::OPT_install__name)))
356 D.
Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
359 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
360 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
361 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
363 CmdArgs.push_back(
"-dylib");
366 if ((A = Args.getLastArg(options::OPT_bundle)) ||
367 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
368 (A = Args.getLastArg(options::OPT_client__name)) ||
369 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
370 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
371 (A = Args.getLastArg(options::OPT_private__bundle)))
372 D.
Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
375 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
376 "-dylib_compatibility_version");
377 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
378 "-dylib_current_version");
380 AddMachOArch(Args, CmdArgs);
382 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
383 "-dylib_install_name");
386 Args.AddLastArg(CmdArgs, options::OPT_all__load);
387 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
388 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
390 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
391 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
392 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
393 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
394 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
395 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
396 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
397 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
398 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
399 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
400 Args.AddAllArgs(CmdArgs, options::OPT_init);
403 if (Version >= VersionTuple(520) || LinkerIsLLD || UsePlatformVersion)
408 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
409 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
410 Args.AddLastArg(CmdArgs, options::OPT_single__module);
411 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
412 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
415 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
416 options::OPT_fno_pie, options::OPT_fno_PIE)) {
417 if (A->getOption().matches(options::OPT_fpie) ||
418 A->getOption().matches(options::OPT_fPIE))
419 CmdArgs.push_back(
"-pie");
421 CmdArgs.push_back(
"-no_pie");
425 if (
C.getDriver().embedBitcodeEnabled()) {
428 CmdArgs.push_back(
"-bitcode_bundle");
430 if (
C.getDriver().embedBitcodeMarkerOnly() &&
431 Version >= VersionTuple(278)) {
432 CmdArgs.push_back(
"-bitcode_process_mode");
433 CmdArgs.push_back(
"marker");
436 D.
Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
440 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
441 options::OPT_fno_global_isel)) {
442 if (A->getOption().matches(options::OPT_fglobal_isel)) {
443 CmdArgs.push_back(
"-mllvm");
444 CmdArgs.push_back(
"-global-isel");
446 CmdArgs.push_back(
"-mllvm");
447 CmdArgs.push_back(
"-global-isel-abort=0");
451 if (Args.hasArg(options::OPT_mkernel) ||
452 Args.hasArg(options::OPT_fapple_kext) ||
453 Args.hasArg(options::OPT_ffreestanding)) {
454 CmdArgs.push_back(
"-mllvm");
455 CmdArgs.push_back(
"-disable-atexit-based-global-dtor-lowering");
458 Args.AddLastArg(CmdArgs, options::OPT_prebind);
459 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
460 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
461 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
462 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
463 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
464 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
465 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
466 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
467 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
468 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
469 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
470 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
471 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
472 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
473 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
477 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
478 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
479 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
480 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
481 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
482 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
483 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
484 Args.AddAllArgs(CmdArgs, options::OPT_y);
485 Args.AddLastArg(CmdArgs, options::OPT_w);
486 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
487 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
488 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
489 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
490 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
491 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
492 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
493 Args.AddLastArg(CmdArgs, options::OPT_why_load);
494 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
495 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
496 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
497 Args.AddLastArg(CmdArgs, options::OPT_Mach);
501 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
503 : CSPGOGenerateArg->getValue());
504 llvm::sys::path::append(Path,
"default_%m.profraw");
505 CmdArgs.push_back(
"--cs-profile-generate");
506 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
508 SmallString<128> Path(
509 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
510 if (Path.empty() || llvm::sys::fs::is_directory(Path))
511 llvm::sys::path::append(Path,
"default.profdata");
512 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
515 auto *CodeGenDataGenArg =
516 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
517 if (CodeGenDataGenArg)
519 Args.MakeArgString(Twine(
"--codegen-data-generate-path=") +
520 CodeGenDataGenArg->getValue()));
523 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
525 : CSPGOGenerateArg->getValue());
526 llvm::sys::path::append(Path,
"default_%m.profraw");
527 CmdArgs.push_back(
"-mllvm");
528 CmdArgs.push_back(
"-cs-profile-generate");
529 CmdArgs.push_back(
"-mllvm");
530 CmdArgs.push_back(Args.MakeArgString(Twine(
"-cs-profile-path=") + Path));
532 SmallString<128> Path(
533 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
534 if (Path.empty() || llvm::sys::fs::is_directory(Path))
535 llvm::sys::path::append(Path,
"default.profdata");
536 CmdArgs.push_back(
"-mllvm");
537 CmdArgs.push_back(Args.MakeArgString(Twine(
"-cs-profile-path=") + Path));
542 CmdArgs.push_back(
"-mllvm");
544 Args.MakeArgString(Twine(
"-sample-profile-file=") + A->getValue()));
551 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
554 return Args.hasArg(options::OPT_fobjc_link_runtime);
558 const llvm::Triple &Triple) {
563 Args.getAllArgValues(options::OPT_arch).size() > 1;
564 bool hasExplicitOutputFile =
565 Args.getLastArg(options::OPT_foptimization_record_file_EQ);
567 D.
Diag(diag::err_drv_invalid_output_with_multiple_archs)
568 <<
"-foptimization-record-file";
575 const llvm::Triple &Triple,
577 StringRef Format =
"yaml";
578 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
579 Format = A->getValue();
581 CmdArgs.push_back(
"-mllvm");
582 CmdArgs.push_back(
"-lto-pass-remarks-output");
583 CmdArgs.push_back(
"-mllvm");
585 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
587 CmdArgs.push_back(A->getValue());
589 assert(Output.
isFilename() &&
"Unexpected ld output.");
595 CmdArgs.push_back(Args.MakeArgString(F));
599 Args.getLastArg(options::OPT_foptimization_record_passes_EQ)) {
600 CmdArgs.push_back(
"-mllvm");
602 std::string(
"-lto-pass-remarks-filter=") + A->getValue();
603 CmdArgs.push_back(Args.MakeArgString(Passes));
606 if (!Format.empty()) {
607 CmdArgs.push_back(
"-mllvm");
608 Twine FormatArg = Twine(
"-lto-pass-remarks-format=") + Format;
609 CmdArgs.push_back(Args.MakeArgString(FormatArg));
613 CmdArgs.push_back(
"-mllvm");
614 CmdArgs.push_back(
"-lto-pass-remarks-with-hotness");
617 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
618 CmdArgs.push_back(
"-mllvm");
620 std::string(
"-lto-pass-remarks-hotness-threshold=") + A->getValue();
621 CmdArgs.push_back(Args.MakeArgString(Opt));
630 const char *LinkingOutput)
const {
631 assert((Output.
getType() == types::TY_Image ||
632 Output.
getType() == types::TY_Object) &&
633 "Invalid linker output type.");
639 llvm::opt::ArgStringList InputFileList;
644 ArgStringList CmdArgs;
650 Args.MakeArgString(
getToolChain().GetLinkerPath(&LinkerIsLLD));
654 bool UsePlatformVersion = Triple.isXROS() || Triple.isOSFirmware();
658 AddLinkArgs(
C, Args, CmdArgs, Inputs, Version, LinkerIsLLD,
668 Args.getLastArg(options::OPT_moutline, options::OPT_mno_outline)) {
669 if (A->getOption().matches(options::OPT_moutline)) {
671 CmdArgs.push_back(
"-mllvm");
672 CmdArgs.push_back(
"-enable-machine-outliner");
678 CmdArgs.push_back(
"-mllvm");
679 CmdArgs.push_back(
"-enable-machine-outliner=never");
686 CmdArgs.push_back(
"-mllvm");
687 CmdArgs.push_back(
"-enable-linkonceodr-outlining");
690 auto *CodeGenDataGenArg =
691 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
692 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
696 if (CodeGenDataGenArg && CodeGenDataUseArg)
697 D.
Diag(diag::err_drv_argument_not_allowed_with)
698 << CodeGenDataGenArg->getAsString(Args)
699 << CodeGenDataUseArg->getAsString(Args);
703 if (CodeGenDataGenArg) {
704 CmdArgs.push_back(
"-mllvm");
705 CmdArgs.push_back(
"-codegen-data-generate");
709 if (CodeGenDataUseArg) {
710 CmdArgs.push_back(
"-mllvm");
711 CmdArgs.push_back(Args.MakeArgString(Twine(
"-codegen-data-use-path=") +
712 CodeGenDataUseArg->getValue()));
718 if (!StatsFile.empty()) {
719 CmdArgs.push_back(
"-mllvm");
720 CmdArgs.push_back(Args.MakeArgString(
"-lto-stats-file=" + StatsFile.str()));
724 if (Args.hasArg(options::OPT_fstack_usage)) {
726 llvm::sys::path::replace_extension(StackUsageFile,
"su");
727 CmdArgs.push_back(
"-mllvm");
729 Args.MakeArgString(
"-stack-usage-file=" + StackUsageFile));
734 Args.addAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
735 options::OPT_Z_Flag, options::OPT_u_Group});
740 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
741 CmdArgs.push_back(
"-ObjC");
743 CmdArgs.push_back(
"-o");
746 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
749 Args.AddAllArgs(CmdArgs, options::OPT_L);
754 for (
const auto &II : Inputs) {
755 if (!II.isFilename()) {
760 if (InputFileList.size() > 0)
766 InputFileList.push_back(II.getFilename());
772 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
773 getToolChain().addFortranRuntimeLibraryPath(Args, CmdArgs);
777 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
781 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
785 CmdArgs.push_back(
"-framework");
786 CmdArgs.push_back(
"Foundation");
788 CmdArgs.push_back(
"-lobjc");
792 CmdArgs.push_back(
"-arch_multiple");
793 CmdArgs.push_back(
"-final_output");
794 CmdArgs.push_back(LinkingOutput);
797 if (Args.hasArg(options::OPT_fnested_functions))
798 CmdArgs.push_back(
"-allow_stack_execute");
803 if (!Parallelism.empty()) {
804 CmdArgs.push_back(
"-mllvm");
805 unsigned NumThreads =
806 llvm::get_threadpool_strategy(Parallelism)->compute_thread_count();
807 CmdArgs.push_back(Args.MakeArgString(
"-threads=" + Twine(NumThreads)));
813 bool NoStdOrDefaultLibs =
814 Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
815 bool ForceLinkBuiltins = Args.hasArg(options::OPT_fapple_link_rtlib);
816 if (!NoStdOrDefaultLibs || ForceLinkBuiltins) {
821 if (NoStdOrDefaultLibs && ForceLinkBuiltins) {
829 Args.ClaimAllArgs(options::OPT_pthread);
830 Args.ClaimAllArgs(options::OPT_pthreads);
834 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
838 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
839 Args.AddAllArgs(CmdArgs, options::OPT_F);
842 for (
const Arg *A : Args.filtered(options::OPT_iframework))
843 CmdArgs.push_back(Args.MakeArgString(std::string(
"-F") + A->getValue()));
845 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
846 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
847 if (A->getValue() == StringRef(
"Accelerate")) {
848 CmdArgs.push_back(
"-framework");
849 CmdArgs.push_back(
"Accelerate");
858 bool NonStandardSearchPath =
false;
860 if (Triple.isDriverKit()) {
862 NonStandardSearchPath =
863 Version.getMajor() < 605 ||
864 (Version.getMajor() == 605 && Version.getMinor().value_or(0) < 1);
869 if (NonStandardSearchPath) {
870 if (
auto *Sysroot = Args.getLastArg(options::OPT_isysroot)) {
871 auto AddSearchPath = [&](StringRef Flag, StringRef SearchPath) {
874 llvm::sys::path::append(P, SearchPath);
876 CmdArgs.push_back(Args.MakeArgString(Flag + P));
879 AddSearchPath(
"-L",
"/usr/lib");
880 AddSearchPath(
"-F",
"/System/Library/Frameworks");
886 if (Version >= VersionTuple(705) || LinkerIsLLD) {
894 std::unique_ptr<Command> Cmd = std::make_unique<Command>(
895 JA, *
this, ResponseSupport, Exec, CmdArgs, Inputs, Output);
896 Cmd->setInputFileList(std::move(InputFileList));
897 C.addCommand(std::move(Cmd));
904 const char *LinkingOutput)
const {
908 Args.ClaimAllArgs(options::OPT_g_Group);
910 Args.ClaimAllArgs(options::OPT_emit_llvm);
913 Args.ClaimAllArgs(options::OPT_w);
915 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
917 ArgStringList CmdArgs;
918 CmdArgs.push_back(
"-static");
920 if (Args.hasArg(options::OPT_static_lib_target_arch_only))
923 if (Args.hasFlag(options::OPT_static_lib_deterministic,
924 options::OPT_no_static_lib_deterministic,
926 CmdArgs.push_back(
"-D");
929 Args.AddAllArgs(CmdArgs, options::OPT_L);
930 Args.AddAllArgs(CmdArgs, options::OPT_F);
933 for (
const Arg *A : Args.filtered(options::OPT_iframework))
934 CmdArgs.push_back(Args.MakeArgString(std::string(
"-F") + A->getValue()));
936 if (!Args.hasFlag(options::OPT_static_lib_warn_no_symbols,
937 options::OPT_no_static_lib_warn_no_symbols,
939 CmdArgs.push_back(
"-no_warning_for_no_symbols");
941 Args.AddAllArgValues(CmdArgs, options::OPT_Xstatic_lib_tool);
943 CmdArgs.push_back(
"-o");
948 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
950 for (
const auto &II : Inputs) {
952 if (II.isFilename()) {
953 CmdArgs.push_back(II.getFilename());
962 const Arg &A = II.getInputArg();
966 if (A.getOption().matches(options::OPT_filelist) ||
967 A.getOption().matches(options::OPT_l) ||
968 A.getOption().matches(options::OPT_framework))
969 A.renderAsInput(Args, CmdArgs);
971 D.
Diag(diag::warn_drv_unused_argument) << A.getAsString(Args);
977 if (Output.
isFilename() && llvm::sys::fs::exists(OutputFileName)) {
978 if (std::error_code EC = llvm::sys::fs::remove(OutputFileName)) {
979 D.
Diag(diag::err_drv_unable_to_remove_file) << EC.message();
984 const char *Exec = Args.MakeArgString(
getToolChain().GetStaticLibToolPath());
985 C.addCommand(std::make_unique<Command>(JA, *
this,
987 Exec, CmdArgs, Inputs, Output));
994 const char *LinkingOutput)
const {
995 ArgStringList CmdArgs;
997 CmdArgs.push_back(
"-create");
998 assert(Output.
isFilename() &&
"Unexpected lipo output.");
1000 CmdArgs.push_back(
"-output");
1003 for (
const auto &II : Inputs) {
1004 assert(II.isFilename() &&
"Unexpected lipo input.");
1005 CmdArgs.push_back(II.getFilename());
1008 StringRef LipoName = Args.getLastArgValue(options::OPT_fuse_lipo_EQ,
"lipo");
1010 Args.MakeArgString(
getToolChain().GetProgramPath(LipoName.data()));
1012 Exec, CmdArgs, Inputs, Output));
1018 const ArgList &Args,
1019 const char *LinkingOutput)
const {
1020 ArgStringList CmdArgs;
1022 CmdArgs.push_back(
"-o");
1025 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
1027 assert(Input.
isFilename() &&
"Unexpected dsymutil input.");
1031 Args.MakeArgString(
getToolChain().GetProgramPath(
"dsymutil"));
1033 Exec, CmdArgs, Inputs, Output));
1039 const ArgList &Args,
1040 const char *LinkingOutput)
const {
1041 ArgStringList CmdArgs;
1042 CmdArgs.push_back(
"--verify");
1043 CmdArgs.push_back(
"--debug-info");
1044 CmdArgs.push_back(
"--eh-frame");
1045 CmdArgs.push_back(
"--quiet");
1047 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
1049 assert(Input.
isFilename() &&
"Unexpected verify input");
1055 Args.MakeArgString(
getToolChain().GetProgramPath(
"dwarfdump"));
1057 Exec, CmdArgs, Inputs, Output));
1067 const ArgList &Args)
1079 if (Ty == types::TY_PP_Asm)
1080 return types::TY_Asm;
1100 auto T = llvm::Triple(Twine(
"arm64-apple-") +
1101 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
1125 ArgStringList &CC1Args)
const {
1130 ArgStringList &CC1Args)
const {
1135 ArgStringList &CC1Args)
const {
1144 return llvm::StringSwitch<const char *>(
Arch)
1145 .Case(
"armv6k",
"armv6")
1146 .Case(
"armv6m",
"armv6m")
1147 .Case(
"armv5tej",
"armv5")
1148 .Case(
"xscale",
"xscale")
1149 .Case(
"armv4t",
"armv4t")
1150 .Case(
"armv7",
"armv7")
1151 .Cases({
"armv7a",
"armv7-a"},
"armv7")
1152 .Cases({
"armv7r",
"armv7-r"},
"armv7")
1153 .Cases({
"armv7em",
"armv7e-m"},
"armv7em")
1154 .Cases({
"armv7k",
"armv7-k"},
"armv7k")
1155 .Cases({
"armv7m",
"armv7-m"},
"armv7m")
1156 .Cases({
"armv7s",
"armv7-s"},
"armv7s")
1157 .Cases({
"armv8-m.base",
"armv8m.base"},
"armv8m.base")
1158 .Cases({
"armv8-m.main",
"armv8m.main"},
"armv8m.main")
1159 .Cases({
"armv8.1-m.main",
"armv8m.main"},
"armv8.1m.main")
1164 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseCPUArch(CPU);
1165 if (ArchKind == llvm::ARM::ArchKind::INVALID)
1167 StringRef
Arch = llvm::ARM::getArchName(ArchKind);
1171 if (
Arch.starts_with(
"armv5"))
1174 else if (
Arch.starts_with(
"armv6") && !
Arch.ends_with(
"6m"))
1177 else if (
Arch.ends_with(
"v7a"))
1187 case llvm::Triple::aarch64_32:
1190 case llvm::Triple::aarch64: {
1196 case llvm::Triple::thumb:
1197 case llvm::Triple::arm:
1198 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1202 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1211 if (LinkerVersion) {
1213 VersionTuple NewLinkerVersion;
1214 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ))
1215 (void)NewLinkerVersion.tryParse(A->getValue());
1216 assert(NewLinkerVersion == LinkerVersion);
1218 return *LinkerVersion;
1221 VersionTuple NewLinkerVersion;
1222 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1225 if (NewLinkerVersion.tryParse(A->getValue()) ||
1226 NewLinkerVersion.getSubbuild())
1228 << A->getAsString(Args);
1231 LinkerVersion = NewLinkerVersion;
1232 return *LinkerVersion;
1241 llvm::Triple::OSType OS =
getTriple().getOS();
1245 case llvm::Triple::Darwin:
1246 case llvm::Triple::MacOSX:
1249 case llvm::Triple::IOS:
1252 case llvm::Triple::TvOS:
1255 case llvm::Triple::WatchOS:
1258 case llvm::Triple::XROS:
1261 case llvm::Triple::DriverKit:
1270 if (
getTriple().isSimulatorEnvironment())
1272 else if (
getTriple().isMacCatalystEnvironment())
1276 if (Platform ==
MacOS) {
1280 if (!
getTriple().getMacOSXVersion(OsVer))
1285 setTarget(Platform, Environment, OsVer.getMajor(),
1286 OsVer.getMinor().value_or(0), OsVer.getSubminor().value_or(0),
1298void Darwin::VerifyTripleForSDK(
const llvm::opt::ArgList &Args,
1299 const llvm::Triple &Triple)
const {
1301 if (!
SDKInfo->supportsTriple(Triple))
1303 <<
SDKInfo->getDisplayName() << Triple.getTriple();
1304 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
1307 const char *isysroot = A->getValue();
1309 if (!SDKName.empty()) {
1310 bool supported =
true;
1311 if (Triple.isWatchOS())
1312 supported = SDKName.starts_with(
"Watch");
1313 else if (Triple.isTvOS())
1314 supported = SDKName.starts_with(
"AppleTV");
1315 else if (Triple.isDriverKit())
1316 supported = SDKName.starts_with(
"DriverKit");
1317 else if (Triple.isiOS())
1318 supported = SDKName.starts_with(
"iPhone");
1319 else if (Triple.isMacOSX())
1320 supported = SDKName.starts_with(
"MacOSX");
1326 << SDKName << Triple.getTriple();
1343 return Triple.getTriple();
1355 Str += llvm::Triple::getOSTypeName(llvm::Triple::XROS);
1357 Str += llvm::Triple::getOSTypeName(llvm::Triple::Firmware);
1361 Triple.setOSName(Str);
1363 VerifyTripleForSDK(Args, Triple);
1365 return Triple.getTriple();
1377 return Dsymutil.get();
1381 return VerifyDebug.get();
1398 const ArgList &Args)
1399 :
Darwin(D, Triple, Args) {}
1403 CC1Args.push_back(
"-Wundef-prefix=TARGET_OS_");
1404 CC1Args.push_back(
"-Werror=undef-prefix");
1415 CC1Args.push_back(
"-Wdeprecated-objc-isa-usage");
1416 CC1Args.push_back(
"-Werror=deprecated-objc-isa-usage");
1421 CC1Args.push_back(
"-Werror=implicit-function-declaration");
1426 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
1436 static constexpr llvm::StringLiteral XcodeAppSuffix(
1437 ".app/Contents/Developer");
1438 size_t Index = PathIntoXcode.find(XcodeAppSuffix);
1439 if (Index == StringRef::npos)
1441 return PathIntoXcode.take_front(Index + XcodeAppSuffix.size());
1445 ArgStringList &CmdArgs)
const {
1464 llvm::sys::path::remove_filename(P);
1465 llvm::sys::path::remove_filename(P);
1466 llvm::sys::path::append(P,
"lib",
"arc");
1472 if (!
getVFS().exists(P)) {
1473 auto updatePath = [&](
const Arg *A) {
1477 if (XcodePathForSDK.empty())
1480 P = XcodePathForSDK;
1481 llvm::sys::path::append(P,
"Toolchains/XcodeDefault.xctoolchain/usr",
1483 return getVFS().exists(P);
1486 bool updated =
false;
1487 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot))
1488 updated = updatePath(A);
1491 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1496 CmdArgs.push_back(
"-force_load");
1497 llvm::sys::path::append(P,
"libarclite_");
1500 P +=
"watchsimulator";
1504 P +=
"appletvsimulator";
1508 P +=
"iphonesimulator";
1516 getDriver().
Diag(clang::diag::err_drv_darwin_sdk_missing_arclite) << P;
1518 CmdArgs.push_back(Args.MakeArgString(P));
1555 bool IsShared)
const {
1563 const char *LibArg = Args.MakeArgString(P);
1564 CmdArgs.push_back(LibArg);
1572 assert(StringRef(P).ends_with(
".dylib") &&
"must be a dynamic library");
1576 CmdArgs.push_back(
"-rpath");
1577 CmdArgs.push_back(
"@executable_path");
1581 CmdArgs.push_back(
"-rpath");
1582 CmdArgs.push_back(Args.MakeArgString(llvm::sys::path::parent_path(P)));
1589 "it doesn't make sense to ask for the compiler-rt library name as an "
1593 if (Component !=
"builtins") {
1594 MachOLibName +=
'.';
1595 MachOLibName += Component;
1600 llvm::sys::path::append(FullPath,
"lib",
"darwin",
"macho_embedded",
1602 return std::string(FullPath);
1612 "it doesn't make sense to ask for the compiler-rt library name as an "
1616 if (Component !=
"builtins") {
1617 DarwinLibName += Component;
1618 DarwinLibName +=
'_';
1624 llvm::sys::path::append(FullPath,
"lib",
"darwin", DarwinLibName);
1625 return std::string(FullPath);
1630 auto BeginSDK = llvm::sys::path::rbegin(isysroot);
1631 auto EndSDK = llvm::sys::path::rend(isysroot);
1632 for (
auto IT = BeginSDK; IT != EndSDK; ++IT) {
1633 StringRef SDK = *IT;
1634 if (SDK.consume_back(
".sdk"))
1664 llvm_unreachable(
"Unsupported platform");
1669 for (Arg *A : Args) {
1670 if (A->getOption().matches(options::OPT_exported__symbols__list))
1672 if (!A->getOption().matches(options::OPT_Wl_COMMA) &&
1673 !A->getOption().matches(options::OPT_Xlinker))
1675 if (A->containsValue(
"-exported_symbols_list") ||
1676 A->containsValue(
"-exported_symbol"))
1684 CmdArgs.push_back(
"-exported_symbol");
1685 CmdArgs.push_back(Symbol);
1695 StringRef Segment, StringRef Section) {
1696 for (
const char *A : {
"-sectalign", Args.MakeArgString(Segment),
1697 Args.MakeArgString(Section),
"0x4000"})
1698 CmdArgs.push_back(A);
1702 ArgStringList &CmdArgs)
const {
1731 for (
auto IPSK : {llvm::IPSK_cnts, llvm::IPSK_bitmap, llvm::IPSK_data}) {
1733 Args, CmdArgs,
"__DATA",
1734 llvm::getInstrProfSectionName(IPSK, llvm::Triple::MachO,
1740void DarwinClang::AddLinkSanitizerLibArgs(
const ArgList &Args,
1741 ArgStringList &CmdArgs,
1742 StringRef Sanitizer,
1743 bool Shared)
const {
1749 const ArgList &Args)
const {
1750 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
1751 StringRef
Value = A->getValue();
1752 if (
Value !=
"compiler-rt" &&
Value !=
"platform")
1753 getDriver().
Diag(clang::diag::err_drv_unsupported_rtlib_for_platform)
1754 <<
Value <<
"darwin";
1761 ArgStringList &CmdArgs,
1762 bool ForceLinkBuiltinRT)
const {
1772 if (Args.hasArg(options::OPT_static) ||
1773 Args.hasArg(options::OPT_fapple_kext) ||
1774 Args.hasArg(options::OPT_mkernel)) {
1775 if (ForceLinkBuiltinRT)
1783 if (
const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
1784 getDriver().
Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
1791 const char *sanitizer =
nullptr;
1793 sanitizer =
"UndefinedBehaviorSanitizer";
1795 sanitizer =
"RealtimeSanitizer";
1797 sanitizer =
"AddressSanitizer";
1799 sanitizer =
"ThreadSanitizer";
1802 getDriver().
Diag(diag::err_drv_unsupported_static_sanitizer_darwin)
1811 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan_abi",
false);
1814 "Static sanitizer runtimes not supported");
1815 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan");
1820 "Static sanitizer runtimes not supported");
1821 AddLinkSanitizerLibArgs(Args, CmdArgs,
"rtsan");
1824 AddLinkSanitizerLibArgs(Args, CmdArgs,
"lsan");
1827 "Static sanitizer runtimes not supported");
1828 AddLinkSanitizerLibArgs(
1834 "Static sanitizer runtimes not supported");
1835 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tsan");
1838 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tysan");
1839 if (Sanitize.
needsFuzzer() && !Args.hasArg(options::OPT_dynamiclib)) {
1840 AddLinkSanitizerLibArgs(Args, CmdArgs,
"fuzzer",
false);
1852 AddLinkSanitizerLibArgs(Args, CmdArgs,
"stats");
1860 llvm::memprof::getMemprofOptionsSymbolDarwinLinkageName().data());
1870 CmdArgs.push_back(
"-framework");
1871 CmdArgs.push_back(
"DriverKit");
1877 CmdArgs.push_back(
"-lSystem");
1889 CmdArgs.push_back(
"-lgcc_s.1");
1898 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
1899 if (!SystemTriple.isMacOSX())
1900 return std::string(MacOSSDKVersion);
1901 VersionTuple SystemVersion;
1902 SystemTriple.getMacOSXVersion(SystemVersion);
1904 unsigned Major, Minor, Micro;
1908 return std::string(MacOSSDKVersion);
1909 VersionTuple SDKVersion(Major, Minor, Micro);
1911 if (SDKVersion > SystemVersion)
1912 return SystemVersion.getAsString();
1913 return std::string(MacOSSDKVersion);
1920struct DarwinPlatform {
1929 DeploymentTargetEnv,
1939 DarwinPlatformKind getPlatform()
const {
return Platform; }
1941 DarwinEnvironmentKind getEnvironment()
const {
return Environment; }
1943 void setEnvironment(DarwinEnvironmentKind Kind) {
1945 InferSimulatorFromArch =
false;
1948 const VersionTuple getOSVersion()
const {
1949 return UnderlyingOSVersion.value_or(VersionTuple());
1952 VersionTuple takeOSVersion() {
1953 assert(UnderlyingOSVersion.has_value() &&
1954 "attempting to get an unset OS version");
1955 VersionTuple
Result = *UnderlyingOSVersion;
1956 UnderlyingOSVersion.reset();
1959 bool isValidOSVersion()
const {
1960 return llvm::Triple::isValidVersionForOS(getOSFromPlatform(Platform),
1964 VersionTuple getCanonicalOSVersion()
const {
1965 return llvm::Triple::getCanonicalVersionForOS(
1966 getOSFromPlatform(Platform), getOSVersion(),
true);
1969 void setOSVersion(
const VersionTuple &Version) {
1970 UnderlyingOSVersion = Version;
1973 bool hasOSVersion()
const {
return UnderlyingOSVersion.has_value(); }
1975 VersionTuple getZipperedOSVersion()
const {
1976 assert(Environment == DarwinEnvironmentKind::MacCatalyst &&
1977 "zippered target version is specified only for Mac Catalyst");
1978 return ZipperedOSVersion;
1982 bool isExplicitlySpecified()
const {
return Kind <= DeploymentTargetEnv; }
1985 bool canInferSimulatorFromArch()
const {
return InferSimulatorFromArch; }
1987 const std::optional<llvm::Triple> &getTargetVariantTriple()
const {
1988 return TargetVariantTriple;
1992 void addOSVersionMinArgument(DerivedArgList &Args,
const OptTable &Opts) {
1996 assert(Kind != TargetArg && Kind != MTargetOSArg && Kind != OSVersionArg &&
2000 case DarwinPlatformKind::MacOS:
2001 Opt = options::OPT_mmacos_version_min_EQ;
2003 case DarwinPlatformKind::IPhoneOS:
2004 Opt = options::OPT_mios_version_min_EQ;
2006 case DarwinPlatformKind::TvOS:
2007 Opt = options::OPT_mtvos_version_min_EQ;
2009 case DarwinPlatformKind::WatchOS:
2010 Opt = options::OPT_mwatchos_version_min_EQ;
2016 Arg = Args.MakeJoinedArg(
nullptr, Opts.getOption(Opt), OSVersionStr);
2022 std::string
getAsString(DerivedArgList &Args,
const OptTable &Opts) {
2028 assert(Arg &&
"OS version argument not yet inferred");
2029 return Arg->getAsString(Args);
2030 case DeploymentTargetEnv:
2031 return (llvm::Twine(EnvVarName) +
"=" + OSVersionStr).str();
2032 case InferredFromSDK:
2033 case InferredFromArch:
2034 llvm_unreachable(
"Cannot print arguments for inferred OS version");
2036 llvm_unreachable(
"Unsupported Darwin Source Kind");
2040 std::string getInferredSource() {
2041 assert(!isExplicitlySpecified() &&
"OS version was not inferred");
2042 return InferredSource.str();
2045 void setEnvironment(llvm::Triple::EnvironmentType EnvType,
2046 const VersionTuple &OSVersion,
2047 const std::optional<DarwinSDKInfo> &SDKInfo) {
2049 case llvm::Triple::Simulator:
2050 Environment = DarwinEnvironmentKind::Simulator;
2052 case llvm::Triple::MacABI: {
2053 Environment = DarwinEnvironmentKind::MacCatalyst;
2055 ZipperedOSVersion = VersionTuple(10, 15);
2056 if (hasOSVersion() && SDKInfo) {
2057 if (
const auto *MacCatalystToMacOSMapping = SDKInfo->getVersionMapping(
2059 if (
auto MacOSVersion = MacCatalystToMacOSMapping->map(
2060 OSVersion, ZipperedOSVersion, std::nullopt)) {
2061 ZipperedOSVersion = *MacOSVersion;
2068 if (TargetVariantTriple) {
2069 auto TargetVariantVersion = TargetVariantTriple->getOSVersion();
2070 if (TargetVariantVersion.getMajor()) {
2071 if (TargetVariantVersion < ZipperedOSVersion)
2072 ZipperedOSVersion = std::move(TargetVariantVersion);
2082 static DarwinPlatform
2083 createFromTarget(
const llvm::Triple &TT, Arg *A,
2084 std::optional<llvm::Triple> TargetVariantTriple,
2085 const std::optional<DarwinSDKInfo> &SDKInfo) {
2086 DarwinPlatform
Result(TargetArg, getPlatformFromOS(TT.getOS()),
2087 TT.getOSVersion(), A);
2088 VersionTuple OsVersion = TT.getOSVersion();
2089 Result.TargetVariantTriple = std::move(TargetVariantTriple);
2090 Result.setEnvironment(TT.getEnvironment(), OsVersion, SDKInfo);
2093 static DarwinPlatform
2094 createFromMTargetOS(llvm::Triple::OSType OS, VersionTuple OSVersion,
2095 llvm::Triple::EnvironmentType Environment, Arg *A,
2096 const std::optional<DarwinSDKInfo> &SDKInfo) {
2097 DarwinPlatform
Result(MTargetOSArg, getPlatformFromOS(OS), OSVersion, A);
2098 Result.InferSimulatorFromArch =
false;
2099 Result.setEnvironment(Environment, OSVersion, SDKInfo);
2102 static DarwinPlatform createOSVersionArg(DarwinPlatformKind Platform, Arg *A,
2104 DarwinPlatform
Result{OSVersionArg, Platform,
2105 getVersionFromString(A->getValue()), A};
2107 Result.Environment = DarwinEnvironmentKind::Simulator;
2110 static DarwinPlatform createDeploymentTargetEnv(DarwinPlatformKind Platform,
2111 StringRef EnvVarName,
2112 StringRef OSVersion) {
2113 DarwinPlatform
Result(DeploymentTargetEnv, Platform,
2114 getVersionFromString(OSVersion));
2115 Result.EnvVarName = EnvVarName;
2118 static DarwinPlatform createFromSDKInfo(StringRef SDKRoot,
2119 const DarwinSDKInfo &SDKInfo) {
2121 const llvm::Triple::OSType
OS = PlatformTriple.getOS();
2123 if (OS == llvm::Triple::MacOSX)
2124 Version = getVersionFromString(
2126 DarwinPlatform
Result(InferredFromSDK, getPlatformFromOS(OS), Version);
2127 Result.Environment = getEnvKindFromEnvType(PlatformTriple.getEnvironment());
2128 Result.InferSimulatorFromArch =
false;
2129 Result.InferredSource = SDKRoot;
2132 static DarwinPlatform createFromSDK(StringRef SDKRoot,
2133 DarwinPlatformKind Platform,
2135 bool IsSimulator =
false) {
2136 DarwinPlatform
Result(InferredFromSDK, Platform,
2137 getVersionFromString(
Value));
2139 Result.Environment = DarwinEnvironmentKind::Simulator;
2140 Result.InferSimulatorFromArch =
false;
2141 Result.InferredSource = SDKRoot;
2144 static DarwinPlatform createFromArch(StringRef
Arch, llvm::Triple::OSType OS,
2145 VersionTuple Version) {
2147 DarwinPlatform(InferredFromArch, getPlatformFromOS(OS), Version);
2155 DarwinSDKInfo inferSDKInfo() {
2156 assert(Kind == InferredFromSDK &&
"can infer SDK info only");
2157 llvm::Triple::OSType
OS = getOSFromPlatform(Platform);
2158 llvm::Triple::EnvironmentType EnvironmentType =
2159 getEnvTypeFromEnvKind(Environment);
2160 return DarwinSDKInfo(OS, EnvironmentType, getOSVersion(),
2161 getDisplayName(Platform, Environment, getOSVersion()),
2163 VersionTuple(getOSVersion().getMajor(), 0, 99));
2167 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform, Arg *Argument)
2169 Arguments({Argument, VersionTuple().getAsString()}) {}
2170 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform,
2171 VersionTuple
Value, Arg *Argument =
nullptr)
2175 UnderlyingOSVersion =
Value;
2178 static VersionTuple getVersionFromString(
const StringRef Input) {
2179 llvm::VersionTuple Version;
2180 bool IsValid = !Version.tryParse(Input);
2181 assert(IsValid &&
"unable to convert input version to version tuple");
2186 static DarwinPlatformKind getPlatformFromOS(llvm::Triple::OSType OS) {
2188 case llvm::Triple::Darwin:
2189 case llvm::Triple::MacOSX:
2190 return DarwinPlatformKind::MacOS;
2191 case llvm::Triple::IOS:
2192 return DarwinPlatformKind::IPhoneOS;
2193 case llvm::Triple::TvOS:
2194 return DarwinPlatformKind::TvOS;
2195 case llvm::Triple::WatchOS:
2196 return DarwinPlatformKind::WatchOS;
2197 case llvm::Triple::XROS:
2198 return DarwinPlatformKind::XROS;
2199 case llvm::Triple::DriverKit:
2200 return DarwinPlatformKind::DriverKit;
2201 case llvm::Triple::Firmware:
2202 return DarwinPlatformKind::Firmware;
2204 llvm_unreachable(
"Unable to infer Darwin variant");
2208 static llvm::Triple::OSType getOSFromPlatform(DarwinPlatformKind Platform) {
2210 case DarwinPlatformKind::MacOS:
2211 return llvm::Triple::MacOSX;
2212 case DarwinPlatformKind::IPhoneOS:
2213 return llvm::Triple::IOS;
2214 case DarwinPlatformKind::TvOS:
2215 return llvm::Triple::TvOS;
2216 case DarwinPlatformKind::WatchOS:
2217 return llvm::Triple::WatchOS;
2218 case DarwinPlatformKind::DriverKit:
2219 return llvm::Triple::DriverKit;
2220 case DarwinPlatformKind::XROS:
2221 return llvm::Triple::XROS;
2222 case DarwinPlatformKind::Firmware:
2223 return llvm::Triple::Firmware;
2225 llvm_unreachable(
"Unknown DarwinPlatformKind enum");
2228 static DarwinEnvironmentKind
2229 getEnvKindFromEnvType(llvm::Triple::EnvironmentType EnvironmentType) {
2230 switch (EnvironmentType) {
2231 case llvm::Triple::UnknownEnvironment:
2232 return DarwinEnvironmentKind::NativeEnvironment;
2233 case llvm::Triple::Simulator:
2234 return DarwinEnvironmentKind::Simulator;
2235 case llvm::Triple::MacABI:
2236 return DarwinEnvironmentKind::MacCatalyst;
2238 llvm_unreachable(
"Unable to infer Darwin environment");
2242 static llvm::Triple::EnvironmentType
2243 getEnvTypeFromEnvKind(DarwinEnvironmentKind EnvironmentKind) {
2244 switch (EnvironmentKind) {
2245 case DarwinEnvironmentKind::NativeEnvironment:
2246 return llvm::Triple::UnknownEnvironment;
2247 case DarwinEnvironmentKind::Simulator:
2248 return llvm::Triple::Simulator;
2249 case DarwinEnvironmentKind::MacCatalyst:
2250 return llvm::Triple::MacABI;
2252 llvm_unreachable(
"Unknown DarwinEnvironmentKind enum");
2255 static std::string getDisplayName(DarwinPlatformKind TargetPlatform,
2256 DarwinEnvironmentKind TargetEnvironment,
2257 VersionTuple Version) {
2258 SmallVector<std::string, 3> Components;
2259 switch (TargetPlatform) {
2260 case DarwinPlatformKind::MacOS:
2261 Components.push_back(
"macOS");
2263 case DarwinPlatformKind::IPhoneOS:
2264 Components.push_back(
"iOS");
2266 case DarwinPlatformKind::TvOS:
2267 Components.push_back(
"tvOS");
2269 case DarwinPlatformKind::WatchOS:
2270 Components.push_back(
"watchOS");
2272 case DarwinPlatformKind::DriverKit:
2273 Components.push_back(
"DriverKit");
2276 llvm::reportFatalUsageError(Twine(
"Platform: '") +
2277 std::to_string(TargetPlatform) +
2278 "' is unsupported when inferring SDK Info.");
2280 switch (TargetEnvironment) {
2281 case DarwinEnvironmentKind::NativeEnvironment:
2283 case DarwinEnvironmentKind::Simulator:
2284 Components.push_back(
"Simulator");
2287 llvm::reportFatalUsageError(Twine(
"Environment: '") +
2288 std::to_string(TargetEnvironment) +
2289 "' is unsupported when inferring SDK Info.");
2291 Components.push_back(Version.getAsString());
2292 return join(Components,
" ");
2296 DarwinPlatformKind Platform;
2297 DarwinEnvironmentKind Environment = DarwinEnvironmentKind::NativeEnvironment;
2301 VersionTuple ZipperedOSVersion;
2306 std::optional<VersionTuple> UnderlyingOSVersion;
2307 bool InferSimulatorFromArch =
true;
2308 std::pair<Arg *, std::string>
Arguments;
2309 StringRef EnvVarName;
2312 StringRef InferredSource;
2315 std::optional<llvm::Triple> TargetVariantTriple;
2320std::optional<DarwinPlatform>
2321getDeploymentTargetFromOSVersionArg(DerivedArgList &Args,
2322 const Driver &TheDriver) {
2323 Arg *macOSVersion = Args.getLastArg(options::OPT_mmacos_version_min_EQ);
2324 Arg *iOSVersion = Args.getLastArg(options::OPT_mios_version_min_EQ,
2325 options::OPT_mios_simulator_version_min_EQ);
2327 Args.getLastArg(options::OPT_mtvos_version_min_EQ,
2328 options::OPT_mtvos_simulator_version_min_EQ);
2329 Arg *WatchOSVersion =
2330 Args.getLastArg(options::OPT_mwatchos_version_min_EQ,
2331 options::OPT_mwatchos_simulator_version_min_EQ);
2333 auto GetDarwinPlatform =
2334 [&](DarwinPlatform::DarwinPlatformKind Platform, Arg *VersionArg,
2335 bool IsSimulator) -> std::optional<DarwinPlatform> {
2336 if (StringRef(VersionArg->getValue()).empty()) {
2337 TheDriver.
Diag(diag::err_drv_missing_version_number)
2338 << VersionArg->getAsString(Args);
2339 return std::nullopt;
2341 return DarwinPlatform::createOSVersionArg(Platform, VersionArg,
2346 if (iOSVersion || TvOSVersion || WatchOSVersion) {
2347 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2348 << macOSVersion->getAsString(Args)
2349 << (iOSVersion ? iOSVersion
2350 : TvOSVersion ? TvOSVersion : WatchOSVersion)
2356 }
else if (iOSVersion) {
2357 if (TvOSVersion || WatchOSVersion) {
2358 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2359 << iOSVersion->getAsString(Args)
2360 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->
getAsString(Args);
2363 iOSVersion->getOption().getID() ==
2364 options::OPT_mios_simulator_version_min_EQ);
2365 }
else if (TvOSVersion) {
2366 if (WatchOSVersion) {
2367 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2368 << TvOSVersion->getAsString(Args)
2369 << WatchOSVersion->getAsString(Args);
2372 TvOSVersion->getOption().getID() ==
2373 options::OPT_mtvos_simulator_version_min_EQ);
2374 }
else if (WatchOSVersion)
2375 return GetDarwinPlatform(
2377 WatchOSVersion->getOption().getID() ==
2378 options::OPT_mwatchos_simulator_version_min_EQ);
2379 return std::nullopt;
2384std::optional<DarwinPlatform>
2385getDeploymentTargetFromEnvironmentVariables(
const Driver &TheDriver,
2386 const llvm::Triple &Triple) {
2387 const char *EnvVars[] = {
2388 "MACOSX_DEPLOYMENT_TARGET",
2389 "IPHONEOS_DEPLOYMENT_TARGET",
2390 "TVOS_DEPLOYMENT_TARGET",
2391 "WATCHOS_DEPLOYMENT_TARGET",
2392 "DRIVERKIT_DEPLOYMENT_TARGET",
2393 "XROS_DEPLOYMENT_TARGET"
2395 std::string Targets[std::size(EnvVars)];
2396 for (
const auto &I : llvm::enumerate(llvm::ArrayRef(EnvVars))) {
2397 if (
char *Env = ::getenv(I.value()))
2398 Targets[I.index()] = Env;
2407 if (Triple.getArch() == llvm::Triple::arm ||
2408 Triple.getArch() == llvm::Triple::aarch64 ||
2409 Triple.getArch() == llvm::Triple::thumb)
2416 unsigned FirstTarget = std::size(Targets);
2417 for (
unsigned I = 0; I != std::size(Targets); ++I) {
2418 if (Targets[I].empty())
2420 if (FirstTarget == std::size(Targets))
2423 TheDriver.
Diag(diag::err_drv_conflicting_deployment_targets)
2424 << Targets[FirstTarget] << Targets[I];
2428 for (
const auto &
Target : llvm::enumerate(llvm::ArrayRef(Targets))) {
2429 if (!
Target.value().empty())
2430 return DarwinPlatform::createDeploymentTargetEnv(
2434 return std::nullopt;
2440std::optional<DarwinPlatform>
2441inferDeploymentTargetFromSDK(DerivedArgList &Args,
2442 const std::optional<DarwinSDKInfo> &SDKInfo) {
2443 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2445 return std::nullopt;
2446 StringRef isysroot = A->getValue();
2448 return DarwinPlatform::createFromSDKInfo(isysroot, *SDKInfo);
2452 return std::nullopt;
2454 std::string Version;
2457 size_t StartVer = SDK.find_first_of(
"0123456789");
2458 size_t EndVer = SDK.find_last_of(
"0123456789");
2459 if (StartVer != StringRef::npos && EndVer > StartVer)
2460 Version = std::string(SDK.slice(StartVer, EndVer + 1));
2461 if (Version.empty())
2462 return std::nullopt;
2464 if (SDK.starts_with(
"iPhoneOS") || SDK.starts_with(
"iPhoneSimulator"))
2465 return DarwinPlatform::createFromSDK(
2467 SDK.starts_with(
"iPhoneSimulator"));
2468 else if (SDK.starts_with(
"MacOSX"))
2469 return DarwinPlatform::createFromSDK(isysroot,
Darwin::MacOS,
2471 else if (SDK.starts_with(
"WatchOS") || SDK.starts_with(
"WatchSimulator"))
2472 return DarwinPlatform::createFromSDK(
2474 SDK.starts_with(
"WatchSimulator"));
2475 else if (SDK.starts_with(
"AppleTVOS") || SDK.starts_with(
"AppleTVSimulator"))
2476 return DarwinPlatform::createFromSDK(
2478 SDK.starts_with(
"AppleTVSimulator"));
2479 else if (SDK.starts_with(
"DriverKit"))
2481 return std::nullopt;
2485VersionTuple getInferredOSVersion(llvm::Triple::OSType OS,
2486 const llvm::Triple &Triple,
2487 const Driver &TheDriver) {
2488 VersionTuple OsVersion;
2489 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
2491 case llvm::Triple::Darwin:
2492 case llvm::Triple::MacOSX:
2495 if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
2496 !Triple.getOSMajorVersion())
2497 SystemTriple.getMacOSXVersion(OsVersion);
2498 else if (!Triple.getMacOSXVersion(OsVersion))
2499 TheDriver.
Diag(diag::err_drv_invalid_darwin_version)
2500 << Triple.getOSName();
2502 case llvm::Triple::IOS:
2503 if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
2504 OsVersion = VersionTuple(13, 1);
2506 OsVersion = Triple.getiOSVersion();
2508 case llvm::Triple::TvOS:
2509 OsVersion = Triple.getOSVersion();
2511 case llvm::Triple::WatchOS:
2512 OsVersion = Triple.getWatchOSVersion();
2514 case llvm::Triple::DriverKit:
2515 OsVersion = Triple.getDriverKitVersion();
2518 OsVersion = Triple.getOSVersion();
2519 if (!OsVersion.getMajor())
2520 OsVersion = OsVersion.withMajorReplaced(1);
2527std::optional<DarwinPlatform>
2528inferDeploymentTargetFromArch(DerivedArgList &Args,
const Darwin &Toolchain,
2529 const llvm::Triple &Triple,
2530 const Driver &TheDriver) {
2531 llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS;
2534 if (MachOArchName ==
"arm64" || MachOArchName ==
"arm64e")
2535 OSTy = llvm::Triple::MacOSX;
2536 else if (MachOArchName ==
"armv7" || MachOArchName ==
"armv7s" ||
2537 MachOArchName ==
"armv6")
2538 OSTy = llvm::Triple::IOS;
2539 else if (MachOArchName ==
"armv7k" || MachOArchName ==
"arm64_32")
2540 OSTy = llvm::Triple::WatchOS;
2541 else if (MachOArchName !=
"armv6m" && MachOArchName !=
"armv7m" &&
2542 MachOArchName !=
"armv7em" && MachOArchName !=
"armv8m.base" &&
2543 MachOArchName !=
"armv8m.main" && MachOArchName !=
"armv8.1m.main")
2544 OSTy = llvm::Triple::MacOSX;
2545 if (OSTy == llvm::Triple::UnknownOS)
2546 return std::nullopt;
2547 return DarwinPlatform::createFromArch(
2548 MachOArchName, OSTy, getInferredOSVersion(OSTy, Triple, TheDriver));
2552std::optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
2553 DerivedArgList &Args,
const llvm::Triple &Triple,
const Driver &TheDriver,
2554 const std::optional<DarwinSDKInfo> &SDKInfo) {
2555 if (!Args.hasArg(options::OPT_target))
2556 return std::nullopt;
2557 if (Triple.getOS() == llvm::Triple::Darwin ||
2558 Triple.getOS() == llvm::Triple::UnknownOS)
2559 return std::nullopt;
2560 std::optional<llvm::Triple> TargetVariantTriple;
2561 for (
const Arg *A : Args.filtered(options::OPT_darwin_target_variant)) {
2562 llvm::Triple TVT(A->getValue());
2564 if ((Triple.getArch() == llvm::Triple::aarch64 ||
2565 TVT.getArchName() == Triple.getArchName()) &&
2566 TVT.getArch() == Triple.getArch() &&
2567 TVT.getSubArch() == Triple.getSubArch() &&
2568 TVT.getVendor() == Triple.getVendor()) {
2569 if (TargetVariantTriple)
2574 if ((Triple.isMacOSX() && TVT.getOS() == llvm::Triple::IOS &&
2575 TVT.isMacCatalystEnvironment()) ||
2576 (TVT.isMacOSX() && Triple.getOS() == llvm::Triple::IOS &&
2577 Triple.isMacCatalystEnvironment())) {
2578 TargetVariantTriple = TVT;
2581 TheDriver.
Diag(diag::err_drv_target_variant_invalid)
2582 << A->getSpelling() << A->getValue();
2585 DarwinPlatform PlatformAndVersion = DarwinPlatform::createFromTarget(
2586 Triple, Args.getLastArg(options::OPT_target), TargetVariantTriple,
2589 return PlatformAndVersion;
2593std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2594 DerivedArgList &Args,
const Driver &TheDriver,
2595 const std::optional<DarwinSDKInfo> &SDKInfo) {
2596 auto *A = Args.getLastArg(options::OPT_mtargetos_EQ);
2598 return std::nullopt;
2599 llvm::Triple TT(llvm::Twine(
"unknown-apple-") + A->getValue());
2600 switch (TT.getOS()) {
2601 case llvm::Triple::MacOSX:
2602 case llvm::Triple::IOS:
2603 case llvm::Triple::TvOS:
2604 case llvm::Triple::WatchOS:
2605 case llvm::Triple::XROS:
2608 TheDriver.
Diag(diag::err_drv_invalid_os_in_arg)
2609 << TT.getOSName() << A->getAsString(Args);
2610 return std::nullopt;
2613 VersionTuple Version = TT.getOSVersion();
2614 if (!Version.getMajor()) {
2615 TheDriver.
Diag(diag::err_drv_invalid_version_number)
2616 << A->getAsString(Args);
2617 return std::nullopt;
2619 return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
2620 TT.getEnvironment(), A, SDKInfo);
2623std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS,
2624 const ArgList &Args,
2625 const Driver &TheDriver) {
2626 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2628 return std::nullopt;
2629 StringRef isysroot = A->getValue();
2631 if (!SDKInfoOrErr) {
2632 llvm::consumeError(SDKInfoOrErr.takeError());
2633 TheDriver.
Diag(diag::warn_drv_darwin_sdk_invalid_settings);
2634 return std::nullopt;
2636 return *SDKInfoOrErr;
2641void Darwin::AddDeploymentTarget(DerivedArgList &Args)
const {
2647 bool TryXcselect =
false;
2653 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2655 if (!
getVFS().exists(A->getValue()))
2656 getDriver().
Diag(clang::diag::warn_missing_sysroot) << A->getValue();
2657 }
else if (
const char *env = ::getenv(
"SDKROOT")) {
2660 if (llvm::sys::path::is_absolute(env) &&
getVFS().exists(env) &&
2661 StringRef(env) !=
"/") {
2662 Args.append(Args.MakeSeparateArg(
2663 nullptr, Opts.getOption(options::OPT_isysroot), env));
2666 TryXcselect = !Args.hasArg(options::OPT__sysroot_EQ) &&
2667 !Args.hasArg(options::OPT_no_xcselect);
2677 std::optional<DarwinPlatform> PlatformAndVersion =
2679 if (PlatformAndVersion) {
2681 if (
const auto *MTargetOSArg = Args.getLastArg(options::OPT_mtargetos_EQ)) {
2682 std::string TargetArgStr = PlatformAndVersion->getAsString(Args, Opts);
2683 std::string MTargetOSArgStr = MTargetOSArg->getAsString(Args);
2685 << TargetArgStr << MTargetOSArgStr;
2688 bool TripleProvidedOSVersion = PlatformAndVersion->hasOSVersion();
2689 if (!TripleProvidedOSVersion)
2690 PlatformAndVersion->setOSVersion(
2693 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2694 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2695 if (PlatformAndVersionFromOSVersionArg) {
2696 unsigned TargetMajor, TargetMinor, TargetMicro;
2698 unsigned ArgMajor, ArgMinor, ArgMicro;
2700 if (PlatformAndVersion->getPlatform() !=
2701 PlatformAndVersionFromOSVersionArg->getPlatform() ||
2703 PlatformAndVersion->getOSVersion().getAsString(), TargetMajor,
2704 TargetMinor, TargetMicro, TargetExtra) &&
2706 PlatformAndVersionFromOSVersionArg->getOSVersion().getAsString(),
2707 ArgMajor, ArgMinor, ArgMicro, ArgExtra) &&
2708 (VersionTuple(TargetMajor, TargetMinor, TargetMicro) !=
2709 VersionTuple(ArgMajor, ArgMinor, ArgMicro) ||
2710 TargetExtra != ArgExtra))) {
2713 if (PlatformAndVersion->getPlatform() ==
2714 PlatformAndVersionFromOSVersionArg->getPlatform() &&
2715 !TripleProvidedOSVersion) {
2716 PlatformAndVersion->setOSVersion(
2717 PlatformAndVersionFromOSVersionArg->getOSVersion());
2721 std::string OSVersionArg =
2722 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2723 std::string TargetArg = PlatformAndVersion->getAsString(Args, Opts);
2725 << OSVersionArg << TargetArg;
2729 }
else if ((PlatformAndVersion = getDeploymentTargetFromMTargetOSArg(
2733 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2734 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2735 if (PlatformAndVersionFromOSVersionArg) {
2736 std::string MTargetOSArgStr = PlatformAndVersion->getAsString(Args, Opts);
2737 std::string OSVersionArgStr =
2738 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2740 << MTargetOSArgStr << OSVersionArgStr;
2744 PlatformAndVersion = getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2747 if (!PlatformAndVersion) {
2748 PlatformAndVersion =
2750 if (PlatformAndVersion) {
2752 std::optional<DarwinPlatform> SDKTarget =
2753 inferDeploymentTargetFromSDK(Args,
SDKInfo);
2755 PlatformAndVersion->setEnvironment(SDKTarget->getEnvironment());
2761 if (!PlatformAndVersion) {
2762 PlatformAndVersion = inferDeploymentTargetFromSDK(Args,
SDKInfo);
2765 if (PlatformAndVersion && !
SDKInfo)
2766 SDKInfo = PlatformAndVersion->inferSDKInfo();
2770 if (!PlatformAndVersion)
2771 PlatformAndVersion =
2775 assert(PlatformAndVersion &&
"Unable to infer Darwin variant");
2776 if (!PlatformAndVersion->isValidOSVersion()) {
2777 if (PlatformAndVersion->isExplicitlySpecified())
2779 << PlatformAndVersion->getAsString(Args, Opts);
2781 getDriver().
Diag(diag::err_drv_invalid_version_number_inferred)
2782 << PlatformAndVersion->getOSVersion().getAsString()
2783 << PlatformAndVersion->getInferredSource();
2788 VersionTuple CanonicalVersion = PlatformAndVersion->getCanonicalOSVersion();
2789 if (CanonicalVersion != PlatformAndVersion->getOSVersion()) {
2790 getDriver().
Diag(diag::warn_drv_overriding_deployment_version)
2791 << PlatformAndVersion->getOSVersion().getAsString()
2792 << CanonicalVersion.getAsString();
2793 PlatformAndVersion->setOSVersion(CanonicalVersion);
2796 PlatformAndVersion->addOSVersionMinArgument(Args, Opts);
2799 unsigned Major, Minor, Micro;
2802 const unsigned MajorVersionLimit = 1000;
2803 const VersionTuple OSVersion = PlatformAndVersion->takeOSVersion();
2804 const std::string OSVersionStr = OSVersion.getAsString();
2806 if (Platform ==
MacOS) {
2807#ifdef CLANG_USE_XCSELECT
2810 if (!::xcselect_host_sdk_path(CLANG_XCSELECT_HOST_SDK_POLICY, &p)) {
2811 Args.append(Args.MakeSeparateArg(
2812 nullptr, Opts.getOption(options::OPT_isysroot), p));
2821 HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
2824 << PlatformAndVersion->getAsString(Args, Opts);
2828 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2830 << PlatformAndVersion->getAsString(Args, Opts);
2832 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst &&
2833 (Major < 13 || (Major == 13 && Minor < 1))) {
2835 << PlatformAndVersion->getAsString(Args, Opts);
2842 if (
getTriple().isArch32Bit() && Major >= 11) {
2844 if (PlatformAndVersion->isExplicitlySpecified()) {
2845 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst)
2846 getDriver().
Diag(diag::err_invalid_macos_32bit_deployment_target);
2849 << PlatformAndVersion->getAsString(Args, Opts);
2857 }
else if (Platform ==
TvOS) {
2860 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2862 << PlatformAndVersion->getAsString(Args, Opts);
2863 }
else if (Platform ==
WatchOS) {
2866 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2868 << PlatformAndVersion->getAsString(Args, Opts);
2872 HadExtra || Major < 19 || Major >= MajorVersionLimit || Minor >= 100 ||
2875 << PlatformAndVersion->getAsString(Args, Opts);
2879 HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2882 << PlatformAndVersion->getAsString(Args, Opts);
2889 PlatformAndVersion->canInferSimulatorFromArch() &&
getTriple().isX86())
2892 VersionTuple ZipperedOSVersion;
2894 ZipperedOSVersion = PlatformAndVersion->getZipperedOSVersion();
2895 setTarget(Platform, Environment, Major, Minor, Micro, ZipperedOSVersion);
2907 return !
SDKInfo->getPlatformPrefix(
T).empty();
2916 const llvm::Triple &
T)
const {
2918 const StringRef PlatformPrefix =
SDKInfo->getPlatformPrefix(
T);
2919 if (!PlatformPrefix.empty())
2920 llvm::sys::path::append(Path, PlatformPrefix);
2921 }
else if (
T.isDriverKit()) {
2924 llvm::sys::path::append(Path,
"System",
"DriverKit");
2933 if (DriverArgs.hasArg(options::OPT_isysroot))
2934 Path = DriverArgs.getLastArgValue(options::OPT_isysroot);
2945 const llvm::opt::ArgList &DriverArgs,
2946 llvm::opt::ArgStringList &CC1Args)
const {
2951 bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc);
2952 bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc);
2953 bool NoBuiltinInc = DriverArgs.hasFlag(
2954 options::OPT_nobuiltininc, options::OPT_ibuiltininc,
false);
2955 bool ForceBuiltinInc = DriverArgs.hasFlag(
2956 options::OPT_ibuiltininc, options::OPT_nobuiltininc,
false);
2959 if (!NoStdInc && !NoStdlibInc) {
2961 llvm::sys::path::append(P,
"usr",
"local",
"include");
2966 if (!(NoStdInc && !ForceBuiltinInc) && !NoBuiltinInc) {
2968 llvm::sys::path::append(P,
"include");
2972 if (NoStdInc || NoStdlibInc)
2976 llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
2977 if (!CIncludeDirs.empty()) {
2979 CIncludeDirs.split(dirs,
":");
2980 for (llvm::StringRef dir : dirs) {
2981 llvm::StringRef Prefix =
2982 llvm::sys::path::is_absolute(dir) ?
"" : llvm::StringRef(Sysroot);
2988 llvm::sys::path::append(P,
"usr",
"include");
2994 const llvm::opt::ArgList &DriverArgs,
2995 llvm::opt::ArgStringList &CC1Args)
const {
2998 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc))
3007 llvm::sys::path::append(P1,
"System",
"Library",
"Frameworks");
3008 llvm::sys::path::append(P2,
"System",
"Library",
"SubFrameworks");
3009 llvm::sys::path::append(P3,
"Library",
"Frameworks");
3013bool DarwinClang::AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
3014 llvm::opt::ArgStringList &CC1Args,
3016 llvm::StringRef Version,
3017 llvm::StringRef ArchDir,
3018 llvm::StringRef BitDir)
const {
3019 llvm::sys::path::append(
Base, Version);
3027 if (!ArchDir.empty())
3028 llvm::sys::path::append(P, ArchDir);
3029 if (!BitDir.empty())
3030 llvm::sys::path::append(P, BitDir);
3037 llvm::sys::path::append(P,
"backward");
3045 const llvm::opt::ArgList &DriverArgs,
3046 llvm::opt::ArgStringList &CC1Args)
const {
3054 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
3055 options::OPT_nostdincxx))
3076 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
3077 if (
getVFS().exists(InstallBin)) {
3080 }
else if (DriverArgs.hasArg(options::OPT_v)) {
3081 llvm::errs() <<
"ignoring nonexistent directory \"" << InstallBin
3087 llvm::sys::path::append(SysrootUsr,
"usr",
"include",
"c++",
"v1");
3088 if (
getVFS().exists(SysrootUsr)) {
3091 }
else if (DriverArgs.hasArg(options::OPT_v)) {
3092 llvm::errs() <<
"ignoring nonexistent directory \"" << SysrootUsr
3101 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args);
3106void AppleMachO::AddGnuCPlusPlusIncludePaths(
3107 const llvm::opt::ArgList &DriverArgs,
3108 llvm::opt::ArgStringList &CC1Args)
const {}
3110void DarwinClang::AddGnuCPlusPlusIncludePaths(
3111 const llvm::opt::ArgList &DriverArgs,
3112 llvm::opt::ArgStringList &CC1Args)
const {
3114 llvm::sys::path::append(UsrIncludeCxx,
"usr",
"include",
"c++");
3116 llvm::Triple::ArchType arch =
getTriple().getArch();
3117 bool IsBaseFound =
true;
3122 case llvm::Triple::x86:
3123 case llvm::Triple::x86_64:
3124 IsBaseFound = AddGnuCPlusPlusIncludePaths(
3125 DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
"i686-apple-darwin10",
3126 arch == llvm::Triple::x86_64 ?
"x86_64" :
"");
3127 IsBaseFound |= AddGnuCPlusPlusIncludePaths(
3128 DriverArgs, CC1Args, UsrIncludeCxx,
"4.0.0",
"i686-apple-darwin8",
"");
3131 case llvm::Triple::arm:
3132 case llvm::Triple::thumb:
3134 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3135 "arm-apple-darwin10",
"v7");
3137 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3138 "arm-apple-darwin10",
"v6");
3141 case llvm::Triple::aarch64:
3143 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3144 "arm64-apple-darwin10",
"");
3154 ArgStringList &CmdArgs)
const {
3159 CmdArgs.push_back(
"-lc++");
3160 if (Args.hasArg(options::OPT_fexperimental_library))
3161 CmdArgs.push_back(
"-lc++experimental");
3171 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
3173 llvm::sys::path::append(P,
"usr",
"lib",
"libstdc++.dylib");
3175 if (!
getVFS().exists(P)) {
3176 llvm::sys::path::remove_filename(P);
3177 llvm::sys::path::append(P,
"libstdc++.6.dylib");
3178 if (
getVFS().exists(P)) {
3179 CmdArgs.push_back(Args.MakeArgString(P));
3188 if (!
getVFS().exists(
"/usr/lib/libstdc++.dylib") &&
3189 getVFS().exists(
"/usr/lib/libstdc++.6.dylib")) {
3190 CmdArgs.push_back(
"/usr/lib/libstdc++.6.dylib");
3195 CmdArgs.push_back(
"-lstdc++");
3201 ArgStringList &CmdArgs)
const {
3207 llvm::sys::path::append(P,
"lib",
"darwin");
3211 llvm::sys::path::append(P,
"libclang_rt.cc_kext_watchos.a");
3213 llvm::sys::path::append(P,
"libclang_rt.cc_kext_tvos.a");
3215 llvm::sys::path::append(P,
"libclang_rt.cc_kext_ios.a");
3219 llvm::sys::path::append(
3220 P, llvm::Twine(
"libclang_rt.cc_kext_") +
3221 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
".a");
3223 llvm::sys::path::append(P,
"libclang_rt.cc_kext.a");
3229 CmdArgs.push_back(Args.MakeArgString(P));
3234 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
3244 for (Arg *A : Args) {
3253 case options::OPT_mkernel:
3254 case options::OPT_fapple_kext:
3256 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
3259 case options::OPT_dependency_file:
3260 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
3263 case options::OPT_gfull:
3264 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3266 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
3269 case options::OPT_gused:
3270 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3272 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
3275 case options::OPT_shared:
3276 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
3279 case options::OPT_fconstant_cfstrings:
3280 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
3283 case options::OPT_fno_constant_cfstrings:
3284 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
3287 case options::OPT_Wnonportable_cfstrings:
3289 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
3292 case options::OPT_Wno_nonportable_cfstrings:
3294 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
3303 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
3304 const Option MArch = Opts.getOption(options::OPT_march_EQ);
3310 else if (Name ==
"ppc601")
3311 DAL->AddJoinedArg(
nullptr, MCpu,
"601");
3312 else if (Name ==
"ppc603")
3313 DAL->AddJoinedArg(
nullptr, MCpu,
"603");
3314 else if (Name ==
"ppc604")
3315 DAL->AddJoinedArg(
nullptr, MCpu,
"604");
3316 else if (Name ==
"ppc604e")
3317 DAL->AddJoinedArg(
nullptr, MCpu,
"604e");
3318 else if (Name ==
"ppc750")
3319 DAL->AddJoinedArg(
nullptr, MCpu,
"750");
3320 else if (Name ==
"ppc7400")
3321 DAL->AddJoinedArg(
nullptr, MCpu,
"7400");
3322 else if (Name ==
"ppc7450")
3323 DAL->AddJoinedArg(
nullptr, MCpu,
"7450");
3324 else if (Name ==
"ppc970")
3325 DAL->AddJoinedArg(
nullptr, MCpu,
"970");
3327 else if (Name ==
"ppc64" || Name ==
"ppc64le")
3328 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3330 else if (Name ==
"i386")
3332 else if (Name ==
"i486")
3333 DAL->AddJoinedArg(
nullptr, MArch,
"i486");
3334 else if (Name ==
"i586")
3335 DAL->AddJoinedArg(
nullptr, MArch,
"i586");
3336 else if (Name ==
"i686")
3337 DAL->AddJoinedArg(
nullptr, MArch,
"i686");
3338 else if (Name ==
"pentium")
3339 DAL->AddJoinedArg(
nullptr, MArch,
"pentium");
3340 else if (Name ==
"pentium2")
3341 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3342 else if (Name ==
"pentpro")
3343 DAL->AddJoinedArg(
nullptr, MArch,
"pentiumpro");
3344 else if (Name ==
"pentIIm3")
3345 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3347 else if (Name ==
"x86_64" || Name ==
"x86_64h")
3348 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3350 else if (Name ==
"arm")
3351 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3352 else if (Name ==
"armv4t")
3353 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3354 else if (Name ==
"armv5")
3355 DAL->AddJoinedArg(
nullptr, MArch,
"armv5tej");
3356 else if (Name ==
"xscale")
3357 DAL->AddJoinedArg(
nullptr, MArch,
"xscale");
3358 else if (Name ==
"armv6")
3359 DAL->AddJoinedArg(
nullptr, MArch,
"armv6k");
3360 else if (Name ==
"armv6m")
3361 DAL->AddJoinedArg(
nullptr, MArch,
"armv6m");
3362 else if (Name ==
"armv7")
3363 DAL->AddJoinedArg(
nullptr, MArch,
"armv7a");
3364 else if (Name ==
"armv7em")
3365 DAL->AddJoinedArg(
nullptr, MArch,
"armv7em");
3366 else if (Name ==
"armv7k")
3367 DAL->AddJoinedArg(
nullptr, MArch,
"armv7k");
3368 else if (Name ==
"armv7m")
3369 DAL->AddJoinedArg(
nullptr, MArch,
"armv7m");
3370 else if (Name ==
"armv7s")
3371 DAL->AddJoinedArg(
nullptr, MArch,
"armv7s");
3372 else if (Name ==
"armv8-m.base" || Name ==
"armv8m.base")
3373 DAL->AddJoinedArg(
nullptr, MArch,
"armv8m.base");
3374 else if (Name ==
"armv8-m.main" || Name ==
"armv8m.main")
3375 DAL->AddJoinedArg(
nullptr, MArch,
"armv8m.main");
3376 else if (Name ==
"armv8.1-m.main" || Name ==
"armv8.1m.main")
3377 DAL->AddJoinedArg(
nullptr, MArch,
"armv8.1m.main");
3384 ArgStringList &CmdArgs,
3385 bool ForceLinkBuiltinRT)
const {
3394 CompilerRT += Args.hasArg(options::OPT_fPIC) ?
"_pic" :
"_static";
3400 llvm::Triple::OSType OS;
3406 OS = llvm::Triple::MacOSX;
3409 OS = llvm::Triple::IOS;
3412 OS = llvm::Triple::TvOS;
3415 OS = llvm::Triple::WatchOS;
3431 switch (SDKInfo->getEnvironment()) {
3432 case llvm::Triple::UnknownEnvironment:
3433 case llvm::Triple::Simulator:
3434 case llvm::Triple::MacABI:
3443 VersionTuple SDKVersion = SDKInfo->getVersion();
3444 switch (SDKInfo->getOS()) {
3447 case llvm::Triple::MacOSX:
3448 return SDKVersion >= VersionTuple(15U);
3449 case llvm::Triple::IOS:
3450 return SDKVersion >= VersionTuple(18U);
3451 case llvm::Triple::TvOS:
3452 return SDKVersion >= VersionTuple(18U);
3453 case llvm::Triple::WatchOS:
3454 return SDKVersion >= VersionTuple(11U);
3455 case llvm::Triple::XROS:
3456 return SDKVersion >= VersionTuple(2U);
3464static inline llvm::VersionTuple
3469 case llvm::Triple::Darwin:
3470 case llvm::Triple::MacOSX:
3471 return llvm::VersionTuple(10U, 12U);
3472 case llvm::Triple::IOS:
3473 case llvm::Triple::TvOS:
3474 return llvm::VersionTuple(10U);
3475 case llvm::Triple::WatchOS:
3476 return llvm::VersionTuple(3U);
3479 llvm_unreachable(
"Unexpected OS");
3483 llvm::Triple::OSType OS;
3489 OS = llvm::Triple::MacOSX;
3492 OS = llvm::Triple::IOS;
3495 OS = llvm::Triple::TvOS;
3498 OS = llvm::Triple::WatchOS;
3509 llvm::opt::ArgStringList &CC1Args,
3519 if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3520 options::OPT_fno_ptrauth_calls))
3521 CC1Args.push_back(
"-fptrauth-calls");
3522 if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3523 options::OPT_fno_ptrauth_returns))
3524 CC1Args.push_back(
"-fptrauth-returns");
3525 if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3526 options::OPT_fno_ptrauth_intrinsics))
3527 CC1Args.push_back(
"-fptrauth-intrinsics");
3528 if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3529 options::OPT_fno_ptrauth_indirect_gotos))
3530 CC1Args.push_back(
"-fptrauth-indirect-gotos");
3531 if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3532 options::OPT_fno_ptrauth_auth_traps))
3533 CC1Args.push_back(
"-fptrauth-auth-traps");
3536 if (!DriverArgs.hasArg(
3537 options::OPT_fptrauth_vtable_pointer_address_discrimination,
3538 options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
3539 CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
3540 if (!DriverArgs.hasArg(
3541 options::OPT_fptrauth_vtable_pointer_type_discrimination,
3542 options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
3543 CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
3546 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
3547 options::OPT_fno_ptrauth_objc_isa))
3548 CC1Args.push_back(
"-fptrauth-objc-isa");
3549 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
3550 options::OPT_fno_ptrauth_objc_class_ro))
3551 CC1Args.push_back(
"-fptrauth-objc-class-ro");
3552 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
3553 options::OPT_fno_ptrauth_objc_interface_sel))
3554 CC1Args.push_back(
"-fptrauth-objc-interface-sel");
3559 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3572 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
3573 options::OPT_fno_aligned_allocation) &&
3575 CC1Args.push_back(
"-faligned-alloc-unavailable");
3579 if (!DriverArgs.hasArgNoClaim(options::OPT_fobjc_msgsend_selector_stubs,
3580 options::OPT_fno_objc_msgsend_selector_stubs) &&
3583 CC1Args.push_back(
"-fobjc-msgsend-selector-stubs");
3587 if (!DriverArgs.hasArgNoClaim(
3588 options::OPT_fobjc_msgsend_class_selector_stubs,
3589 options::OPT_fno_objc_msgsend_class_selector_stubs) &&
3592 CC1Args.push_back(
"-fobjc-msgsend-class-selector-stubs");
3596 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
3597 options::OPT_fno_sized_deallocation) &&
3599 CC1Args.push_back(
"-fno-sized-deallocation");
3606 if (!
SDKInfo->getFilePath().empty()) {
3608 ExtraDepOpt +=
SDKInfo->getFilePath();
3609 CC1Args.push_back(DriverArgs.MakeArgString(ExtraDepOpt));
3615 CC1Args.push_back(
"-fcompatibility-qualified-id-block-type-checking");
3619 if (!DriverArgs.getLastArgNoClaim(
3620 options::OPT_fvisibility_inlines_hidden_static_local_var,
3621 options::OPT_fno_visibility_inlines_hidden_static_local_var))
3622 CC1Args.push_back(
"-fvisibility-inlines-hidden-static-local-var");
3636 CC1Args.push_back(
"-fbuiltin-headers-in-system-modules");
3638 if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
3639 options::OPT_fno_define_target_os_macros))
3640 CC1Args.push_back(
"-fdefine-target-os-macros");
3644 !DriverArgs.hasFlag(options::OPT_fmodulemap_allow_subdirectory_search,
3645 options::OPT_fno_modulemap_allow_subdirectory_search,
3647 bool RequiresSubdirectorySearch;
3648 VersionTuple SDKVersion =
SDKInfo->getVersion();
3651 RequiresSubdirectorySearch =
true;
3654 RequiresSubdirectorySearch = SDKVersion < VersionTuple(15, 0);
3658 RequiresSubdirectorySearch = SDKVersion < VersionTuple(18, 0);
3661 RequiresSubdirectorySearch = SDKVersion < VersionTuple(11, 0);
3664 RequiresSubdirectorySearch = SDKVersion < VersionTuple(2, 0);
3667 if (!RequiresSubdirectorySearch)
3668 CC1Args.push_back(
"-fno-modulemap-allow-subdirectory-search");
3673 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1ASArgs)
const {
3675 CC1ASArgs.push_back(
"-darwin-target-variant-triple");
3682 auto EmitTargetSDKVersionArg = [&](
const VersionTuple &
V) {
3684 llvm::raw_string_ostream OS(Arg);
3685 OS <<
"-target-sdk-version=" <<
V;
3686 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3690 if (
const auto *MacOStoMacCatalystMapping =
SDKInfo->getVersionMapping(
3692 std::optional<VersionTuple> SDKVersion = MacOStoMacCatalystMapping->map(
3695 EmitTargetSDKVersionArg(
3699 EmitTargetSDKVersionArg(
SDKInfo->getVersion());
3707 llvm::raw_string_ostream OS(Arg);
3708 OS <<
"-darwin-target-variant-sdk-version=" <<
SDKInfo->getVersion();
3709 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3710 }
else if (
const auto *MacOStoMacCatalystMapping =
3713 if (std::optional<VersionTuple> SDKVersion =
3714 MacOStoMacCatalystMapping->map(
3718 llvm::raw_string_ostream OS(Arg);
3719 OS <<
"-darwin-target-variant-sdk-version=" << *SDKVersion;
3720 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3740 AddDeploymentTarget(*DAL);
3748 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
3751 if (A->getOption().getID() != options::OPT_mkernel &&
3752 A->getOption().getID() != options::OPT_fapple_kext)
3754 assert(it != ie &&
"unexpected argument translation");
3756 assert(A->getOption().getID() == options::OPT_static &&
3757 "missing expected -static argument");
3764 if ((
Arch == llvm::Triple::arm ||
Arch == llvm::Triple::thumb)) {
3765 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
3766 options::OPT_fno_omit_frame_pointer,
false))
3767 getDriver().
Diag(clang::diag::warn_drv_unsupported_opt_for_target)
3768 <<
"-fomit-frame-pointer" << BA.
ArchName;
3777 if (
getArch() == llvm::Triple::x86_64 ||
3779 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
3781 return (
getArch() == llvm::Triple::aarch64 ||
3782 getArch() == llvm::Triple::aarch64_32)
3790 if (
const char *S = ::getenv(
"RC_DEBUG_OPTIONS"))
3791 return S[0] !=
'\0';
3796 if (
const char *S = ::getenv(
"RC_DEBUG_PREFIX_MAP"))
3805 return llvm::ExceptionHandling::Default;
3809 if (Triple.isWatchABI())
3810 return llvm::ExceptionHandling::DwarfCFI;
3812 return llvm::ExceptionHandling::SjLj;
3827 return (
getArch() == llvm::Triple::x86_64 ||
3828 getArch() == llvm::Triple::aarch64);
3837 ArgStringList &CmdArgs)
const {
3840 assert(!
isTargetXROS() &&
"xrOS always uses -platform-version");
3843 CmdArgs.push_back(
"-watchos_version_min");
3845 CmdArgs.push_back(
"-watchos_simulator_version_min");
3847 CmdArgs.push_back(
"-tvos_version_min");
3849 CmdArgs.push_back(
"-tvos_simulator_version_min");
3851 CmdArgs.push_back(
"-driverkit_version_min");
3853 CmdArgs.push_back(
"-ios_simulator_version_min");
3855 CmdArgs.push_back(
"-iphoneos_version_min");
3857 CmdArgs.push_back(
"-maccatalyst_version_min");
3860 CmdArgs.push_back(
"-macosx_version_min");
3866 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3869 VersionTuple VariantTargetVersion;
3871 CmdArgs.push_back(
"-macosx_version_min");
3876 "unexpected target variant triple");
3877 CmdArgs.push_back(
"-maccatalyst_version_min");
3880 VersionTuple MinTgtVers =
3882 if (MinTgtVers.getMajor() && MinTgtVers > VariantTargetVersion)
3883 VariantTargetVersion = MinTgtVers;
3884 CmdArgs.push_back(Args.MakeArgString(VariantTargetVersion.getAsString()));
3895 return "mac catalyst";
3908 llvm_unreachable(
"invalid platform");
3912 llvm::opt::ArgStringList &CmdArgs)
const {
3917 auto EmitPlatformVersionArg =
3920 const llvm::Triple &TT) {
3923 CmdArgs.push_back(
"-platform_version");
3924 std::string PlatformName =
3927 PlatformName +=
"-simulator";
3928 CmdArgs.push_back(Args.MakeArgString(PlatformName));
3937 VersionTuple MinTgtVers = TT.getMinimumSupportedOSVersion();
3940 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3945 std::optional<VersionTuple> iOSSDKVersion;
3947 if (
const auto *MacOStoMacCatalystMapping =
3950 iOSSDKVersion = MacOStoMacCatalystMapping->map(
3951 SDKInfo->getVersion().withoutBuild(),
3955 CmdArgs.push_back(Args.MakeArgString(
3956 (iOSSDKVersion ? *iOSSDKVersion
3963 VersionTuple SDKVersion =
SDKInfo->getVersion().withoutBuild();
3964 if (!SDKVersion.getMinor())
3965 SDKVersion = VersionTuple(SDKVersion.getMajor(), 0);
3966 CmdArgs.push_back(Args.MakeArgString(SDKVersion.getAsString()));
3977 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3986 VersionTuple TargetVariantVersion;
3994 "unexpected target variant triple");
3999 EmitPlatformVersionArg(TargetVariantVersion, Platform, Environment,
4005 ArgStringList &CmdArgs) {
4009 CmdArgs.push_back(
"-ldylib1.o");
4016 CmdArgs.push_back(
"-ldylib1.o");
4018 CmdArgs.push_back(
"-ldylib1.10.5.o");
4023 ArgStringList &CmdArgs) {
4024 if (Args.hasArg(options::OPT_static))
4029 CmdArgs.push_back(
"-lbundle1.o");
4034 ArgStringList &CmdArgs) {
4036 if (Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_object) ||
4037 Args.hasArg(options::OPT_preload)) {
4038 CmdArgs.push_back(
"-lgcrt0.o");
4040 CmdArgs.push_back(
"-lgcrt1.o");
4050 CmdArgs.push_back(
"-no_new_main");
4052 D.
getDriver().
Diag(diag::err_drv_clang_unsupported_opt_pg_darwin)
4058 ArgStringList &CmdArgs) {
4061 if (D.
getArch() == llvm::Triple::aarch64)
4064 CmdArgs.push_back(
"-lcrt1.o");
4066 CmdArgs.push_back(
"-lcrt1.3.1.o");
4073 CmdArgs.push_back(
"-lcrt1.o");
4075 CmdArgs.push_back(
"-lcrt1.10.5.o");
4077 CmdArgs.push_back(
"-lcrt1.10.6.o");
4082 ArgStringList &CmdArgs)
const {
4088 if (Args.hasArg(options::OPT_dynamiclib))
4090 else if (Args.hasArg(options::OPT_bundle))
4094 else if (Args.hasArg(options::OPT_static) ||
4095 Args.hasArg(options::OPT_object) ||
4096 Args.hasArg(options::OPT_preload))
4097 CmdArgs.push_back(
"-lcrt0.o");
4101 if (
isTargetMacOS() && Args.hasArg(options::OPT_shared_libgcc) &&
4103 const char *Str = Args.MakeArgString(
GetFilePath(
"crt3.o"));
4104 CmdArgs.push_back(Str);
4121 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
4122 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
4124 Res |= SanitizerKind::Address;
4125 Res |= SanitizerKind::PointerCompare;
4126 Res |= SanitizerKind::PointerSubtract;
4127 Res |= SanitizerKind::Realtime;
4128 Res |= SanitizerKind::Leak;
4129 Res |= SanitizerKind::Fuzzer;
4130 Res |= SanitizerKind::FuzzerNoLink;
4131 Res |= SanitizerKind::ObjCCast;
4141 Res |= SanitizerKind::Vptr;
4143 if ((IsX86_64 || IsAArch64) &&
4146 Res |= SanitizerKind::Thread;
4150 Res |= SanitizerKind::Type;
4154 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 void AddMachOSysLibRoot(Compilation &C, const ArgList &Args, ArgStringList &CmdArgs)
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.
Result
Implement __builtin_bit_cast and related operations.
static StringRef getTriple(const Command &Job)
Defines types useful for describing an Objective-C runtime.
const llvm::VersionTuple & getDefaultDeploymentTarget() const
const llvm::Triple & getCanonicalPlatformTriple() 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 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,...
SetTy< T > join(SetTy< T > A, SetTy< T > B, typename SetTy< T >::Factory &F)
Computes the union of two ImmutableSets.
Top level wrappers for InstallAPI frontend operations.
Expected< std::optional< DarwinSDKInfo > > parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath)
Parse the SDK information from the SDKSettings.json file.
@ Default
Set to the current date and time.
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
Represents a bound architecture for offload / multiple architecture compilation.
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()