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 .Case(
"r600", llvm::Triple::r600)
70 .Case(
"amdgcn", llvm::Triple::amdgcn)
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");
195bool darwin::Linker::NeedsTempPath(
const InputInfoList &Inputs)
const {
199 for (
const auto &Input : Inputs)
200 if (Input.getType() != types::TY_Object)
214 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
215 if (A->getOption().matches(options::OPT_O0))
217 if (A->getOption().matches(options::OPT_O))
218 return llvm::StringSwitch<bool>(A->getValue())
224 if (!IsLinkerOnlyAction)
229void darwin::Linker::AddLinkArgs(Compilation &
C,
const ArgList &Args,
230 ArgStringList &CmdArgs,
232 VersionTuple Version,
bool LinkerIsLLD,
233 bool UsePlatformVersion)
const {
234 const Driver &D = getToolChain().getDriver();
235 const toolchains::MachO &MachOTC = getMachOToolChain();
239 if ((Version >= VersionTuple(100) || LinkerIsLLD) &&
240 !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
241 CmdArgs.push_back(
"-demangle");
243 if (Args.hasArg(options::OPT_rdynamic) &&
244 (Version >= VersionTuple(137) || LinkerIsLLD))
245 CmdArgs.push_back(
"-export_dynamic");
249 if (Args.hasFlag(options::OPT_fapplication_extension,
250 options::OPT_fno_application_extension,
false))
251 CmdArgs.push_back(
"-application_extension");
253 if (
auto LTO = getToolChain().getLTOMode(Args);
254 LTO !=
LTOK_None && (Version >= VersionTuple(116) || LinkerIsLLD) &&
255 NeedsTempPath(Inputs)) {
256 std::string TmpPathName;
267 if (!TmpPathName.empty()) {
268 auto *TmpPath =
C.getArgs().MakeArgString(TmpPathName);
269 C.addTempFile(TmpPath);
270 CmdArgs.push_back(
"-object_path_lto");
271 CmdArgs.push_back(TmpPath);
284 if (Version >= VersionTuple(133) && !LinkerIsLLD) {
286 StringRef P = llvm::sys::path::parent_path(D.
Dir);
287 SmallString<128> LibLTOPath(P);
288 llvm::sys::path::append(LibLTOPath,
"lib");
289 llvm::sys::path::append(LibLTOPath,
"libLTO.dylib");
290 CmdArgs.push_back(
"-lto_library");
291 CmdArgs.push_back(
C.getArgs().MakeArgString(LibLTOPath));
297 if (Version >= VersionTuple(262) &&
299 CmdArgs.push_back(
"-no_deduplicate");
302 Args.AddAllArgs(CmdArgs, options::OPT_static);
303 if (!Args.hasArg(options::OPT_static))
304 CmdArgs.push_back(
"-dynamic");
305 if (Args.hasArg(options::OPT_fgnu_runtime)) {
310 if (!Args.hasArg(options::OPT_dynamiclib)) {
311 AddMachOArch(Args, CmdArgs);
313 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
315 Args.AddLastArg(CmdArgs, options::OPT_bundle);
316 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
317 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
320 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
321 (A = Args.getLastArg(options::OPT_current__version)) ||
322 (A = Args.getLastArg(options::OPT_install__name)))
323 D.
Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
326 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
327 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
328 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
330 CmdArgs.push_back(
"-dylib");
333 if ((A = Args.getLastArg(options::OPT_bundle)) ||
334 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
335 (A = Args.getLastArg(options::OPT_client__name)) ||
336 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
337 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
338 (A = Args.getLastArg(options::OPT_private__bundle)))
339 D.
Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
342 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
343 "-dylib_compatibility_version");
344 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
345 "-dylib_current_version");
347 AddMachOArch(Args, CmdArgs);
349 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
350 "-dylib_install_name");
353 Args.AddLastArg(CmdArgs, options::OPT_all__load);
354 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
355 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
357 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
358 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
359 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
360 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
361 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
362 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
363 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
364 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
365 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
366 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
367 Args.AddAllArgs(CmdArgs, options::OPT_init);
370 if (Version >= VersionTuple(520) || LinkerIsLLD || UsePlatformVersion)
375 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
376 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
377 Args.AddLastArg(CmdArgs, options::OPT_single__module);
378 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
379 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
382 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
383 options::OPT_fno_pie, options::OPT_fno_PIE)) {
384 if (A->getOption().matches(options::OPT_fpie) ||
385 A->getOption().matches(options::OPT_fPIE))
386 CmdArgs.push_back(
"-pie");
388 CmdArgs.push_back(
"-no_pie");
392 if (
C.getDriver().embedBitcodeEnabled()) {
395 CmdArgs.push_back(
"-bitcode_bundle");
397 if (
C.getDriver().embedBitcodeMarkerOnly() &&
398 Version >= VersionTuple(278)) {
399 CmdArgs.push_back(
"-bitcode_process_mode");
400 CmdArgs.push_back(
"marker");
403 D.
Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
407 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
408 options::OPT_fno_global_isel)) {
409 if (A->getOption().matches(options::OPT_fglobal_isel)) {
410 CmdArgs.push_back(
"-mllvm");
411 CmdArgs.push_back(
"-global-isel");
413 CmdArgs.push_back(
"-mllvm");
414 CmdArgs.push_back(
"-global-isel-abort=0");
418 if (Args.hasArg(options::OPT_mkernel) ||
419 Args.hasArg(options::OPT_fapple_kext) ||
420 Args.hasArg(options::OPT_ffreestanding)) {
421 CmdArgs.push_back(
"-mllvm");
422 CmdArgs.push_back(
"-disable-atexit-based-global-dtor-lowering");
425 Args.AddLastArg(CmdArgs, options::OPT_prebind);
426 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
427 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
428 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
429 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
430 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
431 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
432 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
433 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
434 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
435 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
436 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
437 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
438 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
439 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
440 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
446 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
447 CmdArgs.push_back(
"-syslibroot");
448 CmdArgs.push_back(A->getValue());
449 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
450 CmdArgs.push_back(
"-syslibroot");
451 CmdArgs.push_back(A->getValue());
452 }
else if (StringRef sysroot =
C.getSysRoot(); sysroot !=
"") {
453 CmdArgs.push_back(
"-syslibroot");
454 CmdArgs.push_back(
C.getArgs().MakeArgString(sysroot));
457 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
458 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
459 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
460 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
461 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
462 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
463 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
464 Args.AddAllArgs(CmdArgs, options::OPT_y);
465 Args.AddLastArg(CmdArgs, options::OPT_w);
466 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
467 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
468 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
469 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
470 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
471 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
472 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
473 Args.AddLastArg(CmdArgs, options::OPT_why_load);
474 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
475 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
476 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
477 Args.AddLastArg(CmdArgs, options::OPT_Mach);
481 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
483 : CSPGOGenerateArg->getValue());
484 llvm::sys::path::append(Path,
"default_%m.profraw");
485 CmdArgs.push_back(
"--cs-profile-generate");
486 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
488 SmallString<128> Path(
489 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
490 if (Path.empty() || llvm::sys::fs::is_directory(Path))
491 llvm::sys::path::append(Path,
"default.profdata");
492 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
495 auto *CodeGenDataGenArg =
496 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
497 if (CodeGenDataGenArg)
499 Args.MakeArgString(Twine(
"--codegen-data-generate-path=") +
500 CodeGenDataGenArg->getValue()));
503 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
505 : CSPGOGenerateArg->getValue());
506 llvm::sys::path::append(Path,
"default_%m.profraw");
507 CmdArgs.push_back(
"-mllvm");
508 CmdArgs.push_back(
"-cs-profile-generate");
509 CmdArgs.push_back(
"-mllvm");
510 CmdArgs.push_back(Args.MakeArgString(Twine(
"-cs-profile-path=") + Path));
512 SmallString<128> Path(
513 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
514 if (Path.empty() || llvm::sys::fs::is_directory(Path))
515 llvm::sys::path::append(Path,
"default.profdata");
516 CmdArgs.push_back(
"-mllvm");
517 CmdArgs.push_back(Args.MakeArgString(Twine(
"-cs-profile-path=") + Path));
522 CmdArgs.push_back(
"-mllvm");
524 Args.MakeArgString(Twine(
"-sample-profile-file=") + A->getValue()));
531 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
534 return Args.hasArg(options::OPT_fobjc_link_runtime);
538 const llvm::Triple &Triple) {
543 Args.getAllArgValues(options::OPT_arch).size() > 1;
544 bool hasExplicitOutputFile =
545 Args.getLastArg(options::OPT_foptimization_record_file_EQ);
547 D.
Diag(diag::err_drv_invalid_output_with_multiple_archs)
548 <<
"-foptimization-record-file";
555 const llvm::Triple &Triple,
557 StringRef Format =
"yaml";
558 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
559 Format = A->getValue();
561 CmdArgs.push_back(
"-mllvm");
562 CmdArgs.push_back(
"-lto-pass-remarks-output");
563 CmdArgs.push_back(
"-mllvm");
565 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
567 CmdArgs.push_back(A->getValue());
569 assert(Output.
isFilename() &&
"Unexpected ld output.");
575 CmdArgs.push_back(Args.MakeArgString(F));
579 Args.getLastArg(options::OPT_foptimization_record_passes_EQ)) {
580 CmdArgs.push_back(
"-mllvm");
582 std::string(
"-lto-pass-remarks-filter=") + A->getValue();
583 CmdArgs.push_back(Args.MakeArgString(Passes));
586 if (!Format.empty()) {
587 CmdArgs.push_back(
"-mllvm");
588 Twine FormatArg = Twine(
"-lto-pass-remarks-format=") + Format;
589 CmdArgs.push_back(Args.MakeArgString(FormatArg));
593 CmdArgs.push_back(
"-mllvm");
594 CmdArgs.push_back(
"-lto-pass-remarks-with-hotness");
597 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
598 CmdArgs.push_back(
"-mllvm");
600 std::string(
"-lto-pass-remarks-hotness-threshold=") + A->getValue();
601 CmdArgs.push_back(Args.MakeArgString(Opt));
610 const char *LinkingOutput)
const {
611 assert((Output.
getType() == types::TY_Image ||
612 Output.
getType() == types::TY_Object) &&
613 "Invalid linker output type.");
619 llvm::opt::ArgStringList InputFileList;
624 ArgStringList CmdArgs;
630 Args.MakeArgString(
getToolChain().GetLinkerPath(&LinkerIsLLD));
634 bool UsePlatformVersion = Triple.isXROS() || Triple.isOSFirmware();
638 AddLinkArgs(
C, Args, CmdArgs, Inputs, Version, LinkerIsLLD,
648 Args.getLastArg(options::OPT_moutline, options::OPT_mno_outline)) {
649 if (A->getOption().matches(options::OPT_moutline)) {
651 CmdArgs.push_back(
"-mllvm");
652 CmdArgs.push_back(
"-enable-machine-outliner");
658 CmdArgs.push_back(
"-mllvm");
659 CmdArgs.push_back(
"-enable-machine-outliner=never");
666 CmdArgs.push_back(
"-mllvm");
667 CmdArgs.push_back(
"-enable-linkonceodr-outlining");
670 auto *CodeGenDataGenArg =
671 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
672 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
676 if (CodeGenDataGenArg && CodeGenDataUseArg)
677 D.
Diag(diag::err_drv_argument_not_allowed_with)
678 << CodeGenDataGenArg->getAsString(Args)
679 << CodeGenDataUseArg->getAsString(Args);
683 if (CodeGenDataGenArg) {
684 CmdArgs.push_back(
"-mllvm");
685 CmdArgs.push_back(
"-codegen-data-generate");
689 if (CodeGenDataUseArg) {
690 CmdArgs.push_back(
"-mllvm");
691 CmdArgs.push_back(Args.MakeArgString(Twine(
"-codegen-data-use-path=") +
692 CodeGenDataUseArg->getValue()));
698 if (!StatsFile.empty()) {
699 CmdArgs.push_back(
"-mllvm");
700 CmdArgs.push_back(Args.MakeArgString(
"-lto-stats-file=" + StatsFile.str()));
704 if (Args.hasArg(options::OPT_fstack_usage)) {
706 llvm::sys::path::replace_extension(StackUsageFile,
"su");
707 CmdArgs.push_back(
"-mllvm");
709 Args.MakeArgString(
"-stack-usage-file=" + StackUsageFile));
714 Args.addAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
715 options::OPT_Z_Flag, options::OPT_u_Group});
720 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
721 CmdArgs.push_back(
"-ObjC");
723 CmdArgs.push_back(
"-o");
726 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
729 Args.AddAllArgs(CmdArgs, options::OPT_L);
734 for (
const auto &II : Inputs) {
735 if (!II.isFilename()) {
740 if (InputFileList.size() > 0)
746 InputFileList.push_back(II.getFilename());
752 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
753 getToolChain().addFortranRuntimeLibraryPath(Args, CmdArgs);
757 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
761 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
765 CmdArgs.push_back(
"-framework");
766 CmdArgs.push_back(
"Foundation");
768 CmdArgs.push_back(
"-lobjc");
772 CmdArgs.push_back(
"-arch_multiple");
773 CmdArgs.push_back(
"-final_output");
774 CmdArgs.push_back(LinkingOutput);
777 if (Args.hasArg(options::OPT_fnested_functions))
778 CmdArgs.push_back(
"-allow_stack_execute");
783 if (!Parallelism.empty()) {
784 CmdArgs.push_back(
"-mllvm");
785 unsigned NumThreads =
786 llvm::get_threadpool_strategy(Parallelism)->compute_thread_count();
787 CmdArgs.push_back(Args.MakeArgString(
"-threads=" + Twine(NumThreads)));
793 bool NoStdOrDefaultLibs =
794 Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
795 bool ForceLinkBuiltins = Args.hasArg(options::OPT_fapple_link_rtlib);
796 if (!NoStdOrDefaultLibs || ForceLinkBuiltins) {
801 if (NoStdOrDefaultLibs && ForceLinkBuiltins) {
809 Args.ClaimAllArgs(options::OPT_pthread);
810 Args.ClaimAllArgs(options::OPT_pthreads);
814 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
818 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
819 Args.AddAllArgs(CmdArgs, options::OPT_F);
822 for (
const Arg *A : Args.filtered(options::OPT_iframework))
823 CmdArgs.push_back(Args.MakeArgString(std::string(
"-F") + A->getValue()));
825 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
826 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
827 if (A->getValue() == StringRef(
"Accelerate")) {
828 CmdArgs.push_back(
"-framework");
829 CmdArgs.push_back(
"Accelerate");
838 bool NonStandardSearchPath =
false;
840 if (Triple.isDriverKit()) {
842 NonStandardSearchPath =
843 Version.getMajor() < 605 ||
844 (Version.getMajor() == 605 && Version.getMinor().value_or(0) < 1);
849 if (NonStandardSearchPath) {
850 if (
auto *Sysroot = Args.getLastArg(options::OPT_isysroot)) {
851 auto AddSearchPath = [&](StringRef Flag, StringRef SearchPath) {
854 llvm::sys::path::append(P, SearchPath);
856 CmdArgs.push_back(Args.MakeArgString(Flag + P));
859 AddSearchPath(
"-L",
"/usr/lib");
860 AddSearchPath(
"-F",
"/System/Library/Frameworks");
866 if (Version >= VersionTuple(705) || LinkerIsLLD) {
874 std::unique_ptr<Command> Cmd = std::make_unique<Command>(
875 JA, *
this, ResponseSupport, Exec, CmdArgs, Inputs, Output);
876 Cmd->setInputFileList(std::move(InputFileList));
877 C.addCommand(std::move(Cmd));
884 const char *LinkingOutput)
const {
888 Args.ClaimAllArgs(options::OPT_g_Group);
890 Args.ClaimAllArgs(options::OPT_emit_llvm);
893 Args.ClaimAllArgs(options::OPT_w);
895 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
898 ArgStringList CmdArgs;
900 CmdArgs.push_back(
"-static");
901 CmdArgs.push_back(
"-D");
902 CmdArgs.push_back(
"-no_warning_for_no_symbols");
903 CmdArgs.push_back(
"-o");
906 for (
const auto &II : Inputs) {
907 if (II.isFilename()) {
908 CmdArgs.push_back(II.getFilename());
915 if (Output.
isFilename() && llvm::sys::fs::exists(OutputFileName)) {
916 if (std::error_code EC = llvm::sys::fs::remove(OutputFileName)) {
917 D.
Diag(diag::err_drv_unable_to_remove_file) << EC.message();
922 const char *Exec = Args.MakeArgString(
getToolChain().GetStaticLibToolPath());
923 C.addCommand(std::make_unique<Command>(JA, *
this,
925 Exec, CmdArgs, Inputs, Output));
932 const char *LinkingOutput)
const {
933 ArgStringList CmdArgs;
935 CmdArgs.push_back(
"-create");
936 assert(Output.
isFilename() &&
"Unexpected lipo output.");
938 CmdArgs.push_back(
"-output");
941 for (
const auto &II : Inputs) {
942 assert(II.isFilename() &&
"Unexpected lipo input.");
943 CmdArgs.push_back(II.getFilename());
946 StringRef LipoName = Args.getLastArgValue(options::OPT_fuse_lipo_EQ,
"lipo");
948 Args.MakeArgString(
getToolChain().GetProgramPath(LipoName.data()));
950 Exec, CmdArgs, Inputs, Output));
957 const char *LinkingOutput)
const {
958 ArgStringList CmdArgs;
960 CmdArgs.push_back(
"-o");
963 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
965 assert(Input.
isFilename() &&
"Unexpected dsymutil input.");
969 Args.MakeArgString(
getToolChain().GetProgramPath(
"dsymutil"));
971 Exec, CmdArgs, Inputs, Output));
978 const char *LinkingOutput)
const {
979 ArgStringList CmdArgs;
980 CmdArgs.push_back(
"--verify");
981 CmdArgs.push_back(
"--debug-info");
982 CmdArgs.push_back(
"--eh-frame");
983 CmdArgs.push_back(
"--quiet");
985 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
987 assert(Input.
isFilename() &&
"Unexpected verify input");
993 Args.MakeArgString(
getToolChain().GetProgramPath(
"dwarfdump"));
995 Exec, CmdArgs, Inputs, Output));
1005 const ArgList &Args)
1017 if (Ty == types::TY_PP_Asm)
1018 return types::TY_Asm;
1038 auto T = llvm::Triple(Twine(
"arm64-apple-") +
1039 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
1063 ArgStringList &CC1Args)
const {
1068 ArgStringList &CC1Args)
const {
1073 ArgStringList &CC1Args)
const {
1082 return llvm::StringSwitch<const char *>(
Arch)
1083 .Case(
"armv6k",
"armv6")
1084 .Case(
"armv6m",
"armv6m")
1085 .Case(
"armv5tej",
"armv5")
1086 .Case(
"xscale",
"xscale")
1087 .Case(
"armv4t",
"armv4t")
1088 .Case(
"armv7",
"armv7")
1089 .Cases({
"armv7a",
"armv7-a"},
"armv7")
1090 .Cases({
"armv7r",
"armv7-r"},
"armv7")
1091 .Cases({
"armv7em",
"armv7e-m"},
"armv7em")
1092 .Cases({
"armv7k",
"armv7-k"},
"armv7k")
1093 .Cases({
"armv7m",
"armv7-m"},
"armv7m")
1094 .Cases({
"armv7s",
"armv7-s"},
"armv7s")
1095 .Cases({
"armv8-m.base",
"armv8m.base"},
"armv8m.base")
1096 .Cases({
"armv8-m.main",
"armv8m.main"},
"armv8m.main")
1097 .Cases({
"armv8.1-m.main",
"armv8m.main"},
"armv8.1m.main")
1102 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseCPUArch(CPU);
1103 if (ArchKind == llvm::ARM::ArchKind::INVALID)
1105 StringRef
Arch = llvm::ARM::getArchName(ArchKind);
1109 if (
Arch.starts_with(
"armv5"))
1112 else if (
Arch.starts_with(
"armv6") && !
Arch.ends_with(
"6m"))
1115 else if (
Arch.ends_with(
"v7a"))
1125 case llvm::Triple::aarch64_32:
1128 case llvm::Triple::aarch64: {
1134 case llvm::Triple::thumb:
1135 case llvm::Triple::arm:
1136 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1140 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1149 if (LinkerVersion) {
1151 VersionTuple NewLinkerVersion;
1152 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ))
1153 (void)NewLinkerVersion.tryParse(A->getValue());
1154 assert(NewLinkerVersion == LinkerVersion);
1156 return *LinkerVersion;
1159 VersionTuple NewLinkerVersion;
1160 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1163 if (NewLinkerVersion.tryParse(A->getValue()) ||
1164 NewLinkerVersion.getSubbuild())
1166 << A->getAsString(Args);
1169 LinkerVersion = NewLinkerVersion;
1170 return *LinkerVersion;
1179 llvm::Triple::OSType OS =
getTriple().getOS();
1183 case llvm::Triple::Darwin:
1184 case llvm::Triple::MacOSX:
1187 case llvm::Triple::IOS:
1190 case llvm::Triple::TvOS:
1193 case llvm::Triple::WatchOS:
1196 case llvm::Triple::XROS:
1199 case llvm::Triple::DriverKit:
1208 if (
getTriple().isSimulatorEnvironment())
1210 else if (
getTriple().isMacCatalystEnvironment())
1213 VersionTuple OsVer =
getTriple().getOSVersion();
1214 setTarget(Platform, Environment, OsVer.getMajor(),
1215 OsVer.getMinor().value_or(0), OsVer.getSubminor().value_or(0),
1223void Darwin::VerifyTripleForSDK(
const llvm::opt::ArgList &Args,
1224 const llvm::Triple Triple)
const {
1226 if (!
SDKInfo->supportsTriple(Triple))
1228 <<
SDKInfo->getDisplayName() << Triple.getTriple();
1229 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
1232 const char *isysroot = A->getValue();
1234 if (!SDKName.empty()) {
1235 bool supported =
true;
1236 if (Triple.isWatchOS())
1237 supported = SDKName.starts_with(
"Watch");
1238 else if (Triple.isTvOS())
1239 supported = SDKName.starts_with(
"AppleTV");
1240 else if (Triple.isDriverKit())
1241 supported = SDKName.starts_with(
"DriverKit");
1242 else if (Triple.isiOS())
1243 supported = SDKName.starts_with(
"iPhone");
1244 else if (Triple.isMacOSX())
1245 supported = SDKName.starts_with(
"MacOSX");
1251 << SDKName << Triple.getTriple();
1257 llvm::StringRef BoundArch,
1268 return Triple.getTriple();
1280 Str += llvm::Triple::getOSTypeName(llvm::Triple::XROS);
1282 Str += llvm::Triple::getOSTypeName(llvm::Triple::Firmware);
1286 Triple.setOSName(Str);
1288 VerifyTripleForSDK(Args, Triple);
1290 return Triple.getTriple();
1302 return Dsymutil.get();
1306 return VerifyDebug.get();
1323 const ArgList &Args)
1324 :
Darwin(D, Triple, Args) {}
1328 CC1Args.push_back(
"-Wundef-prefix=TARGET_OS_");
1329 CC1Args.push_back(
"-Werror=undef-prefix");
1340 CC1Args.push_back(
"-Wdeprecated-objc-isa-usage");
1341 CC1Args.push_back(
"-Werror=deprecated-objc-isa-usage");
1346 CC1Args.push_back(
"-Werror=implicit-function-declaration");
1351 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
1361 static constexpr llvm::StringLiteral XcodeAppSuffix(
1362 ".app/Contents/Developer");
1363 size_t Index = PathIntoXcode.find(XcodeAppSuffix);
1364 if (Index == StringRef::npos)
1366 return PathIntoXcode.take_front(Index + XcodeAppSuffix.size());
1370 ArgStringList &CmdArgs)
const {
1389 llvm::sys::path::remove_filename(P);
1390 llvm::sys::path::remove_filename(P);
1391 llvm::sys::path::append(P,
"lib",
"arc");
1397 if (!
getVFS().exists(P)) {
1398 auto updatePath = [&](
const Arg *A) {
1402 if (XcodePathForSDK.empty())
1405 P = XcodePathForSDK;
1406 llvm::sys::path::append(P,
"Toolchains/XcodeDefault.xctoolchain/usr",
1408 return getVFS().exists(P);
1411 bool updated =
false;
1412 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot))
1413 updated = updatePath(A);
1416 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1421 CmdArgs.push_back(
"-force_load");
1422 llvm::sys::path::append(P,
"libarclite_");
1425 P +=
"watchsimulator";
1429 P +=
"appletvsimulator";
1433 P +=
"iphonesimulator";
1441 getDriver().
Diag(clang::diag::err_drv_darwin_sdk_missing_arclite) << P;
1443 CmdArgs.push_back(Args.MakeArgString(P));
1480 bool IsShared)
const {
1488 const char *LibArg = Args.MakeArgString(P);
1489 CmdArgs.push_back(LibArg);
1497 assert(StringRef(P).ends_with(
".dylib") &&
"must be a dynamic library");
1501 CmdArgs.push_back(
"-rpath");
1502 CmdArgs.push_back(
"@executable_path");
1506 CmdArgs.push_back(
"-rpath");
1507 CmdArgs.push_back(Args.MakeArgString(llvm::sys::path::parent_path(P)));
1514 "it doesn't make sense to ask for the compiler-rt library name as an "
1518 if (Component !=
"builtins") {
1519 MachOLibName +=
'.';
1520 MachOLibName += Component;
1525 llvm::sys::path::append(FullPath,
"lib",
"darwin",
"macho_embedded",
1527 return std::string(FullPath);
1537 "it doesn't make sense to ask for the compiler-rt library name as an "
1541 if (Component !=
"builtins") {
1542 DarwinLibName += Component;
1543 DarwinLibName +=
'_';
1549 llvm::sys::path::append(FullPath,
"lib",
"darwin", DarwinLibName);
1550 return std::string(FullPath);
1555 auto BeginSDK = llvm::sys::path::rbegin(isysroot);
1556 auto EndSDK = llvm::sys::path::rend(isysroot);
1557 for (
auto IT = BeginSDK; IT != EndSDK; ++IT) {
1558 StringRef SDK = *IT;
1559 if (SDK.consume_back(
".sdk"))
1589 llvm_unreachable(
"Unsupported platform");
1594 for (Arg *A : Args) {
1595 if (A->getOption().matches(options::OPT_exported__symbols__list))
1597 if (!A->getOption().matches(options::OPT_Wl_COMMA) &&
1598 !A->getOption().matches(options::OPT_Xlinker))
1600 if (A->containsValue(
"-exported_symbols_list") ||
1601 A->containsValue(
"-exported_symbol"))
1609 CmdArgs.push_back(
"-exported_symbol");
1610 CmdArgs.push_back(Symbol);
1620 StringRef Segment, StringRef Section) {
1621 for (
const char *A : {
"-sectalign", Args.MakeArgString(Segment),
1622 Args.MakeArgString(Section),
"0x4000"})
1623 CmdArgs.push_back(A);
1627 ArgStringList &CmdArgs)
const {
1656 for (
auto IPSK : {llvm::IPSK_cnts, llvm::IPSK_bitmap, llvm::IPSK_data}) {
1658 Args, CmdArgs,
"__DATA",
1659 llvm::getInstrProfSectionName(IPSK, llvm::Triple::MachO,
1665void DarwinClang::AddLinkSanitizerLibArgs(
const ArgList &Args,
1666 ArgStringList &CmdArgs,
1667 StringRef Sanitizer,
1668 bool Shared)
const {
1674 const ArgList &Args)
const {
1675 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
1676 StringRef
Value = A->getValue();
1677 if (
Value !=
"compiler-rt" &&
Value !=
"platform")
1678 getDriver().
Diag(clang::diag::err_drv_unsupported_rtlib_for_platform)
1679 <<
Value <<
"darwin";
1686 ArgStringList &CmdArgs,
1687 bool ForceLinkBuiltinRT)
const {
1697 if (Args.hasArg(options::OPT_static) ||
1698 Args.hasArg(options::OPT_fapple_kext) ||
1699 Args.hasArg(options::OPT_mkernel)) {
1700 if (ForceLinkBuiltinRT)
1708 if (
const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
1709 getDriver().
Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
1716 const char *sanitizer =
nullptr;
1718 sanitizer =
"UndefinedBehaviorSanitizer";
1720 sanitizer =
"RealtimeSanitizer";
1722 sanitizer =
"AddressSanitizer";
1724 sanitizer =
"ThreadSanitizer";
1727 getDriver().
Diag(diag::err_drv_unsupported_static_sanitizer_darwin)
1736 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan_abi",
false);
1739 "Static sanitizer runtimes not supported");
1740 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan");
1745 "Static sanitizer runtimes not supported");
1746 AddLinkSanitizerLibArgs(Args, CmdArgs,
"rtsan");
1749 AddLinkSanitizerLibArgs(Args, CmdArgs,
"lsan");
1752 "Static sanitizer runtimes not supported");
1753 AddLinkSanitizerLibArgs(
1759 "Static sanitizer runtimes not supported");
1760 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tsan");
1763 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tysan");
1764 if (Sanitize.
needsFuzzer() && !Args.hasArg(options::OPT_dynamiclib)) {
1765 AddLinkSanitizerLibArgs(Args, CmdArgs,
"fuzzer",
false);
1777 AddLinkSanitizerLibArgs(Args, CmdArgs,
"stats");
1785 llvm::memprof::getMemprofOptionsSymbolDarwinLinkageName().data());
1795 CmdArgs.push_back(
"-framework");
1796 CmdArgs.push_back(
"DriverKit");
1802 CmdArgs.push_back(
"-lSystem");
1814 CmdArgs.push_back(
"-lgcc_s.1");
1823 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
1824 if (!SystemTriple.isMacOSX())
1825 return std::string(MacOSSDKVersion);
1826 VersionTuple SystemVersion;
1827 SystemTriple.getMacOSXVersion(SystemVersion);
1829 unsigned Major, Minor, Micro;
1833 return std::string(MacOSSDKVersion);
1834 VersionTuple SDKVersion(Major, Minor, Micro);
1836 if (SDKVersion > SystemVersion)
1837 return SystemVersion.getAsString();
1838 return std::string(MacOSSDKVersion);
1845struct DarwinPlatform {
1854 DeploymentTargetEnv,
1864 DarwinPlatformKind getPlatform()
const {
return Platform; }
1866 DarwinEnvironmentKind getEnvironment()
const {
return Environment; }
1868 void setEnvironment(DarwinEnvironmentKind Kind) {
1870 InferSimulatorFromArch =
false;
1873 const VersionTuple getOSVersion()
const {
1874 return UnderlyingOSVersion.value_or(VersionTuple());
1877 VersionTuple takeOSVersion() {
1878 assert(UnderlyingOSVersion.has_value() &&
1879 "attempting to get an unset OS version");
1880 VersionTuple
Result = *UnderlyingOSVersion;
1881 UnderlyingOSVersion.reset();
1884 bool isValidOSVersion()
const {
1885 return llvm::Triple::isValidVersionForOS(getOSFromPlatform(Platform),
1889 VersionTuple getCanonicalOSVersion()
const {
1890 return llvm::Triple::getCanonicalVersionForOS(
1891 getOSFromPlatform(Platform), getOSVersion(),
true);
1894 void setOSVersion(
const VersionTuple &Version) {
1895 UnderlyingOSVersion = Version;
1898 bool hasOSVersion()
const {
return UnderlyingOSVersion.has_value(); }
1900 VersionTuple getZipperedOSVersion()
const {
1901 assert(Environment == DarwinEnvironmentKind::MacCatalyst &&
1902 "zippered target version is specified only for Mac Catalyst");
1903 return ZipperedOSVersion;
1907 bool isExplicitlySpecified()
const {
return Kind <= DeploymentTargetEnv; }
1910 bool canInferSimulatorFromArch()
const {
return InferSimulatorFromArch; }
1912 const std::optional<llvm::Triple> &getTargetVariantTriple()
const {
1913 return TargetVariantTriple;
1917 void addOSVersionMinArgument(DerivedArgList &Args,
const OptTable &Opts) {
1921 assert(Kind != TargetArg && Kind != MTargetOSArg && Kind != OSVersionArg &&
1925 case DarwinPlatformKind::MacOS:
1926 Opt = options::OPT_mmacos_version_min_EQ;
1928 case DarwinPlatformKind::IPhoneOS:
1929 Opt = options::OPT_mios_version_min_EQ;
1931 case DarwinPlatformKind::TvOS:
1932 Opt = options::OPT_mtvos_version_min_EQ;
1934 case DarwinPlatformKind::WatchOS:
1935 Opt = options::OPT_mwatchos_version_min_EQ;
1941 Arg = Args.MakeJoinedArg(
nullptr, Opts.getOption(Opt), OSVersionStr);
1947 std::string
getAsString(DerivedArgList &Args,
const OptTable &Opts) {
1953 assert(Arg &&
"OS version argument not yet inferred");
1954 return Arg->getAsString(Args);
1955 case DeploymentTargetEnv:
1956 return (llvm::Twine(EnvVarName) +
"=" + OSVersionStr).str();
1957 case InferredFromSDK:
1958 case InferredFromArch:
1959 llvm_unreachable(
"Cannot print arguments for inferred OS version");
1961 llvm_unreachable(
"Unsupported Darwin Source Kind");
1965 std::string getInferredSource() {
1966 assert(!isExplicitlySpecified() &&
"OS version was not inferred");
1967 return InferredSource.str();
1970 void setEnvironment(llvm::Triple::EnvironmentType EnvType,
1971 const VersionTuple &OSVersion,
1972 const std::optional<DarwinSDKInfo> &SDKInfo) {
1974 case llvm::Triple::Simulator:
1975 Environment = DarwinEnvironmentKind::Simulator;
1977 case llvm::Triple::MacABI: {
1978 Environment = DarwinEnvironmentKind::MacCatalyst;
1980 ZipperedOSVersion = VersionTuple(10, 15);
1981 if (hasOSVersion() && SDKInfo) {
1982 if (
const auto *MacCatalystToMacOSMapping = SDKInfo->getVersionMapping(
1984 if (
auto MacOSVersion = MacCatalystToMacOSMapping->map(
1985 OSVersion, ZipperedOSVersion, std::nullopt)) {
1986 ZipperedOSVersion = *MacOSVersion;
1993 if (TargetVariantTriple) {
1994 auto TargetVariantVersion = TargetVariantTriple->getOSVersion();
1995 if (TargetVariantVersion.getMajor()) {
1996 if (TargetVariantVersion < ZipperedOSVersion)
1997 ZipperedOSVersion = std::move(TargetVariantVersion);
2007 static DarwinPlatform
2008 createFromTarget(
const llvm::Triple &TT, Arg *A,
2009 std::optional<llvm::Triple> TargetVariantTriple,
2010 const std::optional<DarwinSDKInfo> &SDKInfo) {
2011 DarwinPlatform
Result(TargetArg, getPlatformFromOS(TT.getOS()),
2012 TT.getOSVersion(), A);
2013 VersionTuple OsVersion = TT.getOSVersion();
2014 Result.TargetVariantTriple = std::move(TargetVariantTriple);
2015 Result.setEnvironment(TT.getEnvironment(), OsVersion, SDKInfo);
2018 static DarwinPlatform
2019 createFromMTargetOS(llvm::Triple::OSType OS, VersionTuple OSVersion,
2020 llvm::Triple::EnvironmentType Environment, Arg *A,
2021 const std::optional<DarwinSDKInfo> &SDKInfo) {
2022 DarwinPlatform
Result(MTargetOSArg, getPlatformFromOS(OS), OSVersion, A);
2023 Result.InferSimulatorFromArch =
false;
2024 Result.setEnvironment(Environment, OSVersion, SDKInfo);
2027 static DarwinPlatform createOSVersionArg(DarwinPlatformKind Platform, Arg *A,
2029 DarwinPlatform
Result{OSVersionArg, Platform,
2030 getVersionFromString(A->getValue()), A};
2032 Result.Environment = DarwinEnvironmentKind::Simulator;
2035 static DarwinPlatform createDeploymentTargetEnv(DarwinPlatformKind Platform,
2036 StringRef EnvVarName,
2037 StringRef OSVersion) {
2038 DarwinPlatform
Result(DeploymentTargetEnv, Platform,
2039 getVersionFromString(OSVersion));
2040 Result.EnvVarName = EnvVarName;
2043 static DarwinPlatform createFromSDKInfo(StringRef SDKRoot,
2044 const DarwinSDKInfo &SDKInfo) {
2045 const DarwinSDKInfo::SDKPlatformInfo PlatformInfo =
2047 const llvm::Triple::OSType
OS = PlatformInfo.
getOS();
2049 if (OS == llvm::Triple::MacOSX)
2050 Version = getVersionFromString(
2052 DarwinPlatform
Result(InferredFromSDK, getPlatformFromOS(OS), Version);
2054 Result.InferSimulatorFromArch =
false;
2055 Result.InferredSource = SDKRoot;
2058 static DarwinPlatform createFromSDK(StringRef SDKRoot,
2059 DarwinPlatformKind Platform,
2061 bool IsSimulator =
false) {
2062 DarwinPlatform
Result(InferredFromSDK, Platform,
2063 getVersionFromString(
Value));
2065 Result.Environment = DarwinEnvironmentKind::Simulator;
2066 Result.InferSimulatorFromArch =
false;
2067 Result.InferredSource = SDKRoot;
2070 static DarwinPlatform createFromArch(StringRef
Arch, llvm::Triple::OSType OS,
2071 VersionTuple Version) {
2073 DarwinPlatform(InferredFromArch, getPlatformFromOS(OS), Version);
2081 DarwinSDKInfo inferSDKInfo() {
2082 assert(Kind == InferredFromSDK &&
"can infer SDK info only");
2083 llvm::Triple::OSType
OS = getOSFromPlatform(Platform);
2084 llvm::Triple::EnvironmentType EnvironmentType =
2085 getEnvTypeFromEnvKind(Environment);
2086 StringRef PlatformPrefix =
2087 (Platform == DarwinPlatformKind::DriverKit) ?
"/System/DriverKit" :
"";
2088 return DarwinSDKInfo(
"", OS, EnvironmentType, getOSVersion(),
2089 getDisplayName(Platform, Environment, getOSVersion()),
2091 VersionTuple(getOSVersion().getMajor(), 0, 99),
2092 {DarwinSDKInfo::SDKPlatformInfo(
2093 llvm::Triple::Apple, OS, EnvironmentType,
2094 llvm::Triple::MachO, PlatformPrefix)});
2098 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform, Arg *Argument)
2100 Arguments({Argument, VersionTuple().getAsString()}) {}
2101 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform,
2102 VersionTuple
Value, Arg *Argument =
nullptr)
2106 UnderlyingOSVersion =
Value;
2109 static VersionTuple getVersionFromString(
const StringRef Input) {
2110 llvm::VersionTuple Version;
2111 bool IsValid = !Version.tryParse(Input);
2112 assert(IsValid &&
"unable to convert input version to version tuple");
2117 static DarwinPlatformKind getPlatformFromOS(llvm::Triple::OSType OS) {
2119 case llvm::Triple::Darwin:
2120 case llvm::Triple::MacOSX:
2121 return DarwinPlatformKind::MacOS;
2122 case llvm::Triple::IOS:
2123 return DarwinPlatformKind::IPhoneOS;
2124 case llvm::Triple::TvOS:
2125 return DarwinPlatformKind::TvOS;
2126 case llvm::Triple::WatchOS:
2127 return DarwinPlatformKind::WatchOS;
2128 case llvm::Triple::XROS:
2129 return DarwinPlatformKind::XROS;
2130 case llvm::Triple::DriverKit:
2131 return DarwinPlatformKind::DriverKit;
2132 case llvm::Triple::Firmware:
2133 return DarwinPlatformKind::Firmware;
2135 llvm_unreachable(
"Unable to infer Darwin variant");
2139 static llvm::Triple::OSType getOSFromPlatform(DarwinPlatformKind Platform) {
2141 case DarwinPlatformKind::MacOS:
2142 return llvm::Triple::MacOSX;
2143 case DarwinPlatformKind::IPhoneOS:
2144 return llvm::Triple::IOS;
2145 case DarwinPlatformKind::TvOS:
2146 return llvm::Triple::TvOS;
2147 case DarwinPlatformKind::WatchOS:
2148 return llvm::Triple::WatchOS;
2149 case DarwinPlatformKind::DriverKit:
2150 return llvm::Triple::DriverKit;
2151 case DarwinPlatformKind::XROS:
2152 return llvm::Triple::XROS;
2153 case DarwinPlatformKind::Firmware:
2154 return llvm::Triple::Firmware;
2156 llvm_unreachable(
"Unknown DarwinPlatformKind enum");
2159 static DarwinEnvironmentKind
2160 getEnvKindFromEnvType(llvm::Triple::EnvironmentType EnvironmentType) {
2161 switch (EnvironmentType) {
2162 case llvm::Triple::UnknownEnvironment:
2163 return DarwinEnvironmentKind::NativeEnvironment;
2164 case llvm::Triple::Simulator:
2165 return DarwinEnvironmentKind::Simulator;
2166 case llvm::Triple::MacABI:
2167 return DarwinEnvironmentKind::MacCatalyst;
2169 llvm_unreachable(
"Unable to infer Darwin environment");
2173 static llvm::Triple::EnvironmentType
2174 getEnvTypeFromEnvKind(DarwinEnvironmentKind EnvironmentKind) {
2175 switch (EnvironmentKind) {
2176 case DarwinEnvironmentKind::NativeEnvironment:
2177 return llvm::Triple::UnknownEnvironment;
2178 case DarwinEnvironmentKind::Simulator:
2179 return llvm::Triple::Simulator;
2180 case DarwinEnvironmentKind::MacCatalyst:
2181 return llvm::Triple::MacABI;
2183 llvm_unreachable(
"Unknown DarwinEnvironmentKind enum");
2186 static std::string getDisplayName(DarwinPlatformKind TargetPlatform,
2187 DarwinEnvironmentKind TargetEnvironment,
2188 VersionTuple Version) {
2189 SmallVector<std::string, 3> Components;
2190 switch (TargetPlatform) {
2191 case DarwinPlatformKind::MacOS:
2192 Components.push_back(
"macOS");
2194 case DarwinPlatformKind::IPhoneOS:
2195 Components.push_back(
"iOS");
2197 case DarwinPlatformKind::TvOS:
2198 Components.push_back(
"tvOS");
2200 case DarwinPlatformKind::WatchOS:
2201 Components.push_back(
"watchOS");
2203 case DarwinPlatformKind::DriverKit:
2204 Components.push_back(
"DriverKit");
2207 llvm::reportFatalUsageError(Twine(
"Platform: '") +
2208 std::to_string(TargetPlatform) +
2209 "' is unsupported when inferring SDK Info.");
2211 switch (TargetEnvironment) {
2212 case DarwinEnvironmentKind::NativeEnvironment:
2214 case DarwinEnvironmentKind::Simulator:
2215 Components.push_back(
"Simulator");
2218 llvm::reportFatalUsageError(Twine(
"Environment: '") +
2219 std::to_string(TargetEnvironment) +
2220 "' is unsupported when inferring SDK Info.");
2222 Components.push_back(Version.getAsString());
2223 return join(Components,
" ");
2227 DarwinPlatformKind Platform;
2228 DarwinEnvironmentKind Environment = DarwinEnvironmentKind::NativeEnvironment;
2232 VersionTuple ZipperedOSVersion;
2237 std::optional<VersionTuple> UnderlyingOSVersion;
2238 bool InferSimulatorFromArch =
true;
2239 std::pair<Arg *, std::string>
Arguments;
2240 StringRef EnvVarName;
2243 StringRef InferredSource;
2246 std::optional<llvm::Triple> TargetVariantTriple;
2251std::optional<DarwinPlatform>
2252getDeploymentTargetFromOSVersionArg(DerivedArgList &Args,
2253 const Driver &TheDriver) {
2254 Arg *macOSVersion = Args.getLastArg(options::OPT_mmacos_version_min_EQ);
2255 Arg *iOSVersion = Args.getLastArg(options::OPT_mios_version_min_EQ,
2256 options::OPT_mios_simulator_version_min_EQ);
2258 Args.getLastArg(options::OPT_mtvos_version_min_EQ,
2259 options::OPT_mtvos_simulator_version_min_EQ);
2260 Arg *WatchOSVersion =
2261 Args.getLastArg(options::OPT_mwatchos_version_min_EQ,
2262 options::OPT_mwatchos_simulator_version_min_EQ);
2264 auto GetDarwinPlatform =
2265 [&](DarwinPlatform::DarwinPlatformKind Platform, Arg *VersionArg,
2266 bool IsSimulator) -> std::optional<DarwinPlatform> {
2267 if (StringRef(VersionArg->getValue()).empty()) {
2268 TheDriver.
Diag(diag::err_drv_missing_version_number)
2269 << VersionArg->getAsString(Args);
2270 return std::nullopt;
2272 return DarwinPlatform::createOSVersionArg(Platform, VersionArg,
2277 if (iOSVersion || TvOSVersion || WatchOSVersion) {
2278 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2279 << macOSVersion->getAsString(Args)
2280 << (iOSVersion ? iOSVersion
2281 : TvOSVersion ? TvOSVersion : WatchOSVersion)
2287 }
else if (iOSVersion) {
2288 if (TvOSVersion || WatchOSVersion) {
2289 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2290 << iOSVersion->getAsString(Args)
2291 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->
getAsString(Args);
2294 iOSVersion->getOption().getID() ==
2295 options::OPT_mios_simulator_version_min_EQ);
2296 }
else if (TvOSVersion) {
2297 if (WatchOSVersion) {
2298 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2299 << TvOSVersion->getAsString(Args)
2300 << WatchOSVersion->getAsString(Args);
2303 TvOSVersion->getOption().getID() ==
2304 options::OPT_mtvos_simulator_version_min_EQ);
2305 }
else if (WatchOSVersion)
2306 return GetDarwinPlatform(
2308 WatchOSVersion->getOption().getID() ==
2309 options::OPT_mwatchos_simulator_version_min_EQ);
2310 return std::nullopt;
2315std::optional<DarwinPlatform>
2316getDeploymentTargetFromEnvironmentVariables(
const Driver &TheDriver,
2317 const llvm::Triple &Triple) {
2318 const char *EnvVars[] = {
2319 "MACOSX_DEPLOYMENT_TARGET",
2320 "IPHONEOS_DEPLOYMENT_TARGET",
2321 "TVOS_DEPLOYMENT_TARGET",
2322 "WATCHOS_DEPLOYMENT_TARGET",
2323 "DRIVERKIT_DEPLOYMENT_TARGET",
2324 "XROS_DEPLOYMENT_TARGET"
2326 std::string Targets[std::size(EnvVars)];
2327 for (
const auto &I : llvm::enumerate(llvm::ArrayRef(EnvVars))) {
2328 if (
char *Env = ::getenv(I.value()))
2329 Targets[I.index()] = Env;
2338 if (Triple.getArch() == llvm::Triple::arm ||
2339 Triple.getArch() == llvm::Triple::aarch64 ||
2340 Triple.getArch() == llvm::Triple::thumb)
2347 unsigned FirstTarget = std::size(Targets);
2348 for (
unsigned I = 0; I != std::size(Targets); ++I) {
2349 if (Targets[I].empty())
2351 if (FirstTarget == std::size(Targets))
2354 TheDriver.
Diag(diag::err_drv_conflicting_deployment_targets)
2355 << Targets[FirstTarget] << Targets[I];
2359 for (
const auto &
Target : llvm::enumerate(llvm::ArrayRef(Targets))) {
2360 if (!
Target.value().empty())
2361 return DarwinPlatform::createDeploymentTargetEnv(
2365 return std::nullopt;
2371std::optional<DarwinPlatform>
2372inferDeploymentTargetFromSDK(DerivedArgList &Args,
2373 const std::optional<DarwinSDKInfo> &SDKInfo) {
2374 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2376 return std::nullopt;
2377 StringRef isysroot = A->getValue();
2379 return DarwinPlatform::createFromSDKInfo(isysroot, *SDKInfo);
2383 return std::nullopt;
2385 std::string Version;
2388 size_t StartVer = SDK.find_first_of(
"0123456789");
2389 size_t EndVer = SDK.find_last_of(
"0123456789");
2390 if (StartVer != StringRef::npos && EndVer > StartVer)
2391 Version = std::string(SDK.slice(StartVer, EndVer + 1));
2392 if (Version.empty())
2393 return std::nullopt;
2395 if (SDK.starts_with(
"iPhoneOS") || SDK.starts_with(
"iPhoneSimulator"))
2396 return DarwinPlatform::createFromSDK(
2398 SDK.starts_with(
"iPhoneSimulator"));
2399 else if (SDK.starts_with(
"MacOSX"))
2400 return DarwinPlatform::createFromSDK(isysroot,
Darwin::MacOS,
2402 else if (SDK.starts_with(
"WatchOS") || SDK.starts_with(
"WatchSimulator"))
2403 return DarwinPlatform::createFromSDK(
2405 SDK.starts_with(
"WatchSimulator"));
2406 else if (SDK.starts_with(
"AppleTVOS") || SDK.starts_with(
"AppleTVSimulator"))
2407 return DarwinPlatform::createFromSDK(
2409 SDK.starts_with(
"AppleTVSimulator"));
2410 else if (SDK.starts_with(
"DriverKit"))
2412 return std::nullopt;
2416VersionTuple getInferredOSVersion(llvm::Triple::OSType OS,
2417 const llvm::Triple &Triple,
2418 const Driver &TheDriver) {
2419 VersionTuple OsVersion;
2420 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
2422 case llvm::Triple::Darwin:
2423 case llvm::Triple::MacOSX:
2426 if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
2427 !Triple.getOSMajorVersion())
2428 SystemTriple.getMacOSXVersion(OsVersion);
2429 else if (!Triple.getMacOSXVersion(OsVersion))
2430 TheDriver.
Diag(diag::err_drv_invalid_darwin_version)
2431 << Triple.getOSName();
2433 case llvm::Triple::IOS:
2434 if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
2435 OsVersion = VersionTuple(13, 1);
2437 OsVersion = Triple.getiOSVersion();
2439 case llvm::Triple::TvOS:
2440 OsVersion = Triple.getOSVersion();
2442 case llvm::Triple::WatchOS:
2443 OsVersion = Triple.getWatchOSVersion();
2445 case llvm::Triple::DriverKit:
2446 OsVersion = Triple.getDriverKitVersion();
2449 OsVersion = Triple.getOSVersion();
2450 if (!OsVersion.getMajor())
2451 OsVersion = OsVersion.withMajorReplaced(1);
2458std::optional<DarwinPlatform>
2459inferDeploymentTargetFromArch(DerivedArgList &Args,
const Darwin &Toolchain,
2460 const llvm::Triple &Triple,
2461 const Driver &TheDriver) {
2462 llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS;
2465 if (MachOArchName ==
"arm64" || MachOArchName ==
"arm64e")
2466 OSTy = llvm::Triple::MacOSX;
2467 else if (MachOArchName ==
"armv7" || MachOArchName ==
"armv7s" ||
2468 MachOArchName ==
"armv6")
2469 OSTy = llvm::Triple::IOS;
2470 else if (MachOArchName ==
"armv7k" || MachOArchName ==
"arm64_32")
2471 OSTy = llvm::Triple::WatchOS;
2472 else if (MachOArchName !=
"armv6m" && MachOArchName !=
"armv7m" &&
2473 MachOArchName !=
"armv7em" && MachOArchName !=
"armv8m.base" &&
2474 MachOArchName !=
"armv8m.main" && MachOArchName !=
"armv8.1m.main")
2475 OSTy = llvm::Triple::MacOSX;
2476 if (OSTy == llvm::Triple::UnknownOS)
2477 return std::nullopt;
2478 return DarwinPlatform::createFromArch(
2479 MachOArchName, OSTy, getInferredOSVersion(OSTy, Triple, TheDriver));
2483std::optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
2484 DerivedArgList &Args,
const llvm::Triple &Triple,
const Driver &TheDriver,
2485 const std::optional<DarwinSDKInfo> &SDKInfo) {
2486 if (!Args.hasArg(options::OPT_target))
2487 return std::nullopt;
2488 if (Triple.getOS() == llvm::Triple::Darwin ||
2489 Triple.getOS() == llvm::Triple::UnknownOS)
2490 return std::nullopt;
2491 std::optional<llvm::Triple> TargetVariantTriple;
2492 for (
const Arg *A : Args.filtered(options::OPT_darwin_target_variant)) {
2493 llvm::Triple TVT(A->getValue());
2495 if ((Triple.getArch() == llvm::Triple::aarch64 ||
2496 TVT.getArchName() == Triple.getArchName()) &&
2497 TVT.getArch() == Triple.getArch() &&
2498 TVT.getSubArch() == Triple.getSubArch() &&
2499 TVT.getVendor() == Triple.getVendor()) {
2500 if (TargetVariantTriple)
2505 if ((Triple.isMacOSX() && TVT.getOS() == llvm::Triple::IOS &&
2506 TVT.isMacCatalystEnvironment()) ||
2507 (TVT.isMacOSX() && Triple.getOS() == llvm::Triple::IOS &&
2508 Triple.isMacCatalystEnvironment())) {
2509 TargetVariantTriple = TVT;
2512 TheDriver.
Diag(diag::err_drv_target_variant_invalid)
2513 << A->getSpelling() << A->getValue();
2516 DarwinPlatform PlatformAndVersion = DarwinPlatform::createFromTarget(
2517 Triple, Args.getLastArg(options::OPT_target), TargetVariantTriple,
2520 return PlatformAndVersion;
2524std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2525 DerivedArgList &Args,
const Driver &TheDriver,
2526 const std::optional<DarwinSDKInfo> &SDKInfo) {
2527 auto *A = Args.getLastArg(options::OPT_mtargetos_EQ);
2529 return std::nullopt;
2530 llvm::Triple TT(llvm::Twine(
"unknown-apple-") + A->getValue());
2531 switch (TT.getOS()) {
2532 case llvm::Triple::MacOSX:
2533 case llvm::Triple::IOS:
2534 case llvm::Triple::TvOS:
2535 case llvm::Triple::WatchOS:
2536 case llvm::Triple::XROS:
2539 TheDriver.
Diag(diag::err_drv_invalid_os_in_arg)
2540 << TT.getOSName() << A->getAsString(Args);
2541 return std::nullopt;
2544 VersionTuple Version = TT.getOSVersion();
2545 if (!Version.getMajor()) {
2546 TheDriver.
Diag(diag::err_drv_invalid_version_number)
2547 << A->getAsString(Args);
2548 return std::nullopt;
2550 return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
2551 TT.getEnvironment(), A, SDKInfo);
2554std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS,
2555 const ArgList &Args,
2556 const Driver &TheDriver) {
2557 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2559 return std::nullopt;
2560 StringRef isysroot = A->getValue();
2562 if (!SDKInfoOrErr) {
2563 llvm::consumeError(SDKInfoOrErr.takeError());
2564 TheDriver.
Diag(diag::warn_drv_darwin_sdk_invalid_settings);
2565 return std::nullopt;
2567 return *SDKInfoOrErr;
2572void Darwin::AddDeploymentTarget(DerivedArgList &Args)
const {
2578 bool TryXcselect =
false;
2584 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2586 if (!
getVFS().exists(A->getValue()))
2587 getDriver().
Diag(clang::diag::warn_missing_sysroot) << A->getValue();
2588 }
else if (
const char *env = ::getenv(
"SDKROOT")) {
2591 if (llvm::sys::path::is_absolute(env) &&
getVFS().exists(env) &&
2592 StringRef(env) !=
"/") {
2593 Args.append(Args.MakeSeparateArg(
2594 nullptr, Opts.getOption(options::OPT_isysroot), env));
2597 TryXcselect = !Args.hasArg(options::OPT__sysroot_EQ) &&
2598 !Args.hasArg(options::OPT_no_xcselect);
2608 std::optional<DarwinPlatform> PlatformAndVersion =
2610 if (PlatformAndVersion) {
2612 if (
const auto *MTargetOSArg = Args.getLastArg(options::OPT_mtargetos_EQ)) {
2613 std::string TargetArgStr = PlatformAndVersion->getAsString(Args, Opts);
2614 std::string MTargetOSArgStr = MTargetOSArg->getAsString(Args);
2616 << TargetArgStr << MTargetOSArgStr;
2619 bool TripleProvidedOSVersion = PlatformAndVersion->hasOSVersion();
2620 if (!TripleProvidedOSVersion)
2621 PlatformAndVersion->setOSVersion(
2624 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2625 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2626 if (PlatformAndVersionFromOSVersionArg) {
2627 unsigned TargetMajor, TargetMinor, TargetMicro;
2629 unsigned ArgMajor, ArgMinor, ArgMicro;
2631 if (PlatformAndVersion->getPlatform() !=
2632 PlatformAndVersionFromOSVersionArg->getPlatform() ||
2634 PlatformAndVersion->getOSVersion().getAsString(), TargetMajor,
2635 TargetMinor, TargetMicro, TargetExtra) &&
2637 PlatformAndVersionFromOSVersionArg->getOSVersion().getAsString(),
2638 ArgMajor, ArgMinor, ArgMicro, ArgExtra) &&
2639 (VersionTuple(TargetMajor, TargetMinor, TargetMicro) !=
2640 VersionTuple(ArgMajor, ArgMinor, ArgMicro) ||
2641 TargetExtra != ArgExtra))) {
2644 if (PlatformAndVersion->getPlatform() ==
2645 PlatformAndVersionFromOSVersionArg->getPlatform() &&
2646 !TripleProvidedOSVersion) {
2647 PlatformAndVersion->setOSVersion(
2648 PlatformAndVersionFromOSVersionArg->getOSVersion());
2652 std::string OSVersionArg =
2653 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2654 std::string TargetArg = PlatformAndVersion->getAsString(Args, Opts);
2656 << OSVersionArg << TargetArg;
2660 }
else if ((PlatformAndVersion = getDeploymentTargetFromMTargetOSArg(
2664 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2665 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2666 if (PlatformAndVersionFromOSVersionArg) {
2667 std::string MTargetOSArgStr = PlatformAndVersion->getAsString(Args, Opts);
2668 std::string OSVersionArgStr =
2669 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2671 << MTargetOSArgStr << OSVersionArgStr;
2675 PlatformAndVersion = getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2678 if (!PlatformAndVersion) {
2679 PlatformAndVersion =
2681 if (PlatformAndVersion) {
2683 std::optional<DarwinPlatform> SDKTarget =
2684 inferDeploymentTargetFromSDK(Args,
SDKInfo);
2686 PlatformAndVersion->setEnvironment(SDKTarget->getEnvironment());
2692 if (!PlatformAndVersion) {
2693 PlatformAndVersion = inferDeploymentTargetFromSDK(Args,
SDKInfo);
2696 if (PlatformAndVersion && !
SDKInfo)
2697 SDKInfo = PlatformAndVersion->inferSDKInfo();
2701 if (!PlatformAndVersion)
2702 PlatformAndVersion =
2706 assert(PlatformAndVersion &&
"Unable to infer Darwin variant");
2707 if (!PlatformAndVersion->isValidOSVersion()) {
2708 if (PlatformAndVersion->isExplicitlySpecified())
2710 << PlatformAndVersion->getAsString(Args, Opts);
2712 getDriver().
Diag(diag::err_drv_invalid_version_number_inferred)
2713 << PlatformAndVersion->getOSVersion().getAsString()
2714 << PlatformAndVersion->getInferredSource();
2719 VersionTuple CanonicalVersion = PlatformAndVersion->getCanonicalOSVersion();
2720 if (CanonicalVersion != PlatformAndVersion->getOSVersion()) {
2721 getDriver().
Diag(diag::warn_drv_overriding_deployment_version)
2722 << PlatformAndVersion->getOSVersion().getAsString()
2723 << CanonicalVersion.getAsString();
2724 PlatformAndVersion->setOSVersion(CanonicalVersion);
2727 PlatformAndVersion->addOSVersionMinArgument(Args, Opts);
2730 unsigned Major, Minor, Micro;
2733 const unsigned MajorVersionLimit = 1000;
2734 const VersionTuple OSVersion = PlatformAndVersion->takeOSVersion();
2735 const std::string OSVersionStr = OSVersion.getAsString();
2737 if (Platform ==
MacOS) {
2738#ifdef CLANG_USE_XCSELECT
2741 if (!::xcselect_host_sdk_path(CLANG_XCSELECT_HOST_SDK_POLICY, &p)) {
2742 Args.append(Args.MakeSeparateArg(
2743 nullptr, Opts.getOption(options::OPT_isysroot), p));
2752 HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
2755 << PlatformAndVersion->getAsString(Args, Opts);
2759 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2761 << PlatformAndVersion->getAsString(Args, Opts);
2763 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst &&
2764 (Major < 13 || (Major == 13 && Minor < 1))) {
2766 << PlatformAndVersion->getAsString(Args, Opts);
2773 if (
getTriple().isArch32Bit() && Major >= 11) {
2775 if (PlatformAndVersion->isExplicitlySpecified()) {
2776 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst)
2777 getDriver().
Diag(diag::err_invalid_macos_32bit_deployment_target);
2780 << PlatformAndVersion->getAsString(Args, Opts);
2788 }
else if (Platform ==
TvOS) {
2791 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2793 << PlatformAndVersion->getAsString(Args, Opts);
2794 }
else if (Platform ==
WatchOS) {
2797 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2799 << PlatformAndVersion->getAsString(Args, Opts);
2803 HadExtra || Major < 19 || Major >= MajorVersionLimit || Minor >= 100 ||
2806 << PlatformAndVersion->getAsString(Args, Opts);
2810 HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2813 << PlatformAndVersion->getAsString(Args, Opts);
2820 PlatformAndVersion->canInferSimulatorFromArch() &&
getTriple().isX86())
2823 VersionTuple ZipperedOSVersion;
2825 ZipperedOSVersion = PlatformAndVersion->getZipperedOSVersion();
2826 setTarget(Platform, Environment, Major, Minor, Micro, ZipperedOSVersion);
2838 return !
SDKInfo->getPlatformPrefix(T).empty();
2847 const llvm::Triple &T)
const {
2849 const StringRef PlatformPrefix =
SDKInfo->getPlatformPrefix(T);
2850 if (!PlatformPrefix.empty())
2851 llvm::sys::path::append(Path, PlatformPrefix);
2852 }
else if (T.isDriverKit()) {
2855 llvm::sys::path::append(Path,
"System",
"DriverKit");
2864 if (DriverArgs.hasArg(options::OPT_isysroot))
2865 Path = DriverArgs.getLastArgValue(options::OPT_isysroot);
2876 const llvm::opt::ArgList &DriverArgs,
2877 llvm::opt::ArgStringList &CC1Args)
const {
2882 bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc);
2883 bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc);
2884 bool NoBuiltinInc = DriverArgs.hasFlag(
2885 options::OPT_nobuiltininc, options::OPT_ibuiltininc,
false);
2886 bool ForceBuiltinInc = DriverArgs.hasFlag(
2887 options::OPT_ibuiltininc, options::OPT_nobuiltininc,
false);
2890 if (!NoStdInc && !NoStdlibInc) {
2892 llvm::sys::path::append(P,
"usr",
"local",
"include");
2897 if (!(NoStdInc && !ForceBuiltinInc) && !NoBuiltinInc) {
2899 llvm::sys::path::append(P,
"include");
2903 if (NoStdInc || NoStdlibInc)
2907 llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
2908 if (!CIncludeDirs.empty()) {
2910 CIncludeDirs.split(dirs,
":");
2911 for (llvm::StringRef dir : dirs) {
2912 llvm::StringRef Prefix =
2913 llvm::sys::path::is_absolute(dir) ?
"" : llvm::StringRef(Sysroot);
2919 llvm::sys::path::append(P,
"usr",
"include");
2925 const llvm::opt::ArgList &DriverArgs,
2926 llvm::opt::ArgStringList &CC1Args)
const {
2929 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc))
2938 llvm::sys::path::append(P1,
"System",
"Library",
"Frameworks");
2939 llvm::sys::path::append(P2,
"System",
"Library",
"SubFrameworks");
2940 llvm::sys::path::append(P3,
"Library",
"Frameworks");
2944bool DarwinClang::AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
2945 llvm::opt::ArgStringList &CC1Args,
2947 llvm::StringRef Version,
2948 llvm::StringRef ArchDir,
2949 llvm::StringRef BitDir)
const {
2950 llvm::sys::path::append(
Base, Version);
2958 if (!ArchDir.empty())
2959 llvm::sys::path::append(P, ArchDir);
2960 if (!BitDir.empty())
2961 llvm::sys::path::append(P, BitDir);
2968 llvm::sys::path::append(P,
"backward");
2976 const llvm::opt::ArgList &DriverArgs,
2977 llvm::opt::ArgStringList &CC1Args)
const {
2985 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
2986 options::OPT_nostdincxx))
3007 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
3008 if (
getVFS().exists(InstallBin)) {
3011 }
else if (DriverArgs.hasArg(options::OPT_v)) {
3012 llvm::errs() <<
"ignoring nonexistent directory \"" << InstallBin
3018 llvm::sys::path::append(SysrootUsr,
"usr",
"include",
"c++",
"v1");
3019 if (
getVFS().exists(SysrootUsr)) {
3022 }
else if (DriverArgs.hasArg(options::OPT_v)) {
3023 llvm::errs() <<
"ignoring nonexistent directory \"" << SysrootUsr
3032 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args);
3037void AppleMachO::AddGnuCPlusPlusIncludePaths(
3038 const llvm::opt::ArgList &DriverArgs,
3039 llvm::opt::ArgStringList &CC1Args)
const {}
3041void DarwinClang::AddGnuCPlusPlusIncludePaths(
3042 const llvm::opt::ArgList &DriverArgs,
3043 llvm::opt::ArgStringList &CC1Args)
const {
3045 llvm::sys::path::append(UsrIncludeCxx,
"usr",
"include",
"c++");
3047 llvm::Triple::ArchType arch =
getTriple().getArch();
3048 bool IsBaseFound =
true;
3053 case llvm::Triple::x86:
3054 case llvm::Triple::x86_64:
3055 IsBaseFound = AddGnuCPlusPlusIncludePaths(
3056 DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
"i686-apple-darwin10",
3057 arch == llvm::Triple::x86_64 ?
"x86_64" :
"");
3058 IsBaseFound |= AddGnuCPlusPlusIncludePaths(
3059 DriverArgs, CC1Args, UsrIncludeCxx,
"4.0.0",
"i686-apple-darwin8",
"");
3062 case llvm::Triple::arm:
3063 case llvm::Triple::thumb:
3065 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3066 "arm-apple-darwin10",
"v7");
3068 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3069 "arm-apple-darwin10",
"v6");
3072 case llvm::Triple::aarch64:
3074 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3075 "arm64-apple-darwin10",
"");
3085 ArgStringList &CmdArgs)
const {
3090 CmdArgs.push_back(
"-lc++");
3091 if (Args.hasArg(options::OPT_fexperimental_library))
3092 CmdArgs.push_back(
"-lc++experimental");
3102 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
3104 llvm::sys::path::append(P,
"usr",
"lib",
"libstdc++.dylib");
3106 if (!
getVFS().exists(P)) {
3107 llvm::sys::path::remove_filename(P);
3108 llvm::sys::path::append(P,
"libstdc++.6.dylib");
3109 if (
getVFS().exists(P)) {
3110 CmdArgs.push_back(Args.MakeArgString(P));
3119 if (!
getVFS().exists(
"/usr/lib/libstdc++.dylib") &&
3120 getVFS().exists(
"/usr/lib/libstdc++.6.dylib")) {
3121 CmdArgs.push_back(
"/usr/lib/libstdc++.6.dylib");
3126 CmdArgs.push_back(
"-lstdc++");
3132 ArgStringList &CmdArgs)
const {
3138 llvm::sys::path::append(P,
"lib",
"darwin");
3142 llvm::sys::path::append(P,
"libclang_rt.cc_kext_watchos.a");
3144 llvm::sys::path::append(P,
"libclang_rt.cc_kext_tvos.a");
3146 llvm::sys::path::append(P,
"libclang_rt.cc_kext_ios.a");
3150 llvm::sys::path::append(
3151 P, llvm::Twine(
"libclang_rt.cc_kext_") +
3152 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
".a");
3154 llvm::sys::path::append(P,
"libclang_rt.cc_kext.a");
3160 CmdArgs.push_back(Args.MakeArgString(P));
3164 StringRef BoundArch,
3166 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
3176 for (Arg *A : Args) {
3185 case options::OPT_mkernel:
3186 case options::OPT_fapple_kext:
3188 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
3191 case options::OPT_dependency_file:
3192 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
3195 case options::OPT_gfull:
3196 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3198 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
3201 case options::OPT_gused:
3202 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3204 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
3207 case options::OPT_shared:
3208 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
3211 case options::OPT_fconstant_cfstrings:
3212 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
3215 case options::OPT_fno_constant_cfstrings:
3216 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
3219 case options::OPT_Wnonportable_cfstrings:
3221 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
3224 case options::OPT_Wno_nonportable_cfstrings:
3226 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
3233 if (!BoundArch.empty()) {
3234 StringRef Name = BoundArch;
3235 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
3236 const Option MArch = Opts.getOption(options::OPT_march_EQ);
3242 else if (Name ==
"ppc601")
3243 DAL->AddJoinedArg(
nullptr, MCpu,
"601");
3244 else if (Name ==
"ppc603")
3245 DAL->AddJoinedArg(
nullptr, MCpu,
"603");
3246 else if (Name ==
"ppc604")
3247 DAL->AddJoinedArg(
nullptr, MCpu,
"604");
3248 else if (Name ==
"ppc604e")
3249 DAL->AddJoinedArg(
nullptr, MCpu,
"604e");
3250 else if (Name ==
"ppc750")
3251 DAL->AddJoinedArg(
nullptr, MCpu,
"750");
3252 else if (Name ==
"ppc7400")
3253 DAL->AddJoinedArg(
nullptr, MCpu,
"7400");
3254 else if (Name ==
"ppc7450")
3255 DAL->AddJoinedArg(
nullptr, MCpu,
"7450");
3256 else if (Name ==
"ppc970")
3257 DAL->AddJoinedArg(
nullptr, MCpu,
"970");
3259 else if (Name ==
"ppc64" || Name ==
"ppc64le")
3260 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3262 else if (Name ==
"i386")
3264 else if (Name ==
"i486")
3265 DAL->AddJoinedArg(
nullptr, MArch,
"i486");
3266 else if (Name ==
"i586")
3267 DAL->AddJoinedArg(
nullptr, MArch,
"i586");
3268 else if (Name ==
"i686")
3269 DAL->AddJoinedArg(
nullptr, MArch,
"i686");
3270 else if (Name ==
"pentium")
3271 DAL->AddJoinedArg(
nullptr, MArch,
"pentium");
3272 else if (Name ==
"pentium2")
3273 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3274 else if (Name ==
"pentpro")
3275 DAL->AddJoinedArg(
nullptr, MArch,
"pentiumpro");
3276 else if (Name ==
"pentIIm3")
3277 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3279 else if (Name ==
"x86_64" || Name ==
"x86_64h")
3280 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3282 else if (Name ==
"arm")
3283 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3284 else if (Name ==
"armv4t")
3285 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3286 else if (Name ==
"armv5")
3287 DAL->AddJoinedArg(
nullptr, MArch,
"armv5tej");
3288 else if (Name ==
"xscale")
3289 DAL->AddJoinedArg(
nullptr, MArch,
"xscale");
3290 else if (Name ==
"armv6")
3291 DAL->AddJoinedArg(
nullptr, MArch,
"armv6k");
3292 else if (Name ==
"armv6m")
3293 DAL->AddJoinedArg(
nullptr, MArch,
"armv6m");
3294 else if (Name ==
"armv7")
3295 DAL->AddJoinedArg(
nullptr, MArch,
"armv7a");
3296 else if (Name ==
"armv7em")
3297 DAL->AddJoinedArg(
nullptr, MArch,
"armv7em");
3298 else if (Name ==
"armv7k")
3299 DAL->AddJoinedArg(
nullptr, MArch,
"armv7k");
3300 else if (Name ==
"armv7m")
3301 DAL->AddJoinedArg(
nullptr, MArch,
"armv7m");
3302 else if (Name ==
"armv7s")
3303 DAL->AddJoinedArg(
nullptr, MArch,
"armv7s");
3304 else if (Name ==
"armv8-m.base" || Name ==
"armv8m.base")
3305 DAL->AddJoinedArg(
nullptr, MArch,
"armv8m.base");
3306 else if (Name ==
"armv8-m.main" || Name ==
"armv8m.main")
3307 DAL->AddJoinedArg(
nullptr, MArch,
"armv8m.main");
3308 else if (Name ==
"armv8.1-m.main" || Name ==
"armv8.1m.main")
3309 DAL->AddJoinedArg(
nullptr, MArch,
"armv8.1m.main");
3316 ArgStringList &CmdArgs,
3317 bool ForceLinkBuiltinRT)
const {
3326 CompilerRT += Args.hasArg(options::OPT_fPIC) ?
"_pic" :
"_static";
3332 llvm::Triple::OSType OS;
3338 OS = llvm::Triple::MacOSX;
3341 OS = llvm::Triple::IOS;
3344 OS = llvm::Triple::TvOS;
3347 OS = llvm::Triple::WatchOS;
3363 switch (SDKInfo->getEnvironment()) {
3364 case llvm::Triple::UnknownEnvironment:
3365 case llvm::Triple::Simulator:
3366 case llvm::Triple::MacABI:
3375 VersionTuple SDKVersion = SDKInfo->getVersion();
3376 switch (SDKInfo->getOS()) {
3379 case llvm::Triple::MacOSX:
3380 return SDKVersion >= VersionTuple(15U);
3381 case llvm::Triple::IOS:
3382 return SDKVersion >= VersionTuple(18U);
3383 case llvm::Triple::TvOS:
3384 return SDKVersion >= VersionTuple(18U);
3385 case llvm::Triple::WatchOS:
3386 return SDKVersion >= VersionTuple(11U);
3387 case llvm::Triple::XROS:
3388 return SDKVersion >= VersionTuple(2U);
3396static inline llvm::VersionTuple
3401 case llvm::Triple::Darwin:
3402 case llvm::Triple::MacOSX:
3403 return llvm::VersionTuple(10U, 12U);
3404 case llvm::Triple::IOS:
3405 case llvm::Triple::TvOS:
3406 return llvm::VersionTuple(10U);
3407 case llvm::Triple::WatchOS:
3408 return llvm::VersionTuple(3U);
3411 llvm_unreachable(
"Unexpected OS");
3415 llvm::Triple::OSType OS;
3421 OS = llvm::Triple::MacOSX;
3424 OS = llvm::Triple::IOS;
3427 OS = llvm::Triple::TvOS;
3430 OS = llvm::Triple::WatchOS;
3441 llvm::opt::ArgStringList &CC1Args,
3450 if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3451 options::OPT_fno_ptrauth_calls))
3452 CC1Args.push_back(
"-fptrauth-calls");
3453 if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3454 options::OPT_fno_ptrauth_returns))
3455 CC1Args.push_back(
"-fptrauth-returns");
3456 if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3457 options::OPT_fno_ptrauth_intrinsics))
3458 CC1Args.push_back(
"-fptrauth-intrinsics");
3459 if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3460 options::OPT_fno_ptrauth_indirect_gotos))
3461 CC1Args.push_back(
"-fptrauth-indirect-gotos");
3462 if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3463 options::OPT_fno_ptrauth_auth_traps))
3464 CC1Args.push_back(
"-fptrauth-auth-traps");
3467 if (!DriverArgs.hasArg(
3468 options::OPT_fptrauth_vtable_pointer_address_discrimination,
3469 options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
3470 CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
3471 if (!DriverArgs.hasArg(
3472 options::OPT_fptrauth_vtable_pointer_type_discrimination,
3473 options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
3474 CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
3477 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
3478 options::OPT_fno_ptrauth_objc_isa))
3479 CC1Args.push_back(
"-fptrauth-objc-isa");
3480 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
3481 options::OPT_fno_ptrauth_objc_class_ro))
3482 CC1Args.push_back(
"-fptrauth-objc-class-ro");
3483 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
3484 options::OPT_fno_ptrauth_objc_interface_sel))
3485 CC1Args.push_back(
"-fptrauth-objc-interface-sel");
3490 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3503 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
3504 options::OPT_fno_aligned_allocation) &&
3506 CC1Args.push_back(
"-faligned-alloc-unavailable");
3510 if (!DriverArgs.hasArgNoClaim(options::OPT_fobjc_msgsend_selector_stubs,
3511 options::OPT_fno_objc_msgsend_selector_stubs) &&
3514 CC1Args.push_back(
"-fobjc-msgsend-selector-stubs");
3518 if (!DriverArgs.hasArgNoClaim(
3519 options::OPT_fobjc_msgsend_class_selector_stubs,
3520 options::OPT_fno_objc_msgsend_class_selector_stubs) &&
3523 CC1Args.push_back(
"-fobjc-msgsend-class-selector-stubs");
3527 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
3528 options::OPT_fno_sized_deallocation) &&
3530 CC1Args.push_back(
"-fno-sized-deallocation");
3537 if (!
SDKInfo->getFilePath().empty()) {
3539 ExtraDepOpt +=
SDKInfo->getFilePath();
3540 CC1Args.push_back(DriverArgs.MakeArgString(ExtraDepOpt));
3546 CC1Args.push_back(
"-fcompatibility-qualified-id-block-type-checking");
3550 if (!DriverArgs.getLastArgNoClaim(
3551 options::OPT_fvisibility_inlines_hidden_static_local_var,
3552 options::OPT_fno_visibility_inlines_hidden_static_local_var))
3553 CC1Args.push_back(
"-fvisibility-inlines-hidden-static-local-var");
3567 CC1Args.push_back(
"-fbuiltin-headers-in-system-modules");
3569 if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
3570 options::OPT_fno_define_target_os_macros))
3571 CC1Args.push_back(
"-fdefine-target-os-macros");
3575 !DriverArgs.hasFlag(options::OPT_fmodulemap_allow_subdirectory_search,
3576 options::OPT_fno_modulemap_allow_subdirectory_search,
3578 bool RequiresSubdirectorySearch;
3579 VersionTuple SDKVersion =
SDKInfo->getVersion();
3582 RequiresSubdirectorySearch =
true;
3585 RequiresSubdirectorySearch = SDKVersion < VersionTuple(15, 0);
3589 RequiresSubdirectorySearch = SDKVersion < VersionTuple(18, 0);
3592 RequiresSubdirectorySearch = SDKVersion < VersionTuple(11, 0);
3595 RequiresSubdirectorySearch = SDKVersion < VersionTuple(2, 0);
3598 if (!RequiresSubdirectorySearch)
3599 CC1Args.push_back(
"-fno-modulemap-allow-subdirectory-search");
3604 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1ASArgs)
const {
3606 CC1ASArgs.push_back(
"-darwin-target-variant-triple");
3613 auto EmitTargetSDKVersionArg = [&](
const VersionTuple &
V) {
3615 llvm::raw_string_ostream OS(Arg);
3616 OS <<
"-target-sdk-version=" <<
V;
3617 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3621 if (
const auto *MacOStoMacCatalystMapping =
SDKInfo->getVersionMapping(
3623 std::optional<VersionTuple> SDKVersion = MacOStoMacCatalystMapping->map(
3626 EmitTargetSDKVersionArg(
3630 EmitTargetSDKVersionArg(
SDKInfo->getVersion());
3638 llvm::raw_string_ostream OS(Arg);
3639 OS <<
"-darwin-target-variant-sdk-version=" <<
SDKInfo->getVersion();
3640 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3641 }
else if (
const auto *MacOStoMacCatalystMapping =
3644 if (std::optional<VersionTuple> SDKVersion =
3645 MacOStoMacCatalystMapping->map(
3649 llvm::raw_string_ostream OS(Arg);
3650 OS <<
"-darwin-target-variant-sdk-version=" << *SDKVersion;
3651 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3662 DerivedArgList *DAL =
3666 if (BoundArch.empty())
3672 AddDeploymentTarget(*DAL);
3680 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
3683 if (A->getOption().getID() != options::OPT_mkernel &&
3684 A->getOption().getID() != options::OPT_fapple_kext)
3686 assert(it != ie &&
"unexpected argument translation");
3688 assert(A->getOption().getID() == options::OPT_static &&
3689 "missing expected -static argument");
3696 if ((
Arch == llvm::Triple::arm ||
Arch == llvm::Triple::thumb)) {
3697 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
3698 options::OPT_fno_omit_frame_pointer,
false))
3699 getDriver().
Diag(clang::diag::warn_drv_unsupported_opt_for_target)
3700 <<
"-fomit-frame-pointer" << BoundArch;
3709 if (
getArch() == llvm::Triple::x86_64 ||
3711 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
3713 return (
getArch() == llvm::Triple::aarch64 ||
3714 getArch() == llvm::Triple::aarch64_32)
3722 if (
const char *S = ::getenv(
"RC_DEBUG_OPTIONS"))
3723 return S[0] !=
'\0';
3728 if (
const char *S = ::getenv(
"RC_DEBUG_PREFIX_MAP"))
3737 return llvm::ExceptionHandling::None;
3741 if (Triple.isWatchABI())
3742 return llvm::ExceptionHandling::DwarfCFI;
3744 return llvm::ExceptionHandling::SjLj;
3759 return (
getArch() == llvm::Triple::x86_64 ||
3760 getArch() == llvm::Triple::aarch64);
3769 ArgStringList &CmdArgs)
const {
3772 assert(!
isTargetXROS() &&
"xrOS always uses -platform-version");
3775 CmdArgs.push_back(
"-watchos_version_min");
3777 CmdArgs.push_back(
"-watchos_simulator_version_min");
3779 CmdArgs.push_back(
"-tvos_version_min");
3781 CmdArgs.push_back(
"-tvos_simulator_version_min");
3783 CmdArgs.push_back(
"-driverkit_version_min");
3785 CmdArgs.push_back(
"-ios_simulator_version_min");
3787 CmdArgs.push_back(
"-iphoneos_version_min");
3789 CmdArgs.push_back(
"-maccatalyst_version_min");
3792 CmdArgs.push_back(
"-macosx_version_min");
3798 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3801 VersionTuple VariantTargetVersion;
3803 CmdArgs.push_back(
"-macosx_version_min");
3808 "unexpected target variant triple");
3809 CmdArgs.push_back(
"-maccatalyst_version_min");
3812 VersionTuple MinTgtVers =
3814 if (MinTgtVers.getMajor() && MinTgtVers > VariantTargetVersion)
3815 VariantTargetVersion = MinTgtVers;
3816 CmdArgs.push_back(Args.MakeArgString(VariantTargetVersion.getAsString()));
3827 return "mac catalyst";
3840 llvm_unreachable(
"invalid platform");
3844 llvm::opt::ArgStringList &CmdArgs)
const {
3849 auto EmitPlatformVersionArg =
3852 const llvm::Triple &TT) {
3855 CmdArgs.push_back(
"-platform_version");
3856 std::string PlatformName =
3859 PlatformName +=
"-simulator";
3860 CmdArgs.push_back(Args.MakeArgString(PlatformName));
3869 VersionTuple MinTgtVers = TT.getMinimumSupportedOSVersion();
3872 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3877 std::optional<VersionTuple> iOSSDKVersion;
3879 if (
const auto *MacOStoMacCatalystMapping =
3882 iOSSDKVersion = MacOStoMacCatalystMapping->map(
3883 SDKInfo->getVersion().withoutBuild(),
3887 CmdArgs.push_back(Args.MakeArgString(
3888 (iOSSDKVersion ? *iOSSDKVersion
3895 VersionTuple SDKVersion =
SDKInfo->getVersion().withoutBuild();
3896 if (!SDKVersion.getMinor())
3897 SDKVersion = VersionTuple(SDKVersion.getMajor(), 0);
3898 CmdArgs.push_back(Args.MakeArgString(SDKVersion.getAsString()));
3909 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3918 VersionTuple TargetVariantVersion;
3926 "unexpected target variant triple");
3931 EmitPlatformVersionArg(TargetVariantVersion, Platform, Environment,
3937 ArgStringList &CmdArgs) {
3941 CmdArgs.push_back(
"-ldylib1.o");
3948 CmdArgs.push_back(
"-ldylib1.o");
3950 CmdArgs.push_back(
"-ldylib1.10.5.o");
3955 ArgStringList &CmdArgs) {
3956 if (Args.hasArg(options::OPT_static))
3961 CmdArgs.push_back(
"-lbundle1.o");
3966 ArgStringList &CmdArgs) {
3968 if (Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_object) ||
3969 Args.hasArg(options::OPT_preload)) {
3970 CmdArgs.push_back(
"-lgcrt0.o");
3972 CmdArgs.push_back(
"-lgcrt1.o");
3982 CmdArgs.push_back(
"-no_new_main");
3984 D.
getDriver().
Diag(diag::err_drv_clang_unsupported_opt_pg_darwin)
3990 ArgStringList &CmdArgs) {
3993 if (D.
getArch() == llvm::Triple::aarch64)
3996 CmdArgs.push_back(
"-lcrt1.o");
3998 CmdArgs.push_back(
"-lcrt1.3.1.o");
4005 CmdArgs.push_back(
"-lcrt1.o");
4007 CmdArgs.push_back(
"-lcrt1.10.5.o");
4009 CmdArgs.push_back(
"-lcrt1.10.6.o");
4014 ArgStringList &CmdArgs)
const {
4020 if (Args.hasArg(options::OPT_dynamiclib))
4022 else if (Args.hasArg(options::OPT_bundle))
4026 else if (Args.hasArg(options::OPT_static) ||
4027 Args.hasArg(options::OPT_object) ||
4028 Args.hasArg(options::OPT_preload))
4029 CmdArgs.push_back(
"-lcrt0.o");
4033 if (
isTargetMacOS() && Args.hasArg(options::OPT_shared_libgcc) &&
4035 const char *Str = Args.MakeArgString(
GetFilePath(
"crt3.o"));
4036 CmdArgs.push_back(Str);
4053 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
4054 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
4057 Res |= SanitizerKind::Address;
4058 Res |= SanitizerKind::PointerCompare;
4059 Res |= SanitizerKind::PointerSubtract;
4060 Res |= SanitizerKind::Realtime;
4061 Res |= SanitizerKind::Leak;
4062 Res |= SanitizerKind::Fuzzer;
4063 Res |= SanitizerKind::FuzzerNoLink;
4064 Res |= SanitizerKind::ObjCCast;
4074 Res |= SanitizerKind::Vptr;
4076 if ((IsX86_64 || IsAArch64) &&
4079 Res |= SanitizerKind::Thread;
4083 Res |= SanitizerKind::Type;
4087 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.
Result
Implement __builtin_bit_cast and related operations.
static StringRef getTriple(const Command &Job)
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 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.
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()