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 (D.
isUsingLTO() && (Version >= VersionTuple(116) || LinkerIsLLD) &&
254 NeedsTempPath(Inputs)) {
255 std::string TmpPathName;
266 if (!TmpPathName.empty()) {
267 auto *TmpPath =
C.getArgs().MakeArgString(TmpPathName);
268 C.addTempFile(TmpPath);
269 CmdArgs.push_back(
"-object_path_lto");
270 CmdArgs.push_back(TmpPath);
283 if (Version >= VersionTuple(133) && !LinkerIsLLD) {
285 StringRef P = llvm::sys::path::parent_path(D.
Dir);
286 SmallString<128> LibLTOPath(P);
287 llvm::sys::path::append(LibLTOPath,
"lib");
288 llvm::sys::path::append(LibLTOPath,
"libLTO.dylib");
289 CmdArgs.push_back(
"-lto_library");
290 CmdArgs.push_back(
C.getArgs().MakeArgString(LibLTOPath));
296 if (Version >= VersionTuple(262) &&
298 CmdArgs.push_back(
"-no_deduplicate");
301 Args.AddAllArgs(CmdArgs, options::OPT_static);
302 if (!Args.hasArg(options::OPT_static))
303 CmdArgs.push_back(
"-dynamic");
304 if (Args.hasArg(options::OPT_fgnu_runtime)) {
309 if (!Args.hasArg(options::OPT_dynamiclib)) {
310 AddMachOArch(Args, CmdArgs);
312 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
314 Args.AddLastArg(CmdArgs, options::OPT_bundle);
315 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
316 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
319 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
320 (A = Args.getLastArg(options::OPT_current__version)) ||
321 (A = Args.getLastArg(options::OPT_install__name)))
322 D.
Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
325 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
326 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
327 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
329 CmdArgs.push_back(
"-dylib");
332 if ((A = Args.getLastArg(options::OPT_bundle)) ||
333 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
334 (A = Args.getLastArg(options::OPT_client__name)) ||
335 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
336 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
337 (A = Args.getLastArg(options::OPT_private__bundle)))
338 D.
Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
341 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
342 "-dylib_compatibility_version");
343 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
344 "-dylib_current_version");
346 AddMachOArch(Args, CmdArgs);
348 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
349 "-dylib_install_name");
352 Args.AddLastArg(CmdArgs, options::OPT_all__load);
353 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
354 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
356 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
357 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
358 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
359 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
360 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
361 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
362 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
363 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
364 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
365 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
366 Args.AddAllArgs(CmdArgs, options::OPT_init);
369 if (Version >= VersionTuple(520) || LinkerIsLLD || UsePlatformVersion)
374 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
375 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
376 Args.AddLastArg(CmdArgs, options::OPT_single__module);
377 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
378 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
381 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
382 options::OPT_fno_pie, options::OPT_fno_PIE)) {
383 if (A->getOption().matches(options::OPT_fpie) ||
384 A->getOption().matches(options::OPT_fPIE))
385 CmdArgs.push_back(
"-pie");
387 CmdArgs.push_back(
"-no_pie");
391 if (
C.getDriver().embedBitcodeEnabled()) {
394 CmdArgs.push_back(
"-bitcode_bundle");
396 if (
C.getDriver().embedBitcodeMarkerOnly() &&
397 Version >= VersionTuple(278)) {
398 CmdArgs.push_back(
"-bitcode_process_mode");
399 CmdArgs.push_back(
"marker");
402 D.
Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
406 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
407 options::OPT_fno_global_isel)) {
408 if (A->getOption().matches(options::OPT_fglobal_isel)) {
409 CmdArgs.push_back(
"-mllvm");
410 CmdArgs.push_back(
"-global-isel");
412 CmdArgs.push_back(
"-mllvm");
413 CmdArgs.push_back(
"-global-isel-abort=0");
417 if (Args.hasArg(options::OPT_mkernel) ||
418 Args.hasArg(options::OPT_fapple_kext) ||
419 Args.hasArg(options::OPT_ffreestanding)) {
420 CmdArgs.push_back(
"-mllvm");
421 CmdArgs.push_back(
"-disable-atexit-based-global-dtor-lowering");
424 Args.AddLastArg(CmdArgs, options::OPT_prebind);
425 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
426 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
427 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
428 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
429 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
430 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
431 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
432 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
433 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
434 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
435 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
436 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
437 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
438 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
439 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
445 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
446 CmdArgs.push_back(
"-syslibroot");
447 CmdArgs.push_back(A->getValue());
448 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
449 CmdArgs.push_back(
"-syslibroot");
450 CmdArgs.push_back(A->getValue());
451 }
else if (StringRef sysroot =
C.getSysRoot(); sysroot !=
"") {
452 CmdArgs.push_back(
"-syslibroot");
453 CmdArgs.push_back(
C.getArgs().MakeArgString(sysroot));
456 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
457 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
458 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
459 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
460 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
461 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
462 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
463 Args.AddAllArgs(CmdArgs, options::OPT_y);
464 Args.AddLastArg(CmdArgs, options::OPT_w);
465 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
466 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
467 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
468 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
469 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
470 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
471 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
472 Args.AddLastArg(CmdArgs, options::OPT_why_load);
473 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
474 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
475 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
476 Args.AddLastArg(CmdArgs, options::OPT_Mach);
480 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
482 : CSPGOGenerateArg->getValue());
483 llvm::sys::path::append(Path,
"default_%m.profraw");
484 CmdArgs.push_back(
"--cs-profile-generate");
485 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
487 SmallString<128> Path(
488 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
489 if (Path.empty() || llvm::sys::fs::is_directory(Path))
490 llvm::sys::path::append(Path,
"default.profdata");
491 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
494 auto *CodeGenDataGenArg =
495 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
496 if (CodeGenDataGenArg)
498 Args.MakeArgString(Twine(
"--codegen-data-generate-path=") +
499 CodeGenDataGenArg->getValue()));
502 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
504 : CSPGOGenerateArg->getValue());
505 llvm::sys::path::append(Path,
"default_%m.profraw");
506 CmdArgs.push_back(
"-mllvm");
507 CmdArgs.push_back(
"-cs-profile-generate");
508 CmdArgs.push_back(
"-mllvm");
509 CmdArgs.push_back(Args.MakeArgString(Twine(
"-cs-profile-path=") + Path));
511 SmallString<128> Path(
512 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
513 if (Path.empty() || llvm::sys::fs::is_directory(Path))
514 llvm::sys::path::append(Path,
"default.profdata");
515 CmdArgs.push_back(
"-mllvm");
516 CmdArgs.push_back(Args.MakeArgString(Twine(
"-cs-profile-path=") + Path));
524 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
527 return Args.hasArg(options::OPT_fobjc_link_runtime);
531 const llvm::Triple &Triple) {
536 Args.getAllArgValues(options::OPT_arch).size() > 1;
537 bool hasExplicitOutputFile =
538 Args.getLastArg(options::OPT_foptimization_record_file_EQ);
540 D.
Diag(diag::err_drv_invalid_output_with_multiple_archs)
541 <<
"-foptimization-record-file";
548 const llvm::Triple &Triple,
550 StringRef Format =
"yaml";
551 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
552 Format = A->getValue();
554 CmdArgs.push_back(
"-mllvm");
555 CmdArgs.push_back(
"-lto-pass-remarks-output");
556 CmdArgs.push_back(
"-mllvm");
558 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
560 CmdArgs.push_back(A->getValue());
562 assert(Output.
isFilename() &&
"Unexpected ld output.");
568 CmdArgs.push_back(Args.MakeArgString(F));
572 Args.getLastArg(options::OPT_foptimization_record_passes_EQ)) {
573 CmdArgs.push_back(
"-mllvm");
575 std::string(
"-lto-pass-remarks-filter=") + A->getValue();
576 CmdArgs.push_back(Args.MakeArgString(Passes));
579 if (!Format.empty()) {
580 CmdArgs.push_back(
"-mllvm");
581 Twine FormatArg = Twine(
"-lto-pass-remarks-format=") + Format;
582 CmdArgs.push_back(Args.MakeArgString(FormatArg));
586 CmdArgs.push_back(
"-mllvm");
587 CmdArgs.push_back(
"-lto-pass-remarks-with-hotness");
590 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
591 CmdArgs.push_back(
"-mllvm");
593 std::string(
"-lto-pass-remarks-hotness-threshold=") + A->getValue();
594 CmdArgs.push_back(Args.MakeArgString(Opt));
603 const char *LinkingOutput)
const {
604 assert((Output.
getType() == types::TY_Image ||
605 Output.
getType() == types::TY_Object) &&
606 "Invalid linker output type.");
612 llvm::opt::ArgStringList InputFileList;
617 ArgStringList CmdArgs;
623 Args.MakeArgString(
getToolChain().GetLinkerPath(&LinkerIsLLD));
627 bool UsePlatformVersion = Triple.isXROS() || Triple.isOSFirmware();
631 AddLinkArgs(
C, Args, CmdArgs, Inputs, Version, LinkerIsLLD,
641 Args.getLastArg(options::OPT_moutline, options::OPT_mno_outline)) {
642 if (A->getOption().matches(options::OPT_moutline)) {
644 CmdArgs.push_back(
"-mllvm");
645 CmdArgs.push_back(
"-enable-machine-outliner");
651 CmdArgs.push_back(
"-mllvm");
652 CmdArgs.push_back(
"-enable-machine-outliner=never");
659 CmdArgs.push_back(
"-mllvm");
660 CmdArgs.push_back(
"-enable-linkonceodr-outlining");
663 auto *CodeGenDataGenArg =
664 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
665 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
669 if (CodeGenDataGenArg && CodeGenDataUseArg)
670 D.
Diag(diag::err_drv_argument_not_allowed_with)
671 << CodeGenDataGenArg->getAsString(Args)
672 << CodeGenDataUseArg->getAsString(Args);
676 if (CodeGenDataGenArg) {
677 CmdArgs.push_back(
"-mllvm");
678 CmdArgs.push_back(
"-codegen-data-generate");
682 if (CodeGenDataUseArg) {
683 CmdArgs.push_back(
"-mllvm");
684 CmdArgs.push_back(Args.MakeArgString(Twine(
"-codegen-data-use-path=") +
685 CodeGenDataUseArg->getValue()));
691 if (!StatsFile.empty()) {
692 CmdArgs.push_back(
"-mllvm");
693 CmdArgs.push_back(Args.MakeArgString(
"-lto-stats-file=" + StatsFile.str()));
697 if (Args.hasArg(options::OPT_fstack_usage)) {
699 llvm::sys::path::replace_extension(StackUsageFile,
"su");
700 CmdArgs.push_back(
"-mllvm");
702 Args.MakeArgString(
"-stack-usage-file=" + StackUsageFile));
707 Args.addAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
708 options::OPT_Z_Flag, options::OPT_u_Group});
713 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
714 CmdArgs.push_back(
"-ObjC");
716 CmdArgs.push_back(
"-o");
719 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
722 Args.AddAllArgs(CmdArgs, options::OPT_L);
727 for (
const auto &II : Inputs) {
728 if (!II.isFilename()) {
733 if (InputFileList.size() > 0)
739 InputFileList.push_back(II.getFilename());
745 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
746 getToolChain().addFortranRuntimeLibraryPath(Args, CmdArgs);
750 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
754 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
758 CmdArgs.push_back(
"-framework");
759 CmdArgs.push_back(
"Foundation");
761 CmdArgs.push_back(
"-lobjc");
765 CmdArgs.push_back(
"-arch_multiple");
766 CmdArgs.push_back(
"-final_output");
767 CmdArgs.push_back(LinkingOutput);
770 if (Args.hasArg(options::OPT_fnested_functions))
771 CmdArgs.push_back(
"-allow_stack_execute");
776 if (!Parallelism.empty()) {
777 CmdArgs.push_back(
"-mllvm");
778 unsigned NumThreads =
779 llvm::get_threadpool_strategy(Parallelism)->compute_thread_count();
780 CmdArgs.push_back(Args.MakeArgString(
"-threads=" + Twine(NumThreads)));
786 bool NoStdOrDefaultLibs =
787 Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
788 bool ForceLinkBuiltins = Args.hasArg(options::OPT_fapple_link_rtlib);
789 if (!NoStdOrDefaultLibs || ForceLinkBuiltins) {
794 if (NoStdOrDefaultLibs && ForceLinkBuiltins) {
802 Args.ClaimAllArgs(options::OPT_pthread);
803 Args.ClaimAllArgs(options::OPT_pthreads);
807 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
811 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
812 Args.AddAllArgs(CmdArgs, options::OPT_F);
815 for (
const Arg *A : Args.filtered(options::OPT_iframework))
816 CmdArgs.push_back(Args.MakeArgString(std::string(
"-F") + A->getValue()));
818 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
819 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
820 if (A->getValue() == StringRef(
"Accelerate")) {
821 CmdArgs.push_back(
"-framework");
822 CmdArgs.push_back(
"Accelerate");
831 bool NonStandardSearchPath =
false;
833 if (Triple.isDriverKit()) {
835 NonStandardSearchPath =
836 Version.getMajor() < 605 ||
837 (Version.getMajor() == 605 && Version.getMinor().value_or(0) < 1);
842 if (NonStandardSearchPath) {
843 if (
auto *Sysroot = Args.getLastArg(options::OPT_isysroot)) {
844 auto AddSearchPath = [&](StringRef Flag, StringRef SearchPath) {
847 llvm::sys::path::append(P, SearchPath);
849 CmdArgs.push_back(Args.MakeArgString(Flag + P));
852 AddSearchPath(
"-L",
"/usr/lib");
853 AddSearchPath(
"-F",
"/System/Library/Frameworks");
859 if (Version >= VersionTuple(705) || LinkerIsLLD) {
867 std::unique_ptr<Command> Cmd = std::make_unique<Command>(
868 JA, *
this, ResponseSupport, Exec, CmdArgs, Inputs, Output);
869 Cmd->setInputFileList(std::move(InputFileList));
870 C.addCommand(std::move(Cmd));
877 const char *LinkingOutput)
const {
881 Args.ClaimAllArgs(options::OPT_g_Group);
883 Args.ClaimAllArgs(options::OPT_emit_llvm);
886 Args.ClaimAllArgs(options::OPT_w);
888 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
891 ArgStringList CmdArgs;
893 CmdArgs.push_back(
"-static");
894 CmdArgs.push_back(
"-D");
895 CmdArgs.push_back(
"-no_warning_for_no_symbols");
896 CmdArgs.push_back(
"-o");
899 for (
const auto &II : Inputs) {
900 if (II.isFilename()) {
901 CmdArgs.push_back(II.getFilename());
908 if (Output.
isFilename() && llvm::sys::fs::exists(OutputFileName)) {
909 if (std::error_code EC = llvm::sys::fs::remove(OutputFileName)) {
910 D.
Diag(diag::err_drv_unable_to_remove_file) << EC.message();
915 const char *Exec = Args.MakeArgString(
getToolChain().GetStaticLibToolPath());
916 C.addCommand(std::make_unique<Command>(JA, *
this,
918 Exec, CmdArgs, Inputs, Output));
925 const char *LinkingOutput)
const {
926 ArgStringList CmdArgs;
928 CmdArgs.push_back(
"-create");
929 assert(Output.
isFilename() &&
"Unexpected lipo output.");
931 CmdArgs.push_back(
"-output");
934 for (
const auto &II : Inputs) {
935 assert(II.isFilename() &&
"Unexpected lipo input.");
936 CmdArgs.push_back(II.getFilename());
939 StringRef LipoName = Args.getLastArgValue(options::OPT_fuse_lipo_EQ,
"lipo");
941 Args.MakeArgString(
getToolChain().GetProgramPath(LipoName.data()));
943 Exec, CmdArgs, Inputs, Output));
950 const char *LinkingOutput)
const {
951 ArgStringList CmdArgs;
953 CmdArgs.push_back(
"-o");
956 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
958 assert(Input.
isFilename() &&
"Unexpected dsymutil input.");
962 Args.MakeArgString(
getToolChain().GetProgramPath(
"dsymutil"));
964 Exec, CmdArgs, Inputs, Output));
971 const char *LinkingOutput)
const {
972 ArgStringList CmdArgs;
973 CmdArgs.push_back(
"--verify");
974 CmdArgs.push_back(
"--debug-info");
975 CmdArgs.push_back(
"--eh-frame");
976 CmdArgs.push_back(
"--quiet");
978 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
980 assert(Input.
isFilename() &&
"Unexpected verify input");
986 Args.MakeArgString(
getToolChain().GetProgramPath(
"dwarfdump"));
988 Exec, CmdArgs, Inputs, Output));
1010 if (Ty == types::TY_PP_Asm)
1011 return types::TY_Asm;
1031 auto T = llvm::Triple(Twine(
"arm64-apple-") +
1032 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
1056 ArgStringList &CC1Args)
const {
1061 ArgStringList &CC1Args)
const {
1066 ArgStringList &CC1Args)
const {
1075 return llvm::StringSwitch<const char *>(
Arch)
1076 .Case(
"armv6k",
"armv6")
1077 .Case(
"armv6m",
"armv6m")
1078 .Case(
"armv5tej",
"armv5")
1079 .Case(
"xscale",
"xscale")
1080 .Case(
"armv4t",
"armv4t")
1081 .Case(
"armv7",
"armv7")
1082 .Cases({
"armv7a",
"armv7-a"},
"armv7")
1083 .Cases({
"armv7r",
"armv7-r"},
"armv7")
1084 .Cases({
"armv7em",
"armv7e-m"},
"armv7em")
1085 .Cases({
"armv7k",
"armv7-k"},
"armv7k")
1086 .Cases({
"armv7m",
"armv7-m"},
"armv7m")
1087 .Cases({
"armv7s",
"armv7-s"},
"armv7s")
1088 .Cases({
"armv8-m.base",
"armv8m.base"},
"armv8m.base")
1089 .Cases({
"armv8-m.main",
"armv8m.main"},
"armv8m.main")
1090 .Cases({
"armv8.1-m.main",
"armv8m.main"},
"armv8.1m.main")
1095 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseCPUArch(CPU);
1096 if (ArchKind == llvm::ARM::ArchKind::INVALID)
1098 StringRef
Arch = llvm::ARM::getArchName(ArchKind);
1102 if (
Arch.starts_with(
"armv5"))
1105 else if (
Arch.starts_with(
"armv6") && !
Arch.ends_with(
"6m"))
1108 else if (
Arch.ends_with(
"v7a"))
1118 case llvm::Triple::aarch64_32:
1121 case llvm::Triple::aarch64: {
1127 case llvm::Triple::thumb:
1128 case llvm::Triple::arm:
1129 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1133 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1142 if (LinkerVersion) {
1144 VersionTuple NewLinkerVersion;
1145 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ))
1146 (void)NewLinkerVersion.tryParse(A->getValue());
1147 assert(NewLinkerVersion == LinkerVersion);
1149 return *LinkerVersion;
1152 VersionTuple NewLinkerVersion;
1153 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1156 if (NewLinkerVersion.tryParse(A->getValue()) ||
1157 NewLinkerVersion.getSubbuild())
1159 << A->getAsString(Args);
1162 LinkerVersion = NewLinkerVersion;
1163 return *LinkerVersion;
1172 llvm::Triple::OSType OS =
getTriple().getOS();
1176 case llvm::Triple::Darwin:
1177 case llvm::Triple::MacOSX:
1180 case llvm::Triple::IOS:
1183 case llvm::Triple::TvOS:
1186 case llvm::Triple::WatchOS:
1189 case llvm::Triple::XROS:
1192 case llvm::Triple::DriverKit:
1201 if (
getTriple().isSimulatorEnvironment())
1203 else if (
getTriple().isMacCatalystEnvironment())
1206 VersionTuple OsVer =
getTriple().getOSVersion();
1207 setTarget(Platform, Environment, OsVer.getMajor(),
1208 OsVer.getMinor().value_or(0), OsVer.getSubminor().value_or(0),
1216void Darwin::VerifyTripleForSDK(
const llvm::opt::ArgList &Args,
1217 const llvm::Triple Triple)
const {
1219 if (!
SDKInfo->supportsTriple(Triple))
1221 <<
SDKInfo->getDisplayName() << Triple.getTriple();
1222 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
1225 const char *isysroot = A->getValue();
1227 if (!SDKName.empty()) {
1228 bool supported =
true;
1229 if (Triple.isWatchOS())
1230 supported = SDKName.starts_with(
"Watch");
1231 else if (Triple.isTvOS())
1232 supported = SDKName.starts_with(
"AppleTV");
1233 else if (Triple.isDriverKit())
1234 supported = SDKName.starts_with(
"DriverKit");
1235 else if (Triple.isiOS())
1236 supported = SDKName.starts_with(
"iPhone");
1237 else if (Triple.isMacOSX())
1238 supported = SDKName.starts_with(
"MacOSX");
1244 << SDKName << Triple.getTriple();
1250 llvm::StringRef BoundArch,
1261 return Triple.getTriple();
1273 Str += llvm::Triple::getOSTypeName(llvm::Triple::XROS);
1275 Str += llvm::Triple::getOSTypeName(llvm::Triple::Firmware);
1279 Triple.setOSName(Str);
1281 VerifyTripleForSDK(Args, Triple);
1283 return Triple.getTriple();
1295 return Dsymutil.get();
1299 return VerifyDebug.get();
1316 const ArgList &Args)
1317 :
Darwin(D, Triple, Args) {}
1321 CC1Args.push_back(
"-Wundef-prefix=TARGET_OS_");
1322 CC1Args.push_back(
"-Werror=undef-prefix");
1333 CC1Args.push_back(
"-Wdeprecated-objc-isa-usage");
1334 CC1Args.push_back(
"-Werror=deprecated-objc-isa-usage");
1339 CC1Args.push_back(
"-Werror=implicit-function-declaration");
1344 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
1354 static constexpr llvm::StringLiteral XcodeAppSuffix(
1355 ".app/Contents/Developer");
1356 size_t Index = PathIntoXcode.find(XcodeAppSuffix);
1357 if (Index == StringRef::npos)
1359 return PathIntoXcode.take_front(Index + XcodeAppSuffix.size());
1363 ArgStringList &CmdArgs)
const {
1382 llvm::sys::path::remove_filename(P);
1383 llvm::sys::path::remove_filename(P);
1384 llvm::sys::path::append(P,
"lib",
"arc");
1390 if (!
getVFS().exists(P)) {
1391 auto updatePath = [&](
const Arg *A) {
1395 if (XcodePathForSDK.empty())
1398 P = XcodePathForSDK;
1399 llvm::sys::path::append(P,
"Toolchains/XcodeDefault.xctoolchain/usr",
1401 return getVFS().exists(P);
1404 bool updated =
false;
1405 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot))
1406 updated = updatePath(A);
1409 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1414 CmdArgs.push_back(
"-force_load");
1415 llvm::sys::path::append(P,
"libarclite_");
1418 P +=
"watchsimulator";
1422 P +=
"appletvsimulator";
1426 P +=
"iphonesimulator";
1434 getDriver().
Diag(clang::diag::err_drv_darwin_sdk_missing_arclite) << P;
1436 CmdArgs.push_back(Args.MakeArgString(P));
1473 bool IsShared)
const {
1481 const char *LibArg = Args.MakeArgString(P);
1482 CmdArgs.push_back(LibArg);
1490 assert(StringRef(P).ends_with(
".dylib") &&
"must be a dynamic library");
1494 CmdArgs.push_back(
"-rpath");
1495 CmdArgs.push_back(
"@executable_path");
1499 CmdArgs.push_back(
"-rpath");
1500 CmdArgs.push_back(Args.MakeArgString(llvm::sys::path::parent_path(P)));
1507 "it doesn't make sense to ask for the compiler-rt library name as an "
1511 if (Component !=
"builtins") {
1512 MachOLibName +=
'.';
1513 MachOLibName += Component;
1518 llvm::sys::path::append(FullPath,
"lib",
"darwin",
"macho_embedded",
1520 return std::string(FullPath);
1530 "it doesn't make sense to ask for the compiler-rt library name as an "
1534 if (Component !=
"builtins") {
1535 DarwinLibName += Component;
1536 DarwinLibName +=
'_';
1542 llvm::sys::path::append(FullPath,
"lib",
"darwin", DarwinLibName);
1543 return std::string(FullPath);
1548 auto BeginSDK = llvm::sys::path::rbegin(isysroot);
1549 auto EndSDK = llvm::sys::path::rend(isysroot);
1550 for (
auto IT = BeginSDK; IT != EndSDK; ++IT) {
1551 StringRef SDK = *IT;
1552 if (SDK.consume_back(
".sdk"))
1582 llvm_unreachable(
"Unsupported platform");
1587 for (Arg *A : Args) {
1588 if (A->getOption().matches(options::OPT_exported__symbols__list))
1590 if (!A->getOption().matches(options::OPT_Wl_COMMA) &&
1591 !A->getOption().matches(options::OPT_Xlinker))
1593 if (A->containsValue(
"-exported_symbols_list") ||
1594 A->containsValue(
"-exported_symbol"))
1602 CmdArgs.push_back(
"-exported_symbol");
1603 CmdArgs.push_back(Symbol);
1613 StringRef Segment, StringRef Section) {
1614 for (
const char *A : {
"-sectalign", Args.MakeArgString(Segment),
1615 Args.MakeArgString(Section),
"0x4000"})
1616 CmdArgs.push_back(A);
1620 ArgStringList &CmdArgs)
const {
1649 for (
auto IPSK : {llvm::IPSK_cnts, llvm::IPSK_bitmap, llvm::IPSK_data}) {
1651 Args, CmdArgs,
"__DATA",
1652 llvm::getInstrProfSectionName(IPSK, llvm::Triple::MachO,
1658void DarwinClang::AddLinkSanitizerLibArgs(
const ArgList &Args,
1659 ArgStringList &CmdArgs,
1660 StringRef Sanitizer,
1661 bool Shared)
const {
1667 const ArgList &Args)
const {
1668 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
1669 StringRef
Value = A->getValue();
1670 if (
Value !=
"compiler-rt" &&
Value !=
"platform")
1671 getDriver().
Diag(clang::diag::err_drv_unsupported_rtlib_for_platform)
1672 <<
Value <<
"darwin";
1679 ArgStringList &CmdArgs,
1680 bool ForceLinkBuiltinRT)
const {
1690 if (Args.hasArg(options::OPT_static) ||
1691 Args.hasArg(options::OPT_fapple_kext) ||
1692 Args.hasArg(options::OPT_mkernel)) {
1693 if (ForceLinkBuiltinRT)
1701 if (
const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
1702 getDriver().
Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
1709 const char *sanitizer =
nullptr;
1711 sanitizer =
"UndefinedBehaviorSanitizer";
1713 sanitizer =
"RealtimeSanitizer";
1715 sanitizer =
"AddressSanitizer";
1717 sanitizer =
"ThreadSanitizer";
1720 getDriver().
Diag(diag::err_drv_unsupported_static_sanitizer_darwin)
1729 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan_abi",
false);
1732 "Static sanitizer runtimes not supported");
1733 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan");
1738 "Static sanitizer runtimes not supported");
1739 AddLinkSanitizerLibArgs(Args, CmdArgs,
"rtsan");
1742 AddLinkSanitizerLibArgs(Args, CmdArgs,
"lsan");
1745 "Static sanitizer runtimes not supported");
1746 AddLinkSanitizerLibArgs(
1752 "Static sanitizer runtimes not supported");
1753 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tsan");
1756 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tysan");
1757 if (Sanitize.
needsFuzzer() && !Args.hasArg(options::OPT_dynamiclib)) {
1758 AddLinkSanitizerLibArgs(Args, CmdArgs,
"fuzzer",
false);
1770 AddLinkSanitizerLibArgs(Args, CmdArgs,
"stats");
1778 llvm::memprof::getMemprofOptionsSymbolDarwinLinkageName().data());
1788 CmdArgs.push_back(
"-framework");
1789 CmdArgs.push_back(
"DriverKit");
1795 CmdArgs.push_back(
"-lSystem");
1807 CmdArgs.push_back(
"-lgcc_s.1");
1816 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
1817 if (!SystemTriple.isMacOSX())
1818 return std::string(MacOSSDKVersion);
1819 VersionTuple SystemVersion;
1820 SystemTriple.getMacOSXVersion(SystemVersion);
1822 unsigned Major, Minor, Micro;
1826 return std::string(MacOSSDKVersion);
1827 VersionTuple SDKVersion(Major, Minor, Micro);
1829 if (SDKVersion > SystemVersion)
1830 return SystemVersion.getAsString();
1831 return std::string(MacOSSDKVersion);
1838struct DarwinPlatform {
1847 DeploymentTargetEnv,
1857 DarwinPlatformKind getPlatform()
const {
return Platform; }
1859 DarwinEnvironmentKind getEnvironment()
const {
return Environment; }
1861 void setEnvironment(DarwinEnvironmentKind Kind) {
1863 InferSimulatorFromArch =
false;
1866 const VersionTuple getOSVersion()
const {
1867 return UnderlyingOSVersion.value_or(VersionTuple());
1870 VersionTuple takeOSVersion() {
1871 assert(UnderlyingOSVersion.has_value() &&
1872 "attempting to get an unset OS version");
1873 VersionTuple
Result = *UnderlyingOSVersion;
1874 UnderlyingOSVersion.reset();
1877 bool isValidOSVersion()
const {
1878 return llvm::Triple::isValidVersionForOS(getOSFromPlatform(Platform),
1882 VersionTuple getCanonicalOSVersion()
const {
1883 return llvm::Triple::getCanonicalVersionForOS(
1884 getOSFromPlatform(Platform), getOSVersion(),
true);
1887 void setOSVersion(
const VersionTuple &Version) {
1888 UnderlyingOSVersion = Version;
1891 bool hasOSVersion()
const {
return UnderlyingOSVersion.has_value(); }
1893 VersionTuple getZipperedOSVersion()
const {
1894 assert(Environment == DarwinEnvironmentKind::MacCatalyst &&
1895 "zippered target version is specified only for Mac Catalyst");
1896 return ZipperedOSVersion;
1900 bool isExplicitlySpecified()
const {
return Kind <= DeploymentTargetEnv; }
1903 bool canInferSimulatorFromArch()
const {
return InferSimulatorFromArch; }
1905 const std::optional<llvm::Triple> &getTargetVariantTriple()
const {
1906 return TargetVariantTriple;
1910 void addOSVersionMinArgument(DerivedArgList &Args,
const OptTable &Opts) {
1914 assert(Kind != TargetArg && Kind != MTargetOSArg && Kind != OSVersionArg &&
1918 case DarwinPlatformKind::MacOS:
1919 Opt = options::OPT_mmacos_version_min_EQ;
1921 case DarwinPlatformKind::IPhoneOS:
1922 Opt = options::OPT_mios_version_min_EQ;
1924 case DarwinPlatformKind::TvOS:
1925 Opt = options::OPT_mtvos_version_min_EQ;
1927 case DarwinPlatformKind::WatchOS:
1928 Opt = options::OPT_mwatchos_version_min_EQ;
1934 Arg = Args.MakeJoinedArg(
nullptr, Opts.getOption(Opt), OSVersionStr);
1940 std::string
getAsString(DerivedArgList &Args,
const OptTable &Opts) {
1946 assert(Arg &&
"OS version argument not yet inferred");
1947 return Arg->getAsString(Args);
1948 case DeploymentTargetEnv:
1949 return (llvm::Twine(EnvVarName) +
"=" + OSVersionStr).str();
1950 case InferredFromSDK:
1951 case InferredFromArch:
1952 llvm_unreachable(
"Cannot print arguments for inferred OS version");
1954 llvm_unreachable(
"Unsupported Darwin Source Kind");
1958 std::string getInferredSource() {
1959 assert(!isExplicitlySpecified() &&
"OS version was not inferred");
1960 return InferredSource.str();
1963 void setEnvironment(llvm::Triple::EnvironmentType EnvType,
1964 const VersionTuple &OSVersion,
1965 const std::optional<DarwinSDKInfo> &SDKInfo) {
1967 case llvm::Triple::Simulator:
1968 Environment = DarwinEnvironmentKind::Simulator;
1970 case llvm::Triple::MacABI: {
1971 Environment = DarwinEnvironmentKind::MacCatalyst;
1973 ZipperedOSVersion = VersionTuple(10, 15);
1974 if (hasOSVersion() && SDKInfo) {
1975 if (
const auto *MacCatalystToMacOSMapping = SDKInfo->getVersionMapping(
1977 if (
auto MacOSVersion = MacCatalystToMacOSMapping->map(
1978 OSVersion, ZipperedOSVersion, std::nullopt)) {
1979 ZipperedOSVersion = *MacOSVersion;
1986 if (TargetVariantTriple) {
1987 auto TargetVariantVersion = TargetVariantTriple->getOSVersion();
1988 if (TargetVariantVersion.getMajor()) {
1989 if (TargetVariantVersion < ZipperedOSVersion)
1990 ZipperedOSVersion = std::move(TargetVariantVersion);
2000 static DarwinPlatform
2001 createFromTarget(
const llvm::Triple &TT, Arg *A,
2002 std::optional<llvm::Triple> TargetVariantTriple,
2003 const std::optional<DarwinSDKInfo> &SDKInfo) {
2004 DarwinPlatform
Result(TargetArg, getPlatformFromOS(TT.getOS()),
2005 TT.getOSVersion(), A);
2006 VersionTuple OsVersion = TT.getOSVersion();
2007 Result.TargetVariantTriple = std::move(TargetVariantTriple);
2008 Result.setEnvironment(TT.getEnvironment(), OsVersion, SDKInfo);
2011 static DarwinPlatform
2012 createFromMTargetOS(llvm::Triple::OSType OS, VersionTuple OSVersion,
2013 llvm::Triple::EnvironmentType Environment, Arg *A,
2014 const std::optional<DarwinSDKInfo> &SDKInfo) {
2015 DarwinPlatform
Result(MTargetOSArg, getPlatformFromOS(OS), OSVersion, A);
2016 Result.InferSimulatorFromArch =
false;
2017 Result.setEnvironment(Environment, OSVersion, SDKInfo);
2020 static DarwinPlatform createOSVersionArg(DarwinPlatformKind Platform, Arg *A,
2022 DarwinPlatform
Result{OSVersionArg, Platform,
2023 getVersionFromString(A->getValue()), A};
2025 Result.Environment = DarwinEnvironmentKind::Simulator;
2028 static DarwinPlatform createDeploymentTargetEnv(DarwinPlatformKind Platform,
2029 StringRef EnvVarName,
2030 StringRef OSVersion) {
2031 DarwinPlatform
Result(DeploymentTargetEnv, Platform,
2032 getVersionFromString(OSVersion));
2033 Result.EnvVarName = EnvVarName;
2036 static DarwinPlatform createFromSDKInfo(StringRef SDKRoot,
2037 const DarwinSDKInfo &SDKInfo) {
2038 const DarwinSDKInfo::SDKPlatformInfo PlatformInfo =
2040 const llvm::Triple::OSType
OS = PlatformInfo.
getOS();
2042 if (OS == llvm::Triple::MacOSX)
2043 Version = getVersionFromString(
2045 DarwinPlatform
Result(InferredFromSDK, getPlatformFromOS(OS), Version);
2047 Result.InferSimulatorFromArch =
false;
2048 Result.InferredSource = SDKRoot;
2051 static DarwinPlatform createFromSDK(StringRef SDKRoot,
2052 DarwinPlatformKind Platform,
2054 bool IsSimulator =
false) {
2055 DarwinPlatform
Result(InferredFromSDK, Platform,
2056 getVersionFromString(
Value));
2058 Result.Environment = DarwinEnvironmentKind::Simulator;
2059 Result.InferSimulatorFromArch =
false;
2060 Result.InferredSource = SDKRoot;
2063 static DarwinPlatform createFromArch(StringRef
Arch, llvm::Triple::OSType OS,
2064 VersionTuple Version) {
2066 DarwinPlatform(InferredFromArch, getPlatformFromOS(OS), Version);
2074 DarwinSDKInfo inferSDKInfo() {
2075 assert(Kind == InferredFromSDK &&
"can infer SDK info only");
2076 llvm::Triple::OSType
OS = getOSFromPlatform(Platform);
2077 llvm::Triple::EnvironmentType EnvironmentType =
2078 getEnvTypeFromEnvKind(Environment);
2079 StringRef PlatformPrefix =
2080 (Platform == DarwinPlatformKind::DriverKit) ?
"/System/DriverKit" :
"";
2081 return DarwinSDKInfo(
"", OS, EnvironmentType, getOSVersion(),
2082 getDisplayName(Platform, Environment, getOSVersion()),
2084 VersionTuple(getOSVersion().getMajor(), 0, 99),
2085 {DarwinSDKInfo::SDKPlatformInfo(
2086 llvm::Triple::Apple, OS, EnvironmentType,
2087 llvm::Triple::MachO, PlatformPrefix)});
2091 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform, Arg *Argument)
2093 Arguments({Argument, VersionTuple().getAsString()}) {}
2094 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform,
2095 VersionTuple
Value, Arg *Argument =
nullptr)
2099 UnderlyingOSVersion =
Value;
2102 static VersionTuple getVersionFromString(
const StringRef Input) {
2103 llvm::VersionTuple Version;
2104 bool IsValid = !Version.tryParse(Input);
2105 assert(IsValid &&
"unable to convert input version to version tuple");
2110 static DarwinPlatformKind getPlatformFromOS(llvm::Triple::OSType OS) {
2112 case llvm::Triple::Darwin:
2113 case llvm::Triple::MacOSX:
2114 return DarwinPlatformKind::MacOS;
2115 case llvm::Triple::IOS:
2116 return DarwinPlatformKind::IPhoneOS;
2117 case llvm::Triple::TvOS:
2118 return DarwinPlatformKind::TvOS;
2119 case llvm::Triple::WatchOS:
2120 return DarwinPlatformKind::WatchOS;
2121 case llvm::Triple::XROS:
2122 return DarwinPlatformKind::XROS;
2123 case llvm::Triple::DriverKit:
2124 return DarwinPlatformKind::DriverKit;
2125 case llvm::Triple::Firmware:
2126 return DarwinPlatformKind::Firmware;
2128 llvm_unreachable(
"Unable to infer Darwin variant");
2132 static llvm::Triple::OSType getOSFromPlatform(DarwinPlatformKind Platform) {
2134 case DarwinPlatformKind::MacOS:
2135 return llvm::Triple::MacOSX;
2136 case DarwinPlatformKind::IPhoneOS:
2137 return llvm::Triple::IOS;
2138 case DarwinPlatformKind::TvOS:
2139 return llvm::Triple::TvOS;
2140 case DarwinPlatformKind::WatchOS:
2141 return llvm::Triple::WatchOS;
2142 case DarwinPlatformKind::DriverKit:
2143 return llvm::Triple::DriverKit;
2144 case DarwinPlatformKind::XROS:
2145 return llvm::Triple::XROS;
2146 case DarwinPlatformKind::Firmware:
2147 return llvm::Triple::Firmware;
2149 llvm_unreachable(
"Unknown DarwinPlatformKind enum");
2152 static DarwinEnvironmentKind
2153 getEnvKindFromEnvType(llvm::Triple::EnvironmentType EnvironmentType) {
2154 switch (EnvironmentType) {
2155 case llvm::Triple::UnknownEnvironment:
2156 return DarwinEnvironmentKind::NativeEnvironment;
2157 case llvm::Triple::Simulator:
2158 return DarwinEnvironmentKind::Simulator;
2159 case llvm::Triple::MacABI:
2160 return DarwinEnvironmentKind::MacCatalyst;
2162 llvm_unreachable(
"Unable to infer Darwin environment");
2166 static llvm::Triple::EnvironmentType
2167 getEnvTypeFromEnvKind(DarwinEnvironmentKind EnvironmentKind) {
2168 switch (EnvironmentKind) {
2169 case DarwinEnvironmentKind::NativeEnvironment:
2170 return llvm::Triple::UnknownEnvironment;
2171 case DarwinEnvironmentKind::Simulator:
2172 return llvm::Triple::Simulator;
2173 case DarwinEnvironmentKind::MacCatalyst:
2174 return llvm::Triple::MacABI;
2176 llvm_unreachable(
"Unknown DarwinEnvironmentKind enum");
2179 static std::string getDisplayName(DarwinPlatformKind TargetPlatform,
2180 DarwinEnvironmentKind TargetEnvironment,
2181 VersionTuple Version) {
2182 SmallVector<std::string, 3> Components;
2183 switch (TargetPlatform) {
2184 case DarwinPlatformKind::MacOS:
2185 Components.push_back(
"macOS");
2187 case DarwinPlatformKind::IPhoneOS:
2188 Components.push_back(
"iOS");
2190 case DarwinPlatformKind::TvOS:
2191 Components.push_back(
"tvOS");
2193 case DarwinPlatformKind::WatchOS:
2194 Components.push_back(
"watchOS");
2196 case DarwinPlatformKind::DriverKit:
2197 Components.push_back(
"DriverKit");
2200 llvm::reportFatalUsageError(Twine(
"Platform: '") +
2201 std::to_string(TargetPlatform) +
2202 "' is unsupported when inferring SDK Info.");
2204 switch (TargetEnvironment) {
2205 case DarwinEnvironmentKind::NativeEnvironment:
2207 case DarwinEnvironmentKind::Simulator:
2208 Components.push_back(
"Simulator");
2211 llvm::reportFatalUsageError(Twine(
"Environment: '") +
2212 std::to_string(TargetEnvironment) +
2213 "' is unsupported when inferring SDK Info.");
2215 Components.push_back(Version.getAsString());
2216 return join(Components,
" ");
2220 DarwinPlatformKind Platform;
2221 DarwinEnvironmentKind Environment = DarwinEnvironmentKind::NativeEnvironment;
2225 VersionTuple ZipperedOSVersion;
2230 std::optional<VersionTuple> UnderlyingOSVersion;
2231 bool InferSimulatorFromArch =
true;
2232 std::pair<Arg *, std::string>
Arguments;
2233 StringRef EnvVarName;
2236 StringRef InferredSource;
2239 std::optional<llvm::Triple> TargetVariantTriple;
2244std::optional<DarwinPlatform>
2245getDeploymentTargetFromOSVersionArg(DerivedArgList &Args,
2246 const Driver &TheDriver) {
2247 Arg *macOSVersion = Args.getLastArg(options::OPT_mmacos_version_min_EQ);
2248 Arg *iOSVersion = Args.getLastArg(options::OPT_mios_version_min_EQ,
2249 options::OPT_mios_simulator_version_min_EQ);
2251 Args.getLastArg(options::OPT_mtvos_version_min_EQ,
2252 options::OPT_mtvos_simulator_version_min_EQ);
2253 Arg *WatchOSVersion =
2254 Args.getLastArg(options::OPT_mwatchos_version_min_EQ,
2255 options::OPT_mwatchos_simulator_version_min_EQ);
2257 auto GetDarwinPlatform =
2258 [&](DarwinPlatform::DarwinPlatformKind Platform, Arg *VersionArg,
2259 bool IsSimulator) -> std::optional<DarwinPlatform> {
2260 if (StringRef(VersionArg->getValue()).empty()) {
2261 TheDriver.
Diag(diag::err_drv_missing_version_number)
2262 << VersionArg->getAsString(Args);
2263 return std::nullopt;
2265 return DarwinPlatform::createOSVersionArg(Platform, VersionArg,
2270 if (iOSVersion || TvOSVersion || WatchOSVersion) {
2271 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2272 << macOSVersion->getAsString(Args)
2273 << (iOSVersion ? iOSVersion
2274 : TvOSVersion ? TvOSVersion : WatchOSVersion)
2280 }
else if (iOSVersion) {
2281 if (TvOSVersion || WatchOSVersion) {
2282 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2283 << iOSVersion->getAsString(Args)
2284 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->
getAsString(Args);
2287 iOSVersion->getOption().getID() ==
2288 options::OPT_mios_simulator_version_min_EQ);
2289 }
else if (TvOSVersion) {
2290 if (WatchOSVersion) {
2291 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2292 << TvOSVersion->getAsString(Args)
2293 << WatchOSVersion->getAsString(Args);
2296 TvOSVersion->getOption().getID() ==
2297 options::OPT_mtvos_simulator_version_min_EQ);
2298 }
else if (WatchOSVersion)
2299 return GetDarwinPlatform(
2301 WatchOSVersion->getOption().getID() ==
2302 options::OPT_mwatchos_simulator_version_min_EQ);
2303 return std::nullopt;
2308std::optional<DarwinPlatform>
2309getDeploymentTargetFromEnvironmentVariables(
const Driver &TheDriver,
2310 const llvm::Triple &Triple) {
2311 const char *EnvVars[] = {
2312 "MACOSX_DEPLOYMENT_TARGET",
2313 "IPHONEOS_DEPLOYMENT_TARGET",
2314 "TVOS_DEPLOYMENT_TARGET",
2315 "WATCHOS_DEPLOYMENT_TARGET",
2316 "DRIVERKIT_DEPLOYMENT_TARGET",
2317 "XROS_DEPLOYMENT_TARGET"
2319 std::string Targets[std::size(EnvVars)];
2320 for (
const auto &I : llvm::enumerate(llvm::ArrayRef(EnvVars))) {
2321 if (
char *Env = ::getenv(I.value()))
2322 Targets[I.index()] = Env;
2331 if (Triple.getArch() == llvm::Triple::arm ||
2332 Triple.getArch() == llvm::Triple::aarch64 ||
2333 Triple.getArch() == llvm::Triple::thumb)
2340 unsigned FirstTarget = std::size(Targets);
2341 for (
unsigned I = 0; I != std::size(Targets); ++I) {
2342 if (Targets[I].empty())
2344 if (FirstTarget == std::size(Targets))
2347 TheDriver.
Diag(diag::err_drv_conflicting_deployment_targets)
2348 << Targets[FirstTarget] << Targets[I];
2352 for (
const auto &
Target : llvm::enumerate(llvm::ArrayRef(Targets))) {
2353 if (!
Target.value().empty())
2354 return DarwinPlatform::createDeploymentTargetEnv(
2358 return std::nullopt;
2364std::optional<DarwinPlatform>
2365inferDeploymentTargetFromSDK(DerivedArgList &Args,
2366 const std::optional<DarwinSDKInfo> &SDKInfo) {
2367 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2369 return std::nullopt;
2370 StringRef isysroot = A->getValue();
2372 return DarwinPlatform::createFromSDKInfo(isysroot, *SDKInfo);
2376 return std::nullopt;
2378 std::string Version;
2381 size_t StartVer = SDK.find_first_of(
"0123456789");
2382 size_t EndVer = SDK.find_last_of(
"0123456789");
2383 if (StartVer != StringRef::npos && EndVer > StartVer)
2384 Version = std::string(SDK.slice(StartVer, EndVer + 1));
2385 if (Version.empty())
2386 return std::nullopt;
2388 if (SDK.starts_with(
"iPhoneOS") || SDK.starts_with(
"iPhoneSimulator"))
2389 return DarwinPlatform::createFromSDK(
2391 SDK.starts_with(
"iPhoneSimulator"));
2392 else if (SDK.starts_with(
"MacOSX"))
2393 return DarwinPlatform::createFromSDK(isysroot,
Darwin::MacOS,
2395 else if (SDK.starts_with(
"WatchOS") || SDK.starts_with(
"WatchSimulator"))
2396 return DarwinPlatform::createFromSDK(
2398 SDK.starts_with(
"WatchSimulator"));
2399 else if (SDK.starts_with(
"AppleTVOS") || SDK.starts_with(
"AppleTVSimulator"))
2400 return DarwinPlatform::createFromSDK(
2402 SDK.starts_with(
"AppleTVSimulator"));
2403 else if (SDK.starts_with(
"DriverKit"))
2405 return std::nullopt;
2409VersionTuple getInferredOSVersion(llvm::Triple::OSType OS,
2410 const llvm::Triple &Triple,
2411 const Driver &TheDriver) {
2412 VersionTuple OsVersion;
2413 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
2415 case llvm::Triple::Darwin:
2416 case llvm::Triple::MacOSX:
2419 if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
2420 !Triple.getOSMajorVersion())
2421 SystemTriple.getMacOSXVersion(OsVersion);
2422 else if (!Triple.getMacOSXVersion(OsVersion))
2423 TheDriver.
Diag(diag::err_drv_invalid_darwin_version)
2424 << Triple.getOSName();
2426 case llvm::Triple::IOS:
2427 if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
2428 OsVersion = VersionTuple(13, 1);
2430 OsVersion = Triple.getiOSVersion();
2432 case llvm::Triple::TvOS:
2433 OsVersion = Triple.getOSVersion();
2435 case llvm::Triple::WatchOS:
2436 OsVersion = Triple.getWatchOSVersion();
2438 case llvm::Triple::DriverKit:
2439 OsVersion = Triple.getDriverKitVersion();
2442 OsVersion = Triple.getOSVersion();
2443 if (!OsVersion.getMajor())
2444 OsVersion = OsVersion.withMajorReplaced(1);
2451std::optional<DarwinPlatform>
2452inferDeploymentTargetFromArch(DerivedArgList &Args,
const Darwin &Toolchain,
2453 const llvm::Triple &Triple,
2454 const Driver &TheDriver) {
2455 llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS;
2458 if (MachOArchName ==
"arm64" || MachOArchName ==
"arm64e")
2459 OSTy = llvm::Triple::MacOSX;
2460 else if (MachOArchName ==
"armv7" || MachOArchName ==
"armv7s" ||
2461 MachOArchName ==
"armv6")
2462 OSTy = llvm::Triple::IOS;
2463 else if (MachOArchName ==
"armv7k" || MachOArchName ==
"arm64_32")
2464 OSTy = llvm::Triple::WatchOS;
2465 else if (MachOArchName !=
"armv6m" && MachOArchName !=
"armv7m" &&
2466 MachOArchName !=
"armv7em" && MachOArchName !=
"armv8m.base" &&
2467 MachOArchName !=
"armv8m.main" && MachOArchName !=
"armv8.1m.main")
2468 OSTy = llvm::Triple::MacOSX;
2469 if (OSTy == llvm::Triple::UnknownOS)
2470 return std::nullopt;
2471 return DarwinPlatform::createFromArch(
2472 MachOArchName, OSTy, getInferredOSVersion(OSTy, Triple, TheDriver));
2476std::optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
2477 DerivedArgList &Args,
const llvm::Triple &Triple,
const Driver &TheDriver,
2478 const std::optional<DarwinSDKInfo> &SDKInfo) {
2479 if (!Args.hasArg(options::OPT_target))
2480 return std::nullopt;
2481 if (Triple.getOS() == llvm::Triple::Darwin ||
2482 Triple.getOS() == llvm::Triple::UnknownOS)
2483 return std::nullopt;
2484 std::optional<llvm::Triple> TargetVariantTriple;
2485 for (
const Arg *A : Args.filtered(options::OPT_darwin_target_variant)) {
2486 llvm::Triple TVT(A->getValue());
2488 if ((Triple.getArch() == llvm::Triple::aarch64 ||
2489 TVT.getArchName() == Triple.getArchName()) &&
2490 TVT.getArch() == Triple.getArch() &&
2491 TVT.getSubArch() == Triple.getSubArch() &&
2492 TVT.getVendor() == Triple.getVendor()) {
2493 if (TargetVariantTriple)
2498 if ((Triple.isMacOSX() && TVT.getOS() == llvm::Triple::IOS &&
2499 TVT.isMacCatalystEnvironment()) ||
2500 (TVT.isMacOSX() && Triple.getOS() == llvm::Triple::IOS &&
2501 Triple.isMacCatalystEnvironment())) {
2502 TargetVariantTriple = TVT;
2505 TheDriver.
Diag(diag::err_drv_target_variant_invalid)
2506 << A->getSpelling() << A->getValue();
2509 DarwinPlatform PlatformAndVersion = DarwinPlatform::createFromTarget(
2510 Triple, Args.getLastArg(options::OPT_target), TargetVariantTriple,
2513 return PlatformAndVersion;
2517std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2518 DerivedArgList &Args,
const Driver &TheDriver,
2519 const std::optional<DarwinSDKInfo> &SDKInfo) {
2520 auto *A = Args.getLastArg(options::OPT_mtargetos_EQ);
2522 return std::nullopt;
2523 llvm::Triple TT(llvm::Twine(
"unknown-apple-") + A->getValue());
2524 switch (TT.getOS()) {
2525 case llvm::Triple::MacOSX:
2526 case llvm::Triple::IOS:
2527 case llvm::Triple::TvOS:
2528 case llvm::Triple::WatchOS:
2529 case llvm::Triple::XROS:
2532 TheDriver.
Diag(diag::err_drv_invalid_os_in_arg)
2533 << TT.getOSName() << A->getAsString(Args);
2534 return std::nullopt;
2537 VersionTuple Version = TT.getOSVersion();
2538 if (!Version.getMajor()) {
2539 TheDriver.
Diag(diag::err_drv_invalid_version_number)
2540 << A->getAsString(Args);
2541 return std::nullopt;
2543 return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
2544 TT.getEnvironment(), A, SDKInfo);
2547std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS,
2548 const ArgList &Args,
2549 const Driver &TheDriver) {
2550 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2552 return std::nullopt;
2553 StringRef isysroot = A->getValue();
2555 if (!SDKInfoOrErr) {
2556 llvm::consumeError(SDKInfoOrErr.takeError());
2557 TheDriver.
Diag(diag::warn_drv_darwin_sdk_invalid_settings);
2558 return std::nullopt;
2560 return *SDKInfoOrErr;
2565void Darwin::AddDeploymentTarget(DerivedArgList &Args)
const {
2571 bool TryXcselect =
false;
2577 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2579 if (!
getVFS().exists(A->getValue()))
2580 getDriver().
Diag(clang::diag::warn_missing_sysroot) << A->getValue();
2581 }
else if (
const char *env = ::getenv(
"SDKROOT")) {
2584 if (llvm::sys::path::is_absolute(env) &&
getVFS().exists(env) &&
2585 StringRef(env) !=
"/") {
2586 Args.append(Args.MakeSeparateArg(
2587 nullptr, Opts.getOption(options::OPT_isysroot), env));
2590 TryXcselect = !Args.hasArg(options::OPT__sysroot_EQ) &&
2591 !Args.hasArg(options::OPT_no_xcselect);
2601 std::optional<DarwinPlatform> PlatformAndVersion =
2603 if (PlatformAndVersion) {
2605 if (
const auto *MTargetOSArg = Args.getLastArg(options::OPT_mtargetos_EQ)) {
2606 std::string TargetArgStr = PlatformAndVersion->getAsString(Args, Opts);
2607 std::string MTargetOSArgStr = MTargetOSArg->getAsString(Args);
2609 << TargetArgStr << MTargetOSArgStr;
2612 bool TripleProvidedOSVersion = PlatformAndVersion->hasOSVersion();
2613 if (!TripleProvidedOSVersion)
2614 PlatformAndVersion->setOSVersion(
2617 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2618 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2619 if (PlatformAndVersionFromOSVersionArg) {
2620 unsigned TargetMajor, TargetMinor, TargetMicro;
2622 unsigned ArgMajor, ArgMinor, ArgMicro;
2624 if (PlatformAndVersion->getPlatform() !=
2625 PlatformAndVersionFromOSVersionArg->getPlatform() ||
2627 PlatformAndVersion->getOSVersion().getAsString(), TargetMajor,
2628 TargetMinor, TargetMicro, TargetExtra) &&
2630 PlatformAndVersionFromOSVersionArg->getOSVersion().getAsString(),
2631 ArgMajor, ArgMinor, ArgMicro, ArgExtra) &&
2632 (VersionTuple(TargetMajor, TargetMinor, TargetMicro) !=
2633 VersionTuple(ArgMajor, ArgMinor, ArgMicro) ||
2634 TargetExtra != ArgExtra))) {
2637 if (PlatformAndVersion->getPlatform() ==
2638 PlatformAndVersionFromOSVersionArg->getPlatform() &&
2639 !TripleProvidedOSVersion) {
2640 PlatformAndVersion->setOSVersion(
2641 PlatformAndVersionFromOSVersionArg->getOSVersion());
2645 std::string OSVersionArg =
2646 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2647 std::string TargetArg = PlatformAndVersion->getAsString(Args, Opts);
2649 << OSVersionArg << TargetArg;
2653 }
else if ((PlatformAndVersion = getDeploymentTargetFromMTargetOSArg(
2657 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2658 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2659 if (PlatformAndVersionFromOSVersionArg) {
2660 std::string MTargetOSArgStr = PlatformAndVersion->getAsString(Args, Opts);
2661 std::string OSVersionArgStr =
2662 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2664 << MTargetOSArgStr << OSVersionArgStr;
2668 PlatformAndVersion = getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2671 if (!PlatformAndVersion) {
2672 PlatformAndVersion =
2674 if (PlatformAndVersion) {
2676 std::optional<DarwinPlatform> SDKTarget =
2677 inferDeploymentTargetFromSDK(Args,
SDKInfo);
2679 PlatformAndVersion->setEnvironment(SDKTarget->getEnvironment());
2685 if (!PlatformAndVersion) {
2686 PlatformAndVersion = inferDeploymentTargetFromSDK(Args,
SDKInfo);
2689 if (PlatformAndVersion && !
SDKInfo)
2690 SDKInfo = PlatformAndVersion->inferSDKInfo();
2694 if (!PlatformAndVersion)
2695 PlatformAndVersion =
2699 assert(PlatformAndVersion &&
"Unable to infer Darwin variant");
2700 if (!PlatformAndVersion->isValidOSVersion()) {
2701 if (PlatformAndVersion->isExplicitlySpecified())
2703 << PlatformAndVersion->getAsString(Args, Opts);
2705 getDriver().
Diag(diag::err_drv_invalid_version_number_inferred)
2706 << PlatformAndVersion->getOSVersion().getAsString()
2707 << PlatformAndVersion->getInferredSource();
2712 VersionTuple CanonicalVersion = PlatformAndVersion->getCanonicalOSVersion();
2713 if (CanonicalVersion != PlatformAndVersion->getOSVersion()) {
2714 getDriver().
Diag(diag::warn_drv_overriding_deployment_version)
2715 << PlatformAndVersion->getOSVersion().getAsString()
2716 << CanonicalVersion.getAsString();
2717 PlatformAndVersion->setOSVersion(CanonicalVersion);
2720 PlatformAndVersion->addOSVersionMinArgument(Args, Opts);
2723 unsigned Major, Minor, Micro;
2726 const unsigned MajorVersionLimit = 1000;
2727 const VersionTuple OSVersion = PlatformAndVersion->takeOSVersion();
2728 const std::string OSVersionStr = OSVersion.getAsString();
2730 if (Platform ==
MacOS) {
2731#ifdef CLANG_USE_XCSELECT
2734 if (!::xcselect_host_sdk_path(CLANG_XCSELECT_HOST_SDK_POLICY, &p)) {
2735 Args.append(Args.MakeSeparateArg(
2736 nullptr, Opts.getOption(options::OPT_isysroot), p));
2745 HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
2748 << PlatformAndVersion->getAsString(Args, Opts);
2752 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2754 << PlatformAndVersion->getAsString(Args, Opts);
2756 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst &&
2757 (Major < 13 || (Major == 13 && Minor < 1))) {
2759 << PlatformAndVersion->getAsString(Args, Opts);
2766 if (
getTriple().isArch32Bit() && Major >= 11) {
2768 if (PlatformAndVersion->isExplicitlySpecified()) {
2769 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst)
2770 getDriver().
Diag(diag::err_invalid_macos_32bit_deployment_target);
2773 << PlatformAndVersion->getAsString(Args, Opts);
2781 }
else if (Platform ==
TvOS) {
2784 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2786 << PlatformAndVersion->getAsString(Args, Opts);
2787 }
else if (Platform ==
WatchOS) {
2790 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2792 << PlatformAndVersion->getAsString(Args, Opts);
2796 HadExtra || Major < 19 || Major >= MajorVersionLimit || Minor >= 100 ||
2799 << PlatformAndVersion->getAsString(Args, Opts);
2803 HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2806 << PlatformAndVersion->getAsString(Args, Opts);
2813 PlatformAndVersion->canInferSimulatorFromArch() &&
getTriple().isX86())
2816 VersionTuple ZipperedOSVersion;
2818 ZipperedOSVersion = PlatformAndVersion->getZipperedOSVersion();
2819 setTarget(Platform, Environment, Major, Minor, Micro, ZipperedOSVersion);
2831 return !
SDKInfo->getPlatformPrefix(T).empty();
2840 const llvm::Triple &T)
const {
2842 const StringRef PlatformPrefix =
SDKInfo->getPlatformPrefix(T);
2843 if (!PlatformPrefix.empty())
2844 llvm::sys::path::append(Path, PlatformPrefix);
2845 }
else if (T.isDriverKit()) {
2848 llvm::sys::path::append(Path,
"System",
"DriverKit");
2857 if (DriverArgs.hasArg(options::OPT_isysroot))
2858 Path = DriverArgs.getLastArgValue(options::OPT_isysroot);
2869 const llvm::opt::ArgList &DriverArgs,
2870 llvm::opt::ArgStringList &CC1Args)
const {
2875 bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc);
2876 bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc);
2877 bool NoBuiltinInc = DriverArgs.hasFlag(
2878 options::OPT_nobuiltininc, options::OPT_ibuiltininc,
false);
2879 bool ForceBuiltinInc = DriverArgs.hasFlag(
2880 options::OPT_ibuiltininc, options::OPT_nobuiltininc,
false);
2883 if (!NoStdInc && !NoStdlibInc) {
2885 llvm::sys::path::append(P,
"usr",
"local",
"include");
2890 if (!(NoStdInc && !ForceBuiltinInc) && !NoBuiltinInc) {
2892 llvm::sys::path::append(P,
"include");
2896 if (NoStdInc || NoStdlibInc)
2900 llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
2901 if (!CIncludeDirs.empty()) {
2903 CIncludeDirs.split(dirs,
":");
2904 for (llvm::StringRef dir : dirs) {
2905 llvm::StringRef Prefix =
2906 llvm::sys::path::is_absolute(dir) ?
"" : llvm::StringRef(Sysroot);
2912 llvm::sys::path::append(P,
"usr",
"include");
2918 const llvm::opt::ArgList &DriverArgs,
2919 llvm::opt::ArgStringList &CC1Args)
const {
2922 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc))
2931 llvm::sys::path::append(P1,
"System",
"Library",
"Frameworks");
2932 llvm::sys::path::append(P2,
"System",
"Library",
"SubFrameworks");
2933 llvm::sys::path::append(P3,
"Library",
"Frameworks");
2937bool DarwinClang::AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
2938 llvm::opt::ArgStringList &CC1Args,
2940 llvm::StringRef Version,
2941 llvm::StringRef ArchDir,
2942 llvm::StringRef BitDir)
const {
2943 llvm::sys::path::append(
Base, Version);
2951 if (!ArchDir.empty())
2952 llvm::sys::path::append(P, ArchDir);
2953 if (!BitDir.empty())
2954 llvm::sys::path::append(P, BitDir);
2961 llvm::sys::path::append(P,
"backward");
2969 const llvm::opt::ArgList &DriverArgs,
2970 llvm::opt::ArgStringList &CC1Args)
const {
2978 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
2979 options::OPT_nostdincxx))
3000 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
3001 if (
getVFS().exists(InstallBin)) {
3004 }
else if (DriverArgs.hasArg(options::OPT_v)) {
3005 llvm::errs() <<
"ignoring nonexistent directory \"" << InstallBin
3011 llvm::sys::path::append(SysrootUsr,
"usr",
"include",
"c++",
"v1");
3012 if (
getVFS().exists(SysrootUsr)) {
3015 }
else if (DriverArgs.hasArg(options::OPT_v)) {
3016 llvm::errs() <<
"ignoring nonexistent directory \"" << SysrootUsr
3025 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args);
3030void AppleMachO::AddGnuCPlusPlusIncludePaths(
3031 const llvm::opt::ArgList &DriverArgs,
3032 llvm::opt::ArgStringList &CC1Args)
const {}
3034void DarwinClang::AddGnuCPlusPlusIncludePaths(
3035 const llvm::opt::ArgList &DriverArgs,
3036 llvm::opt::ArgStringList &CC1Args)
const {
3038 llvm::sys::path::append(UsrIncludeCxx,
"usr",
"include",
"c++");
3040 llvm::Triple::ArchType arch =
getTriple().getArch();
3041 bool IsBaseFound =
true;
3046 case llvm::Triple::x86:
3047 case llvm::Triple::x86_64:
3048 IsBaseFound = AddGnuCPlusPlusIncludePaths(
3049 DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
"i686-apple-darwin10",
3050 arch == llvm::Triple::x86_64 ?
"x86_64" :
"");
3051 IsBaseFound |= AddGnuCPlusPlusIncludePaths(
3052 DriverArgs, CC1Args, UsrIncludeCxx,
"4.0.0",
"i686-apple-darwin8",
"");
3055 case llvm::Triple::arm:
3056 case llvm::Triple::thumb:
3058 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3059 "arm-apple-darwin10",
"v7");
3061 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3062 "arm-apple-darwin10",
"v6");
3065 case llvm::Triple::aarch64:
3067 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3068 "arm64-apple-darwin10",
"");
3078 ArgStringList &CmdArgs)
const {
3083 CmdArgs.push_back(
"-lc++");
3084 if (Args.hasArg(options::OPT_fexperimental_library))
3085 CmdArgs.push_back(
"-lc++experimental");
3095 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
3097 llvm::sys::path::append(P,
"usr",
"lib",
"libstdc++.dylib");
3099 if (!
getVFS().exists(P)) {
3100 llvm::sys::path::remove_filename(P);
3101 llvm::sys::path::append(P,
"libstdc++.6.dylib");
3102 if (
getVFS().exists(P)) {
3103 CmdArgs.push_back(Args.MakeArgString(P));
3112 if (!
getVFS().exists(
"/usr/lib/libstdc++.dylib") &&
3113 getVFS().exists(
"/usr/lib/libstdc++.6.dylib")) {
3114 CmdArgs.push_back(
"/usr/lib/libstdc++.6.dylib");
3119 CmdArgs.push_back(
"-lstdc++");
3125 ArgStringList &CmdArgs)
const {
3131 llvm::sys::path::append(P,
"lib",
"darwin");
3135 llvm::sys::path::append(P,
"libclang_rt.cc_kext_watchos.a");
3137 llvm::sys::path::append(P,
"libclang_rt.cc_kext_tvos.a");
3139 llvm::sys::path::append(P,
"libclang_rt.cc_kext_ios.a");
3143 llvm::sys::path::append(
3144 P, llvm::Twine(
"libclang_rt.cc_kext_") +
3145 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
".a");
3147 llvm::sys::path::append(P,
"libclang_rt.cc_kext.a");
3153 CmdArgs.push_back(Args.MakeArgString(P));
3157 StringRef BoundArch,
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));
3226 if (!BoundArch.empty()) {
3227 StringRef Name = BoundArch;
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,
3443 if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3444 options::OPT_fno_ptrauth_calls))
3445 CC1Args.push_back(
"-fptrauth-calls");
3446 if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3447 options::OPT_fno_ptrauth_returns))
3448 CC1Args.push_back(
"-fptrauth-returns");
3449 if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3450 options::OPT_fno_ptrauth_intrinsics))
3451 CC1Args.push_back(
"-fptrauth-intrinsics");
3452 if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3453 options::OPT_fno_ptrauth_indirect_gotos))
3454 CC1Args.push_back(
"-fptrauth-indirect-gotos");
3455 if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3456 options::OPT_fno_ptrauth_auth_traps))
3457 CC1Args.push_back(
"-fptrauth-auth-traps");
3460 if (!DriverArgs.hasArg(
3461 options::OPT_fptrauth_vtable_pointer_address_discrimination,
3462 options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
3463 CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
3464 if (!DriverArgs.hasArg(
3465 options::OPT_fptrauth_vtable_pointer_type_discrimination,
3466 options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
3467 CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
3470 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
3471 options::OPT_fno_ptrauth_objc_isa))
3472 CC1Args.push_back(
"-fptrauth-objc-isa");
3473 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
3474 options::OPT_fno_ptrauth_objc_class_ro))
3475 CC1Args.push_back(
"-fptrauth-objc-class-ro");
3476 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
3477 options::OPT_fno_ptrauth_objc_interface_sel))
3478 CC1Args.push_back(
"-fptrauth-objc-interface-sel");
3483 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3496 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
3497 options::OPT_fno_aligned_allocation) &&
3499 CC1Args.push_back(
"-faligned-alloc-unavailable");
3503 if (!DriverArgs.hasArgNoClaim(options::OPT_fobjc_msgsend_selector_stubs,
3504 options::OPT_fno_objc_msgsend_selector_stubs) &&
3507 CC1Args.push_back(
"-fobjc-msgsend-selector-stubs");
3511 if (!DriverArgs.hasArgNoClaim(
3512 options::OPT_fobjc_msgsend_class_selector_stubs,
3513 options::OPT_fno_objc_msgsend_class_selector_stubs) &&
3516 CC1Args.push_back(
"-fobjc-msgsend-class-selector-stubs");
3520 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
3521 options::OPT_fno_sized_deallocation) &&
3523 CC1Args.push_back(
"-fno-sized-deallocation");
3530 if (!
SDKInfo->getFilePath().empty()) {
3532 ExtraDepOpt +=
SDKInfo->getFilePath();
3533 CC1Args.push_back(DriverArgs.MakeArgString(ExtraDepOpt));
3539 CC1Args.push_back(
"-fcompatibility-qualified-id-block-type-checking");
3543 if (!DriverArgs.getLastArgNoClaim(
3544 options::OPT_fvisibility_inlines_hidden_static_local_var,
3545 options::OPT_fno_visibility_inlines_hidden_static_local_var))
3546 CC1Args.push_back(
"-fvisibility-inlines-hidden-static-local-var");
3560 CC1Args.push_back(
"-fbuiltin-headers-in-system-modules");
3562 if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
3563 options::OPT_fno_define_target_os_macros))
3564 CC1Args.push_back(
"-fdefine-target-os-macros");
3568 !DriverArgs.hasFlag(options::OPT_fmodulemap_allow_subdirectory_search,
3569 options::OPT_fno_modulemap_allow_subdirectory_search,
3571 bool RequiresSubdirectorySearch;
3572 VersionTuple SDKVersion =
SDKInfo->getVersion();
3575 RequiresSubdirectorySearch =
true;
3578 RequiresSubdirectorySearch = SDKVersion < VersionTuple(15, 0);
3582 RequiresSubdirectorySearch = SDKVersion < VersionTuple(18, 0);
3585 RequiresSubdirectorySearch = SDKVersion < VersionTuple(11, 0);
3588 RequiresSubdirectorySearch = SDKVersion < VersionTuple(2, 0);
3591 if (!RequiresSubdirectorySearch)
3592 CC1Args.push_back(
"-fno-modulemap-allow-subdirectory-search");
3597 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1ASArgs)
const {
3599 CC1ASArgs.push_back(
"-darwin-target-variant-triple");
3606 auto EmitTargetSDKVersionArg = [&](
const VersionTuple &
V) {
3608 llvm::raw_string_ostream OS(Arg);
3609 OS <<
"-target-sdk-version=" <<
V;
3610 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3614 if (
const auto *MacOStoMacCatalystMapping =
SDKInfo->getVersionMapping(
3616 std::optional<VersionTuple> SDKVersion = MacOStoMacCatalystMapping->map(
3619 EmitTargetSDKVersionArg(
3623 EmitTargetSDKVersionArg(
SDKInfo->getVersion());
3631 llvm::raw_string_ostream OS(Arg);
3632 OS <<
"-darwin-target-variant-sdk-version=" <<
SDKInfo->getVersion();
3633 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3634 }
else if (
const auto *MacOStoMacCatalystMapping =
3637 if (std::optional<VersionTuple> SDKVersion =
3638 MacOStoMacCatalystMapping->map(
3642 llvm::raw_string_ostream OS(Arg);
3643 OS <<
"-darwin-target-variant-sdk-version=" << *SDKVersion;
3644 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3655 DerivedArgList *DAL =
3659 if (BoundArch.empty())
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" << BoundArch;
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);
4044 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
4045 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
4047 Res |= SanitizerKind::Address;
4048 Res |= SanitizerKind::PointerCompare;
4049 Res |= SanitizerKind::PointerSubtract;
4050 Res |= SanitizerKind::Realtime;
4051 Res |= SanitizerKind::Leak;
4052 Res |= SanitizerKind::Fuzzer;
4053 Res |= SanitizerKind::FuzzerNoLink;
4054 Res |= SanitizerKind::ObjCCast;
4064 Res |= SanitizerKind::Vptr;
4066 if ((IsX86_64 || IsAArch64) &&
4069 Res |= SanitizerKind::Thread;
4073 Res |= SanitizerKind::Type;
4077 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 isUsingLTO() const
Returns true if we are performing any kind of LTO.
LTOKind getLTOMode() const
Get the specific kind of LTO being performed.
bool needsStatsRt() const
bool needsMemProfRt() const
bool linkRuntimes() const
bool needsUbsanRt() const
bool needsRtsanRt() const
bool requiresMinimalRuntime() const
bool needsSharedRt() const
bool needsTysanRt() const
bool needsStableAbi() const
const char * getTypeTempSuffix(ID Id, bool CLStyle=false)
getTypeTempSuffix - Return the suffix to use when creating a temp file of this type,...
SmallVector< InputInfo, 4 > InputInfoList
bool willEmitRemarks(const llvm::opt::ArgList &Args)
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
The JSON file list parser is used to communicate input to InstallAPI.
Expected< std::optional< DarwinSDKInfo > > parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath)
Parse the SDK information from the SDKSettings.json file.
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()