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,
1362 static constexpr llvm::StringLiteral XcodeAppSuffix(
1363 ".app/Contents/Developer");
1364 size_t Index = PathIntoXcode.find(XcodeAppSuffix);
1365 if (Index == StringRef::npos)
1367 return PathIntoXcode.take_front(Index + XcodeAppSuffix.size());
1371 ArgStringList &CmdArgs)
const {
1390 llvm::sys::path::remove_filename(P);
1391 llvm::sys::path::remove_filename(P);
1392 llvm::sys::path::append(P,
"lib",
"arc");
1398 if (!
getVFS().exists(P)) {
1399 auto updatePath = [&](
const Arg *A) {
1403 if (XcodePathForSDK.empty())
1406 P = XcodePathForSDK;
1407 llvm::sys::path::append(P,
"Toolchains/XcodeDefault.xctoolchain/usr",
1409 return getVFS().exists(P);
1412 bool updated =
false;
1413 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot))
1414 updated = updatePath(A);
1417 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1422 CmdArgs.push_back(
"-force_load");
1423 llvm::sys::path::append(P,
"libarclite_");
1426 P +=
"watchsimulator";
1430 P +=
"appletvsimulator";
1434 P +=
"iphonesimulator";
1442 getDriver().
Diag(clang::diag::err_drv_darwin_sdk_missing_arclite) << P;
1444 CmdArgs.push_back(Args.MakeArgString(P));
1481 bool IsShared)
const {
1489 const char *LibArg = Args.MakeArgString(P);
1490 CmdArgs.push_back(LibArg);
1498 assert(StringRef(P).ends_with(
".dylib") &&
"must be a dynamic library");
1502 CmdArgs.push_back(
"-rpath");
1503 CmdArgs.push_back(
"@executable_path");
1507 CmdArgs.push_back(
"-rpath");
1508 CmdArgs.push_back(Args.MakeArgString(llvm::sys::path::parent_path(P)));
1515 "it doesn't make sense to ask for the compiler-rt library name as an "
1519 if (Component !=
"builtins") {
1520 MachOLibName +=
'.';
1521 MachOLibName += Component;
1526 llvm::sys::path::append(FullPath,
"lib",
"darwin",
"macho_embedded",
1528 return std::string(FullPath);
1538 "it doesn't make sense to ask for the compiler-rt library name as an "
1542 if (Component !=
"builtins") {
1543 DarwinLibName += Component;
1544 DarwinLibName +=
'_';
1550 llvm::sys::path::append(FullPath,
"lib",
"darwin", DarwinLibName);
1551 return std::string(FullPath);
1556 auto BeginSDK = llvm::sys::path::rbegin(isysroot);
1557 auto EndSDK = llvm::sys::path::rend(isysroot);
1558 for (
auto IT = BeginSDK; IT != EndSDK; ++IT) {
1559 StringRef SDK = *IT;
1560 if (SDK.consume_back(
".sdk"))
1590 llvm_unreachable(
"Unsupported platform");
1595 for (Arg *A : Args) {
1596 if (A->getOption().matches(options::OPT_exported__symbols__list))
1598 if (!A->getOption().matches(options::OPT_Wl_COMMA) &&
1599 !A->getOption().matches(options::OPT_Xlinker))
1601 if (A->containsValue(
"-exported_symbols_list") ||
1602 A->containsValue(
"-exported_symbol"))
1610 CmdArgs.push_back(
"-exported_symbol");
1611 CmdArgs.push_back(Symbol);
1621 StringRef Segment, StringRef Section) {
1622 for (
const char *A : {
"-sectalign", Args.MakeArgString(Segment),
1623 Args.MakeArgString(Section),
"0x4000"})
1624 CmdArgs.push_back(A);
1628 ArgStringList &CmdArgs)
const {
1657 for (
auto IPSK : {llvm::IPSK_cnts, llvm::IPSK_bitmap, llvm::IPSK_data}) {
1659 Args, CmdArgs,
"__DATA",
1660 llvm::getInstrProfSectionName(IPSK, llvm::Triple::MachO,
1666void DarwinClang::AddLinkSanitizerLibArgs(
const ArgList &Args,
1667 ArgStringList &CmdArgs,
1668 StringRef Sanitizer,
1669 bool Shared)
const {
1675 const ArgList &Args)
const {
1676 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
1677 StringRef
Value = A->getValue();
1678 if (
Value !=
"compiler-rt" &&
Value !=
"platform")
1679 getDriver().
Diag(clang::diag::err_drv_unsupported_rtlib_for_platform)
1680 <<
Value <<
"darwin";
1687 ArgStringList &CmdArgs,
1688 bool ForceLinkBuiltinRT)
const {
1698 if (Args.hasArg(options::OPT_static) ||
1699 Args.hasArg(options::OPT_fapple_kext) ||
1700 Args.hasArg(options::OPT_mkernel)) {
1701 if (ForceLinkBuiltinRT)
1709 if (
const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
1710 getDriver().
Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
1717 const char *sanitizer =
nullptr;
1719 sanitizer =
"UndefinedBehaviorSanitizer";
1721 sanitizer =
"RealtimeSanitizer";
1723 sanitizer =
"AddressSanitizer";
1725 sanitizer =
"ThreadSanitizer";
1728 getDriver().
Diag(diag::err_drv_unsupported_static_sanitizer_darwin)
1737 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan_abi",
false);
1740 "Static sanitizer runtimes not supported");
1741 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan");
1746 "Static sanitizer runtimes not supported");
1747 AddLinkSanitizerLibArgs(Args, CmdArgs,
"rtsan");
1750 AddLinkSanitizerLibArgs(Args, CmdArgs,
"lsan");
1753 "Static sanitizer runtimes not supported");
1754 AddLinkSanitizerLibArgs(
1760 "Static sanitizer runtimes not supported");
1761 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tsan");
1764 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tysan");
1765 if (Sanitize.
needsFuzzer() && !Args.hasArg(options::OPT_dynamiclib)) {
1766 AddLinkSanitizerLibArgs(Args, CmdArgs,
"fuzzer",
false);
1778 AddLinkSanitizerLibArgs(Args, CmdArgs,
"stats");
1786 llvm::memprof::getMemprofOptionsSymbolDarwinLinkageName().data());
1796 CmdArgs.push_back(
"-framework");
1797 CmdArgs.push_back(
"DriverKit");
1803 CmdArgs.push_back(
"-lSystem");
1815 CmdArgs.push_back(
"-lgcc_s.1");
1824 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
1825 if (!SystemTriple.isMacOSX())
1826 return std::string(MacOSSDKVersion);
1827 VersionTuple SystemVersion;
1828 SystemTriple.getMacOSXVersion(SystemVersion);
1830 unsigned Major, Minor, Micro;
1834 return std::string(MacOSSDKVersion);
1835 VersionTuple SDKVersion(Major, Minor, Micro);
1837 if (SDKVersion > SystemVersion)
1838 return SystemVersion.getAsString();
1839 return std::string(MacOSSDKVersion);
1846struct DarwinPlatform {
1855 DeploymentTargetEnv,
1865 DarwinPlatformKind getPlatform()
const {
return Platform; }
1867 DarwinEnvironmentKind getEnvironment()
const {
return Environment; }
1869 void setEnvironment(DarwinEnvironmentKind Kind) {
1871 InferSimulatorFromArch =
false;
1874 const VersionTuple getOSVersion()
const {
1875 return UnderlyingOSVersion.value_or(VersionTuple());
1878 VersionTuple takeOSVersion() {
1879 assert(UnderlyingOSVersion.has_value() &&
1880 "attempting to get an unset OS version");
1881 VersionTuple
Result = *UnderlyingOSVersion;
1882 UnderlyingOSVersion.reset();
1885 bool isValidOSVersion()
const {
1886 return llvm::Triple::isValidVersionForOS(getOSFromPlatform(Platform),
1890 VersionTuple getCanonicalOSVersion()
const {
1891 return llvm::Triple::getCanonicalVersionForOS(
1892 getOSFromPlatform(Platform), getOSVersion(),
true);
1895 void setOSVersion(
const VersionTuple &Version) {
1896 UnderlyingOSVersion = Version;
1899 bool hasOSVersion()
const {
return UnderlyingOSVersion.has_value(); }
1901 VersionTuple getZipperedOSVersion()
const {
1902 assert(Environment == DarwinEnvironmentKind::MacCatalyst &&
1903 "zippered target version is specified only for Mac Catalyst");
1904 return ZipperedOSVersion;
1908 bool isExplicitlySpecified()
const {
return Kind <= DeploymentTargetEnv; }
1911 bool canInferSimulatorFromArch()
const {
return InferSimulatorFromArch; }
1913 const std::optional<llvm::Triple> &getTargetVariantTriple()
const {
1914 return TargetVariantTriple;
1918 void addOSVersionMinArgument(DerivedArgList &Args,
const OptTable &Opts) {
1922 assert(Kind != TargetArg && Kind != MTargetOSArg && Kind != OSVersionArg &&
1926 case DarwinPlatformKind::MacOS:
1927 Opt = options::OPT_mmacos_version_min_EQ;
1929 case DarwinPlatformKind::IPhoneOS:
1930 Opt = options::OPT_mios_version_min_EQ;
1932 case DarwinPlatformKind::TvOS:
1933 Opt = options::OPT_mtvos_version_min_EQ;
1935 case DarwinPlatformKind::WatchOS:
1936 Opt = options::OPT_mwatchos_version_min_EQ;
1942 Arg = Args.MakeJoinedArg(
nullptr, Opts.getOption(Opt), OSVersionStr);
1948 std::string
getAsString(DerivedArgList &Args,
const OptTable &Opts) {
1954 assert(Arg &&
"OS version argument not yet inferred");
1955 return Arg->getAsString(Args);
1956 case DeploymentTargetEnv:
1957 return (llvm::Twine(EnvVarName) +
"=" + OSVersionStr).str();
1958 case InferredFromSDK:
1959 case InferredFromArch:
1960 llvm_unreachable(
"Cannot print arguments for inferred OS version");
1962 llvm_unreachable(
"Unsupported Darwin Source Kind");
1966 std::string getInferredSource() {
1967 assert(!isExplicitlySpecified() &&
"OS version was not inferred");
1968 return InferredSource.str();
1971 void setEnvironment(llvm::Triple::EnvironmentType EnvType,
1972 const VersionTuple &OSVersion,
1973 const std::optional<DarwinSDKInfo> &SDKInfo) {
1975 case llvm::Triple::Simulator:
1976 Environment = DarwinEnvironmentKind::Simulator;
1978 case llvm::Triple::MacABI: {
1979 Environment = DarwinEnvironmentKind::MacCatalyst;
1981 ZipperedOSVersion = VersionTuple(10, 15);
1982 if (hasOSVersion() && SDKInfo) {
1983 if (
const auto *MacCatalystToMacOSMapping = SDKInfo->getVersionMapping(
1985 if (
auto MacOSVersion = MacCatalystToMacOSMapping->map(
1986 OSVersion, ZipperedOSVersion, std::nullopt)) {
1987 ZipperedOSVersion = *MacOSVersion;
1994 if (TargetVariantTriple) {
1995 auto TargetVariantVersion = TargetVariantTriple->getOSVersion();
1996 if (TargetVariantVersion.getMajor()) {
1997 if (TargetVariantVersion < ZipperedOSVersion)
1998 ZipperedOSVersion = std::move(TargetVariantVersion);
2008 static DarwinPlatform
2009 createFromTarget(
const llvm::Triple &TT, Arg *A,
2010 std::optional<llvm::Triple> TargetVariantTriple,
2011 const std::optional<DarwinSDKInfo> &SDKInfo) {
2012 DarwinPlatform
Result(TargetArg, getPlatformFromOS(TT.getOS()),
2013 TT.getOSVersion(), A);
2014 VersionTuple OsVersion = TT.getOSVersion();
2015 Result.TargetVariantTriple = std::move(TargetVariantTriple);
2016 Result.setEnvironment(TT.getEnvironment(), OsVersion, SDKInfo);
2019 static DarwinPlatform
2020 createFromMTargetOS(llvm::Triple::OSType OS, VersionTuple OSVersion,
2021 llvm::Triple::EnvironmentType Environment, Arg *A,
2022 const std::optional<DarwinSDKInfo> &SDKInfo) {
2023 DarwinPlatform
Result(MTargetOSArg, getPlatformFromOS(OS), OSVersion, A);
2024 Result.InferSimulatorFromArch =
false;
2025 Result.setEnvironment(Environment, OSVersion, SDKInfo);
2028 static DarwinPlatform createOSVersionArg(DarwinPlatformKind Platform, Arg *A,
2030 DarwinPlatform
Result{OSVersionArg, Platform,
2031 getVersionFromString(A->getValue()), A};
2033 Result.Environment = DarwinEnvironmentKind::Simulator;
2036 static DarwinPlatform createDeploymentTargetEnv(DarwinPlatformKind Platform,
2037 StringRef EnvVarName,
2038 StringRef OSVersion) {
2039 DarwinPlatform
Result(DeploymentTargetEnv, Platform,
2040 getVersionFromString(OSVersion));
2041 Result.EnvVarName = EnvVarName;
2044 static DarwinPlatform createFromSDKInfo(StringRef SDKRoot,
2045 const DarwinSDKInfo &SDKInfo) {
2046 const DarwinSDKInfo::SDKPlatformInfo PlatformInfo =
2048 const llvm::Triple::OSType
OS = PlatformInfo.
getOS();
2050 if (OS == llvm::Triple::MacOSX)
2051 Version = getVersionFromString(
2053 DarwinPlatform
Result(InferredFromSDK, getPlatformFromOS(OS), Version);
2055 Result.InferSimulatorFromArch =
false;
2056 Result.InferredSource = SDKRoot;
2059 static DarwinPlatform createFromSDK(StringRef SDKRoot,
2060 DarwinPlatformKind Platform,
2062 bool IsSimulator =
false) {
2063 DarwinPlatform
Result(InferredFromSDK, Platform,
2064 getVersionFromString(
Value));
2066 Result.Environment = DarwinEnvironmentKind::Simulator;
2067 Result.InferSimulatorFromArch =
false;
2068 Result.InferredSource = SDKRoot;
2071 static DarwinPlatform createFromArch(StringRef
Arch, llvm::Triple::OSType OS,
2072 VersionTuple Version) {
2074 DarwinPlatform(InferredFromArch, getPlatformFromOS(OS), Version);
2082 DarwinSDKInfo inferSDKInfo() {
2083 assert(Kind == InferredFromSDK &&
"can infer SDK info only");
2084 llvm::Triple::OSType
OS = getOSFromPlatform(Platform);
2085 llvm::Triple::EnvironmentType EnvironmentType =
2086 getEnvTypeFromEnvKind(Environment);
2087 StringRef PlatformPrefix =
2088 (Platform == DarwinPlatformKind::DriverKit) ?
"/System/DriverKit" :
"";
2089 return DarwinSDKInfo(
"", OS, EnvironmentType, getOSVersion(),
2090 getDisplayName(Platform, Environment, getOSVersion()),
2092 VersionTuple(getOSVersion().getMajor(), 0, 99),
2093 {DarwinSDKInfo::SDKPlatformInfo(
2094 llvm::Triple::Apple, OS, EnvironmentType,
2095 llvm::Triple::MachO, PlatformPrefix)});
2099 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform, Arg *Argument)
2101 Arguments({Argument, VersionTuple().getAsString()}) {}
2102 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform,
2103 VersionTuple
Value, Arg *Argument =
nullptr)
2107 UnderlyingOSVersion =
Value;
2110 static VersionTuple getVersionFromString(
const StringRef Input) {
2111 llvm::VersionTuple Version;
2112 bool IsValid = !Version.tryParse(Input);
2113 assert(IsValid &&
"unable to convert input version to version tuple");
2118 static DarwinPlatformKind getPlatformFromOS(llvm::Triple::OSType OS) {
2120 case llvm::Triple::Darwin:
2121 case llvm::Triple::MacOSX:
2122 return DarwinPlatformKind::MacOS;
2123 case llvm::Triple::IOS:
2124 return DarwinPlatformKind::IPhoneOS;
2125 case llvm::Triple::TvOS:
2126 return DarwinPlatformKind::TvOS;
2127 case llvm::Triple::WatchOS:
2128 return DarwinPlatformKind::WatchOS;
2129 case llvm::Triple::XROS:
2130 return DarwinPlatformKind::XROS;
2131 case llvm::Triple::DriverKit:
2132 return DarwinPlatformKind::DriverKit;
2133 case llvm::Triple::Firmware:
2134 return DarwinPlatformKind::Firmware;
2136 llvm_unreachable(
"Unable to infer Darwin variant");
2140 static llvm::Triple::OSType getOSFromPlatform(DarwinPlatformKind Platform) {
2142 case DarwinPlatformKind::MacOS:
2143 return llvm::Triple::MacOSX;
2144 case DarwinPlatformKind::IPhoneOS:
2145 return llvm::Triple::IOS;
2146 case DarwinPlatformKind::TvOS:
2147 return llvm::Triple::TvOS;
2148 case DarwinPlatformKind::WatchOS:
2149 return llvm::Triple::WatchOS;
2150 case DarwinPlatformKind::DriverKit:
2151 return llvm::Triple::DriverKit;
2152 case DarwinPlatformKind::XROS:
2153 return llvm::Triple::XROS;
2154 case DarwinPlatformKind::Firmware:
2155 return llvm::Triple::Firmware;
2157 llvm_unreachable(
"Unknown DarwinPlatformKind enum");
2160 static DarwinEnvironmentKind
2161 getEnvKindFromEnvType(llvm::Triple::EnvironmentType EnvironmentType) {
2162 switch (EnvironmentType) {
2163 case llvm::Triple::UnknownEnvironment:
2164 return DarwinEnvironmentKind::NativeEnvironment;
2165 case llvm::Triple::Simulator:
2166 return DarwinEnvironmentKind::Simulator;
2167 case llvm::Triple::MacABI:
2168 return DarwinEnvironmentKind::MacCatalyst;
2170 llvm_unreachable(
"Unable to infer Darwin environment");
2174 static llvm::Triple::EnvironmentType
2175 getEnvTypeFromEnvKind(DarwinEnvironmentKind EnvironmentKind) {
2176 switch (EnvironmentKind) {
2177 case DarwinEnvironmentKind::NativeEnvironment:
2178 return llvm::Triple::UnknownEnvironment;
2179 case DarwinEnvironmentKind::Simulator:
2180 return llvm::Triple::Simulator;
2181 case DarwinEnvironmentKind::MacCatalyst:
2182 return llvm::Triple::MacABI;
2184 llvm_unreachable(
"Unknown DarwinEnvironmentKind enum");
2187 static std::string getDisplayName(DarwinPlatformKind TargetPlatform,
2188 DarwinEnvironmentKind TargetEnvironment,
2189 VersionTuple Version) {
2190 SmallVector<std::string, 3> Components;
2191 switch (TargetPlatform) {
2192 case DarwinPlatformKind::MacOS:
2193 Components.push_back(
"macOS");
2195 case DarwinPlatformKind::IPhoneOS:
2196 Components.push_back(
"iOS");
2198 case DarwinPlatformKind::TvOS:
2199 Components.push_back(
"tvOS");
2201 case DarwinPlatformKind::WatchOS:
2202 Components.push_back(
"watchOS");
2204 case DarwinPlatformKind::DriverKit:
2205 Components.push_back(
"DriverKit");
2208 llvm::reportFatalUsageError(Twine(
"Platform: '") +
2209 std::to_string(TargetPlatform) +
2210 "' is unsupported when inferring SDK Info.");
2212 switch (TargetEnvironment) {
2213 case DarwinEnvironmentKind::NativeEnvironment:
2215 case DarwinEnvironmentKind::Simulator:
2216 Components.push_back(
"Simulator");
2219 llvm::reportFatalUsageError(Twine(
"Environment: '") +
2220 std::to_string(TargetEnvironment) +
2221 "' is unsupported when inferring SDK Info.");
2223 Components.push_back(Version.getAsString());
2224 return join(Components,
" ");
2228 DarwinPlatformKind Platform;
2229 DarwinEnvironmentKind Environment = DarwinEnvironmentKind::NativeEnvironment;
2233 VersionTuple ZipperedOSVersion;
2238 std::optional<VersionTuple> UnderlyingOSVersion;
2239 bool InferSimulatorFromArch =
true;
2240 std::pair<Arg *, std::string>
Arguments;
2241 StringRef EnvVarName;
2244 StringRef InferredSource;
2247 std::optional<llvm::Triple> TargetVariantTriple;
2252std::optional<DarwinPlatform>
2253getDeploymentTargetFromOSVersionArg(DerivedArgList &Args,
2254 const Driver &TheDriver) {
2255 Arg *macOSVersion = Args.getLastArg(options::OPT_mmacos_version_min_EQ);
2256 Arg *iOSVersion = Args.getLastArg(options::OPT_mios_version_min_EQ,
2257 options::OPT_mios_simulator_version_min_EQ);
2259 Args.getLastArg(options::OPT_mtvos_version_min_EQ,
2260 options::OPT_mtvos_simulator_version_min_EQ);
2261 Arg *WatchOSVersion =
2262 Args.getLastArg(options::OPT_mwatchos_version_min_EQ,
2263 options::OPT_mwatchos_simulator_version_min_EQ);
2265 auto GetDarwinPlatform =
2266 [&](DarwinPlatform::DarwinPlatformKind Platform, Arg *VersionArg,
2267 bool IsSimulator) -> std::optional<DarwinPlatform> {
2268 if (StringRef(VersionArg->getValue()).empty()) {
2269 TheDriver.
Diag(diag::err_drv_missing_version_number)
2270 << VersionArg->getAsString(Args);
2271 return std::nullopt;
2273 return DarwinPlatform::createOSVersionArg(Platform, VersionArg,
2278 if (iOSVersion || TvOSVersion || WatchOSVersion) {
2279 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2280 << macOSVersion->getAsString(Args)
2281 << (iOSVersion ? iOSVersion
2282 : TvOSVersion ? TvOSVersion : WatchOSVersion)
2288 }
else if (iOSVersion) {
2289 if (TvOSVersion || WatchOSVersion) {
2290 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2291 << iOSVersion->getAsString(Args)
2292 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->
getAsString(Args);
2295 iOSVersion->getOption().getID() ==
2296 options::OPT_mios_simulator_version_min_EQ);
2297 }
else if (TvOSVersion) {
2298 if (WatchOSVersion) {
2299 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2300 << TvOSVersion->getAsString(Args)
2301 << WatchOSVersion->getAsString(Args);
2304 TvOSVersion->getOption().getID() ==
2305 options::OPT_mtvos_simulator_version_min_EQ);
2306 }
else if (WatchOSVersion)
2307 return GetDarwinPlatform(
2309 WatchOSVersion->getOption().getID() ==
2310 options::OPT_mwatchos_simulator_version_min_EQ);
2311 return std::nullopt;
2316std::optional<DarwinPlatform>
2317getDeploymentTargetFromEnvironmentVariables(
const Driver &TheDriver,
2318 const llvm::Triple &Triple) {
2319 const char *EnvVars[] = {
2320 "MACOSX_DEPLOYMENT_TARGET",
2321 "IPHONEOS_DEPLOYMENT_TARGET",
2322 "TVOS_DEPLOYMENT_TARGET",
2323 "WATCHOS_DEPLOYMENT_TARGET",
2324 "DRIVERKIT_DEPLOYMENT_TARGET",
2325 "XROS_DEPLOYMENT_TARGET"
2327 std::string Targets[std::size(EnvVars)];
2328 for (
const auto &I : llvm::enumerate(llvm::ArrayRef(EnvVars))) {
2329 if (
char *Env = ::getenv(I.value()))
2330 Targets[I.index()] = Env;
2339 if (Triple.getArch() == llvm::Triple::arm ||
2340 Triple.getArch() == llvm::Triple::aarch64 ||
2341 Triple.getArch() == llvm::Triple::thumb)
2348 unsigned FirstTarget = std::size(Targets);
2349 for (
unsigned I = 0; I != std::size(Targets); ++I) {
2350 if (Targets[I].empty())
2352 if (FirstTarget == std::size(Targets))
2355 TheDriver.
Diag(diag::err_drv_conflicting_deployment_targets)
2356 << Targets[FirstTarget] << Targets[I];
2360 for (
const auto &
Target : llvm::enumerate(llvm::ArrayRef(Targets))) {
2361 if (!
Target.value().empty())
2362 return DarwinPlatform::createDeploymentTargetEnv(
2366 return std::nullopt;
2372std::optional<DarwinPlatform>
2373inferDeploymentTargetFromSDK(DerivedArgList &Args,
2374 const std::optional<DarwinSDKInfo> &SDKInfo) {
2375 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2377 return std::nullopt;
2378 StringRef isysroot = A->getValue();
2380 return DarwinPlatform::createFromSDKInfo(isysroot, *SDKInfo);
2384 return std::nullopt;
2386 std::string Version;
2389 size_t StartVer = SDK.find_first_of(
"0123456789");
2390 size_t EndVer = SDK.find_last_of(
"0123456789");
2391 if (StartVer != StringRef::npos && EndVer > StartVer)
2392 Version = std::string(SDK.slice(StartVer, EndVer + 1));
2393 if (Version.empty())
2394 return std::nullopt;
2396 if (SDK.starts_with(
"iPhoneOS") || SDK.starts_with(
"iPhoneSimulator"))
2397 return DarwinPlatform::createFromSDK(
2399 SDK.starts_with(
"iPhoneSimulator"));
2400 else if (SDK.starts_with(
"MacOSX"))
2401 return DarwinPlatform::createFromSDK(isysroot,
Darwin::MacOS,
2403 else if (SDK.starts_with(
"WatchOS") || SDK.starts_with(
"WatchSimulator"))
2404 return DarwinPlatform::createFromSDK(
2406 SDK.starts_with(
"WatchSimulator"));
2407 else if (SDK.starts_with(
"AppleTVOS") || SDK.starts_with(
"AppleTVSimulator"))
2408 return DarwinPlatform::createFromSDK(
2410 SDK.starts_with(
"AppleTVSimulator"));
2411 else if (SDK.starts_with(
"DriverKit"))
2413 return std::nullopt;
2417VersionTuple getInferredOSVersion(llvm::Triple::OSType OS,
2418 const llvm::Triple &Triple,
2419 const Driver &TheDriver) {
2420 VersionTuple OsVersion;
2421 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
2423 case llvm::Triple::Darwin:
2424 case llvm::Triple::MacOSX:
2427 if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
2428 !Triple.getOSMajorVersion())
2429 SystemTriple.getMacOSXVersion(OsVersion);
2430 else if (!Triple.getMacOSXVersion(OsVersion))
2431 TheDriver.
Diag(diag::err_drv_invalid_darwin_version)
2432 << Triple.getOSName();
2434 case llvm::Triple::IOS:
2435 if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
2436 OsVersion = VersionTuple(13, 1);
2438 OsVersion = Triple.getiOSVersion();
2440 case llvm::Triple::TvOS:
2441 OsVersion = Triple.getOSVersion();
2443 case llvm::Triple::WatchOS:
2444 OsVersion = Triple.getWatchOSVersion();
2446 case llvm::Triple::DriverKit:
2447 OsVersion = Triple.getDriverKitVersion();
2450 OsVersion = Triple.getOSVersion();
2451 if (!OsVersion.getMajor())
2452 OsVersion = OsVersion.withMajorReplaced(1);
2459std::optional<DarwinPlatform>
2460inferDeploymentTargetFromArch(DerivedArgList &Args,
const Darwin &Toolchain,
2461 const llvm::Triple &Triple,
2462 const Driver &TheDriver) {
2463 llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS;
2466 if (MachOArchName ==
"arm64" || MachOArchName ==
"arm64e")
2467 OSTy = llvm::Triple::MacOSX;
2468 else if (MachOArchName ==
"armv7" || MachOArchName ==
"armv7s" ||
2469 MachOArchName ==
"armv6")
2470 OSTy = llvm::Triple::IOS;
2471 else if (MachOArchName ==
"armv7k" || MachOArchName ==
"arm64_32")
2472 OSTy = llvm::Triple::WatchOS;
2473 else if (MachOArchName !=
"armv6m" && MachOArchName !=
"armv7m" &&
2474 MachOArchName !=
"armv7em" && MachOArchName !=
"armv8m.base" &&
2475 MachOArchName !=
"armv8m.main" && MachOArchName !=
"armv8.1m.main")
2476 OSTy = llvm::Triple::MacOSX;
2477 if (OSTy == llvm::Triple::UnknownOS)
2478 return std::nullopt;
2479 return DarwinPlatform::createFromArch(
2480 MachOArchName, OSTy, getInferredOSVersion(OSTy, Triple, TheDriver));
2484std::optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
2485 DerivedArgList &Args,
const llvm::Triple &Triple,
const Driver &TheDriver,
2486 const std::optional<DarwinSDKInfo> &SDKInfo) {
2487 if (!Args.hasArg(options::OPT_target))
2488 return std::nullopt;
2489 if (Triple.getOS() == llvm::Triple::Darwin ||
2490 Triple.getOS() == llvm::Triple::UnknownOS)
2491 return std::nullopt;
2492 std::optional<llvm::Triple> TargetVariantTriple;
2493 for (
const Arg *A : Args.filtered(options::OPT_darwin_target_variant)) {
2494 llvm::Triple TVT(A->getValue());
2496 if ((Triple.getArch() == llvm::Triple::aarch64 ||
2497 TVT.getArchName() == Triple.getArchName()) &&
2498 TVT.getArch() == Triple.getArch() &&
2499 TVT.getSubArch() == Triple.getSubArch() &&
2500 TVT.getVendor() == Triple.getVendor()) {
2501 if (TargetVariantTriple)
2506 if ((Triple.isMacOSX() && TVT.getOS() == llvm::Triple::IOS &&
2507 TVT.isMacCatalystEnvironment()) ||
2508 (TVT.isMacOSX() && Triple.getOS() == llvm::Triple::IOS &&
2509 Triple.isMacCatalystEnvironment())) {
2510 TargetVariantTriple = TVT;
2513 TheDriver.
Diag(diag::err_drv_target_variant_invalid)
2514 << A->getSpelling() << A->getValue();
2517 DarwinPlatform PlatformAndVersion = DarwinPlatform::createFromTarget(
2518 Triple, Args.getLastArg(options::OPT_target), TargetVariantTriple,
2521 return PlatformAndVersion;
2525std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2526 DerivedArgList &Args,
const Driver &TheDriver,
2527 const std::optional<DarwinSDKInfo> &SDKInfo) {
2528 auto *A = Args.getLastArg(options::OPT_mtargetos_EQ);
2530 return std::nullopt;
2531 llvm::Triple TT(llvm::Twine(
"unknown-apple-") + A->getValue());
2532 switch (TT.getOS()) {
2533 case llvm::Triple::MacOSX:
2534 case llvm::Triple::IOS:
2535 case llvm::Triple::TvOS:
2536 case llvm::Triple::WatchOS:
2537 case llvm::Triple::XROS:
2540 TheDriver.
Diag(diag::err_drv_invalid_os_in_arg)
2541 << TT.getOSName() << A->getAsString(Args);
2542 return std::nullopt;
2545 VersionTuple Version = TT.getOSVersion();
2546 if (!Version.getMajor()) {
2547 TheDriver.
Diag(diag::err_drv_invalid_version_number)
2548 << A->getAsString(Args);
2549 return std::nullopt;
2551 return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
2552 TT.getEnvironment(), A, SDKInfo);
2555std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS,
2556 const ArgList &Args,
2557 const Driver &TheDriver) {
2558 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2560 return std::nullopt;
2561 StringRef isysroot = A->getValue();
2563 if (!SDKInfoOrErr) {
2564 llvm::consumeError(SDKInfoOrErr.takeError());
2565 TheDriver.
Diag(diag::warn_drv_darwin_sdk_invalid_settings);
2566 return std::nullopt;
2568 return *SDKInfoOrErr;
2573void Darwin::AddDeploymentTarget(DerivedArgList &Args)
const {
2579 bool TryXcselect =
false;
2585 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2587 if (!
getVFS().exists(A->getValue()))
2588 getDriver().
Diag(clang::diag::warn_missing_sysroot) << A->getValue();
2589 }
else if (
const char *env = ::getenv(
"SDKROOT")) {
2592 if (llvm::sys::path::is_absolute(env) &&
getVFS().exists(env) &&
2593 StringRef(env) !=
"/") {
2594 Args.append(Args.MakeSeparateArg(
2595 nullptr, Opts.getOption(options::OPT_isysroot), env));
2598 TryXcselect = !Args.hasArg(options::OPT__sysroot_EQ) &&
2599 !Args.hasArg(options::OPT_no_xcselect);
2609 std::optional<DarwinPlatform> PlatformAndVersion =
2611 if (PlatformAndVersion) {
2613 if (
const auto *MTargetOSArg = Args.getLastArg(options::OPT_mtargetos_EQ)) {
2614 std::string TargetArgStr = PlatformAndVersion->getAsString(Args, Opts);
2615 std::string MTargetOSArgStr = MTargetOSArg->getAsString(Args);
2617 << TargetArgStr << MTargetOSArgStr;
2620 bool TripleProvidedOSVersion = PlatformAndVersion->hasOSVersion();
2621 if (!TripleProvidedOSVersion)
2622 PlatformAndVersion->setOSVersion(
2625 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2626 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2627 if (PlatformAndVersionFromOSVersionArg) {
2628 unsigned TargetMajor, TargetMinor, TargetMicro;
2630 unsigned ArgMajor, ArgMinor, ArgMicro;
2632 if (PlatformAndVersion->getPlatform() !=
2633 PlatformAndVersionFromOSVersionArg->getPlatform() ||
2635 PlatformAndVersion->getOSVersion().getAsString(), TargetMajor,
2636 TargetMinor, TargetMicro, TargetExtra) &&
2638 PlatformAndVersionFromOSVersionArg->getOSVersion().getAsString(),
2639 ArgMajor, ArgMinor, ArgMicro, ArgExtra) &&
2640 (VersionTuple(TargetMajor, TargetMinor, TargetMicro) !=
2641 VersionTuple(ArgMajor, ArgMinor, ArgMicro) ||
2642 TargetExtra != ArgExtra))) {
2645 if (PlatformAndVersion->getPlatform() ==
2646 PlatformAndVersionFromOSVersionArg->getPlatform() &&
2647 !TripleProvidedOSVersion) {
2648 PlatformAndVersion->setOSVersion(
2649 PlatformAndVersionFromOSVersionArg->getOSVersion());
2653 std::string OSVersionArg =
2654 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2655 std::string TargetArg = PlatformAndVersion->getAsString(Args, Opts);
2657 << OSVersionArg << TargetArg;
2661 }
else if ((PlatformAndVersion = getDeploymentTargetFromMTargetOSArg(
2665 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2666 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2667 if (PlatformAndVersionFromOSVersionArg) {
2668 std::string MTargetOSArgStr = PlatformAndVersion->getAsString(Args, Opts);
2669 std::string OSVersionArgStr =
2670 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2672 << MTargetOSArgStr << OSVersionArgStr;
2676 PlatformAndVersion = getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2679 if (!PlatformAndVersion) {
2680 PlatformAndVersion =
2682 if (PlatformAndVersion) {
2684 std::optional<DarwinPlatform> SDKTarget =
2685 inferDeploymentTargetFromSDK(Args,
SDKInfo);
2687 PlatformAndVersion->setEnvironment(SDKTarget->getEnvironment());
2693 if (!PlatformAndVersion) {
2694 PlatformAndVersion = inferDeploymentTargetFromSDK(Args,
SDKInfo);
2697 if (PlatformAndVersion && !
SDKInfo)
2698 SDKInfo = PlatformAndVersion->inferSDKInfo();
2702 if (!PlatformAndVersion)
2703 PlatformAndVersion =
2707 assert(PlatformAndVersion &&
"Unable to infer Darwin variant");
2708 if (!PlatformAndVersion->isValidOSVersion()) {
2709 if (PlatformAndVersion->isExplicitlySpecified())
2711 << PlatformAndVersion->getAsString(Args, Opts);
2713 getDriver().
Diag(diag::err_drv_invalid_version_number_inferred)
2714 << PlatformAndVersion->getOSVersion().getAsString()
2715 << PlatformAndVersion->getInferredSource();
2720 VersionTuple CanonicalVersion = PlatformAndVersion->getCanonicalOSVersion();
2721 if (CanonicalVersion != PlatformAndVersion->getOSVersion()) {
2722 getDriver().
Diag(diag::warn_drv_overriding_deployment_version)
2723 << PlatformAndVersion->getOSVersion().getAsString()
2724 << CanonicalVersion.getAsString();
2725 PlatformAndVersion->setOSVersion(CanonicalVersion);
2728 PlatformAndVersion->addOSVersionMinArgument(Args, Opts);
2731 unsigned Major, Minor, Micro;
2734 const unsigned MajorVersionLimit = 1000;
2735 const VersionTuple OSVersion = PlatformAndVersion->takeOSVersion();
2736 const std::string OSVersionStr = OSVersion.getAsString();
2738 if (Platform ==
MacOS) {
2739#ifdef CLANG_USE_XCSELECT
2742 if (!::xcselect_host_sdk_path(CLANG_XCSELECT_HOST_SDK_POLICY, &p)) {
2743 Args.append(Args.MakeSeparateArg(
2744 nullptr, Opts.getOption(options::OPT_isysroot), p));
2753 HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
2756 << PlatformAndVersion->getAsString(Args, Opts);
2760 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2762 << PlatformAndVersion->getAsString(Args, Opts);
2764 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst &&
2765 (Major < 13 || (Major == 13 && Minor < 1))) {
2767 << PlatformAndVersion->getAsString(Args, Opts);
2774 if (
getTriple().isArch32Bit() && Major >= 11) {
2776 if (PlatformAndVersion->isExplicitlySpecified()) {
2777 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst)
2778 getDriver().
Diag(diag::err_invalid_macos_32bit_deployment_target);
2781 << PlatformAndVersion->getAsString(Args, Opts);
2789 }
else if (Platform ==
TvOS) {
2792 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2794 << PlatformAndVersion->getAsString(Args, Opts);
2795 }
else if (Platform ==
WatchOS) {
2798 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2800 << PlatformAndVersion->getAsString(Args, Opts);
2804 HadExtra || Major < 19 || Major >= MajorVersionLimit || Minor >= 100 ||
2807 << PlatformAndVersion->getAsString(Args, Opts);
2811 HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2814 << PlatformAndVersion->getAsString(Args, Opts);
2821 PlatformAndVersion->canInferSimulatorFromArch() &&
getTriple().isX86())
2824 VersionTuple ZipperedOSVersion;
2826 ZipperedOSVersion = PlatformAndVersion->getZipperedOSVersion();
2827 setTarget(Platform, Environment, Major, Minor, Micro, ZipperedOSVersion);
2839 return !
SDKInfo->getPlatformPrefix(T).empty();
2848 const llvm::Triple &T)
const {
2850 const StringRef PlatformPrefix =
SDKInfo->getPlatformPrefix(T);
2851 if (!PlatformPrefix.empty())
2852 llvm::sys::path::append(Path, PlatformPrefix);
2853 }
else if (T.isDriverKit()) {
2856 llvm::sys::path::append(Path,
"System",
"DriverKit");
2865 if (DriverArgs.hasArg(options::OPT_isysroot))
2866 Path = DriverArgs.getLastArgValue(options::OPT_isysroot);
2877 const llvm::opt::ArgList &DriverArgs,
2878 llvm::opt::ArgStringList &CC1Args)
const {
2883 bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc);
2884 bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc);
2885 bool NoBuiltinInc = DriverArgs.hasFlag(
2886 options::OPT_nobuiltininc, options::OPT_ibuiltininc,
false);
2887 bool ForceBuiltinInc = DriverArgs.hasFlag(
2888 options::OPT_ibuiltininc, options::OPT_nobuiltininc,
false);
2891 if (!NoStdInc && !NoStdlibInc) {
2893 llvm::sys::path::append(P,
"usr",
"local",
"include");
2898 if (!(NoStdInc && !ForceBuiltinInc) && !NoBuiltinInc) {
2900 llvm::sys::path::append(P,
"include");
2904 if (NoStdInc || NoStdlibInc)
2908 llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
2909 if (!CIncludeDirs.empty()) {
2911 CIncludeDirs.split(dirs,
":");
2912 for (llvm::StringRef dir : dirs) {
2913 llvm::StringRef Prefix =
2914 llvm::sys::path::is_absolute(dir) ?
"" : llvm::StringRef(Sysroot);
2920 llvm::sys::path::append(P,
"usr",
"include");
2926 const llvm::opt::ArgList &DriverArgs,
2927 llvm::opt::ArgStringList &CC1Args)
const {
2930 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc))
2939 llvm::sys::path::append(P1,
"System",
"Library",
"Frameworks");
2940 llvm::sys::path::append(P2,
"System",
"Library",
"SubFrameworks");
2941 llvm::sys::path::append(P3,
"Library",
"Frameworks");
2945bool DarwinClang::AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
2946 llvm::opt::ArgStringList &CC1Args,
2948 llvm::StringRef Version,
2949 llvm::StringRef ArchDir,
2950 llvm::StringRef BitDir)
const {
2951 llvm::sys::path::append(
Base, Version);
2959 if (!ArchDir.empty())
2960 llvm::sys::path::append(P, ArchDir);
2961 if (!BitDir.empty())
2962 llvm::sys::path::append(P, BitDir);
2969 llvm::sys::path::append(P,
"backward");
2977 const llvm::opt::ArgList &DriverArgs,
2978 llvm::opt::ArgStringList &CC1Args)
const {
2986 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
2987 options::OPT_nostdincxx))
3008 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
3009 if (
getVFS().exists(InstallBin)) {
3012 }
else if (DriverArgs.hasArg(options::OPT_v)) {
3013 llvm::errs() <<
"ignoring nonexistent directory \"" << InstallBin
3019 llvm::sys::path::append(SysrootUsr,
"usr",
"include",
"c++",
"v1");
3020 if (
getVFS().exists(SysrootUsr)) {
3023 }
else if (DriverArgs.hasArg(options::OPT_v)) {
3024 llvm::errs() <<
"ignoring nonexistent directory \"" << SysrootUsr
3033 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args);
3038void AppleMachO::AddGnuCPlusPlusIncludePaths(
3039 const llvm::opt::ArgList &DriverArgs,
3040 llvm::opt::ArgStringList &CC1Args)
const {}
3042void DarwinClang::AddGnuCPlusPlusIncludePaths(
3043 const llvm::opt::ArgList &DriverArgs,
3044 llvm::opt::ArgStringList &CC1Args)
const {
3046 llvm::sys::path::append(UsrIncludeCxx,
"usr",
"include",
"c++");
3048 llvm::Triple::ArchType arch =
getTriple().getArch();
3049 bool IsBaseFound =
true;
3054 case llvm::Triple::x86:
3055 case llvm::Triple::x86_64:
3056 IsBaseFound = AddGnuCPlusPlusIncludePaths(
3057 DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
"i686-apple-darwin10",
3058 arch == llvm::Triple::x86_64 ?
"x86_64" :
"");
3059 IsBaseFound |= AddGnuCPlusPlusIncludePaths(
3060 DriverArgs, CC1Args, UsrIncludeCxx,
"4.0.0",
"i686-apple-darwin8",
"");
3063 case llvm::Triple::arm:
3064 case llvm::Triple::thumb:
3066 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3067 "arm-apple-darwin10",
"v7");
3069 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3070 "arm-apple-darwin10",
"v6");
3073 case llvm::Triple::aarch64:
3075 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3076 "arm64-apple-darwin10",
"");
3086 ArgStringList &CmdArgs)
const {
3091 CmdArgs.push_back(
"-lc++");
3092 if (Args.hasArg(options::OPT_fexperimental_library))
3093 CmdArgs.push_back(
"-lc++experimental");
3103 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
3105 llvm::sys::path::append(P,
"usr",
"lib",
"libstdc++.dylib");
3107 if (!
getVFS().exists(P)) {
3108 llvm::sys::path::remove_filename(P);
3109 llvm::sys::path::append(P,
"libstdc++.6.dylib");
3110 if (
getVFS().exists(P)) {
3111 CmdArgs.push_back(Args.MakeArgString(P));
3120 if (!
getVFS().exists(
"/usr/lib/libstdc++.dylib") &&
3121 getVFS().exists(
"/usr/lib/libstdc++.6.dylib")) {
3122 CmdArgs.push_back(
"/usr/lib/libstdc++.6.dylib");
3127 CmdArgs.push_back(
"-lstdc++");
3133 ArgStringList &CmdArgs)
const {
3139 llvm::sys::path::append(P,
"lib",
"darwin");
3143 llvm::sys::path::append(P,
"libclang_rt.cc_kext_watchos.a");
3145 llvm::sys::path::append(P,
"libclang_rt.cc_kext_tvos.a");
3147 llvm::sys::path::append(P,
"libclang_rt.cc_kext_ios.a");
3151 llvm::sys::path::append(
3152 P, llvm::Twine(
"libclang_rt.cc_kext_") +
3153 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
".a");
3155 llvm::sys::path::append(P,
"libclang_rt.cc_kext.a");
3161 CmdArgs.push_back(Args.MakeArgString(P));
3165 StringRef BoundArch,
3167 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
3177 for (Arg *A : Args) {
3186 case options::OPT_mkernel:
3187 case options::OPT_fapple_kext:
3189 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
3192 case options::OPT_dependency_file:
3193 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
3196 case options::OPT_gfull:
3197 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3199 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
3202 case options::OPT_gused:
3203 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3205 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
3208 case options::OPT_shared:
3209 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
3212 case options::OPT_fconstant_cfstrings:
3213 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
3216 case options::OPT_fno_constant_cfstrings:
3217 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
3220 case options::OPT_Wnonportable_cfstrings:
3222 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
3225 case options::OPT_Wno_nonportable_cfstrings:
3227 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
3234 if (!BoundArch.empty()) {
3235 StringRef Name = BoundArch;
3236 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
3237 const Option MArch = Opts.getOption(options::OPT_march_EQ);
3243 else if (Name ==
"ppc601")
3244 DAL->AddJoinedArg(
nullptr, MCpu,
"601");
3245 else if (Name ==
"ppc603")
3246 DAL->AddJoinedArg(
nullptr, MCpu,
"603");
3247 else if (Name ==
"ppc604")
3248 DAL->AddJoinedArg(
nullptr, MCpu,
"604");
3249 else if (Name ==
"ppc604e")
3250 DAL->AddJoinedArg(
nullptr, MCpu,
"604e");
3251 else if (Name ==
"ppc750")
3252 DAL->AddJoinedArg(
nullptr, MCpu,
"750");
3253 else if (Name ==
"ppc7400")
3254 DAL->AddJoinedArg(
nullptr, MCpu,
"7400");
3255 else if (Name ==
"ppc7450")
3256 DAL->AddJoinedArg(
nullptr, MCpu,
"7450");
3257 else if (Name ==
"ppc970")
3258 DAL->AddJoinedArg(
nullptr, MCpu,
"970");
3260 else if (Name ==
"ppc64" || Name ==
"ppc64le")
3261 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3263 else if (Name ==
"i386")
3265 else if (Name ==
"i486")
3266 DAL->AddJoinedArg(
nullptr, MArch,
"i486");
3267 else if (Name ==
"i586")
3268 DAL->AddJoinedArg(
nullptr, MArch,
"i586");
3269 else if (Name ==
"i686")
3270 DAL->AddJoinedArg(
nullptr, MArch,
"i686");
3271 else if (Name ==
"pentium")
3272 DAL->AddJoinedArg(
nullptr, MArch,
"pentium");
3273 else if (Name ==
"pentium2")
3274 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3275 else if (Name ==
"pentpro")
3276 DAL->AddJoinedArg(
nullptr, MArch,
"pentiumpro");
3277 else if (Name ==
"pentIIm3")
3278 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3280 else if (Name ==
"x86_64" || Name ==
"x86_64h")
3281 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3283 else if (Name ==
"arm")
3284 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3285 else if (Name ==
"armv4t")
3286 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3287 else if (Name ==
"armv5")
3288 DAL->AddJoinedArg(
nullptr, MArch,
"armv5tej");
3289 else if (Name ==
"xscale")
3290 DAL->AddJoinedArg(
nullptr, MArch,
"xscale");
3291 else if (Name ==
"armv6")
3292 DAL->AddJoinedArg(
nullptr, MArch,
"armv6k");
3293 else if (Name ==
"armv6m")
3294 DAL->AddJoinedArg(
nullptr, MArch,
"armv6m");
3295 else if (Name ==
"armv7")
3296 DAL->AddJoinedArg(
nullptr, MArch,
"armv7a");
3297 else if (Name ==
"armv7em")
3298 DAL->AddJoinedArg(
nullptr, MArch,
"armv7em");
3299 else if (Name ==
"armv7k")
3300 DAL->AddJoinedArg(
nullptr, MArch,
"armv7k");
3301 else if (Name ==
"armv7m")
3302 DAL->AddJoinedArg(
nullptr, MArch,
"armv7m");
3303 else if (Name ==
"armv7s")
3304 DAL->AddJoinedArg(
nullptr, MArch,
"armv7s");
3305 else if (Name ==
"armv8-m.base" || Name ==
"armv8m.base")
3306 DAL->AddJoinedArg(
nullptr, MArch,
"armv8m.base");
3307 else if (Name ==
"armv8-m.main" || Name ==
"armv8m.main")
3308 DAL->AddJoinedArg(
nullptr, MArch,
"armv8m.main");
3309 else if (Name ==
"armv8.1-m.main" || Name ==
"armv8.1m.main")
3310 DAL->AddJoinedArg(
nullptr, MArch,
"armv8.1m.main");
3317 ArgStringList &CmdArgs,
3318 bool ForceLinkBuiltinRT)
const {
3327 CompilerRT += Args.hasArg(options::OPT_fPIC) ?
"_pic" :
"_static";
3333 llvm::Triple::OSType OS;
3339 OS = llvm::Triple::MacOSX;
3342 OS = llvm::Triple::IOS;
3345 OS = llvm::Triple::TvOS;
3348 OS = llvm::Triple::WatchOS;
3364 switch (SDKInfo->getEnvironment()) {
3365 case llvm::Triple::UnknownEnvironment:
3366 case llvm::Triple::Simulator:
3367 case llvm::Triple::MacABI:
3376 VersionTuple SDKVersion = SDKInfo->getVersion();
3377 switch (SDKInfo->getOS()) {
3380 case llvm::Triple::MacOSX:
3381 return SDKVersion >= VersionTuple(15U);
3382 case llvm::Triple::IOS:
3383 return SDKVersion >= VersionTuple(18U);
3384 case llvm::Triple::TvOS:
3385 return SDKVersion >= VersionTuple(18U);
3386 case llvm::Triple::WatchOS:
3387 return SDKVersion >= VersionTuple(11U);
3388 case llvm::Triple::XROS:
3389 return SDKVersion >= VersionTuple(2U);
3397static inline llvm::VersionTuple
3402 case llvm::Triple::Darwin:
3403 case llvm::Triple::MacOSX:
3404 return llvm::VersionTuple(10U, 12U);
3405 case llvm::Triple::IOS:
3406 case llvm::Triple::TvOS:
3407 return llvm::VersionTuple(10U);
3408 case llvm::Triple::WatchOS:
3409 return llvm::VersionTuple(3U);
3412 llvm_unreachable(
"Unexpected OS");
3416 llvm::Triple::OSType OS;
3422 OS = llvm::Triple::MacOSX;
3425 OS = llvm::Triple::IOS;
3428 OS = llvm::Triple::TvOS;
3431 OS = llvm::Triple::WatchOS;
3442 llvm::opt::ArgStringList &CC1Args,
3443 llvm::StringRef BoundArch,
3453 if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3454 options::OPT_fno_ptrauth_calls))
3455 CC1Args.push_back(
"-fptrauth-calls");
3456 if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3457 options::OPT_fno_ptrauth_returns))
3458 CC1Args.push_back(
"-fptrauth-returns");
3459 if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3460 options::OPT_fno_ptrauth_intrinsics))
3461 CC1Args.push_back(
"-fptrauth-intrinsics");
3462 if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3463 options::OPT_fno_ptrauth_indirect_gotos))
3464 CC1Args.push_back(
"-fptrauth-indirect-gotos");
3465 if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3466 options::OPT_fno_ptrauth_auth_traps))
3467 CC1Args.push_back(
"-fptrauth-auth-traps");
3470 if (!DriverArgs.hasArg(
3471 options::OPT_fptrauth_vtable_pointer_address_discrimination,
3472 options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
3473 CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
3474 if (!DriverArgs.hasArg(
3475 options::OPT_fptrauth_vtable_pointer_type_discrimination,
3476 options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
3477 CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
3480 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
3481 options::OPT_fno_ptrauth_objc_isa))
3482 CC1Args.push_back(
"-fptrauth-objc-isa");
3483 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
3484 options::OPT_fno_ptrauth_objc_class_ro))
3485 CC1Args.push_back(
"-fptrauth-objc-class-ro");
3486 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
3487 options::OPT_fno_ptrauth_objc_interface_sel))
3488 CC1Args.push_back(
"-fptrauth-objc-interface-sel");
3493 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3507 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
3508 options::OPT_fno_aligned_allocation) &&
3510 CC1Args.push_back(
"-faligned-alloc-unavailable");
3514 if (!DriverArgs.hasArgNoClaim(options::OPT_fobjc_msgsend_selector_stubs,
3515 options::OPT_fno_objc_msgsend_selector_stubs) &&
3518 CC1Args.push_back(
"-fobjc-msgsend-selector-stubs");
3522 if (!DriverArgs.hasArgNoClaim(
3523 options::OPT_fobjc_msgsend_class_selector_stubs,
3524 options::OPT_fno_objc_msgsend_class_selector_stubs) &&
3527 CC1Args.push_back(
"-fobjc-msgsend-class-selector-stubs");
3531 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
3532 options::OPT_fno_sized_deallocation) &&
3534 CC1Args.push_back(
"-fno-sized-deallocation");
3541 if (!
SDKInfo->getFilePath().empty()) {
3543 ExtraDepOpt +=
SDKInfo->getFilePath();
3544 CC1Args.push_back(DriverArgs.MakeArgString(ExtraDepOpt));
3550 CC1Args.push_back(
"-fcompatibility-qualified-id-block-type-checking");
3554 if (!DriverArgs.getLastArgNoClaim(
3555 options::OPT_fvisibility_inlines_hidden_static_local_var,
3556 options::OPT_fno_visibility_inlines_hidden_static_local_var))
3557 CC1Args.push_back(
"-fvisibility-inlines-hidden-static-local-var");
3571 CC1Args.push_back(
"-fbuiltin-headers-in-system-modules");
3573 if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
3574 options::OPT_fno_define_target_os_macros))
3575 CC1Args.push_back(
"-fdefine-target-os-macros");
3579 !DriverArgs.hasFlag(options::OPT_fmodulemap_allow_subdirectory_search,
3580 options::OPT_fno_modulemap_allow_subdirectory_search,
3582 bool RequiresSubdirectorySearch;
3583 VersionTuple SDKVersion =
SDKInfo->getVersion();
3586 RequiresSubdirectorySearch =
true;
3589 RequiresSubdirectorySearch = SDKVersion < VersionTuple(15, 0);
3593 RequiresSubdirectorySearch = SDKVersion < VersionTuple(18, 0);
3596 RequiresSubdirectorySearch = SDKVersion < VersionTuple(11, 0);
3599 RequiresSubdirectorySearch = SDKVersion < VersionTuple(2, 0);
3602 if (!RequiresSubdirectorySearch)
3603 CC1Args.push_back(
"-fno-modulemap-allow-subdirectory-search");
3608 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1ASArgs)
const {
3610 CC1ASArgs.push_back(
"-darwin-target-variant-triple");
3617 auto EmitTargetSDKVersionArg = [&](
const VersionTuple &
V) {
3619 llvm::raw_string_ostream OS(Arg);
3620 OS <<
"-target-sdk-version=" <<
V;
3621 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3625 if (
const auto *MacOStoMacCatalystMapping =
SDKInfo->getVersionMapping(
3627 std::optional<VersionTuple> SDKVersion = MacOStoMacCatalystMapping->map(
3630 EmitTargetSDKVersionArg(
3634 EmitTargetSDKVersionArg(
SDKInfo->getVersion());
3642 llvm::raw_string_ostream OS(Arg);
3643 OS <<
"-darwin-target-variant-sdk-version=" <<
SDKInfo->getVersion();
3644 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3645 }
else if (
const auto *MacOStoMacCatalystMapping =
3648 if (std::optional<VersionTuple> SDKVersion =
3649 MacOStoMacCatalystMapping->map(
3653 llvm::raw_string_ostream OS(Arg);
3654 OS <<
"-darwin-target-variant-sdk-version=" << *SDKVersion;
3655 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3666 DerivedArgList *DAL =
3670 if (BoundArch.empty())
3676 AddDeploymentTarget(*DAL);
3684 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
3687 if (A->getOption().getID() != options::OPT_mkernel &&
3688 A->getOption().getID() != options::OPT_fapple_kext)
3690 assert(it != ie &&
"unexpected argument translation");
3692 assert(A->getOption().getID() == options::OPT_static &&
3693 "missing expected -static argument");
3700 if ((
Arch == llvm::Triple::arm ||
Arch == llvm::Triple::thumb)) {
3701 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
3702 options::OPT_fno_omit_frame_pointer,
false))
3703 getDriver().
Diag(clang::diag::warn_drv_unsupported_opt_for_target)
3704 <<
"-fomit-frame-pointer" << BoundArch;
3713 if (
getArch() == llvm::Triple::x86_64 ||
3715 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
3717 return (
getArch() == llvm::Triple::aarch64 ||
3718 getArch() == llvm::Triple::aarch64_32)
3726 if (
const char *S = ::getenv(
"RC_DEBUG_OPTIONS"))
3727 return S[0] !=
'\0';
3732 if (
const char *S = ::getenv(
"RC_DEBUG_PREFIX_MAP"))
3741 return llvm::ExceptionHandling::None;
3745 if (Triple.isWatchABI())
3746 return llvm::ExceptionHandling::DwarfCFI;
3748 return llvm::ExceptionHandling::SjLj;
3763 return (
getArch() == llvm::Triple::x86_64 ||
3764 getArch() == llvm::Triple::aarch64);
3773 ArgStringList &CmdArgs)
const {
3776 assert(!
isTargetXROS() &&
"xrOS always uses -platform-version");
3779 CmdArgs.push_back(
"-watchos_version_min");
3781 CmdArgs.push_back(
"-watchos_simulator_version_min");
3783 CmdArgs.push_back(
"-tvos_version_min");
3785 CmdArgs.push_back(
"-tvos_simulator_version_min");
3787 CmdArgs.push_back(
"-driverkit_version_min");
3789 CmdArgs.push_back(
"-ios_simulator_version_min");
3791 CmdArgs.push_back(
"-iphoneos_version_min");
3793 CmdArgs.push_back(
"-maccatalyst_version_min");
3796 CmdArgs.push_back(
"-macosx_version_min");
3802 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3805 VersionTuple VariantTargetVersion;
3807 CmdArgs.push_back(
"-macosx_version_min");
3812 "unexpected target variant triple");
3813 CmdArgs.push_back(
"-maccatalyst_version_min");
3816 VersionTuple MinTgtVers =
3818 if (MinTgtVers.getMajor() && MinTgtVers > VariantTargetVersion)
3819 VariantTargetVersion = MinTgtVers;
3820 CmdArgs.push_back(Args.MakeArgString(VariantTargetVersion.getAsString()));
3831 return "mac catalyst";
3844 llvm_unreachable(
"invalid platform");
3848 llvm::opt::ArgStringList &CmdArgs)
const {
3853 auto EmitPlatformVersionArg =
3856 const llvm::Triple &TT) {
3859 CmdArgs.push_back(
"-platform_version");
3860 std::string PlatformName =
3863 PlatformName +=
"-simulator";
3864 CmdArgs.push_back(Args.MakeArgString(PlatformName));
3873 VersionTuple MinTgtVers = TT.getMinimumSupportedOSVersion();
3876 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3881 std::optional<VersionTuple> iOSSDKVersion;
3883 if (
const auto *MacOStoMacCatalystMapping =
3886 iOSSDKVersion = MacOStoMacCatalystMapping->map(
3887 SDKInfo->getVersion().withoutBuild(),
3891 CmdArgs.push_back(Args.MakeArgString(
3892 (iOSSDKVersion ? *iOSSDKVersion
3899 VersionTuple SDKVersion =
SDKInfo->getVersion().withoutBuild();
3900 if (!SDKVersion.getMinor())
3901 SDKVersion = VersionTuple(SDKVersion.getMajor(), 0);
3902 CmdArgs.push_back(Args.MakeArgString(SDKVersion.getAsString()));
3913 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3922 VersionTuple TargetVariantVersion;
3930 "unexpected target variant triple");
3935 EmitPlatformVersionArg(TargetVariantVersion, Platform, Environment,
3941 ArgStringList &CmdArgs) {
3945 CmdArgs.push_back(
"-ldylib1.o");
3952 CmdArgs.push_back(
"-ldylib1.o");
3954 CmdArgs.push_back(
"-ldylib1.10.5.o");
3959 ArgStringList &CmdArgs) {
3960 if (Args.hasArg(options::OPT_static))
3965 CmdArgs.push_back(
"-lbundle1.o");
3970 ArgStringList &CmdArgs) {
3972 if (Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_object) ||
3973 Args.hasArg(options::OPT_preload)) {
3974 CmdArgs.push_back(
"-lgcrt0.o");
3976 CmdArgs.push_back(
"-lgcrt1.o");
3986 CmdArgs.push_back(
"-no_new_main");
3988 D.
getDriver().
Diag(diag::err_drv_clang_unsupported_opt_pg_darwin)
3994 ArgStringList &CmdArgs) {
3997 if (D.
getArch() == llvm::Triple::aarch64)
4000 CmdArgs.push_back(
"-lcrt1.o");
4002 CmdArgs.push_back(
"-lcrt1.3.1.o");
4009 CmdArgs.push_back(
"-lcrt1.o");
4011 CmdArgs.push_back(
"-lcrt1.10.5.o");
4013 CmdArgs.push_back(
"-lcrt1.10.6.o");
4018 ArgStringList &CmdArgs)
const {
4024 if (Args.hasArg(options::OPT_dynamiclib))
4026 else if (Args.hasArg(options::OPT_bundle))
4030 else if (Args.hasArg(options::OPT_static) ||
4031 Args.hasArg(options::OPT_object) ||
4032 Args.hasArg(options::OPT_preload))
4033 CmdArgs.push_back(
"-lcrt0.o");
4037 if (
isTargetMacOS() && Args.hasArg(options::OPT_shared_libgcc) &&
4039 const char *Str = Args.MakeArgString(
GetFilePath(
"crt3.o"));
4040 CmdArgs.push_back(Str);
4057 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
4058 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
4061 Res |= SanitizerKind::Address;
4062 Res |= SanitizerKind::PointerCompare;
4063 Res |= SanitizerKind::PointerSubtract;
4064 Res |= SanitizerKind::Realtime;
4065 Res |= SanitizerKind::Leak;
4066 Res |= SanitizerKind::Fuzzer;
4067 Res |= SanitizerKind::FuzzerNoLink;
4068 Res |= SanitizerKind::ObjCCast;
4078 Res |= SanitizerKind::Vptr;
4080 if ((IsX86_64 || IsAArch64) &&
4083 Res |= SanitizerKind::Thread;
4087 Res |= SanitizerKind::Type;
4091 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,...
llvm::ImmutableSet< T > join(llvm::ImmutableSet< T > A, llvm::ImmutableSet< T > B, typename llvm::ImmutableSet< T >::Factory &F)
Computes the union of two ImmutableSets.
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()