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();
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) {
2046 const llvm::Triple::OSType
OS = PlatformTriple.getOS();
2048 if (OS == llvm::Triple::MacOSX)
2049 Version = getVersionFromString(
2051 DarwinPlatform
Result(InferredFromSDK, getPlatformFromOS(OS), Version);
2052 Result.Environment = getEnvKindFromEnvType(PlatformTriple.getEnvironment());
2053 Result.InferSimulatorFromArch =
false;
2054 Result.InferredSource = SDKRoot;
2057 static DarwinPlatform createFromSDK(StringRef SDKRoot,
2058 DarwinPlatformKind Platform,
2060 bool IsSimulator =
false) {
2061 DarwinPlatform
Result(InferredFromSDK, Platform,
2062 getVersionFromString(
Value));
2064 Result.Environment = DarwinEnvironmentKind::Simulator;
2065 Result.InferSimulatorFromArch =
false;
2066 Result.InferredSource = SDKRoot;
2069 static DarwinPlatform createFromArch(StringRef
Arch, llvm::Triple::OSType OS,
2070 VersionTuple Version) {
2072 DarwinPlatform(InferredFromArch, getPlatformFromOS(OS), Version);
2080 DarwinSDKInfo inferSDKInfo() {
2081 assert(Kind == InferredFromSDK &&
"can infer SDK info only");
2082 llvm::Triple::OSType
OS = getOSFromPlatform(Platform);
2083 llvm::Triple::EnvironmentType EnvironmentType =
2084 getEnvTypeFromEnvKind(Environment);
2085 return DarwinSDKInfo(OS, EnvironmentType, getOSVersion(),
2086 getDisplayName(Platform, Environment, getOSVersion()),
2088 VersionTuple(getOSVersion().getMajor(), 0, 99));
2092 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform, Arg *Argument)
2094 Arguments({Argument, VersionTuple().getAsString()}) {}
2095 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform,
2096 VersionTuple
Value, Arg *Argument =
nullptr)
2100 UnderlyingOSVersion =
Value;
2103 static VersionTuple getVersionFromString(
const StringRef Input) {
2104 llvm::VersionTuple Version;
2105 bool IsValid = !Version.tryParse(Input);
2106 assert(IsValid &&
"unable to convert input version to version tuple");
2111 static DarwinPlatformKind getPlatformFromOS(llvm::Triple::OSType OS) {
2113 case llvm::Triple::Darwin:
2114 case llvm::Triple::MacOSX:
2115 return DarwinPlatformKind::MacOS;
2116 case llvm::Triple::IOS:
2117 return DarwinPlatformKind::IPhoneOS;
2118 case llvm::Triple::TvOS:
2119 return DarwinPlatformKind::TvOS;
2120 case llvm::Triple::WatchOS:
2121 return DarwinPlatformKind::WatchOS;
2122 case llvm::Triple::XROS:
2123 return DarwinPlatformKind::XROS;
2124 case llvm::Triple::DriverKit:
2125 return DarwinPlatformKind::DriverKit;
2126 case llvm::Triple::Firmware:
2127 return DarwinPlatformKind::Firmware;
2129 llvm_unreachable(
"Unable to infer Darwin variant");
2133 static llvm::Triple::OSType getOSFromPlatform(DarwinPlatformKind Platform) {
2135 case DarwinPlatformKind::MacOS:
2136 return llvm::Triple::MacOSX;
2137 case DarwinPlatformKind::IPhoneOS:
2138 return llvm::Triple::IOS;
2139 case DarwinPlatformKind::TvOS:
2140 return llvm::Triple::TvOS;
2141 case DarwinPlatformKind::WatchOS:
2142 return llvm::Triple::WatchOS;
2143 case DarwinPlatformKind::DriverKit:
2144 return llvm::Triple::DriverKit;
2145 case DarwinPlatformKind::XROS:
2146 return llvm::Triple::XROS;
2147 case DarwinPlatformKind::Firmware:
2148 return llvm::Triple::Firmware;
2150 llvm_unreachable(
"Unknown DarwinPlatformKind enum");
2153 static DarwinEnvironmentKind
2154 getEnvKindFromEnvType(llvm::Triple::EnvironmentType EnvironmentType) {
2155 switch (EnvironmentType) {
2156 case llvm::Triple::UnknownEnvironment:
2157 return DarwinEnvironmentKind::NativeEnvironment;
2158 case llvm::Triple::Simulator:
2159 return DarwinEnvironmentKind::Simulator;
2160 case llvm::Triple::MacABI:
2161 return DarwinEnvironmentKind::MacCatalyst;
2163 llvm_unreachable(
"Unable to infer Darwin environment");
2167 static llvm::Triple::EnvironmentType
2168 getEnvTypeFromEnvKind(DarwinEnvironmentKind EnvironmentKind) {
2169 switch (EnvironmentKind) {
2170 case DarwinEnvironmentKind::NativeEnvironment:
2171 return llvm::Triple::UnknownEnvironment;
2172 case DarwinEnvironmentKind::Simulator:
2173 return llvm::Triple::Simulator;
2174 case DarwinEnvironmentKind::MacCatalyst:
2175 return llvm::Triple::MacABI;
2177 llvm_unreachable(
"Unknown DarwinEnvironmentKind enum");
2180 static std::string getDisplayName(DarwinPlatformKind TargetPlatform,
2181 DarwinEnvironmentKind TargetEnvironment,
2182 VersionTuple Version) {
2183 SmallVector<std::string, 3> Components;
2184 switch (TargetPlatform) {
2185 case DarwinPlatformKind::MacOS:
2186 Components.push_back(
"macOS");
2188 case DarwinPlatformKind::IPhoneOS:
2189 Components.push_back(
"iOS");
2191 case DarwinPlatformKind::TvOS:
2192 Components.push_back(
"tvOS");
2194 case DarwinPlatformKind::WatchOS:
2195 Components.push_back(
"watchOS");
2197 case DarwinPlatformKind::DriverKit:
2198 Components.push_back(
"DriverKit");
2201 llvm::reportFatalUsageError(Twine(
"Platform: '") +
2202 std::to_string(TargetPlatform) +
2203 "' is unsupported when inferring SDK Info.");
2205 switch (TargetEnvironment) {
2206 case DarwinEnvironmentKind::NativeEnvironment:
2208 case DarwinEnvironmentKind::Simulator:
2209 Components.push_back(
"Simulator");
2212 llvm::reportFatalUsageError(Twine(
"Environment: '") +
2213 std::to_string(TargetEnvironment) +
2214 "' is unsupported when inferring SDK Info.");
2216 Components.push_back(Version.getAsString());
2217 return join(Components,
" ");
2221 DarwinPlatformKind Platform;
2222 DarwinEnvironmentKind Environment = DarwinEnvironmentKind::NativeEnvironment;
2226 VersionTuple ZipperedOSVersion;
2231 std::optional<VersionTuple> UnderlyingOSVersion;
2232 bool InferSimulatorFromArch =
true;
2233 std::pair<Arg *, std::string>
Arguments;
2234 StringRef EnvVarName;
2237 StringRef InferredSource;
2240 std::optional<llvm::Triple> TargetVariantTriple;
2245std::optional<DarwinPlatform>
2246getDeploymentTargetFromOSVersionArg(DerivedArgList &Args,
2247 const Driver &TheDriver) {
2248 Arg *macOSVersion = Args.getLastArg(options::OPT_mmacos_version_min_EQ);
2249 Arg *iOSVersion = Args.getLastArg(options::OPT_mios_version_min_EQ,
2250 options::OPT_mios_simulator_version_min_EQ);
2252 Args.getLastArg(options::OPT_mtvos_version_min_EQ,
2253 options::OPT_mtvos_simulator_version_min_EQ);
2254 Arg *WatchOSVersion =
2255 Args.getLastArg(options::OPT_mwatchos_version_min_EQ,
2256 options::OPT_mwatchos_simulator_version_min_EQ);
2258 auto GetDarwinPlatform =
2259 [&](DarwinPlatform::DarwinPlatformKind Platform, Arg *VersionArg,
2260 bool IsSimulator) -> std::optional<DarwinPlatform> {
2261 if (StringRef(VersionArg->getValue()).empty()) {
2262 TheDriver.
Diag(diag::err_drv_missing_version_number)
2263 << VersionArg->getAsString(Args);
2264 return std::nullopt;
2266 return DarwinPlatform::createOSVersionArg(Platform, VersionArg,
2271 if (iOSVersion || TvOSVersion || WatchOSVersion) {
2272 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2273 << macOSVersion->getAsString(Args)
2274 << (iOSVersion ? iOSVersion
2275 : TvOSVersion ? TvOSVersion : WatchOSVersion)
2281 }
else if (iOSVersion) {
2282 if (TvOSVersion || WatchOSVersion) {
2283 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2284 << iOSVersion->getAsString(Args)
2285 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->
getAsString(Args);
2288 iOSVersion->getOption().getID() ==
2289 options::OPT_mios_simulator_version_min_EQ);
2290 }
else if (TvOSVersion) {
2291 if (WatchOSVersion) {
2292 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2293 << TvOSVersion->getAsString(Args)
2294 << WatchOSVersion->getAsString(Args);
2297 TvOSVersion->getOption().getID() ==
2298 options::OPT_mtvos_simulator_version_min_EQ);
2299 }
else if (WatchOSVersion)
2300 return GetDarwinPlatform(
2302 WatchOSVersion->getOption().getID() ==
2303 options::OPT_mwatchos_simulator_version_min_EQ);
2304 return std::nullopt;
2309std::optional<DarwinPlatform>
2310getDeploymentTargetFromEnvironmentVariables(
const Driver &TheDriver,
2311 const llvm::Triple &Triple) {
2312 const char *EnvVars[] = {
2313 "MACOSX_DEPLOYMENT_TARGET",
2314 "IPHONEOS_DEPLOYMENT_TARGET",
2315 "TVOS_DEPLOYMENT_TARGET",
2316 "WATCHOS_DEPLOYMENT_TARGET",
2317 "DRIVERKIT_DEPLOYMENT_TARGET",
2318 "XROS_DEPLOYMENT_TARGET"
2320 std::string Targets[std::size(EnvVars)];
2321 for (
const auto &I : llvm::enumerate(llvm::ArrayRef(EnvVars))) {
2322 if (
char *Env = ::getenv(I.value()))
2323 Targets[I.index()] = Env;
2332 if (Triple.getArch() == llvm::Triple::arm ||
2333 Triple.getArch() == llvm::Triple::aarch64 ||
2334 Triple.getArch() == llvm::Triple::thumb)
2341 unsigned FirstTarget = std::size(Targets);
2342 for (
unsigned I = 0; I != std::size(Targets); ++I) {
2343 if (Targets[I].empty())
2345 if (FirstTarget == std::size(Targets))
2348 TheDriver.
Diag(diag::err_drv_conflicting_deployment_targets)
2349 << Targets[FirstTarget] << Targets[I];
2353 for (
const auto &
Target : llvm::enumerate(llvm::ArrayRef(Targets))) {
2354 if (!
Target.value().empty())
2355 return DarwinPlatform::createDeploymentTargetEnv(
2359 return std::nullopt;
2365std::optional<DarwinPlatform>
2366inferDeploymentTargetFromSDK(DerivedArgList &Args,
2367 const std::optional<DarwinSDKInfo> &SDKInfo) {
2368 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2370 return std::nullopt;
2371 StringRef isysroot = A->getValue();
2373 return DarwinPlatform::createFromSDKInfo(isysroot, *SDKInfo);
2377 return std::nullopt;
2379 std::string Version;
2382 size_t StartVer = SDK.find_first_of(
"0123456789");
2383 size_t EndVer = SDK.find_last_of(
"0123456789");
2384 if (StartVer != StringRef::npos && EndVer > StartVer)
2385 Version = std::string(SDK.slice(StartVer, EndVer + 1));
2386 if (Version.empty())
2387 return std::nullopt;
2389 if (SDK.starts_with(
"iPhoneOS") || SDK.starts_with(
"iPhoneSimulator"))
2390 return DarwinPlatform::createFromSDK(
2392 SDK.starts_with(
"iPhoneSimulator"));
2393 else if (SDK.starts_with(
"MacOSX"))
2394 return DarwinPlatform::createFromSDK(isysroot,
Darwin::MacOS,
2396 else if (SDK.starts_with(
"WatchOS") || SDK.starts_with(
"WatchSimulator"))
2397 return DarwinPlatform::createFromSDK(
2399 SDK.starts_with(
"WatchSimulator"));
2400 else if (SDK.starts_with(
"AppleTVOS") || SDK.starts_with(
"AppleTVSimulator"))
2401 return DarwinPlatform::createFromSDK(
2403 SDK.starts_with(
"AppleTVSimulator"));
2404 else if (SDK.starts_with(
"DriverKit"))
2406 return std::nullopt;
2410VersionTuple getInferredOSVersion(llvm::Triple::OSType OS,
2411 const llvm::Triple &Triple,
2412 const Driver &TheDriver) {
2413 VersionTuple OsVersion;
2414 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
2416 case llvm::Triple::Darwin:
2417 case llvm::Triple::MacOSX:
2420 if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
2421 !Triple.getOSMajorVersion())
2422 SystemTriple.getMacOSXVersion(OsVersion);
2423 else if (!Triple.getMacOSXVersion(OsVersion))
2424 TheDriver.
Diag(diag::err_drv_invalid_darwin_version)
2425 << Triple.getOSName();
2427 case llvm::Triple::IOS:
2428 if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
2429 OsVersion = VersionTuple(13, 1);
2431 OsVersion = Triple.getiOSVersion();
2433 case llvm::Triple::TvOS:
2434 OsVersion = Triple.getOSVersion();
2436 case llvm::Triple::WatchOS:
2437 OsVersion = Triple.getWatchOSVersion();
2439 case llvm::Triple::DriverKit:
2440 OsVersion = Triple.getDriverKitVersion();
2443 OsVersion = Triple.getOSVersion();
2444 if (!OsVersion.getMajor())
2445 OsVersion = OsVersion.withMajorReplaced(1);
2452std::optional<DarwinPlatform>
2453inferDeploymentTargetFromArch(DerivedArgList &Args,
const Darwin &Toolchain,
2454 const llvm::Triple &Triple,
2455 const Driver &TheDriver) {
2456 llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS;
2459 if (MachOArchName ==
"arm64" || MachOArchName ==
"arm64e")
2460 OSTy = llvm::Triple::MacOSX;
2461 else if (MachOArchName ==
"armv7" || MachOArchName ==
"armv7s" ||
2462 MachOArchName ==
"armv6")
2463 OSTy = llvm::Triple::IOS;
2464 else if (MachOArchName ==
"armv7k" || MachOArchName ==
"arm64_32")
2465 OSTy = llvm::Triple::WatchOS;
2466 else if (MachOArchName !=
"armv6m" && MachOArchName !=
"armv7m" &&
2467 MachOArchName !=
"armv7em" && MachOArchName !=
"armv8m.base" &&
2468 MachOArchName !=
"armv8m.main" && MachOArchName !=
"armv8.1m.main")
2469 OSTy = llvm::Triple::MacOSX;
2470 if (OSTy == llvm::Triple::UnknownOS)
2471 return std::nullopt;
2472 return DarwinPlatform::createFromArch(
2473 MachOArchName, OSTy, getInferredOSVersion(OSTy, Triple, TheDriver));
2477std::optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
2478 DerivedArgList &Args,
const llvm::Triple &Triple,
const Driver &TheDriver,
2479 const std::optional<DarwinSDKInfo> &SDKInfo) {
2480 if (!Args.hasArg(options::OPT_target))
2481 return std::nullopt;
2482 if (Triple.getOS() == llvm::Triple::Darwin ||
2483 Triple.getOS() == llvm::Triple::UnknownOS)
2484 return std::nullopt;
2485 std::optional<llvm::Triple> TargetVariantTriple;
2486 for (
const Arg *A : Args.filtered(options::OPT_darwin_target_variant)) {
2487 llvm::Triple TVT(A->getValue());
2489 if ((Triple.getArch() == llvm::Triple::aarch64 ||
2490 TVT.getArchName() == Triple.getArchName()) &&
2491 TVT.getArch() == Triple.getArch() &&
2492 TVT.getSubArch() == Triple.getSubArch() &&
2493 TVT.getVendor() == Triple.getVendor()) {
2494 if (TargetVariantTriple)
2499 if ((Triple.isMacOSX() && TVT.getOS() == llvm::Triple::IOS &&
2500 TVT.isMacCatalystEnvironment()) ||
2501 (TVT.isMacOSX() && Triple.getOS() == llvm::Triple::IOS &&
2502 Triple.isMacCatalystEnvironment())) {
2503 TargetVariantTriple = TVT;
2506 TheDriver.
Diag(diag::err_drv_target_variant_invalid)
2507 << A->getSpelling() << A->getValue();
2510 DarwinPlatform PlatformAndVersion = DarwinPlatform::createFromTarget(
2511 Triple, Args.getLastArg(options::OPT_target), TargetVariantTriple,
2514 return PlatformAndVersion;
2518std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2519 DerivedArgList &Args,
const Driver &TheDriver,
2520 const std::optional<DarwinSDKInfo> &SDKInfo) {
2521 auto *A = Args.getLastArg(options::OPT_mtargetos_EQ);
2523 return std::nullopt;
2524 llvm::Triple TT(llvm::Twine(
"unknown-apple-") + A->getValue());
2525 switch (TT.getOS()) {
2526 case llvm::Triple::MacOSX:
2527 case llvm::Triple::IOS:
2528 case llvm::Triple::TvOS:
2529 case llvm::Triple::WatchOS:
2530 case llvm::Triple::XROS:
2533 TheDriver.
Diag(diag::err_drv_invalid_os_in_arg)
2534 << TT.getOSName() << A->getAsString(Args);
2535 return std::nullopt;
2538 VersionTuple Version = TT.getOSVersion();
2539 if (!Version.getMajor()) {
2540 TheDriver.
Diag(diag::err_drv_invalid_version_number)
2541 << A->getAsString(Args);
2542 return std::nullopt;
2544 return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
2545 TT.getEnvironment(), A, SDKInfo);
2548std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS,
2549 const ArgList &Args,
2550 const Driver &TheDriver) {
2551 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2553 return std::nullopt;
2554 StringRef isysroot = A->getValue();
2556 if (!SDKInfoOrErr) {
2557 llvm::consumeError(SDKInfoOrErr.takeError());
2558 TheDriver.
Diag(diag::warn_drv_darwin_sdk_invalid_settings);
2559 return std::nullopt;
2561 return *SDKInfoOrErr;
2566void Darwin::AddDeploymentTarget(DerivedArgList &Args)
const {
2572 bool TryXcselect =
false;
2578 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2580 if (!
getVFS().exists(A->getValue()))
2581 getDriver().
Diag(clang::diag::warn_missing_sysroot) << A->getValue();
2582 }
else if (
const char *env = ::getenv(
"SDKROOT")) {
2585 if (llvm::sys::path::is_absolute(env) &&
getVFS().exists(env) &&
2586 StringRef(env) !=
"/") {
2587 Args.append(Args.MakeSeparateArg(
2588 nullptr, Opts.getOption(options::OPT_isysroot), env));
2591 TryXcselect = !Args.hasArg(options::OPT__sysroot_EQ) &&
2592 !Args.hasArg(options::OPT_no_xcselect);
2602 std::optional<DarwinPlatform> PlatformAndVersion =
2604 if (PlatformAndVersion) {
2606 if (
const auto *MTargetOSArg = Args.getLastArg(options::OPT_mtargetos_EQ)) {
2607 std::string TargetArgStr = PlatformAndVersion->getAsString(Args, Opts);
2608 std::string MTargetOSArgStr = MTargetOSArg->getAsString(Args);
2610 << TargetArgStr << MTargetOSArgStr;
2613 bool TripleProvidedOSVersion = PlatformAndVersion->hasOSVersion();
2614 if (!TripleProvidedOSVersion)
2615 PlatformAndVersion->setOSVersion(
2618 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2619 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2620 if (PlatformAndVersionFromOSVersionArg) {
2621 unsigned TargetMajor, TargetMinor, TargetMicro;
2623 unsigned ArgMajor, ArgMinor, ArgMicro;
2625 if (PlatformAndVersion->getPlatform() !=
2626 PlatformAndVersionFromOSVersionArg->getPlatform() ||
2628 PlatformAndVersion->getOSVersion().getAsString(), TargetMajor,
2629 TargetMinor, TargetMicro, TargetExtra) &&
2631 PlatformAndVersionFromOSVersionArg->getOSVersion().getAsString(),
2632 ArgMajor, ArgMinor, ArgMicro, ArgExtra) &&
2633 (VersionTuple(TargetMajor, TargetMinor, TargetMicro) !=
2634 VersionTuple(ArgMajor, ArgMinor, ArgMicro) ||
2635 TargetExtra != ArgExtra))) {
2638 if (PlatformAndVersion->getPlatform() ==
2639 PlatformAndVersionFromOSVersionArg->getPlatform() &&
2640 !TripleProvidedOSVersion) {
2641 PlatformAndVersion->setOSVersion(
2642 PlatformAndVersionFromOSVersionArg->getOSVersion());
2646 std::string OSVersionArg =
2647 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2648 std::string TargetArg = PlatformAndVersion->getAsString(Args, Opts);
2650 << OSVersionArg << TargetArg;
2654 }
else if ((PlatformAndVersion = getDeploymentTargetFromMTargetOSArg(
2658 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2659 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2660 if (PlatformAndVersionFromOSVersionArg) {
2661 std::string MTargetOSArgStr = PlatformAndVersion->getAsString(Args, Opts);
2662 std::string OSVersionArgStr =
2663 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2665 << MTargetOSArgStr << OSVersionArgStr;
2669 PlatformAndVersion = getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2672 if (!PlatformAndVersion) {
2673 PlatformAndVersion =
2675 if (PlatformAndVersion) {
2677 std::optional<DarwinPlatform> SDKTarget =
2678 inferDeploymentTargetFromSDK(Args,
SDKInfo);
2680 PlatformAndVersion->setEnvironment(SDKTarget->getEnvironment());
2686 if (!PlatformAndVersion) {
2687 PlatformAndVersion = inferDeploymentTargetFromSDK(Args,
SDKInfo);
2690 if (PlatformAndVersion && !
SDKInfo)
2691 SDKInfo = PlatformAndVersion->inferSDKInfo();
2695 if (!PlatformAndVersion)
2696 PlatformAndVersion =
2700 assert(PlatformAndVersion &&
"Unable to infer Darwin variant");
2701 if (!PlatformAndVersion->isValidOSVersion()) {
2702 if (PlatformAndVersion->isExplicitlySpecified())
2704 << PlatformAndVersion->getAsString(Args, Opts);
2706 getDriver().
Diag(diag::err_drv_invalid_version_number_inferred)
2707 << PlatformAndVersion->getOSVersion().getAsString()
2708 << PlatformAndVersion->getInferredSource();
2713 VersionTuple CanonicalVersion = PlatformAndVersion->getCanonicalOSVersion();
2714 if (CanonicalVersion != PlatformAndVersion->getOSVersion()) {
2715 getDriver().
Diag(diag::warn_drv_overriding_deployment_version)
2716 << PlatformAndVersion->getOSVersion().getAsString()
2717 << CanonicalVersion.getAsString();
2718 PlatformAndVersion->setOSVersion(CanonicalVersion);
2721 PlatformAndVersion->addOSVersionMinArgument(Args, Opts);
2724 unsigned Major, Minor, Micro;
2727 const unsigned MajorVersionLimit = 1000;
2728 const VersionTuple OSVersion = PlatformAndVersion->takeOSVersion();
2729 const std::string OSVersionStr = OSVersion.getAsString();
2731 if (Platform ==
MacOS) {
2732#ifdef CLANG_USE_XCSELECT
2735 if (!::xcselect_host_sdk_path(CLANG_XCSELECT_HOST_SDK_POLICY, &p)) {
2736 Args.append(Args.MakeSeparateArg(
2737 nullptr, Opts.getOption(options::OPT_isysroot), p));
2746 HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
2749 << PlatformAndVersion->getAsString(Args, Opts);
2753 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2755 << PlatformAndVersion->getAsString(Args, Opts);
2757 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst &&
2758 (Major < 13 || (Major == 13 && Minor < 1))) {
2760 << PlatformAndVersion->getAsString(Args, Opts);
2767 if (
getTriple().isArch32Bit() && Major >= 11) {
2769 if (PlatformAndVersion->isExplicitlySpecified()) {
2770 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst)
2771 getDriver().
Diag(diag::err_invalid_macos_32bit_deployment_target);
2774 << PlatformAndVersion->getAsString(Args, Opts);
2782 }
else if (Platform ==
TvOS) {
2785 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2787 << PlatformAndVersion->getAsString(Args, Opts);
2788 }
else if (Platform ==
WatchOS) {
2791 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2793 << PlatformAndVersion->getAsString(Args, Opts);
2797 HadExtra || Major < 19 || Major >= MajorVersionLimit || Minor >= 100 ||
2800 << PlatformAndVersion->getAsString(Args, Opts);
2804 HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2807 << PlatformAndVersion->getAsString(Args, Opts);
2814 PlatformAndVersion->canInferSimulatorFromArch() &&
getTriple().isX86())
2817 VersionTuple ZipperedOSVersion;
2819 ZipperedOSVersion = PlatformAndVersion->getZipperedOSVersion();
2820 setTarget(Platform, Environment, Major, Minor, Micro, ZipperedOSVersion);
2832 return !
SDKInfo->getPlatformPrefix(T).empty();
2841 const llvm::Triple &T)
const {
2843 const StringRef PlatformPrefix =
SDKInfo->getPlatformPrefix(T);
2844 if (!PlatformPrefix.empty())
2845 llvm::sys::path::append(Path, PlatformPrefix);
2846 }
else if (T.isDriverKit()) {
2849 llvm::sys::path::append(Path,
"System",
"DriverKit");
2858 if (DriverArgs.hasArg(options::OPT_isysroot))
2859 Path = DriverArgs.getLastArgValue(options::OPT_isysroot);
2870 const llvm::opt::ArgList &DriverArgs,
2871 llvm::opt::ArgStringList &CC1Args)
const {
2876 bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc);
2877 bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc);
2878 bool NoBuiltinInc = DriverArgs.hasFlag(
2879 options::OPT_nobuiltininc, options::OPT_ibuiltininc,
false);
2880 bool ForceBuiltinInc = DriverArgs.hasFlag(
2881 options::OPT_ibuiltininc, options::OPT_nobuiltininc,
false);
2884 if (!NoStdInc && !NoStdlibInc) {
2886 llvm::sys::path::append(P,
"usr",
"local",
"include");
2891 if (!(NoStdInc && !ForceBuiltinInc) && !NoBuiltinInc) {
2893 llvm::sys::path::append(P,
"include");
2897 if (NoStdInc || NoStdlibInc)
2901 llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
2902 if (!CIncludeDirs.empty()) {
2904 CIncludeDirs.split(dirs,
":");
2905 for (llvm::StringRef dir : dirs) {
2906 llvm::StringRef Prefix =
2907 llvm::sys::path::is_absolute(dir) ?
"" : llvm::StringRef(Sysroot);
2913 llvm::sys::path::append(P,
"usr",
"include");
2919 const llvm::opt::ArgList &DriverArgs,
2920 llvm::opt::ArgStringList &CC1Args)
const {
2923 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc))
2932 llvm::sys::path::append(P1,
"System",
"Library",
"Frameworks");
2933 llvm::sys::path::append(P2,
"System",
"Library",
"SubFrameworks");
2934 llvm::sys::path::append(P3,
"Library",
"Frameworks");
2938bool DarwinClang::AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
2939 llvm::opt::ArgStringList &CC1Args,
2941 llvm::StringRef Version,
2942 llvm::StringRef ArchDir,
2943 llvm::StringRef BitDir)
const {
2944 llvm::sys::path::append(
Base, Version);
2952 if (!ArchDir.empty())
2953 llvm::sys::path::append(P, ArchDir);
2954 if (!BitDir.empty())
2955 llvm::sys::path::append(P, BitDir);
2962 llvm::sys::path::append(P,
"backward");
2970 const llvm::opt::ArgList &DriverArgs,
2971 llvm::opt::ArgStringList &CC1Args)
const {
2979 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
2980 options::OPT_nostdincxx))
3001 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
3002 if (
getVFS().exists(InstallBin)) {
3005 }
else if (DriverArgs.hasArg(options::OPT_v)) {
3006 llvm::errs() <<
"ignoring nonexistent directory \"" << InstallBin
3012 llvm::sys::path::append(SysrootUsr,
"usr",
"include",
"c++",
"v1");
3013 if (
getVFS().exists(SysrootUsr)) {
3016 }
else if (DriverArgs.hasArg(options::OPT_v)) {
3017 llvm::errs() <<
"ignoring nonexistent directory \"" << SysrootUsr
3026 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args);
3031void AppleMachO::AddGnuCPlusPlusIncludePaths(
3032 const llvm::opt::ArgList &DriverArgs,
3033 llvm::opt::ArgStringList &CC1Args)
const {}
3035void DarwinClang::AddGnuCPlusPlusIncludePaths(
3036 const llvm::opt::ArgList &DriverArgs,
3037 llvm::opt::ArgStringList &CC1Args)
const {
3039 llvm::sys::path::append(UsrIncludeCxx,
"usr",
"include",
"c++");
3041 llvm::Triple::ArchType arch =
getTriple().getArch();
3042 bool IsBaseFound =
true;
3047 case llvm::Triple::x86:
3048 case llvm::Triple::x86_64:
3049 IsBaseFound = AddGnuCPlusPlusIncludePaths(
3050 DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
"i686-apple-darwin10",
3051 arch == llvm::Triple::x86_64 ?
"x86_64" :
"");
3052 IsBaseFound |= AddGnuCPlusPlusIncludePaths(
3053 DriverArgs, CC1Args, UsrIncludeCxx,
"4.0.0",
"i686-apple-darwin8",
"");
3056 case llvm::Triple::arm:
3057 case llvm::Triple::thumb:
3059 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3060 "arm-apple-darwin10",
"v7");
3062 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3063 "arm-apple-darwin10",
"v6");
3066 case llvm::Triple::aarch64:
3068 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3069 "arm64-apple-darwin10",
"");
3079 ArgStringList &CmdArgs)
const {
3084 CmdArgs.push_back(
"-lc++");
3085 if (Args.hasArg(options::OPT_fexperimental_library))
3086 CmdArgs.push_back(
"-lc++experimental");
3096 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
3098 llvm::sys::path::append(P,
"usr",
"lib",
"libstdc++.dylib");
3100 if (!
getVFS().exists(P)) {
3101 llvm::sys::path::remove_filename(P);
3102 llvm::sys::path::append(P,
"libstdc++.6.dylib");
3103 if (
getVFS().exists(P)) {
3104 CmdArgs.push_back(Args.MakeArgString(P));
3113 if (!
getVFS().exists(
"/usr/lib/libstdc++.dylib") &&
3114 getVFS().exists(
"/usr/lib/libstdc++.6.dylib")) {
3115 CmdArgs.push_back(
"/usr/lib/libstdc++.6.dylib");
3120 CmdArgs.push_back(
"-lstdc++");
3126 ArgStringList &CmdArgs)
const {
3132 llvm::sys::path::append(P,
"lib",
"darwin");
3136 llvm::sys::path::append(P,
"libclang_rt.cc_kext_watchos.a");
3138 llvm::sys::path::append(P,
"libclang_rt.cc_kext_tvos.a");
3140 llvm::sys::path::append(P,
"libclang_rt.cc_kext_ios.a");
3144 llvm::sys::path::append(
3145 P, llvm::Twine(
"libclang_rt.cc_kext_") +
3146 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
".a");
3148 llvm::sys::path::append(P,
"libclang_rt.cc_kext.a");
3154 CmdArgs.push_back(Args.MakeArgString(P));
3159 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
3169 for (Arg *A : Args) {
3178 case options::OPT_mkernel:
3179 case options::OPT_fapple_kext:
3181 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
3184 case options::OPT_dependency_file:
3185 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
3188 case options::OPT_gfull:
3189 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3191 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
3194 case options::OPT_gused:
3195 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3197 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
3200 case options::OPT_shared:
3201 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
3204 case options::OPT_fconstant_cfstrings:
3205 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
3208 case options::OPT_fno_constant_cfstrings:
3209 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
3212 case options::OPT_Wnonportable_cfstrings:
3214 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
3217 case options::OPT_Wno_nonportable_cfstrings:
3219 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
3228 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
3229 const Option MArch = Opts.getOption(options::OPT_march_EQ);
3235 else if (Name ==
"ppc601")
3236 DAL->AddJoinedArg(
nullptr, MCpu,
"601");
3237 else if (Name ==
"ppc603")
3238 DAL->AddJoinedArg(
nullptr, MCpu,
"603");
3239 else if (Name ==
"ppc604")
3240 DAL->AddJoinedArg(
nullptr, MCpu,
"604");
3241 else if (Name ==
"ppc604e")
3242 DAL->AddJoinedArg(
nullptr, MCpu,
"604e");
3243 else if (Name ==
"ppc750")
3244 DAL->AddJoinedArg(
nullptr, MCpu,
"750");
3245 else if (Name ==
"ppc7400")
3246 DAL->AddJoinedArg(
nullptr, MCpu,
"7400");
3247 else if (Name ==
"ppc7450")
3248 DAL->AddJoinedArg(
nullptr, MCpu,
"7450");
3249 else if (Name ==
"ppc970")
3250 DAL->AddJoinedArg(
nullptr, MCpu,
"970");
3252 else if (Name ==
"ppc64" || Name ==
"ppc64le")
3253 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3255 else if (Name ==
"i386")
3257 else if (Name ==
"i486")
3258 DAL->AddJoinedArg(
nullptr, MArch,
"i486");
3259 else if (Name ==
"i586")
3260 DAL->AddJoinedArg(
nullptr, MArch,
"i586");
3261 else if (Name ==
"i686")
3262 DAL->AddJoinedArg(
nullptr, MArch,
"i686");
3263 else if (Name ==
"pentium")
3264 DAL->AddJoinedArg(
nullptr, MArch,
"pentium");
3265 else if (Name ==
"pentium2")
3266 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3267 else if (Name ==
"pentpro")
3268 DAL->AddJoinedArg(
nullptr, MArch,
"pentiumpro");
3269 else if (Name ==
"pentIIm3")
3270 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3272 else if (Name ==
"x86_64" || Name ==
"x86_64h")
3273 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3275 else if (Name ==
"arm")
3276 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3277 else if (Name ==
"armv4t")
3278 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3279 else if (Name ==
"armv5")
3280 DAL->AddJoinedArg(
nullptr, MArch,
"armv5tej");
3281 else if (Name ==
"xscale")
3282 DAL->AddJoinedArg(
nullptr, MArch,
"xscale");
3283 else if (Name ==
"armv6")
3284 DAL->AddJoinedArg(
nullptr, MArch,
"armv6k");
3285 else if (Name ==
"armv6m")
3286 DAL->AddJoinedArg(
nullptr, MArch,
"armv6m");
3287 else if (Name ==
"armv7")
3288 DAL->AddJoinedArg(
nullptr, MArch,
"armv7a");
3289 else if (Name ==
"armv7em")
3290 DAL->AddJoinedArg(
nullptr, MArch,
"armv7em");
3291 else if (Name ==
"armv7k")
3292 DAL->AddJoinedArg(
nullptr, MArch,
"armv7k");
3293 else if (Name ==
"armv7m")
3294 DAL->AddJoinedArg(
nullptr, MArch,
"armv7m");
3295 else if (Name ==
"armv7s")
3296 DAL->AddJoinedArg(
nullptr, MArch,
"armv7s");
3297 else if (Name ==
"armv8-m.base" || Name ==
"armv8m.base")
3298 DAL->AddJoinedArg(
nullptr, MArch,
"armv8m.base");
3299 else if (Name ==
"armv8-m.main" || Name ==
"armv8m.main")
3300 DAL->AddJoinedArg(
nullptr, MArch,
"armv8m.main");
3301 else if (Name ==
"armv8.1-m.main" || Name ==
"armv8.1m.main")
3302 DAL->AddJoinedArg(
nullptr, MArch,
"armv8.1m.main");
3309 ArgStringList &CmdArgs,
3310 bool ForceLinkBuiltinRT)
const {
3319 CompilerRT += Args.hasArg(options::OPT_fPIC) ?
"_pic" :
"_static";
3325 llvm::Triple::OSType OS;
3331 OS = llvm::Triple::MacOSX;
3334 OS = llvm::Triple::IOS;
3337 OS = llvm::Triple::TvOS;
3340 OS = llvm::Triple::WatchOS;
3356 switch (SDKInfo->getEnvironment()) {
3357 case llvm::Triple::UnknownEnvironment:
3358 case llvm::Triple::Simulator:
3359 case llvm::Triple::MacABI:
3368 VersionTuple SDKVersion = SDKInfo->getVersion();
3369 switch (SDKInfo->getOS()) {
3372 case llvm::Triple::MacOSX:
3373 return SDKVersion >= VersionTuple(15U);
3374 case llvm::Triple::IOS:
3375 return SDKVersion >= VersionTuple(18U);
3376 case llvm::Triple::TvOS:
3377 return SDKVersion >= VersionTuple(18U);
3378 case llvm::Triple::WatchOS:
3379 return SDKVersion >= VersionTuple(11U);
3380 case llvm::Triple::XROS:
3381 return SDKVersion >= VersionTuple(2U);
3389static inline llvm::VersionTuple
3394 case llvm::Triple::Darwin:
3395 case llvm::Triple::MacOSX:
3396 return llvm::VersionTuple(10U, 12U);
3397 case llvm::Triple::IOS:
3398 case llvm::Triple::TvOS:
3399 return llvm::VersionTuple(10U);
3400 case llvm::Triple::WatchOS:
3401 return llvm::VersionTuple(3U);
3404 llvm_unreachable(
"Unexpected OS");
3408 llvm::Triple::OSType OS;
3414 OS = llvm::Triple::MacOSX;
3417 OS = llvm::Triple::IOS;
3420 OS = llvm::Triple::TvOS;
3423 OS = llvm::Triple::WatchOS;
3434 llvm::opt::ArgStringList &CC1Args,
3444 if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3445 options::OPT_fno_ptrauth_calls))
3446 CC1Args.push_back(
"-fptrauth-calls");
3447 if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3448 options::OPT_fno_ptrauth_returns))
3449 CC1Args.push_back(
"-fptrauth-returns");
3450 if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3451 options::OPT_fno_ptrauth_intrinsics))
3452 CC1Args.push_back(
"-fptrauth-intrinsics");
3453 if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3454 options::OPT_fno_ptrauth_indirect_gotos))
3455 CC1Args.push_back(
"-fptrauth-indirect-gotos");
3456 if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3457 options::OPT_fno_ptrauth_auth_traps))
3458 CC1Args.push_back(
"-fptrauth-auth-traps");
3461 if (!DriverArgs.hasArg(
3462 options::OPT_fptrauth_vtable_pointer_address_discrimination,
3463 options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
3464 CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
3465 if (!DriverArgs.hasArg(
3466 options::OPT_fptrauth_vtable_pointer_type_discrimination,
3467 options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
3468 CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
3471 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
3472 options::OPT_fno_ptrauth_objc_isa))
3473 CC1Args.push_back(
"-fptrauth-objc-isa");
3474 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
3475 options::OPT_fno_ptrauth_objc_class_ro))
3476 CC1Args.push_back(
"-fptrauth-objc-class-ro");
3477 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
3478 options::OPT_fno_ptrauth_objc_interface_sel))
3479 CC1Args.push_back(
"-fptrauth-objc-interface-sel");
3484 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3497 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
3498 options::OPT_fno_aligned_allocation) &&
3500 CC1Args.push_back(
"-faligned-alloc-unavailable");
3504 if (!DriverArgs.hasArgNoClaim(options::OPT_fobjc_msgsend_selector_stubs,
3505 options::OPT_fno_objc_msgsend_selector_stubs) &&
3508 CC1Args.push_back(
"-fobjc-msgsend-selector-stubs");
3512 if (!DriverArgs.hasArgNoClaim(
3513 options::OPT_fobjc_msgsend_class_selector_stubs,
3514 options::OPT_fno_objc_msgsend_class_selector_stubs) &&
3517 CC1Args.push_back(
"-fobjc-msgsend-class-selector-stubs");
3521 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
3522 options::OPT_fno_sized_deallocation) &&
3524 CC1Args.push_back(
"-fno-sized-deallocation");
3531 if (!
SDKInfo->getFilePath().empty()) {
3533 ExtraDepOpt +=
SDKInfo->getFilePath();
3534 CC1Args.push_back(DriverArgs.MakeArgString(ExtraDepOpt));
3540 CC1Args.push_back(
"-fcompatibility-qualified-id-block-type-checking");
3544 if (!DriverArgs.getLastArgNoClaim(
3545 options::OPT_fvisibility_inlines_hidden_static_local_var,
3546 options::OPT_fno_visibility_inlines_hidden_static_local_var))
3547 CC1Args.push_back(
"-fvisibility-inlines-hidden-static-local-var");
3561 CC1Args.push_back(
"-fbuiltin-headers-in-system-modules");
3563 if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
3564 options::OPT_fno_define_target_os_macros))
3565 CC1Args.push_back(
"-fdefine-target-os-macros");
3569 !DriverArgs.hasFlag(options::OPT_fmodulemap_allow_subdirectory_search,
3570 options::OPT_fno_modulemap_allow_subdirectory_search,
3572 bool RequiresSubdirectorySearch;
3573 VersionTuple SDKVersion =
SDKInfo->getVersion();
3576 RequiresSubdirectorySearch =
true;
3579 RequiresSubdirectorySearch = SDKVersion < VersionTuple(15, 0);
3583 RequiresSubdirectorySearch = SDKVersion < VersionTuple(18, 0);
3586 RequiresSubdirectorySearch = SDKVersion < VersionTuple(11, 0);
3589 RequiresSubdirectorySearch = SDKVersion < VersionTuple(2, 0);
3592 if (!RequiresSubdirectorySearch)
3593 CC1Args.push_back(
"-fno-modulemap-allow-subdirectory-search");
3598 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1ASArgs)
const {
3600 CC1ASArgs.push_back(
"-darwin-target-variant-triple");
3607 auto EmitTargetSDKVersionArg = [&](
const VersionTuple &
V) {
3609 llvm::raw_string_ostream OS(Arg);
3610 OS <<
"-target-sdk-version=" <<
V;
3611 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3615 if (
const auto *MacOStoMacCatalystMapping =
SDKInfo->getVersionMapping(
3617 std::optional<VersionTuple> SDKVersion = MacOStoMacCatalystMapping->map(
3620 EmitTargetSDKVersionArg(
3624 EmitTargetSDKVersionArg(
SDKInfo->getVersion());
3632 llvm::raw_string_ostream OS(Arg);
3633 OS <<
"-darwin-target-variant-sdk-version=" <<
SDKInfo->getVersion();
3634 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3635 }
else if (
const auto *MacOStoMacCatalystMapping =
3638 if (std::optional<VersionTuple> SDKVersion =
3639 MacOStoMacCatalystMapping->map(
3643 llvm::raw_string_ostream OS(Arg);
3644 OS <<
"-darwin-target-variant-sdk-version=" << *SDKVersion;
3645 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3665 AddDeploymentTarget(*DAL);
3673 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
3676 if (A->getOption().getID() != options::OPT_mkernel &&
3677 A->getOption().getID() != options::OPT_fapple_kext)
3679 assert(it != ie &&
"unexpected argument translation");
3681 assert(A->getOption().getID() == options::OPT_static &&
3682 "missing expected -static argument");
3689 if ((
Arch == llvm::Triple::arm ||
Arch == llvm::Triple::thumb)) {
3690 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
3691 options::OPT_fno_omit_frame_pointer,
false))
3692 getDriver().
Diag(clang::diag::warn_drv_unsupported_opt_for_target)
3693 <<
"-fomit-frame-pointer" << BA.
ArchName;
3702 if (
getArch() == llvm::Triple::x86_64 ||
3704 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
3706 return (
getArch() == llvm::Triple::aarch64 ||
3707 getArch() == llvm::Triple::aarch64_32)
3715 if (
const char *S = ::getenv(
"RC_DEBUG_OPTIONS"))
3716 return S[0] !=
'\0';
3721 if (
const char *S = ::getenv(
"RC_DEBUG_PREFIX_MAP"))
3730 return llvm::ExceptionHandling::None;
3734 if (Triple.isWatchABI())
3735 return llvm::ExceptionHandling::DwarfCFI;
3737 return llvm::ExceptionHandling::SjLj;
3752 return (
getArch() == llvm::Triple::x86_64 ||
3753 getArch() == llvm::Triple::aarch64);
3762 ArgStringList &CmdArgs)
const {
3765 assert(!
isTargetXROS() &&
"xrOS always uses -platform-version");
3768 CmdArgs.push_back(
"-watchos_version_min");
3770 CmdArgs.push_back(
"-watchos_simulator_version_min");
3772 CmdArgs.push_back(
"-tvos_version_min");
3774 CmdArgs.push_back(
"-tvos_simulator_version_min");
3776 CmdArgs.push_back(
"-driverkit_version_min");
3778 CmdArgs.push_back(
"-ios_simulator_version_min");
3780 CmdArgs.push_back(
"-iphoneos_version_min");
3782 CmdArgs.push_back(
"-maccatalyst_version_min");
3785 CmdArgs.push_back(
"-macosx_version_min");
3791 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3794 VersionTuple VariantTargetVersion;
3796 CmdArgs.push_back(
"-macosx_version_min");
3801 "unexpected target variant triple");
3802 CmdArgs.push_back(
"-maccatalyst_version_min");
3805 VersionTuple MinTgtVers =
3807 if (MinTgtVers.getMajor() && MinTgtVers > VariantTargetVersion)
3808 VariantTargetVersion = MinTgtVers;
3809 CmdArgs.push_back(Args.MakeArgString(VariantTargetVersion.getAsString()));
3820 return "mac catalyst";
3833 llvm_unreachable(
"invalid platform");
3837 llvm::opt::ArgStringList &CmdArgs)
const {
3842 auto EmitPlatformVersionArg =
3845 const llvm::Triple &TT) {
3848 CmdArgs.push_back(
"-platform_version");
3849 std::string PlatformName =
3852 PlatformName +=
"-simulator";
3853 CmdArgs.push_back(Args.MakeArgString(PlatformName));
3862 VersionTuple MinTgtVers = TT.getMinimumSupportedOSVersion();
3865 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3870 std::optional<VersionTuple> iOSSDKVersion;
3872 if (
const auto *MacOStoMacCatalystMapping =
3875 iOSSDKVersion = MacOStoMacCatalystMapping->map(
3876 SDKInfo->getVersion().withoutBuild(),
3880 CmdArgs.push_back(Args.MakeArgString(
3881 (iOSSDKVersion ? *iOSSDKVersion
3888 VersionTuple SDKVersion =
SDKInfo->getVersion().withoutBuild();
3889 if (!SDKVersion.getMinor())
3890 SDKVersion = VersionTuple(SDKVersion.getMajor(), 0);
3891 CmdArgs.push_back(Args.MakeArgString(SDKVersion.getAsString()));
3902 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3911 VersionTuple TargetVariantVersion;
3919 "unexpected target variant triple");
3924 EmitPlatformVersionArg(TargetVariantVersion, Platform, Environment,
3930 ArgStringList &CmdArgs) {
3934 CmdArgs.push_back(
"-ldylib1.o");
3941 CmdArgs.push_back(
"-ldylib1.o");
3943 CmdArgs.push_back(
"-ldylib1.10.5.o");
3948 ArgStringList &CmdArgs) {
3949 if (Args.hasArg(options::OPT_static))
3954 CmdArgs.push_back(
"-lbundle1.o");
3959 ArgStringList &CmdArgs) {
3961 if (Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_object) ||
3962 Args.hasArg(options::OPT_preload)) {
3963 CmdArgs.push_back(
"-lgcrt0.o");
3965 CmdArgs.push_back(
"-lgcrt1.o");
3975 CmdArgs.push_back(
"-no_new_main");
3977 D.
getDriver().
Diag(diag::err_drv_clang_unsupported_opt_pg_darwin)
3983 ArgStringList &CmdArgs) {
3986 if (D.
getArch() == llvm::Triple::aarch64)
3989 CmdArgs.push_back(
"-lcrt1.o");
3991 CmdArgs.push_back(
"-lcrt1.3.1.o");
3998 CmdArgs.push_back(
"-lcrt1.o");
4000 CmdArgs.push_back(
"-lcrt1.10.5.o");
4002 CmdArgs.push_back(
"-lcrt1.10.6.o");
4007 ArgStringList &CmdArgs)
const {
4013 if (Args.hasArg(options::OPT_dynamiclib))
4015 else if (Args.hasArg(options::OPT_bundle))
4019 else if (Args.hasArg(options::OPT_static) ||
4020 Args.hasArg(options::OPT_object) ||
4021 Args.hasArg(options::OPT_preload))
4022 CmdArgs.push_back(
"-lcrt0.o");
4026 if (
isTargetMacOS() && Args.hasArg(options::OPT_shared_libgcc) &&
4028 const char *Str = Args.MakeArgString(
GetFilePath(
"crt3.o"));
4029 CmdArgs.push_back(Str);
4046 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
4047 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
4049 Res |= SanitizerKind::Address;
4050 Res |= SanitizerKind::PointerCompare;
4051 Res |= SanitizerKind::PointerSubtract;
4052 Res |= SanitizerKind::Realtime;
4053 Res |= SanitizerKind::Leak;
4054 Res |= SanitizerKind::Fuzzer;
4055 Res |= SanitizerKind::FuzzerNoLink;
4056 Res |= SanitizerKind::ObjCCast;
4066 Res |= SanitizerKind::Vptr;
4068 if ((IsX86_64 || IsAArch64) &&
4071 Res |= SanitizerKind::Thread;
4075 Res |= SanitizerKind::Type;
4079 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 llvm::VersionTuple & getVersion() const
const llvm::Triple & getCanonicalPlatformTriple() const
The basic abstraction for the target Objective-C runtime.
bool hasNativeARC() const
Does this runtime natively provide the ARC entrypoints?
bool hasSubscripting() const
Does this runtime directly support the subscripting methods?
@ MacOSX
'macosx' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the non-fragile AB...
@ FragileMacOSX
'macosx-fragile' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the fragil...
@ iOS
'ios' is the Apple-provided NeXT-derived runtime on iOS or the iOS simulator; it is always non-fragil...
@ WatchOS
'watchos' is a variant of iOS for Apple's watchOS.
The base class of the type hierarchy.
Action - Represent an abstract compilation step to perform.
types::ID getType() const
ActionClass getKind() const
@ VerifyDebugInfoJobClass
Compilation - A set of tasks to perform for a single driver invocation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
std::string SysRoot
sysroot, if present
std::string GetTemporaryDirectory(StringRef Prefix) const
GetTemporaryDirectory - Return the pathname of a temporary directory to use as part of compilation; t...
DiagnosticBuilder Diag(unsigned DiagID) const
static bool GetReleaseVersion(StringRef Str, unsigned &Major, unsigned &Minor, unsigned &Micro, bool &HadExtra)
GetReleaseVersion - Parse (([0-9]+)(.
const llvm::opt::OptTable & getOpts() const
std::string GetTemporaryPath(StringRef Prefix, StringRef Suffix) const
GetTemporaryPath - Return the pathname of a temporary file to use as part of compilation; the file wi...
std::string Dir
The path the driver executable was in, as invoked from the command line.
bool needsStatsRt() const
bool needsMemProfRt() const
bool linkRuntimes() const
bool needsUbsanRt() const
bool needsRtsanRt() const
bool requiresMinimalRuntime() const
bool needsSharedRt() const
bool needsTysanRt() const
bool needsStableAbi() const
const char * getTypeTempSuffix(ID Id, bool CLStyle=false)
getTypeTempSuffix - Return the suffix to use when creating a temp file of this type,...
SmallVector< InputInfo, 4 > InputInfoList
bool willEmitRemarks(const llvm::opt::ArgList &Args)
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
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.
@ Default
Set to the current date and time.
llvm::VersionTuple alignedAllocMinVersion(llvm::Triple::OSType OS)
llvm::StringRef getAsString(SyncScope S)
bool(*)(llvm::ArrayRef< const char * >, llvm::raw_ostream &, llvm::raw_ostream &, bool, bool) Driver
Represents a bound architecture for offload / multiple architecture compilation.
static constexpr OSEnvPair macCatalystToMacOSPair()
Returns the os-environment mapping pair that's used to represent the Mac Catalyst -> macOS version ma...
static constexpr OSEnvPair macOStoMacCatalystPair()
Returns the os-environment mapping pair that's used to represent the macOS -> Mac Catalyst version ma...
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
static constexpr ResponseFileSupport AtFileUTF8()