13#include "clang/Config/config.h"
19#include "llvm/ADT/StringSwitch.h"
20#include "llvm/Option/ArgList.h"
21#include "llvm/ProfileData/InstrProf.h"
22#include "llvm/ProfileData/MemProf.h"
23#include "llvm/Support/Path.h"
24#include "llvm/Support/Threading.h"
25#include "llvm/Support/VirtualFileSystem.h"
26#include "llvm/TargetParser/TargetParser.h"
27#include "llvm/TargetParser/Triple.h"
30#ifdef CLANG_USE_XCSELECT
41 return VersionTuple(13, 1);
57 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
58 .Cases({
"i386",
"i486",
"i486SX",
"i586",
"i686"}, llvm::Triple::x86)
59 .Cases({
"pentium",
"pentpro",
"pentIIm3",
"pentIIm5",
"pentium4"},
61 .Cases({
"x86_64",
"x86_64h"}, llvm::Triple::x86_64)
63 .Cases({
"arm",
"armv4t",
"armv5",
"armv6",
"armv6m"}, llvm::Triple::arm)
64 .Cases({
"armv7",
"armv7em",
"armv7k",
"armv7m"}, llvm::Triple::arm)
65 .Cases({
"armv7s",
"xscale"}, llvm::Triple::arm)
66 .Cases({
"armv8m.base",
"armv8m.main",
"armv8.1m.main"}, llvm::Triple::arm)
67 .Cases({
"arm64",
"arm64e"}, llvm::Triple::aarch64)
68 .Case(
"arm64_32", llvm::Triple::aarch64_32)
69 .Cases({
"amdgpu",
"amdgcn"}, llvm::Triple::amdgpu)
70 .Case(
"r600", llvm::Triple::r600)
71 .Case(
"nvptx", llvm::Triple::nvptx)
72 .Case(
"nvptx64", llvm::Triple::nvptx64)
73 .Case(
"amdil", llvm::Triple::amdil)
74 .Case(
"spir", llvm::Triple::spir)
75 .Default(llvm::Triple::UnknownArch);
79 const ArgList &Args) {
80 const llvm::Triple::ArchType
Arch = getArchTypeForMachOArchName(Str);
81 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Str);
83 if (
Arch != llvm::Triple::UnknownArch)
89 if ((
T.getOS() != llvm::Triple::Firmware) &&
90 (ArchKind == llvm::ARM::ArchKind::ARMV6M ||
91 ArchKind == llvm::ARM::ArchKind::ARMV7M ||
92 ArchKind == llvm::ARM::ArchKind::ARMV7EM ||
93 ArchKind == llvm::ARM::ArchKind::ARMV8MBaseline ||
94 ArchKind == llvm::ARM::ArchKind::ARMV8MMainline ||
95 ArchKind == llvm::ARM::ArchKind::ARMV8_1MMainline)) {
97 if (
T.getOS() == llvm::Triple::IOS)
98 for (Arg *A : Args.filtered(options::OPT_mios_version_min_EQ))
99 A->ignoreTargetSpecific();
100 if (
T.getOS() == llvm::Triple::WatchOS)
101 for (Arg *A : Args.filtered(options::OPT_mwatchos_version_min_EQ))
102 A->ignoreTargetSpecific();
103 if (
T.getOS() == llvm::Triple::TvOS)
104 for (Arg *A : Args.filtered(options::OPT_mtvos_version_min_EQ))
105 A->ignoreTargetSpecific();
107 T.setOS(llvm::Triple::UnknownOS);
108 T.setObjectFormat(llvm::Triple::MachO);
116 const char *LinkingOutput)
const {
119 ArgStringList CmdArgs;
121 assert(Inputs.size() == 1 &&
"Unexpected number of inputs.");
125 const Action *SourceAction = &JA;
127 assert(!SourceAction->
getInputs().empty() &&
"unexpected root action!");
128 SourceAction = SourceAction->
getInputs()[0];
136 if (Args.hasArg(options::OPT_fno_integrated_as)) {
137 if (!(
T.isMacOSX() &&
T.isMacOSXVersionLT(10, 7)))
138 CmdArgs.push_back(
"-Q");
142 if (SourceAction->
getType() == types::TY_Asm ||
143 SourceAction->
getType() == types::TY_PP_Asm) {
144 if (Args.hasArg(options::OPT_gstabs))
145 CmdArgs.push_back(
"--gstabs");
146 else if (Args.hasArg(options::OPT_g_Group))
147 CmdArgs.push_back(
"-g");
154 if (
T.isX86() || Args.hasArg(options::OPT_force__cpusubtype__ALL))
155 CmdArgs.push_back(
"-force_cpusubtype_ALL");
158 (((Args.hasArg(options::OPT_mkernel) ||
159 Args.hasArg(options::OPT_fapple_kext)) &&
161 Args.hasArg(options::OPT_static)))
162 CmdArgs.push_back(
"-static");
164 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
166 assert(Output.
isFilename() &&
"Unexpected lipo output.");
167 CmdArgs.push_back(
"-o");
170 assert(Input.
isFilename() &&
"Invalid input.");
175 const char *Exec = Args.MakeArgString(
getToolChain().GetProgramPath(
"as"));
177 Exec, CmdArgs, Inputs, Output));
180void darwin::MachOTool::anchor() {}
183 ArgStringList &CmdArgs)
const {
187 CmdArgs.push_back(
"-arch");
188 CmdArgs.push_back(Args.MakeArgString(ArchName));
191 if (ArchName ==
"arm")
192 CmdArgs.push_back(
"-force_cpusubtype_ALL");
196 ArgStringList &CmdArgs)
const {
206 CmdArgs.push_back(
"-arch_only");
207 CmdArgs.push_back(Args.MakeArgString(ArchName));
211 ArgStringList &CmdArgs) {
216 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ);
217 A && !StringRef(A->getValue()).empty()) {
218 CmdArgs.push_back(
"-syslibroot");
219 CmdArgs.push_back(A->getValue());
220 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
221 CmdArgs.push_back(
"-syslibroot");
222 CmdArgs.push_back(A->getValue());
223 }
else if (StringRef sysroot =
C.getSysRoot(); sysroot !=
"") {
224 CmdArgs.push_back(
"-syslibroot");
225 CmdArgs.push_back(
C.getArgs().MakeArgString(sysroot));
229bool darwin::Linker::NeedsTempPath(
const InputInfoList &Inputs)
const {
233 for (
const auto &Input : Inputs)
234 if (Input.getType() != types::TY_Object)
248 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
249 if (A->getOption().matches(options::OPT_O0))
251 if (A->getOption().matches(options::OPT_O))
252 return llvm::StringSwitch<bool>(A->getValue())
258 if (!IsLinkerOnlyAction)
263void darwin::Linker::AddLinkArgs(Compilation &
C,
const ArgList &Args,
264 ArgStringList &CmdArgs,
266 VersionTuple Version,
bool LinkerIsLLD,
267 bool UsePlatformVersion)
const {
268 const Driver &D = getToolChain().getDriver();
269 const toolchains::MachO &MachOTC = getMachOToolChain();
273 if ((Version >= VersionTuple(100) || LinkerIsLLD) &&
274 !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
275 CmdArgs.push_back(
"-demangle");
277 if (Args.hasArg(options::OPT_rdynamic) &&
278 (Version >= VersionTuple(137) || LinkerIsLLD))
279 CmdArgs.push_back(
"-export_dynamic");
283 if (Args.hasFlag(options::OPT_fapplication_extension,
284 options::OPT_fno_application_extension,
false))
285 CmdArgs.push_back(
"-application_extension");
287 if (
auto LTO = getToolChain().getLTOMode(Args);
288 LTO !=
LTOK_None && (Version >= VersionTuple(116) || LinkerIsLLD) &&
289 NeedsTempPath(Inputs)) {
290 std::string TmpPathName;
301 if (!TmpPathName.empty()) {
302 auto *TmpPath =
C.getArgs().MakeArgString(TmpPathName);
303 C.addTempFile(TmpPath);
304 CmdArgs.push_back(
"-object_path_lto");
305 CmdArgs.push_back(TmpPath);
318 if (Version >= VersionTuple(133) && !LinkerIsLLD) {
320 StringRef P = llvm::sys::path::parent_path(D.
Dir);
321 SmallString<128> LibLTOPath(P);
322 llvm::sys::path::append(LibLTOPath,
"lib");
323 llvm::sys::path::append(LibLTOPath,
"libLTO.dylib");
324 CmdArgs.push_back(
"-lto_library");
325 CmdArgs.push_back(
C.getArgs().MakeArgString(LibLTOPath));
331 if (Version >= VersionTuple(262) &&
333 CmdArgs.push_back(
"-no_deduplicate");
336 Args.AddAllArgs(CmdArgs, options::OPT_static);
337 if (!Args.hasArg(options::OPT_static))
338 CmdArgs.push_back(
"-dynamic");
339 if (Args.hasArg(options::OPT_fgnu_runtime)) {
344 if (!Args.hasArg(options::OPT_dynamiclib)) {
345 AddMachOArch(Args, CmdArgs);
347 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
349 Args.AddLastArg(CmdArgs, options::OPT_bundle);
350 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
351 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
354 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
355 (A = Args.getLastArg(options::OPT_current__version)) ||
356 (A = Args.getLastArg(options::OPT_install__name)))
357 D.
Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
360 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
361 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
362 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
364 CmdArgs.push_back(
"-dylib");
367 if ((A = Args.getLastArg(options::OPT_bundle)) ||
368 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
369 (A = Args.getLastArg(options::OPT_client__name)) ||
370 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
371 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
372 (A = Args.getLastArg(options::OPT_private__bundle)))
373 D.
Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
376 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
377 "-dylib_compatibility_version");
378 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
379 "-dylib_current_version");
381 AddMachOArch(Args, CmdArgs);
383 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
384 "-dylib_install_name");
387 Args.AddLastArg(CmdArgs, options::OPT_all__load);
388 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
389 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
391 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
392 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
393 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
394 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
395 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
396 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
397 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
398 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
399 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
400 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
401 Args.AddAllArgs(CmdArgs, options::OPT_init);
404 if (Version >= VersionTuple(520) || LinkerIsLLD || UsePlatformVersion)
409 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
410 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
411 Args.AddLastArg(CmdArgs, options::OPT_single__module);
412 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
413 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
416 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
417 options::OPT_fno_pie, options::OPT_fno_PIE)) {
418 if (A->getOption().matches(options::OPT_fpie) ||
419 A->getOption().matches(options::OPT_fPIE))
420 CmdArgs.push_back(
"-pie");
422 CmdArgs.push_back(
"-no_pie");
426 if (
C.getDriver().embedBitcodeEnabled()) {
429 CmdArgs.push_back(
"-bitcode_bundle");
431 if (
C.getDriver().embedBitcodeMarkerOnly() &&
432 Version >= VersionTuple(278)) {
433 CmdArgs.push_back(
"-bitcode_process_mode");
434 CmdArgs.push_back(
"marker");
437 D.
Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
441 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
442 options::OPT_fno_global_isel)) {
443 if (A->getOption().matches(options::OPT_fglobal_isel)) {
444 CmdArgs.push_back(
"-mllvm");
445 CmdArgs.push_back(
"-global-isel");
447 CmdArgs.push_back(
"-mllvm");
448 CmdArgs.push_back(
"-global-isel-abort=0");
452 if (Args.hasArg(options::OPT_mkernel) ||
453 Args.hasArg(options::OPT_fapple_kext) ||
454 Args.hasArg(options::OPT_ffreestanding)) {
455 CmdArgs.push_back(
"-mllvm");
456 CmdArgs.push_back(
"-disable-atexit-based-global-dtor-lowering");
459 Args.AddLastArg(CmdArgs, options::OPT_prebind);
460 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
461 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
462 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
463 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
464 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
465 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
466 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
467 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
468 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
469 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
470 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
471 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
472 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
473 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
474 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
478 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
479 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
480 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
481 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
482 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
483 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
484 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
485 Args.AddAllArgs(CmdArgs, options::OPT_y);
486 Args.AddLastArg(CmdArgs, options::OPT_w);
487 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
488 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
489 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
490 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
491 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
492 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
493 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
494 Args.AddLastArg(CmdArgs, options::OPT_why_load);
495 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
496 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
497 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
498 Args.AddLastArg(CmdArgs, options::OPT_Mach);
500 if (Version >= VersionTuple(900))
501 Args.AddLastArg(CmdArgs, options::OPT_O_Group);
505 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
507 : CSPGOGenerateArg->getValue());
508 llvm::sys::path::append(Path,
"default_%m.profraw");
509 CmdArgs.push_back(
"--cs-profile-generate");
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(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
519 auto *CodeGenDataGenArg =
520 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
521 if (CodeGenDataGenArg)
523 Args.MakeArgString(Twine(
"--codegen-data-generate-path=") +
524 CodeGenDataGenArg->getValue()));
527 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
529 : CSPGOGenerateArg->getValue());
530 llvm::sys::path::append(Path,
"default_%m.profraw");
531 CmdArgs.push_back(
"-mllvm");
532 CmdArgs.push_back(
"-cs-profile-generate");
533 CmdArgs.push_back(
"-mllvm");
534 CmdArgs.push_back(Args.MakeArgString(Twine(
"-cs-profile-path=") + Path));
536 SmallString<128> Path(
537 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
538 if (Path.empty() || llvm::sys::fs::is_directory(Path))
539 llvm::sys::path::append(Path,
"default.profdata");
540 CmdArgs.push_back(
"-mllvm");
541 CmdArgs.push_back(Args.MakeArgString(Twine(
"-cs-profile-path=") + Path));
546 CmdArgs.push_back(
"-mllvm");
548 Args.MakeArgString(Twine(
"-sample-profile-file=") + A->getValue()));
555 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
558 return Args.hasArg(options::OPT_fobjc_link_runtime);
562 const llvm::Triple &Triple) {
567 Args.getAllArgValues(options::OPT_arch).size() > 1;
568 bool hasExplicitOutputFile =
569 Args.getLastArg(options::OPT_foptimization_record_file_EQ);
571 D.
Diag(diag::err_drv_invalid_output_with_multiple_archs)
572 <<
"-foptimization-record-file";
579 const llvm::Triple &Triple,
581 StringRef Format =
"yaml";
582 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
583 Format = A->getValue();
585 CmdArgs.push_back(
"-mllvm");
586 CmdArgs.push_back(
"-lto-pass-remarks-output");
587 CmdArgs.push_back(
"-mllvm");
589 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
591 CmdArgs.push_back(A->getValue());
593 assert(Output.
isFilename() &&
"Unexpected ld output.");
599 CmdArgs.push_back(Args.MakeArgString(F));
603 Args.getLastArg(options::OPT_foptimization_record_passes_EQ)) {
604 CmdArgs.push_back(
"-mllvm");
606 std::string(
"-lto-pass-remarks-filter=") + A->getValue();
607 CmdArgs.push_back(Args.MakeArgString(Passes));
610 if (!Format.empty()) {
611 CmdArgs.push_back(
"-mllvm");
612 Twine FormatArg = Twine(
"-lto-pass-remarks-format=") + Format;
613 CmdArgs.push_back(Args.MakeArgString(FormatArg));
617 CmdArgs.push_back(
"-mllvm");
618 CmdArgs.push_back(
"-lto-pass-remarks-with-hotness");
621 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
622 CmdArgs.push_back(
"-mllvm");
624 std::string(
"-lto-pass-remarks-hotness-threshold=") + A->getValue();
625 CmdArgs.push_back(Args.MakeArgString(Opt));
634 const char *LinkingOutput)
const {
635 assert((Output.
getType() == types::TY_Image ||
636 Output.
getType() == types::TY_Object) &&
637 "Invalid linker output type.");
643 llvm::opt::ArgStringList InputFileList;
648 ArgStringList CmdArgs;
654 Args.MakeArgString(
getToolChain().GetLinkerPath(&LinkerIsLLD));
658 bool UsePlatformVersion = Triple.isXROS() || Triple.isOSFirmware();
662 AddLinkArgs(
C, Args, CmdArgs, Inputs, Version, LinkerIsLLD,
672 Args.getLastArg(options::OPT_moutline, options::OPT_mno_outline)) {
673 if (A->getOption().matches(options::OPT_moutline)) {
675 CmdArgs.push_back(
"-mllvm");
676 CmdArgs.push_back(
"-enable-machine-outliner");
682 CmdArgs.push_back(
"-mllvm");
683 CmdArgs.push_back(
"-enable-machine-outliner=never");
690 CmdArgs.push_back(
"-mllvm");
691 CmdArgs.push_back(
"-enable-linkonceodr-outlining");
694 auto *CodeGenDataGenArg =
695 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
696 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
700 if (CodeGenDataGenArg && CodeGenDataUseArg)
701 D.
Diag(diag::err_drv_argument_not_allowed_with)
702 << CodeGenDataGenArg->getAsString(Args)
703 << CodeGenDataUseArg->getAsString(Args);
707 if (CodeGenDataGenArg) {
708 CmdArgs.push_back(
"-mllvm");
709 CmdArgs.push_back(
"-codegen-data-generate");
713 if (CodeGenDataUseArg) {
714 CmdArgs.push_back(
"-mllvm");
715 CmdArgs.push_back(Args.MakeArgString(Twine(
"-codegen-data-use-path=") +
716 CodeGenDataUseArg->getValue()));
722 if (!StatsFile.empty()) {
723 CmdArgs.push_back(
"-mllvm");
724 CmdArgs.push_back(Args.MakeArgString(
"-lto-stats-file=" + StatsFile.str()));
728 if (Args.hasArg(options::OPT_fstack_usage)) {
730 llvm::sys::path::replace_extension(StackUsageFile,
"su");
731 CmdArgs.push_back(
"-mllvm");
733 Args.MakeArgString(
"-stack-usage-file=" + StackUsageFile));
738 Args.addAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
739 options::OPT_Z_Flag, options::OPT_u_Group});
744 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
745 CmdArgs.push_back(
"-ObjC");
747 CmdArgs.push_back(
"-o");
750 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
753 Args.AddAllArgs(CmdArgs, options::OPT_L);
758 for (
const auto &II : Inputs) {
759 if (!II.isFilename()) {
764 if (InputFileList.size() > 0)
770 InputFileList.push_back(II.getFilename());
776 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
777 getToolChain().addFortranRuntimeLibraryPath(Args, CmdArgs);
781 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
785 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
789 CmdArgs.push_back(
"-framework");
790 CmdArgs.push_back(
"Foundation");
792 CmdArgs.push_back(
"-lobjc");
796 CmdArgs.push_back(
"-arch_multiple");
797 CmdArgs.push_back(
"-final_output");
798 CmdArgs.push_back(LinkingOutput);
801 if (Args.hasArg(options::OPT_fnested_functions))
802 CmdArgs.push_back(
"-allow_stack_execute");
807 if (!Parallelism.empty()) {
808 CmdArgs.push_back(
"-mllvm");
809 unsigned NumThreads =
810 llvm::get_threadpool_strategy(Parallelism)->compute_thread_count();
811 CmdArgs.push_back(Args.MakeArgString(
"-threads=" + Twine(NumThreads)));
817 bool NoStdOrDefaultLibs =
818 Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
819 bool ForceLinkBuiltins = Args.hasArg(options::OPT_fapple_link_rtlib);
820 if (!NoStdOrDefaultLibs || ForceLinkBuiltins) {
825 if (NoStdOrDefaultLibs && ForceLinkBuiltins) {
833 Args.ClaimAllArgs(options::OPT_pthread);
834 Args.ClaimAllArgs(options::OPT_pthreads);
838 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
842 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
843 Args.AddAllArgs(CmdArgs, options::OPT_F);
846 for (
const Arg *A : Args.filtered(options::OPT_iframework))
847 CmdArgs.push_back(Args.MakeArgString(std::string(
"-F") + A->getValue()));
849 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
850 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
851 if (A->getValue() == StringRef(
"Accelerate")) {
852 CmdArgs.push_back(
"-framework");
853 CmdArgs.push_back(
"Accelerate");
862 bool NonStandardSearchPath =
false;
864 if (Triple.isDriverKit()) {
866 NonStandardSearchPath =
867 Version.getMajor() < 605 ||
868 (Version.getMajor() == 605 && Version.getMinor().value_or(0) < 1);
873 if (NonStandardSearchPath) {
874 if (
auto *Sysroot = Args.getLastArg(options::OPT_isysroot)) {
875 auto AddSearchPath = [&](StringRef Flag, StringRef SearchPath) {
878 llvm::sys::path::append(P, SearchPath);
880 CmdArgs.push_back(Args.MakeArgString(Flag + P));
883 AddSearchPath(
"-L",
"/usr/lib");
884 AddSearchPath(
"-F",
"/System/Library/Frameworks");
890 if (Version >= VersionTuple(705) || LinkerIsLLD) {
898 std::unique_ptr<Command> Cmd = std::make_unique<Command>(
899 JA, *
this, ResponseSupport, Exec, CmdArgs, Inputs, Output);
900 Cmd->setInputFileList(std::move(InputFileList));
901 C.addCommand(std::move(Cmd));
908 const char *LinkingOutput)
const {
912 Args.ClaimAllArgs(options::OPT_g_Group);
914 Args.ClaimAllArgs(options::OPT_emit_llvm);
917 Args.ClaimAllArgs(options::OPT_w);
919 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
921 ArgStringList CmdArgs;
922 CmdArgs.push_back(
"-static");
924 if (Args.hasArg(options::OPT_static_lib_target_arch_only))
927 if (Args.hasFlag(options::OPT_static_lib_deterministic,
928 options::OPT_no_static_lib_deterministic,
930 CmdArgs.push_back(
"-D");
933 Args.AddAllArgs(CmdArgs, options::OPT_L);
934 Args.AddAllArgs(CmdArgs, options::OPT_F);
937 for (
const Arg *A : Args.filtered(options::OPT_iframework))
938 CmdArgs.push_back(Args.MakeArgString(std::string(
"-F") + A->getValue()));
940 if (!Args.hasFlag(options::OPT_static_lib_warn_no_symbols,
941 options::OPT_no_static_lib_warn_no_symbols,
943 CmdArgs.push_back(
"-no_warning_for_no_symbols");
945 Args.AddAllArgValues(CmdArgs, options::OPT_Xstatic_lib_tool);
947 CmdArgs.push_back(
"-o");
952 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
954 for (
const auto &II : Inputs) {
956 if (II.isFilename()) {
957 CmdArgs.push_back(II.getFilename());
966 const Arg &A = II.getInputArg();
970 if (A.getOption().matches(options::OPT_filelist) ||
971 A.getOption().matches(options::OPT_l) ||
972 A.getOption().matches(options::OPT_framework))
973 A.renderAsInput(Args, CmdArgs);
975 D.
Diag(diag::warn_drv_unused_argument) << A.getAsString(Args);
981 if (Output.
isFilename() && llvm::sys::fs::exists(OutputFileName)) {
982 if (std::error_code EC = llvm::sys::fs::remove(OutputFileName)) {
983 D.
Diag(diag::err_drv_unable_to_remove_file) << EC.message();
988 const char *Exec = Args.MakeArgString(
getToolChain().GetStaticLibToolPath());
989 C.addCommand(std::make_unique<Command>(JA, *
this,
991 Exec, CmdArgs, Inputs, Output));
998 const char *LinkingOutput)
const {
999 ArgStringList CmdArgs;
1001 CmdArgs.push_back(
"-create");
1002 assert(Output.
isFilename() &&
"Unexpected lipo output.");
1004 CmdArgs.push_back(
"-output");
1007 for (
const auto &II : Inputs) {
1008 assert(II.isFilename() &&
"Unexpected lipo input.");
1009 CmdArgs.push_back(II.getFilename());
1012 StringRef LipoName = Args.getLastArgValue(options::OPT_fuse_lipo_EQ,
"lipo");
1014 Args.MakeArgString(
getToolChain().GetProgramPath(LipoName.data()));
1016 Exec, CmdArgs, Inputs, Output));
1022 const ArgList &Args,
1023 const char *LinkingOutput)
const {
1024 ArgStringList CmdArgs;
1026 CmdArgs.push_back(
"-o");
1029 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
1031 assert(Input.
isFilename() &&
"Unexpected dsymutil input.");
1035 Args.MakeArgString(
getToolChain().GetProgramPath(
"dsymutil"));
1037 Exec, CmdArgs, Inputs, Output));
1043 const ArgList &Args,
1044 const char *LinkingOutput)
const {
1045 ArgStringList CmdArgs;
1046 CmdArgs.push_back(
"--verify");
1047 CmdArgs.push_back(
"--debug-info");
1048 CmdArgs.push_back(
"--eh-frame");
1049 CmdArgs.push_back(
"--quiet");
1051 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
1053 assert(Input.
isFilename() &&
"Unexpected verify input");
1059 Args.MakeArgString(
getToolChain().GetProgramPath(
"dwarfdump"));
1061 Exec, CmdArgs, Inputs, Output));
1071 const ArgList &Args)
1083 if (Ty == types::TY_PP_Asm)
1084 return types::TY_Asm;
1104 auto T = llvm::Triple(Twine(
"arm64-apple-") +
1105 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
1129 ArgStringList &CC1Args)
const {
1134 ArgStringList &CC1Args)
const {
1139 ArgStringList &CC1Args)
const {
1148 return llvm::StringSwitch<const char *>(
Arch)
1149 .Case(
"armv6k",
"armv6")
1150 .Case(
"armv6m",
"armv6m")
1151 .Case(
"armv5tej",
"armv5")
1152 .Case(
"xscale",
"xscale")
1153 .Case(
"armv4t",
"armv4t")
1154 .Case(
"armv7",
"armv7")
1155 .Cases({
"armv7a",
"armv7-a"},
"armv7")
1156 .Cases({
"armv7r",
"armv7-r"},
"armv7")
1157 .Cases({
"armv7em",
"armv7e-m"},
"armv7em")
1158 .Cases({
"armv7k",
"armv7-k"},
"armv7k")
1159 .Cases({
"armv7m",
"armv7-m"},
"armv7m")
1160 .Cases({
"armv7s",
"armv7-s"},
"armv7s")
1161 .Cases({
"armv8-m.base",
"armv8m.base"},
"armv8m.base")
1162 .Cases({
"armv8-m.main",
"armv8m.main"},
"armv8m.main")
1163 .Cases({
"armv8.1-m.main",
"armv8m.main"},
"armv8.1m.main")
1168 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseCPUArch(CPU);
1169 if (ArchKind == llvm::ARM::ArchKind::INVALID)
1171 StringRef
Arch = llvm::ARM::getArchName(ArchKind);
1175 if (
Arch.starts_with(
"armv5"))
1178 else if (
Arch.starts_with(
"armv6") && !
Arch.ends_with(
"6m"))
1181 else if (
Arch.ends_with(
"v7a"))
1191 case llvm::Triple::aarch64_32:
1194 case llvm::Triple::aarch64: {
1200 case llvm::Triple::thumb:
1201 case llvm::Triple::arm:
1202 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1206 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1215 if (LinkerVersion) {
1217 VersionTuple NewLinkerVersion;
1218 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ))
1219 (void)NewLinkerVersion.tryParse(A->getValue());
1220 assert(NewLinkerVersion == LinkerVersion);
1222 return *LinkerVersion;
1225 VersionTuple NewLinkerVersion;
1226 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1229 if (NewLinkerVersion.tryParse(A->getValue()) ||
1230 NewLinkerVersion.getSubbuild())
1232 << A->getAsString(Args);
1235 LinkerVersion = NewLinkerVersion;
1236 return *LinkerVersion;
1245 llvm::Triple::OSType OS =
getTriple().getOS();
1249 case llvm::Triple::Darwin:
1250 case llvm::Triple::MacOSX:
1253 case llvm::Triple::IOS:
1256 case llvm::Triple::TvOS:
1259 case llvm::Triple::WatchOS:
1262 case llvm::Triple::XROS:
1265 case llvm::Triple::DriverKit:
1274 if (
getTriple().isSimulatorEnvironment())
1276 else if (
getTriple().isMacCatalystEnvironment())
1280 if (Platform ==
MacOS) {
1284 if (!
getTriple().getMacOSXVersion(OsVer))
1289 setTarget(Platform, Environment, OsVer.getMajor(),
1290 OsVer.getMinor().value_or(0), OsVer.getSubminor().value_or(0),
1302void Darwin::VerifyTripleForSDK(
const llvm::opt::ArgList &Args,
1303 const llvm::Triple &Triple)
const {
1305 if (!
SDKInfo->supportsTriple(Triple))
1307 <<
SDKInfo->getDisplayName() << Triple.getTriple();
1308 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
1311 const char *isysroot = A->getValue();
1313 if (!SDKName.empty()) {
1314 bool supported =
true;
1315 if (Triple.isWatchOS())
1316 supported = SDKName.starts_with(
"Watch");
1317 else if (Triple.isTvOS())
1318 supported = SDKName.starts_with(
"AppleTV");
1319 else if (Triple.isDriverKit())
1320 supported = SDKName.starts_with(
"DriverKit");
1321 else if (Triple.isiOS())
1322 supported = SDKName.starts_with(
"iPhone");
1323 else if (Triple.isMacOSX())
1324 supported = SDKName.starts_with(
"MacOSX");
1330 << SDKName << Triple.getTriple();
1347 return Triple.getTriple();
1359 Str += llvm::Triple::getOSTypeName(llvm::Triple::XROS);
1361 Str += llvm::Triple::getOSTypeName(llvm::Triple::Firmware);
1365 Triple.setOSName(Str);
1367 VerifyTripleForSDK(Args, Triple);
1369 return Triple.getTriple();
1381 return Dsymutil.get();
1385 return VerifyDebug.get();
1402 const ArgList &Args)
1403 :
Darwin(D, Triple, Args) {}
1407 CC1Args.push_back(
"-Wundef-prefix=TARGET_OS_");
1408 CC1Args.push_back(
"-Werror=undef-prefix");
1419 CC1Args.push_back(
"-Wdeprecated-objc-isa-usage");
1420 CC1Args.push_back(
"-Werror=deprecated-objc-isa-usage");
1425 CC1Args.push_back(
"-Werror=implicit-function-declaration");
1430 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
1440 static constexpr llvm::StringLiteral XcodeAppSuffix(
1441 ".app/Contents/Developer");
1442 size_t Index = PathIntoXcode.find(XcodeAppSuffix);
1443 if (Index == StringRef::npos)
1445 return PathIntoXcode.take_front(Index + XcodeAppSuffix.size());
1449 ArgStringList &CmdArgs)
const {
1468 llvm::sys::path::remove_filename(P);
1469 llvm::sys::path::remove_filename(P);
1470 llvm::sys::path::append(P,
"lib",
"arc");
1476 if (!
getVFS().exists(P)) {
1477 auto updatePath = [&](
const Arg *A) {
1481 if (XcodePathForSDK.empty())
1484 P = XcodePathForSDK;
1485 llvm::sys::path::append(P,
"Toolchains/XcodeDefault.xctoolchain/usr",
1487 return getVFS().exists(P);
1490 bool updated =
false;
1491 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot))
1492 updated = updatePath(A);
1495 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1500 CmdArgs.push_back(
"-force_load");
1501 llvm::sys::path::append(P,
"libarclite_");
1504 P +=
"watchsimulator";
1508 P +=
"appletvsimulator";
1512 P +=
"iphonesimulator";
1520 getDriver().
Diag(clang::diag::err_drv_darwin_sdk_missing_arclite) << P;
1522 CmdArgs.push_back(Args.MakeArgString(P));
1559 bool IsShared)
const {
1567 const char *LibArg = Args.MakeArgString(P);
1568 CmdArgs.push_back(LibArg);
1576 assert(StringRef(P).ends_with(
".dylib") &&
"must be a dynamic library");
1580 CmdArgs.push_back(
"-rpath");
1581 CmdArgs.push_back(
"@executable_path");
1585 CmdArgs.push_back(
"-rpath");
1586 CmdArgs.push_back(Args.MakeArgString(llvm::sys::path::parent_path(P)));
1593 "it doesn't make sense to ask for the compiler-rt library name as an "
1597 if (Component !=
"builtins") {
1598 MachOLibName +=
'.';
1599 MachOLibName += Component;
1604 llvm::sys::path::append(FullPath,
"lib",
"darwin",
"macho_embedded",
1606 return std::string(FullPath);
1616 "it doesn't make sense to ask for the compiler-rt library name as an "
1620 if (Component !=
"builtins") {
1621 DarwinLibName += Component;
1622 DarwinLibName +=
'_';
1628 llvm::sys::path::append(FullPath,
"lib",
"darwin", DarwinLibName);
1629 return std::string(FullPath);
1634 auto BeginSDK = llvm::sys::path::rbegin(isysroot);
1635 auto EndSDK = llvm::sys::path::rend(isysroot);
1636 for (
auto IT = BeginSDK; IT != EndSDK; ++IT) {
1637 StringRef SDK = *IT;
1638 if (SDK.consume_back(
".sdk"))
1668 llvm_unreachable(
"Unsupported platform");
1673 for (Arg *A : Args) {
1674 if (A->getOption().matches(options::OPT_exported__symbols__list))
1676 if (!A->getOption().matches(options::OPT_Wl_COMMA) &&
1677 !A->getOption().matches(options::OPT_Xlinker))
1679 if (A->containsValue(
"-exported_symbols_list") ||
1680 A->containsValue(
"-exported_symbol"))
1688 CmdArgs.push_back(
"-exported_symbol");
1689 CmdArgs.push_back(Symbol);
1699 StringRef Segment, StringRef Section) {
1700 for (
const char *A : {
"-sectalign", Args.MakeArgString(Segment),
1701 Args.MakeArgString(Section),
"0x4000"})
1702 CmdArgs.push_back(A);
1706 ArgStringList &CmdArgs)
const {
1735 for (
auto IPSK : {llvm::IPSK_cnts, llvm::IPSK_bitmap, llvm::IPSK_data}) {
1737 Args, CmdArgs,
"__DATA",
1738 llvm::getInstrProfSectionName(IPSK, llvm::Triple::MachO,
1744void DarwinClang::AddLinkSanitizerLibArgs(
const ArgList &Args,
1745 ArgStringList &CmdArgs,
1746 StringRef Sanitizer,
1747 bool Shared)
const {
1753 const ArgList &Args)
const {
1754 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
1755 StringRef
Value = A->getValue();
1756 if (
Value !=
"compiler-rt" &&
Value !=
"platform")
1757 getDriver().
Diag(clang::diag::err_drv_unsupported_rtlib_for_platform)
1758 <<
Value <<
"darwin";
1765 ArgStringList &CmdArgs,
1766 bool ForceLinkBuiltinRT)
const {
1776 if (Args.hasArg(options::OPT_static) ||
1777 Args.hasArg(options::OPT_fapple_kext) ||
1778 Args.hasArg(options::OPT_mkernel)) {
1779 if (ForceLinkBuiltinRT)
1787 if (
const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
1788 getDriver().
Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
1795 const char *sanitizer =
nullptr;
1797 sanitizer =
"UndefinedBehaviorSanitizer";
1799 sanitizer =
"RealtimeSanitizer";
1801 sanitizer =
"AddressSanitizer";
1803 sanitizer =
"ThreadSanitizer";
1806 getDriver().
Diag(diag::err_drv_unsupported_static_sanitizer_darwin)
1815 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan_abi",
false);
1818 "Static sanitizer runtimes not supported");
1819 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan");
1824 "Static sanitizer runtimes not supported");
1825 AddLinkSanitizerLibArgs(Args, CmdArgs,
"rtsan");
1828 AddLinkSanitizerLibArgs(Args, CmdArgs,
"lsan");
1831 "Static sanitizer runtimes not supported");
1832 AddLinkSanitizerLibArgs(
1838 "Static sanitizer runtimes not supported");
1839 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tsan");
1842 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tysan");
1843 if (Sanitize.
needsFuzzer() && !Args.hasArg(options::OPT_dynamiclib)) {
1844 AddLinkSanitizerLibArgs(Args, CmdArgs,
"fuzzer",
false);
1856 AddLinkSanitizerLibArgs(Args, CmdArgs,
"stats");
1864 llvm::memprof::getMemprofOptionsSymbolDarwinLinkageName().data());
1874 CmdArgs.push_back(
"-framework");
1875 CmdArgs.push_back(
"DriverKit");
1881 CmdArgs.push_back(
"-lSystem");
1893 CmdArgs.push_back(
"-lgcc_s.1");
1902 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
1903 if (!SystemTriple.isMacOSX())
1904 return std::string(MacOSSDKVersion);
1905 VersionTuple SystemVersion;
1906 SystemTriple.getMacOSXVersion(SystemVersion);
1908 unsigned Major, Minor, Micro;
1912 return std::string(MacOSSDKVersion);
1913 VersionTuple SDKVersion(Major, Minor, Micro);
1915 if (SDKVersion > SystemVersion)
1916 return SystemVersion.getAsString();
1917 return std::string(MacOSSDKVersion);
1924struct DarwinPlatform {
1933 DeploymentTargetEnv,
1943 DarwinPlatformKind getPlatform()
const {
return Platform; }
1945 DarwinEnvironmentKind getEnvironment()
const {
return Environment; }
1947 void setEnvironment(DarwinEnvironmentKind Kind) {
1949 InferSimulatorFromArch =
false;
1952 const VersionTuple getOSVersion()
const {
1953 return UnderlyingOSVersion.value_or(VersionTuple());
1956 VersionTuple takeOSVersion() {
1957 assert(UnderlyingOSVersion.has_value() &&
1958 "attempting to get an unset OS version");
1959 VersionTuple
Result = *UnderlyingOSVersion;
1960 UnderlyingOSVersion.reset();
1963 bool isValidOSVersion()
const {
1964 return llvm::Triple::isValidVersionForOS(getOSFromPlatform(Platform),
1968 VersionTuple getCanonicalOSVersion()
const {
1969 return llvm::Triple::getCanonicalVersionForOS(
1970 getOSFromPlatform(Platform), getOSVersion(),
true);
1973 void setOSVersion(
const VersionTuple &Version) {
1974 UnderlyingOSVersion = Version;
1977 bool hasOSVersion()
const {
return UnderlyingOSVersion.has_value(); }
1979 VersionTuple getZipperedOSVersion()
const {
1980 assert(Environment == DarwinEnvironmentKind::MacCatalyst &&
1981 "zippered target version is specified only for Mac Catalyst");
1982 return ZipperedOSVersion;
1986 bool isExplicitlySpecified()
const {
return Kind <= DeploymentTargetEnv; }
1989 bool canInferSimulatorFromArch()
const {
return InferSimulatorFromArch; }
1991 const std::optional<llvm::Triple> &getTargetVariantTriple()
const {
1992 return TargetVariantTriple;
1996 void addOSVersionMinArgument(DerivedArgList &Args,
const OptTable &Opts) {
2000 assert(Kind != TargetArg && Kind != MTargetOSArg && Kind != OSVersionArg &&
2004 case DarwinPlatformKind::MacOS:
2005 Opt = options::OPT_mmacos_version_min_EQ;
2007 case DarwinPlatformKind::IPhoneOS:
2008 Opt = options::OPT_mios_version_min_EQ;
2010 case DarwinPlatformKind::TvOS:
2011 Opt = options::OPT_mtvos_version_min_EQ;
2013 case DarwinPlatformKind::WatchOS:
2014 Opt = options::OPT_mwatchos_version_min_EQ;
2020 Arg = Args.MakeJoinedArg(
nullptr, Opts.getOption(Opt), OSVersionStr);
2026 std::string
getAsString(DerivedArgList &Args,
const OptTable &Opts) {
2032 assert(Arg &&
"OS version argument not yet inferred");
2033 return Arg->getAsString(Args);
2034 case DeploymentTargetEnv:
2035 return (llvm::Twine(EnvVarName) +
"=" + OSVersionStr).str();
2036 case InferredFromSDK:
2037 case InferredFromArch:
2038 llvm_unreachable(
"Cannot print arguments for inferred OS version");
2040 llvm_unreachable(
"Unsupported Darwin Source Kind");
2044 std::string getInferredSource() {
2045 assert(!isExplicitlySpecified() &&
"OS version was not inferred");
2046 return InferredSource.str();
2049 void setEnvironment(llvm::Triple::EnvironmentType EnvType,
2050 const VersionTuple &OSVersion,
2051 const std::optional<DarwinSDKInfo> &SDKInfo) {
2053 case llvm::Triple::Simulator:
2054 Environment = DarwinEnvironmentKind::Simulator;
2056 case llvm::Triple::MacABI: {
2057 Environment = DarwinEnvironmentKind::MacCatalyst;
2059 ZipperedOSVersion = VersionTuple(10, 15);
2060 if (hasOSVersion() && SDKInfo) {
2061 if (
const auto *MacCatalystToMacOSMapping = SDKInfo->getVersionMapping(
2063 if (
auto MacOSVersion = MacCatalystToMacOSMapping->map(
2064 OSVersion, ZipperedOSVersion, std::nullopt)) {
2065 ZipperedOSVersion = *MacOSVersion;
2072 if (TargetVariantTriple) {
2073 auto TargetVariantVersion = TargetVariantTriple->getOSVersion();
2074 if (TargetVariantVersion.getMajor()) {
2075 if (TargetVariantVersion < ZipperedOSVersion)
2076 ZipperedOSVersion = std::move(TargetVariantVersion);
2086 static DarwinPlatform
2087 createFromTarget(
const llvm::Triple &TT, Arg *A,
2088 std::optional<llvm::Triple> TargetVariantTriple,
2089 const std::optional<DarwinSDKInfo> &SDKInfo) {
2090 DarwinPlatform
Result(TargetArg, getPlatformFromOS(TT.getOS()),
2091 TT.getOSVersion(), A);
2092 VersionTuple OsVersion = TT.getOSVersion();
2093 Result.TargetVariantTriple = std::move(TargetVariantTriple);
2094 Result.setEnvironment(TT.getEnvironment(), OsVersion, SDKInfo);
2097 static DarwinPlatform
2098 createFromMTargetOS(llvm::Triple::OSType OS, VersionTuple OSVersion,
2099 llvm::Triple::EnvironmentType Environment, Arg *A,
2100 const std::optional<DarwinSDKInfo> &SDKInfo) {
2101 DarwinPlatform
Result(MTargetOSArg, getPlatformFromOS(OS), OSVersion, A);
2102 Result.InferSimulatorFromArch =
false;
2103 Result.setEnvironment(Environment, OSVersion, SDKInfo);
2106 static DarwinPlatform createOSVersionArg(DarwinPlatformKind Platform, Arg *A,
2108 DarwinPlatform
Result{OSVersionArg, Platform,
2109 getVersionFromString(A->getValue()), A};
2111 Result.Environment = DarwinEnvironmentKind::Simulator;
2114 static DarwinPlatform createDeploymentTargetEnv(DarwinPlatformKind Platform,
2115 StringRef EnvVarName,
2116 StringRef OSVersion) {
2117 DarwinPlatform
Result(DeploymentTargetEnv, Platform,
2118 getVersionFromString(OSVersion));
2119 Result.EnvVarName = EnvVarName;
2122 static DarwinPlatform createFromSDKInfo(StringRef SDKRoot,
2123 const DarwinSDKInfo &SDKInfo) {
2125 const llvm::Triple::OSType
OS = PlatformTriple.getOS();
2127 if (OS == llvm::Triple::MacOSX)
2128 Version = getVersionFromString(
2130 DarwinPlatform
Result(InferredFromSDK, getPlatformFromOS(OS), Version);
2131 Result.Environment = getEnvKindFromEnvType(PlatformTriple.getEnvironment());
2132 Result.InferSimulatorFromArch =
false;
2133 Result.InferredSource = SDKRoot;
2136 static DarwinPlatform createFromSDK(StringRef SDKRoot,
2137 DarwinPlatformKind Platform,
2139 bool IsSimulator =
false) {
2140 DarwinPlatform
Result(InferredFromSDK, Platform,
2141 getVersionFromString(
Value));
2143 Result.Environment = DarwinEnvironmentKind::Simulator;
2144 Result.InferSimulatorFromArch =
false;
2145 Result.InferredSource = SDKRoot;
2148 static DarwinPlatform createFromArch(StringRef
Arch, llvm::Triple::OSType OS,
2149 VersionTuple Version) {
2151 DarwinPlatform(InferredFromArch, getPlatformFromOS(OS), Version);
2159 DarwinSDKInfo inferSDKInfo() {
2160 assert(Kind == InferredFromSDK &&
"can infer SDK info only");
2161 llvm::Triple::OSType
OS = getOSFromPlatform(Platform);
2162 llvm::Triple::EnvironmentType EnvironmentType =
2163 getEnvTypeFromEnvKind(Environment);
2164 return DarwinSDKInfo(OS, EnvironmentType, getOSVersion(),
2165 getDisplayName(Platform, Environment, getOSVersion()),
2167 VersionTuple(getOSVersion().getMajor(), 0, 99));
2171 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform, Arg *Argument)
2173 Arguments({Argument, VersionTuple().getAsString()}) {}
2174 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform,
2175 VersionTuple
Value, Arg *Argument =
nullptr)
2179 UnderlyingOSVersion =
Value;
2182 static VersionTuple getVersionFromString(
const StringRef Input) {
2183 llvm::VersionTuple Version;
2184 bool IsValid = !Version.tryParse(Input);
2185 assert(IsValid &&
"unable to convert input version to version tuple");
2190 static DarwinPlatformKind getPlatformFromOS(llvm::Triple::OSType OS) {
2192 case llvm::Triple::Darwin:
2193 case llvm::Triple::MacOSX:
2194 return DarwinPlatformKind::MacOS;
2195 case llvm::Triple::IOS:
2196 return DarwinPlatformKind::IPhoneOS;
2197 case llvm::Triple::TvOS:
2198 return DarwinPlatformKind::TvOS;
2199 case llvm::Triple::WatchOS:
2200 return DarwinPlatformKind::WatchOS;
2201 case llvm::Triple::XROS:
2202 return DarwinPlatformKind::XROS;
2203 case llvm::Triple::DriverKit:
2204 return DarwinPlatformKind::DriverKit;
2205 case llvm::Triple::Firmware:
2206 return DarwinPlatformKind::Firmware;
2208 llvm_unreachable(
"Unable to infer Darwin variant");
2212 static llvm::Triple::OSType getOSFromPlatform(DarwinPlatformKind Platform) {
2214 case DarwinPlatformKind::MacOS:
2215 return llvm::Triple::MacOSX;
2216 case DarwinPlatformKind::IPhoneOS:
2217 return llvm::Triple::IOS;
2218 case DarwinPlatformKind::TvOS:
2219 return llvm::Triple::TvOS;
2220 case DarwinPlatformKind::WatchOS:
2221 return llvm::Triple::WatchOS;
2222 case DarwinPlatformKind::DriverKit:
2223 return llvm::Triple::DriverKit;
2224 case DarwinPlatformKind::XROS:
2225 return llvm::Triple::XROS;
2226 case DarwinPlatformKind::Firmware:
2227 return llvm::Triple::Firmware;
2229 llvm_unreachable(
"Unknown DarwinPlatformKind enum");
2232 static DarwinEnvironmentKind
2233 getEnvKindFromEnvType(llvm::Triple::EnvironmentType EnvironmentType) {
2234 switch (EnvironmentType) {
2235 case llvm::Triple::UnknownEnvironment:
2236 return DarwinEnvironmentKind::NativeEnvironment;
2237 case llvm::Triple::Simulator:
2238 return DarwinEnvironmentKind::Simulator;
2239 case llvm::Triple::MacABI:
2240 return DarwinEnvironmentKind::MacCatalyst;
2242 llvm_unreachable(
"Unable to infer Darwin environment");
2246 static llvm::Triple::EnvironmentType
2247 getEnvTypeFromEnvKind(DarwinEnvironmentKind EnvironmentKind) {
2248 switch (EnvironmentKind) {
2249 case DarwinEnvironmentKind::NativeEnvironment:
2250 return llvm::Triple::UnknownEnvironment;
2251 case DarwinEnvironmentKind::Simulator:
2252 return llvm::Triple::Simulator;
2253 case DarwinEnvironmentKind::MacCatalyst:
2254 return llvm::Triple::MacABI;
2256 llvm_unreachable(
"Unknown DarwinEnvironmentKind enum");
2259 static std::string getDisplayName(DarwinPlatformKind TargetPlatform,
2260 DarwinEnvironmentKind TargetEnvironment,
2261 VersionTuple Version) {
2262 SmallVector<std::string, 3> Components;
2263 switch (TargetPlatform) {
2264 case DarwinPlatformKind::MacOS:
2265 Components.push_back(
"macOS");
2267 case DarwinPlatformKind::IPhoneOS:
2268 Components.push_back(
"iOS");
2270 case DarwinPlatformKind::TvOS:
2271 Components.push_back(
"tvOS");
2273 case DarwinPlatformKind::WatchOS:
2274 Components.push_back(
"watchOS");
2276 case DarwinPlatformKind::DriverKit:
2277 Components.push_back(
"DriverKit");
2280 llvm::reportFatalUsageError(Twine(
"Platform: '") +
2281 std::to_string(TargetPlatform) +
2282 "' is unsupported when inferring SDK Info.");
2284 switch (TargetEnvironment) {
2285 case DarwinEnvironmentKind::NativeEnvironment:
2287 case DarwinEnvironmentKind::Simulator:
2288 Components.push_back(
"Simulator");
2291 llvm::reportFatalUsageError(Twine(
"Environment: '") +
2292 std::to_string(TargetEnvironment) +
2293 "' is unsupported when inferring SDK Info.");
2295 Components.push_back(Version.getAsString());
2296 return join(Components,
" ");
2300 DarwinPlatformKind Platform;
2301 DarwinEnvironmentKind Environment = DarwinEnvironmentKind::NativeEnvironment;
2305 VersionTuple ZipperedOSVersion;
2310 std::optional<VersionTuple> UnderlyingOSVersion;
2311 bool InferSimulatorFromArch =
true;
2312 std::pair<Arg *, std::string>
Arguments;
2313 StringRef EnvVarName;
2316 StringRef InferredSource;
2319 std::optional<llvm::Triple> TargetVariantTriple;
2324std::optional<DarwinPlatform>
2325getDeploymentTargetFromOSVersionArg(DerivedArgList &Args,
2326 const Driver &TheDriver) {
2327 Arg *macOSVersion = Args.getLastArg(options::OPT_mmacos_version_min_EQ);
2328 Arg *iOSVersion = Args.getLastArg(options::OPT_mios_version_min_EQ,
2329 options::OPT_mios_simulator_version_min_EQ);
2331 Args.getLastArg(options::OPT_mtvos_version_min_EQ,
2332 options::OPT_mtvos_simulator_version_min_EQ);
2333 Arg *WatchOSVersion =
2334 Args.getLastArg(options::OPT_mwatchos_version_min_EQ,
2335 options::OPT_mwatchos_simulator_version_min_EQ);
2337 auto GetDarwinPlatform =
2338 [&](DarwinPlatform::DarwinPlatformKind Platform, Arg *VersionArg,
2339 bool IsSimulator) -> std::optional<DarwinPlatform> {
2340 if (StringRef(VersionArg->getValue()).empty()) {
2341 TheDriver.
Diag(diag::err_drv_missing_version_number)
2342 << VersionArg->getAsString(Args);
2343 return std::nullopt;
2345 return DarwinPlatform::createOSVersionArg(Platform, VersionArg,
2350 if (iOSVersion || TvOSVersion || WatchOSVersion) {
2351 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2352 << macOSVersion->getAsString(Args)
2353 << (iOSVersion ? iOSVersion
2354 : TvOSVersion ? TvOSVersion : WatchOSVersion)
2360 }
else if (iOSVersion) {
2361 if (TvOSVersion || WatchOSVersion) {
2362 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2363 << iOSVersion->getAsString(Args)
2364 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->
getAsString(Args);
2367 iOSVersion->getOption().getID() ==
2368 options::OPT_mios_simulator_version_min_EQ);
2369 }
else if (TvOSVersion) {
2370 if (WatchOSVersion) {
2371 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2372 << TvOSVersion->getAsString(Args)
2373 << WatchOSVersion->getAsString(Args);
2376 TvOSVersion->getOption().getID() ==
2377 options::OPT_mtvos_simulator_version_min_EQ);
2378 }
else if (WatchOSVersion)
2379 return GetDarwinPlatform(
2381 WatchOSVersion->getOption().getID() ==
2382 options::OPT_mwatchos_simulator_version_min_EQ);
2383 return std::nullopt;
2388std::optional<DarwinPlatform>
2389getDeploymentTargetFromEnvironmentVariables(
const Driver &TheDriver,
2390 const llvm::Triple &Triple) {
2391 const char *EnvVars[] = {
2392 "MACOSX_DEPLOYMENT_TARGET",
2393 "IPHONEOS_DEPLOYMENT_TARGET",
2394 "TVOS_DEPLOYMENT_TARGET",
2395 "WATCHOS_DEPLOYMENT_TARGET",
2396 "DRIVERKIT_DEPLOYMENT_TARGET",
2397 "XROS_DEPLOYMENT_TARGET"
2399 std::string Targets[std::size(EnvVars)];
2400 for (
const auto &I : llvm::enumerate(llvm::ArrayRef(EnvVars))) {
2401 if (
char *Env = ::getenv(I.value()))
2402 Targets[I.index()] = Env;
2411 if (Triple.getArch() == llvm::Triple::arm ||
2412 Triple.getArch() == llvm::Triple::aarch64 ||
2413 Triple.getArch() == llvm::Triple::thumb)
2420 unsigned FirstTarget = std::size(Targets);
2421 for (
unsigned I = 0; I != std::size(Targets); ++I) {
2422 if (Targets[I].empty())
2424 if (FirstTarget == std::size(Targets))
2427 TheDriver.
Diag(diag::err_drv_conflicting_deployment_targets)
2428 << Targets[FirstTarget] << Targets[I];
2432 for (
const auto &
Target : llvm::enumerate(llvm::ArrayRef(Targets))) {
2433 if (!
Target.value().empty())
2434 return DarwinPlatform::createDeploymentTargetEnv(
2438 return std::nullopt;
2444std::optional<DarwinPlatform>
2445inferDeploymentTargetFromSDK(DerivedArgList &Args,
2446 const std::optional<DarwinSDKInfo> &SDKInfo) {
2447 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2449 return std::nullopt;
2450 StringRef isysroot = A->getValue();
2452 return DarwinPlatform::createFromSDKInfo(isysroot, *SDKInfo);
2456 return std::nullopt;
2458 std::string Version;
2461 size_t StartVer = SDK.find_first_of(
"0123456789");
2462 size_t EndVer = SDK.find_last_of(
"0123456789");
2463 if (StartVer != StringRef::npos && EndVer > StartVer)
2464 Version = std::string(SDK.slice(StartVer, EndVer + 1));
2465 if (Version.empty())
2466 return std::nullopt;
2468 if (SDK.starts_with(
"iPhoneOS") || SDK.starts_with(
"iPhoneSimulator"))
2469 return DarwinPlatform::createFromSDK(
2471 SDK.starts_with(
"iPhoneSimulator"));
2472 else if (SDK.starts_with(
"MacOSX"))
2473 return DarwinPlatform::createFromSDK(isysroot,
Darwin::MacOS,
2475 else if (SDK.starts_with(
"WatchOS") || SDK.starts_with(
"WatchSimulator"))
2476 return DarwinPlatform::createFromSDK(
2478 SDK.starts_with(
"WatchSimulator"));
2479 else if (SDK.starts_with(
"AppleTVOS") || SDK.starts_with(
"AppleTVSimulator"))
2480 return DarwinPlatform::createFromSDK(
2482 SDK.starts_with(
"AppleTVSimulator"));
2483 else if (SDK.starts_with(
"DriverKit"))
2485 return std::nullopt;
2489VersionTuple getInferredOSVersion(llvm::Triple::OSType OS,
2490 const llvm::Triple &Triple,
2491 const Driver &TheDriver) {
2492 VersionTuple OsVersion;
2493 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
2495 case llvm::Triple::Darwin:
2496 case llvm::Triple::MacOSX:
2499 if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
2500 !Triple.getOSMajorVersion())
2501 SystemTriple.getMacOSXVersion(OsVersion);
2502 else if (!Triple.getMacOSXVersion(OsVersion))
2503 TheDriver.
Diag(diag::err_drv_invalid_darwin_version)
2504 << Triple.getOSName();
2506 case llvm::Triple::IOS:
2507 if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
2508 OsVersion = VersionTuple(13, 1);
2510 OsVersion = Triple.getiOSVersion();
2512 case llvm::Triple::TvOS:
2513 OsVersion = Triple.getOSVersion();
2515 case llvm::Triple::WatchOS:
2516 OsVersion = Triple.getWatchOSVersion();
2518 case llvm::Triple::DriverKit:
2519 OsVersion = Triple.getDriverKitVersion();
2522 OsVersion = Triple.getOSVersion();
2523 if (!OsVersion.getMajor())
2524 OsVersion = OsVersion.withMajorReplaced(1);
2531std::optional<DarwinPlatform>
2532inferDeploymentTargetFromArch(DerivedArgList &Args,
const Darwin &Toolchain,
2533 const llvm::Triple &Triple,
2534 const Driver &TheDriver) {
2535 llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS;
2538 if (MachOArchName ==
"arm64" || MachOArchName ==
"arm64e")
2539 OSTy = llvm::Triple::MacOSX;
2540 else if (MachOArchName ==
"armv7" || MachOArchName ==
"armv7s" ||
2541 MachOArchName ==
"armv6")
2542 OSTy = llvm::Triple::IOS;
2543 else if (MachOArchName ==
"armv7k" || MachOArchName ==
"arm64_32")
2544 OSTy = llvm::Triple::WatchOS;
2545 else if (MachOArchName !=
"armv6m" && MachOArchName !=
"armv7m" &&
2546 MachOArchName !=
"armv7em" && MachOArchName !=
"armv8m.base" &&
2547 MachOArchName !=
"armv8m.main" && MachOArchName !=
"armv8.1m.main")
2548 OSTy = llvm::Triple::MacOSX;
2549 if (OSTy == llvm::Triple::UnknownOS)
2550 return std::nullopt;
2551 return DarwinPlatform::createFromArch(
2552 MachOArchName, OSTy, getInferredOSVersion(OSTy, Triple, TheDriver));
2556std::optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
2557 DerivedArgList &Args,
const llvm::Triple &Triple,
const Driver &TheDriver,
2558 const std::optional<DarwinSDKInfo> &SDKInfo) {
2559 if (!Args.hasArg(options::OPT_target))
2560 return std::nullopt;
2561 if (Triple.getOS() == llvm::Triple::Darwin ||
2562 Triple.getOS() == llvm::Triple::UnknownOS)
2563 return std::nullopt;
2564 std::optional<llvm::Triple> TargetVariantTriple;
2565 for (
const Arg *A : Args.filtered(options::OPT_darwin_target_variant)) {
2566 llvm::Triple TVT(A->getValue());
2568 if ((Triple.getArch() == llvm::Triple::aarch64 ||
2569 TVT.getArchName() == Triple.getArchName()) &&
2570 TVT.getArch() == Triple.getArch() &&
2571 TVT.getSubArch() == Triple.getSubArch() &&
2572 TVT.getVendor() == Triple.getVendor()) {
2573 if (TargetVariantTriple)
2578 if ((Triple.isMacOSX() && TVT.getOS() == llvm::Triple::IOS &&
2579 TVT.isMacCatalystEnvironment()) ||
2580 (TVT.isMacOSX() && Triple.getOS() == llvm::Triple::IOS &&
2581 Triple.isMacCatalystEnvironment())) {
2582 TargetVariantTriple = TVT;
2585 TheDriver.
Diag(diag::err_drv_target_variant_invalid)
2586 << A->getSpelling() << A->getValue();
2589 DarwinPlatform PlatformAndVersion = DarwinPlatform::createFromTarget(
2590 Triple, Args.getLastArg(options::OPT_target), TargetVariantTriple,
2593 return PlatformAndVersion;
2597std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2598 DerivedArgList &Args,
const Driver &TheDriver,
2599 const std::optional<DarwinSDKInfo> &SDKInfo) {
2600 auto *A = Args.getLastArg(options::OPT_mtargetos_EQ);
2602 return std::nullopt;
2603 llvm::Triple TT(llvm::Twine(
"unknown-apple-") + A->getValue());
2604 switch (TT.getOS()) {
2605 case llvm::Triple::MacOSX:
2606 case llvm::Triple::IOS:
2607 case llvm::Triple::TvOS:
2608 case llvm::Triple::WatchOS:
2609 case llvm::Triple::XROS:
2612 TheDriver.
Diag(diag::err_drv_invalid_os_in_arg)
2613 << TT.getOSName() << A->getAsString(Args);
2614 return std::nullopt;
2617 VersionTuple Version = TT.getOSVersion();
2618 if (!Version.getMajor()) {
2619 TheDriver.
Diag(diag::err_drv_invalid_version_number)
2620 << A->getAsString(Args);
2621 return std::nullopt;
2623 return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
2624 TT.getEnvironment(), A, SDKInfo);
2627std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS,
2628 const ArgList &Args,
2629 const Driver &TheDriver) {
2630 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2632 return std::nullopt;
2633 StringRef isysroot = A->getValue();
2635 if (!SDKInfoOrErr) {
2636 llvm::consumeError(SDKInfoOrErr.takeError());
2637 TheDriver.
Diag(diag::warn_drv_darwin_sdk_invalid_settings);
2638 return std::nullopt;
2640 return *SDKInfoOrErr;
2645void Darwin::AddDeploymentTarget(DerivedArgList &Args)
const {
2651 bool TryXcselect =
false;
2657 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2659 if (!
getVFS().exists(A->getValue()))
2660 getDriver().
Diag(clang::diag::warn_missing_sysroot) << A->getValue();
2661 }
else if (
const char *env = ::getenv(
"SDKROOT")) {
2664 if (llvm::sys::path::is_absolute(env) &&
getVFS().exists(env) &&
2665 StringRef(env) !=
"/") {
2666 Args.append(Args.MakeSeparateArg(
2667 nullptr, Opts.getOption(options::OPT_isysroot), env));
2670 TryXcselect = !Args.hasArg(options::OPT__sysroot_EQ) &&
2671 !Args.hasArg(options::OPT_no_xcselect);
2681 std::optional<DarwinPlatform> PlatformAndVersion =
2683 if (PlatformAndVersion) {
2685 if (
const auto *MTargetOSArg = Args.getLastArg(options::OPT_mtargetos_EQ)) {
2686 std::string TargetArgStr = PlatformAndVersion->getAsString(Args, Opts);
2687 std::string MTargetOSArgStr = MTargetOSArg->getAsString(Args);
2689 << TargetArgStr << MTargetOSArgStr;
2692 bool TripleProvidedOSVersion = PlatformAndVersion->hasOSVersion();
2693 if (!TripleProvidedOSVersion)
2694 PlatformAndVersion->setOSVersion(
2697 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2698 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2699 if (PlatformAndVersionFromOSVersionArg) {
2700 unsigned TargetMajor, TargetMinor, TargetMicro;
2702 unsigned ArgMajor, ArgMinor, ArgMicro;
2704 if (PlatformAndVersion->getPlatform() !=
2705 PlatformAndVersionFromOSVersionArg->getPlatform() ||
2707 PlatformAndVersion->getOSVersion().getAsString(), TargetMajor,
2708 TargetMinor, TargetMicro, TargetExtra) &&
2710 PlatformAndVersionFromOSVersionArg->getOSVersion().getAsString(),
2711 ArgMajor, ArgMinor, ArgMicro, ArgExtra) &&
2712 (VersionTuple(TargetMajor, TargetMinor, TargetMicro) !=
2713 VersionTuple(ArgMajor, ArgMinor, ArgMicro) ||
2714 TargetExtra != ArgExtra))) {
2717 if (PlatformAndVersion->getPlatform() ==
2718 PlatformAndVersionFromOSVersionArg->getPlatform() &&
2719 !TripleProvidedOSVersion) {
2720 PlatformAndVersion->setOSVersion(
2721 PlatformAndVersionFromOSVersionArg->getOSVersion());
2725 std::string OSVersionArg =
2726 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2727 std::string TargetArg = PlatformAndVersion->getAsString(Args, Opts);
2729 << OSVersionArg << TargetArg;
2733 }
else if ((PlatformAndVersion = getDeploymentTargetFromMTargetOSArg(
2737 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2738 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2739 if (PlatformAndVersionFromOSVersionArg) {
2740 std::string MTargetOSArgStr = PlatformAndVersion->getAsString(Args, Opts);
2741 std::string OSVersionArgStr =
2742 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2744 << MTargetOSArgStr << OSVersionArgStr;
2748 PlatformAndVersion = getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2751 if (!PlatformAndVersion) {
2752 PlatformAndVersion =
2754 if (PlatformAndVersion) {
2756 std::optional<DarwinPlatform> SDKTarget =
2757 inferDeploymentTargetFromSDK(Args,
SDKInfo);
2759 PlatformAndVersion->setEnvironment(SDKTarget->getEnvironment());
2765 if (!PlatformAndVersion) {
2766 PlatformAndVersion = inferDeploymentTargetFromSDK(Args,
SDKInfo);
2769 if (PlatformAndVersion && !
SDKInfo)
2770 SDKInfo = PlatformAndVersion->inferSDKInfo();
2774 if (!PlatformAndVersion)
2775 PlatformAndVersion =
2779 assert(PlatformAndVersion &&
"Unable to infer Darwin variant");
2780 if (!PlatformAndVersion->isValidOSVersion()) {
2781 if (PlatformAndVersion->isExplicitlySpecified())
2783 << PlatformAndVersion->getAsString(Args, Opts);
2785 getDriver().
Diag(diag::err_drv_invalid_version_number_inferred)
2786 << PlatformAndVersion->getOSVersion().getAsString()
2787 << PlatformAndVersion->getInferredSource();
2792 VersionTuple CanonicalVersion = PlatformAndVersion->getCanonicalOSVersion();
2793 if (CanonicalVersion != PlatformAndVersion->getOSVersion()) {
2794 getDriver().
Diag(diag::warn_drv_overriding_deployment_version)
2795 << PlatformAndVersion->getOSVersion().getAsString()
2796 << CanonicalVersion.getAsString();
2797 PlatformAndVersion->setOSVersion(CanonicalVersion);
2800 PlatformAndVersion->addOSVersionMinArgument(Args, Opts);
2803 unsigned Major, Minor, Micro;
2806 const unsigned MajorVersionLimit = 1000;
2807 const VersionTuple OSVersion = PlatformAndVersion->takeOSVersion();
2808 const std::string OSVersionStr = OSVersion.getAsString();
2810 if (Platform ==
MacOS) {
2811#ifdef CLANG_USE_XCSELECT
2814 if (!::xcselect_host_sdk_path(CLANG_XCSELECT_HOST_SDK_POLICY, &p)) {
2815 Args.append(Args.MakeSeparateArg(
2816 nullptr, Opts.getOption(options::OPT_isysroot), p));
2825 HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
2828 << PlatformAndVersion->getAsString(Args, Opts);
2832 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2834 << PlatformAndVersion->getAsString(Args, Opts);
2836 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst &&
2837 (Major < 13 || (Major == 13 && Minor < 1))) {
2839 << PlatformAndVersion->getAsString(Args, Opts);
2846 if (
getTriple().isArch32Bit() && Major >= 11) {
2848 if (PlatformAndVersion->isExplicitlySpecified()) {
2849 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst)
2850 getDriver().
Diag(diag::err_invalid_macos_32bit_deployment_target);
2853 << PlatformAndVersion->getAsString(Args, Opts);
2861 }
else if (Platform ==
TvOS) {
2864 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2866 << PlatformAndVersion->getAsString(Args, Opts);
2867 }
else if (Platform ==
WatchOS) {
2870 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2872 << PlatformAndVersion->getAsString(Args, Opts);
2876 HadExtra || Major < 19 || Major >= MajorVersionLimit || Minor >= 100 ||
2879 << PlatformAndVersion->getAsString(Args, Opts);
2883 HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2886 << PlatformAndVersion->getAsString(Args, Opts);
2893 PlatformAndVersion->canInferSimulatorFromArch() &&
getTriple().isX86())
2896 VersionTuple ZipperedOSVersion;
2898 ZipperedOSVersion = PlatformAndVersion->getZipperedOSVersion();
2899 setTarget(Platform, Environment, Major, Minor, Micro, ZipperedOSVersion);
2911 return !
SDKInfo->getPlatformPrefix(
T).empty();
2920 const llvm::Triple &
T)
const {
2922 const StringRef PlatformPrefix =
SDKInfo->getPlatformPrefix(
T);
2923 if (!PlatformPrefix.empty())
2924 llvm::sys::path::append(Path, PlatformPrefix);
2925 }
else if (
T.isDriverKit()) {
2928 llvm::sys::path::append(Path,
"System",
"DriverKit");
2937 if (DriverArgs.hasArg(options::OPT_isysroot))
2938 Path = DriverArgs.getLastArgValue(options::OPT_isysroot);
2949 const llvm::opt::ArgList &DriverArgs,
2950 llvm::opt::ArgStringList &CC1Args)
const {
2955 bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc);
2956 bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc);
2957 bool NoBuiltinInc = DriverArgs.hasFlag(
2958 options::OPT_nobuiltininc, options::OPT_ibuiltininc,
false);
2959 bool ForceBuiltinInc = DriverArgs.hasFlag(
2960 options::OPT_ibuiltininc, options::OPT_nobuiltininc,
false);
2963 if (!NoStdInc && !NoStdlibInc) {
2965 llvm::sys::path::append(P,
"usr",
"local",
"include");
2970 if (!(NoStdInc && !ForceBuiltinInc) && !NoBuiltinInc) {
2972 llvm::sys::path::append(P,
"include");
2976 if (NoStdInc || NoStdlibInc)
2980 llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
2981 if (!CIncludeDirs.empty()) {
2983 CIncludeDirs.split(dirs,
":");
2984 for (llvm::StringRef dir : dirs) {
2985 llvm::StringRef Prefix =
2986 llvm::sys::path::is_absolute(dir) ?
"" : llvm::StringRef(Sysroot);
2992 llvm::sys::path::append(P,
"usr",
"include");
2998 const llvm::opt::ArgList &DriverArgs,
2999 llvm::opt::ArgStringList &CC1Args)
const {
3002 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc))
3011 llvm::sys::path::append(P1,
"System",
"Library",
"Frameworks");
3012 llvm::sys::path::append(P2,
"System",
"Library",
"SubFrameworks");
3013 llvm::sys::path::append(P3,
"Library",
"Frameworks");
3017bool DarwinClang::AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
3018 llvm::opt::ArgStringList &CC1Args,
3020 llvm::StringRef Version,
3021 llvm::StringRef ArchDir,
3022 llvm::StringRef BitDir)
const {
3023 llvm::sys::path::append(
Base, Version);
3031 if (!ArchDir.empty())
3032 llvm::sys::path::append(P, ArchDir);
3033 if (!BitDir.empty())
3034 llvm::sys::path::append(P, BitDir);
3041 llvm::sys::path::append(P,
"backward");
3049 const llvm::opt::ArgList &DriverArgs,
3050 llvm::opt::ArgStringList &CC1Args)
const {
3058 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
3059 options::OPT_nostdincxx))
3080 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
3081 if (
getVFS().exists(InstallBin)) {
3084 }
else if (DriverArgs.hasArg(options::OPT_v)) {
3085 llvm::errs() <<
"ignoring nonexistent directory \"" << InstallBin
3091 llvm::sys::path::append(SysrootUsr,
"usr",
"include",
"c++",
"v1");
3092 if (
getVFS().exists(SysrootUsr)) {
3095 }
else if (DriverArgs.hasArg(options::OPT_v)) {
3096 llvm::errs() <<
"ignoring nonexistent directory \"" << SysrootUsr
3105 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args);
3110void AppleMachO::AddGnuCPlusPlusIncludePaths(
3111 const llvm::opt::ArgList &DriverArgs,
3112 llvm::opt::ArgStringList &CC1Args)
const {}
3114void DarwinClang::AddGnuCPlusPlusIncludePaths(
3115 const llvm::opt::ArgList &DriverArgs,
3116 llvm::opt::ArgStringList &CC1Args)
const {
3118 llvm::sys::path::append(UsrIncludeCxx,
"usr",
"include",
"c++");
3120 llvm::Triple::ArchType arch =
getTriple().getArch();
3121 bool IsBaseFound =
true;
3126 case llvm::Triple::x86:
3127 case llvm::Triple::x86_64:
3128 IsBaseFound = AddGnuCPlusPlusIncludePaths(
3129 DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
"i686-apple-darwin10",
3130 arch == llvm::Triple::x86_64 ?
"x86_64" :
"");
3131 IsBaseFound |= AddGnuCPlusPlusIncludePaths(
3132 DriverArgs, CC1Args, UsrIncludeCxx,
"4.0.0",
"i686-apple-darwin8",
"");
3135 case llvm::Triple::arm:
3136 case llvm::Triple::thumb:
3138 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3139 "arm-apple-darwin10",
"v7");
3141 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3142 "arm-apple-darwin10",
"v6");
3145 case llvm::Triple::aarch64:
3147 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3148 "arm64-apple-darwin10",
"");
3158 ArgStringList &CmdArgs)
const {
3163 CmdArgs.push_back(
"-lc++");
3164 if (Args.hasArg(options::OPT_fexperimental_library))
3165 CmdArgs.push_back(
"-lc++experimental");
3175 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
3177 llvm::sys::path::append(P,
"usr",
"lib",
"libstdc++.dylib");
3179 if (!
getVFS().exists(P)) {
3180 llvm::sys::path::remove_filename(P);
3181 llvm::sys::path::append(P,
"libstdc++.6.dylib");
3182 if (
getVFS().exists(P)) {
3183 CmdArgs.push_back(Args.MakeArgString(P));
3192 if (!
getVFS().exists(
"/usr/lib/libstdc++.dylib") &&
3193 getVFS().exists(
"/usr/lib/libstdc++.6.dylib")) {
3194 CmdArgs.push_back(
"/usr/lib/libstdc++.6.dylib");
3199 CmdArgs.push_back(
"-lstdc++");
3205 ArgStringList &CmdArgs)
const {
3211 llvm::sys::path::append(P,
"lib",
"darwin");
3215 llvm::sys::path::append(P,
"libclang_rt.cc_kext_watchos.a");
3217 llvm::sys::path::append(P,
"libclang_rt.cc_kext_tvos.a");
3219 llvm::sys::path::append(P,
"libclang_rt.cc_kext_ios.a");
3223 llvm::sys::path::append(
3224 P, llvm::Twine(
"libclang_rt.cc_kext_") +
3225 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
".a");
3227 llvm::sys::path::append(P,
"libclang_rt.cc_kext.a");
3233 CmdArgs.push_back(Args.MakeArgString(P));
3238 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
3248 for (Arg *A : Args) {
3257 case options::OPT_mkernel:
3258 case options::OPT_fapple_kext:
3260 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
3263 case options::OPT_dependency_file:
3264 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
3267 case options::OPT_gfull:
3268 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3270 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
3273 case options::OPT_gused:
3274 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3276 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
3279 case options::OPT_shared:
3280 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
3283 case options::OPT_fconstant_cfstrings:
3284 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
3287 case options::OPT_fno_constant_cfstrings:
3288 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
3291 case options::OPT_Wnonportable_cfstrings:
3293 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
3296 case options::OPT_Wno_nonportable_cfstrings:
3298 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
3307 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
3308 const Option MArch = Opts.getOption(options::OPT_march_EQ);
3314 else if (Name ==
"ppc601")
3315 DAL->AddJoinedArg(
nullptr, MCpu,
"601");
3316 else if (Name ==
"ppc603")
3317 DAL->AddJoinedArg(
nullptr, MCpu,
"603");
3318 else if (Name ==
"ppc604")
3319 DAL->AddJoinedArg(
nullptr, MCpu,
"604");
3320 else if (Name ==
"ppc604e")
3321 DAL->AddJoinedArg(
nullptr, MCpu,
"604e");
3322 else if (Name ==
"ppc750")
3323 DAL->AddJoinedArg(
nullptr, MCpu,
"750");
3324 else if (Name ==
"ppc7400")
3325 DAL->AddJoinedArg(
nullptr, MCpu,
"7400");
3326 else if (Name ==
"ppc7450")
3327 DAL->AddJoinedArg(
nullptr, MCpu,
"7450");
3328 else if (Name ==
"ppc970")
3329 DAL->AddJoinedArg(
nullptr, MCpu,
"970");
3331 else if (Name ==
"ppc64" || Name ==
"ppc64le")
3332 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3334 else if (Name ==
"i386")
3336 else if (Name ==
"i486")
3337 DAL->AddJoinedArg(
nullptr, MArch,
"i486");
3338 else if (Name ==
"i586")
3339 DAL->AddJoinedArg(
nullptr, MArch,
"i586");
3340 else if (Name ==
"i686")
3341 DAL->AddJoinedArg(
nullptr, MArch,
"i686");
3342 else if (Name ==
"pentium")
3343 DAL->AddJoinedArg(
nullptr, MArch,
"pentium");
3344 else if (Name ==
"pentium2")
3345 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3346 else if (Name ==
"pentpro")
3347 DAL->AddJoinedArg(
nullptr, MArch,
"pentiumpro");
3348 else if (Name ==
"pentIIm3")
3349 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3351 else if (Name ==
"x86_64" || Name ==
"x86_64h")
3352 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3354 else if (Name ==
"arm")
3355 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3356 else if (Name ==
"armv4t")
3357 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3358 else if (Name ==
"armv5")
3359 DAL->AddJoinedArg(
nullptr, MArch,
"armv5tej");
3360 else if (Name ==
"xscale")
3361 DAL->AddJoinedArg(
nullptr, MArch,
"xscale");
3362 else if (Name ==
"armv6")
3363 DAL->AddJoinedArg(
nullptr, MArch,
"armv6k");
3364 else if (Name ==
"armv6m")
3365 DAL->AddJoinedArg(
nullptr, MArch,
"armv6m");
3366 else if (Name ==
"armv7")
3367 DAL->AddJoinedArg(
nullptr, MArch,
"armv7a");
3368 else if (Name ==
"armv7em")
3369 DAL->AddJoinedArg(
nullptr, MArch,
"armv7em");
3370 else if (Name ==
"armv7k")
3371 DAL->AddJoinedArg(
nullptr, MArch,
"armv7k");
3372 else if (Name ==
"armv7m")
3373 DAL->AddJoinedArg(
nullptr, MArch,
"armv7m");
3374 else if (Name ==
"armv7s")
3375 DAL->AddJoinedArg(
nullptr, MArch,
"armv7s");
3376 else if (Name ==
"armv8-m.base" || Name ==
"armv8m.base")
3377 DAL->AddJoinedArg(
nullptr, MArch,
"armv8m.base");
3378 else if (Name ==
"armv8-m.main" || Name ==
"armv8m.main")
3379 DAL->AddJoinedArg(
nullptr, MArch,
"armv8m.main");
3380 else if (Name ==
"armv8.1-m.main" || Name ==
"armv8.1m.main")
3381 DAL->AddJoinedArg(
nullptr, MArch,
"armv8.1m.main");
3388 ArgStringList &CmdArgs,
3389 bool ForceLinkBuiltinRT)
const {
3398 CompilerRT += Args.hasArg(options::OPT_fPIC) ?
"_pic" :
"_static";
3404 llvm::Triple::OSType OS;
3410 OS = llvm::Triple::MacOSX;
3413 OS = llvm::Triple::IOS;
3416 OS = llvm::Triple::TvOS;
3419 OS = llvm::Triple::WatchOS;
3435 switch (SDKInfo->getEnvironment()) {
3436 case llvm::Triple::UnknownEnvironment:
3437 case llvm::Triple::Simulator:
3438 case llvm::Triple::MacABI:
3447 VersionTuple SDKVersion = SDKInfo->getVersion();
3448 switch (SDKInfo->getOS()) {
3451 case llvm::Triple::MacOSX:
3452 return SDKVersion >= VersionTuple(15U);
3453 case llvm::Triple::IOS:
3454 return SDKVersion >= VersionTuple(18U);
3455 case llvm::Triple::TvOS:
3456 return SDKVersion >= VersionTuple(18U);
3457 case llvm::Triple::WatchOS:
3458 return SDKVersion >= VersionTuple(11U);
3459 case llvm::Triple::XROS:
3460 return SDKVersion >= VersionTuple(2U);
3468static inline llvm::VersionTuple
3473 case llvm::Triple::Darwin:
3474 case llvm::Triple::MacOSX:
3475 return llvm::VersionTuple(10U, 12U);
3476 case llvm::Triple::IOS:
3477 case llvm::Triple::TvOS:
3478 return llvm::VersionTuple(10U);
3479 case llvm::Triple::WatchOS:
3480 return llvm::VersionTuple(3U);
3483 llvm_unreachable(
"Unexpected OS");
3487 llvm::Triple::OSType OS;
3493 OS = llvm::Triple::MacOSX;
3496 OS = llvm::Triple::IOS;
3499 OS = llvm::Triple::TvOS;
3502 OS = llvm::Triple::WatchOS;
3513 llvm::opt::ArgStringList &CC1Args,
3523 if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3524 options::OPT_fno_ptrauth_calls))
3525 CC1Args.push_back(
"-fptrauth-calls");
3526 if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3527 options::OPT_fno_ptrauth_returns))
3528 CC1Args.push_back(
"-fptrauth-returns");
3529 if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3530 options::OPT_fno_ptrauth_intrinsics))
3531 CC1Args.push_back(
"-fptrauth-intrinsics");
3532 if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3533 options::OPT_fno_ptrauth_indirect_gotos))
3534 CC1Args.push_back(
"-fptrauth-indirect-gotos");
3535 if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3536 options::OPT_fno_ptrauth_auth_traps))
3537 CC1Args.push_back(
"-fptrauth-auth-traps");
3540 if (!DriverArgs.hasArg(
3541 options::OPT_fptrauth_vtable_pointer_address_discrimination,
3542 options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
3543 CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
3544 if (!DriverArgs.hasArg(
3545 options::OPT_fptrauth_vtable_pointer_type_discrimination,
3546 options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
3547 CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
3550 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
3551 options::OPT_fno_ptrauth_objc_isa))
3552 CC1Args.push_back(
"-fptrauth-objc-isa");
3553 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
3554 options::OPT_fno_ptrauth_objc_class_ro))
3555 CC1Args.push_back(
"-fptrauth-objc-class-ro");
3556 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
3557 options::OPT_fno_ptrauth_objc_interface_sel))
3558 CC1Args.push_back(
"-fptrauth-objc-interface-sel");
3563 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3576 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
3577 options::OPT_fno_aligned_allocation) &&
3579 CC1Args.push_back(
"-faligned-alloc-unavailable");
3583 if (!DriverArgs.hasArgNoClaim(options::OPT_fobjc_msgsend_selector_stubs,
3584 options::OPT_fno_objc_msgsend_selector_stubs) &&
3587 CC1Args.push_back(
"-fobjc-msgsend-selector-stubs");
3591 if (!DriverArgs.hasArgNoClaim(
3592 options::OPT_fobjc_msgsend_class_selector_stubs,
3593 options::OPT_fno_objc_msgsend_class_selector_stubs) &&
3596 CC1Args.push_back(
"-fobjc-msgsend-class-selector-stubs");
3600 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
3601 options::OPT_fno_sized_deallocation) &&
3603 CC1Args.push_back(
"-fno-sized-deallocation");
3610 if (!
SDKInfo->getFilePath().empty()) {
3612 ExtraDepOpt +=
SDKInfo->getFilePath();
3613 CC1Args.push_back(DriverArgs.MakeArgString(ExtraDepOpt));
3619 CC1Args.push_back(
"-fcompatibility-qualified-id-block-type-checking");
3623 if (!DriverArgs.getLastArgNoClaim(
3624 options::OPT_fvisibility_inlines_hidden_static_local_var,
3625 options::OPT_fno_visibility_inlines_hidden_static_local_var))
3626 CC1Args.push_back(
"-fvisibility-inlines-hidden-static-local-var");
3640 CC1Args.push_back(
"-fbuiltin-headers-in-system-modules");
3642 if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
3643 options::OPT_fno_define_target_os_macros))
3644 CC1Args.push_back(
"-fdefine-target-os-macros");
3648 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1ASArgs)
const {
3650 CC1ASArgs.push_back(
"-darwin-target-variant-triple");
3657 auto EmitTargetSDKVersionArg = [&](
const VersionTuple &
V) {
3659 llvm::raw_string_ostream OS(Arg);
3660 OS <<
"-target-sdk-version=" <<
V;
3661 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3665 if (
const auto *MacOStoMacCatalystMapping =
SDKInfo->getVersionMapping(
3667 std::optional<VersionTuple> SDKVersion = MacOStoMacCatalystMapping->map(
3670 EmitTargetSDKVersionArg(
3674 EmitTargetSDKVersionArg(
SDKInfo->getVersion());
3682 llvm::raw_string_ostream OS(Arg);
3683 OS <<
"-darwin-target-variant-sdk-version=" <<
SDKInfo->getVersion();
3684 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3685 }
else if (
const auto *MacOStoMacCatalystMapping =
3688 if (std::optional<VersionTuple> SDKVersion =
3689 MacOStoMacCatalystMapping->map(
3693 llvm::raw_string_ostream OS(Arg);
3694 OS <<
"-darwin-target-variant-sdk-version=" << *SDKVersion;
3695 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3715 AddDeploymentTarget(*DAL);
3723 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
3726 if (A->getOption().getID() != options::OPT_mkernel &&
3727 A->getOption().getID() != options::OPT_fapple_kext)
3729 assert(it != ie &&
"unexpected argument translation");
3731 assert(A->getOption().getID() == options::OPT_static &&
3732 "missing expected -static argument");
3739 if ((
Arch == llvm::Triple::arm ||
Arch == llvm::Triple::thumb)) {
3740 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
3741 options::OPT_fno_omit_frame_pointer,
false))
3742 getDriver().
Diag(clang::diag::warn_drv_unsupported_opt_for_target)
3743 <<
"-fomit-frame-pointer" << BA.
ArchName;
3752 if (
getArch() == llvm::Triple::x86_64 ||
3754 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
3756 return (
getArch() == llvm::Triple::aarch64 ||
3757 getArch() == llvm::Triple::aarch64_32)
3765 if (
const char *S = ::getenv(
"RC_DEBUG_OPTIONS"))
3766 return S[0] !=
'\0';
3771 if (
const char *S = ::getenv(
"RC_DEBUG_PREFIX_MAP"))
3780 return llvm::ExceptionHandling::Default;
3784 if (Triple.isWatchABI())
3785 return llvm::ExceptionHandling::DwarfCFI;
3787 return llvm::ExceptionHandling::SjLj;
3802 return (
getArch() == llvm::Triple::x86_64 ||
3803 getArch() == llvm::Triple::aarch64);
3812 ArgStringList &CmdArgs)
const {
3815 assert(!
isTargetXROS() &&
"xrOS always uses -platform-version");
3818 CmdArgs.push_back(
"-watchos_version_min");
3820 CmdArgs.push_back(
"-watchos_simulator_version_min");
3822 CmdArgs.push_back(
"-tvos_version_min");
3824 CmdArgs.push_back(
"-tvos_simulator_version_min");
3826 CmdArgs.push_back(
"-driverkit_version_min");
3828 CmdArgs.push_back(
"-ios_simulator_version_min");
3830 CmdArgs.push_back(
"-iphoneos_version_min");
3832 CmdArgs.push_back(
"-maccatalyst_version_min");
3835 CmdArgs.push_back(
"-macosx_version_min");
3841 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3844 VersionTuple VariantTargetVersion;
3846 CmdArgs.push_back(
"-macosx_version_min");
3851 "unexpected target variant triple");
3852 CmdArgs.push_back(
"-maccatalyst_version_min");
3855 VersionTuple MinTgtVers =
3857 if (MinTgtVers.getMajor() && MinTgtVers > VariantTargetVersion)
3858 VariantTargetVersion = MinTgtVers;
3859 CmdArgs.push_back(Args.MakeArgString(VariantTargetVersion.getAsString()));
3870 return "mac catalyst";
3883 llvm_unreachable(
"invalid platform");
3887 llvm::opt::ArgStringList &CmdArgs)
const {
3892 auto EmitPlatformVersionArg =
3895 const llvm::Triple &TT) {
3898 CmdArgs.push_back(
"-platform_version");
3899 std::string PlatformName =
3902 PlatformName +=
"-simulator";
3903 CmdArgs.push_back(Args.MakeArgString(PlatformName));
3912 VersionTuple MinTgtVers = TT.getMinimumSupportedOSVersion();
3915 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3920 std::optional<VersionTuple> iOSSDKVersion;
3922 if (
const auto *MacOStoMacCatalystMapping =
3925 iOSSDKVersion = MacOStoMacCatalystMapping->map(
3926 SDKInfo->getVersion().withoutBuild(),
3930 CmdArgs.push_back(Args.MakeArgString(
3931 (iOSSDKVersion ? *iOSSDKVersion
3938 VersionTuple SDKVersion =
SDKInfo->getVersion().withoutBuild();
3939 if (!SDKVersion.getMinor())
3940 SDKVersion = VersionTuple(SDKVersion.getMajor(), 0);
3941 CmdArgs.push_back(Args.MakeArgString(SDKVersion.getAsString()));
3952 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3961 VersionTuple TargetVariantVersion;
3969 "unexpected target variant triple");
3974 EmitPlatformVersionArg(TargetVariantVersion, Platform, Environment,
3980 ArgStringList &CmdArgs) {
3984 CmdArgs.push_back(
"-ldylib1.o");
3991 CmdArgs.push_back(
"-ldylib1.o");
3993 CmdArgs.push_back(
"-ldylib1.10.5.o");
3998 ArgStringList &CmdArgs) {
3999 if (Args.hasArg(options::OPT_static))
4004 CmdArgs.push_back(
"-lbundle1.o");
4009 ArgStringList &CmdArgs) {
4011 if (Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_object) ||
4012 Args.hasArg(options::OPT_preload)) {
4013 CmdArgs.push_back(
"-lgcrt0.o");
4015 CmdArgs.push_back(
"-lgcrt1.o");
4025 CmdArgs.push_back(
"-no_new_main");
4027 D.
getDriver().
Diag(diag::err_drv_clang_unsupported_opt_pg_darwin)
4033 ArgStringList &CmdArgs) {
4036 if (D.
getArch() == llvm::Triple::aarch64)
4039 CmdArgs.push_back(
"-lcrt1.o");
4041 CmdArgs.push_back(
"-lcrt1.3.1.o");
4048 CmdArgs.push_back(
"-lcrt1.o");
4050 CmdArgs.push_back(
"-lcrt1.10.5.o");
4052 CmdArgs.push_back(
"-lcrt1.10.6.o");
4057 ArgStringList &CmdArgs)
const {
4063 if (Args.hasArg(options::OPT_dynamiclib))
4065 else if (Args.hasArg(options::OPT_bundle))
4069 else if (Args.hasArg(options::OPT_static) ||
4070 Args.hasArg(options::OPT_object) ||
4071 Args.hasArg(options::OPT_preload))
4072 CmdArgs.push_back(
"-lcrt0.o");
4076 if (
isTargetMacOS() && Args.hasArg(options::OPT_shared_libgcc) &&
4078 const char *Str = Args.MakeArgString(
GetFilePath(
"crt3.o"));
4079 CmdArgs.push_back(Str);
4096 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
4097 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
4099 Res |= SanitizerKind::Address;
4100 Res |= SanitizerKind::PointerCompare;
4101 Res |= SanitizerKind::PointerSubtract;
4102 Res |= SanitizerKind::Realtime;
4103 Res |= SanitizerKind::Leak;
4104 Res |= SanitizerKind::Fuzzer;
4105 Res |= SanitizerKind::FuzzerNoLink;
4106 Res |= SanitizerKind::ObjCCast;
4116 Res |= SanitizerKind::Vptr;
4118 if ((IsX86_64 || IsAArch64) &&
4121 Res |= SanitizerKind::Thread;
4125 Res |= SanitizerKind::Type;
4129 Res |= SanitizerKind::NumericalStability;
Defines a function that returns the minimum OS versions supporting C++17's aligned allocation functio...
static bool hasMultipleInvocations(const llvm::Triple &Triple, const ArgList &Args)
static bool checkRemarksOptions(const Driver &D, const ArgList &Args, const llvm::Triple &Triple)
static void renderRemarksOptions(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple, const InputInfo &Input, const InputInfo &Output, const JobAction &JA)
static bool sdkSupportsBuiltinModules(const std::optional< DarwinSDKInfo > &SDKInfo)
static void addPgProfilingLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static const char * ArmMachOArchName(StringRef Arch)
static void AddMachOSysLibRoot(Compilation &C, const ArgList &Args, ArgStringList &CmdArgs)
static bool shouldLinkerNotDedup(bool IsLinkerOnlyAction, const ArgList &Args)
Pass -no_deduplicate to ld64 under certain conditions:
static bool hasExportSymbolDirective(const ArgList &Args)
Check if the link command contains a symbol export directive.
static void addDefaultCRTLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static void addBundleLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static llvm::VersionTuple sizedDeallocMinVersion(llvm::Triple::OSType OS)
static VersionTuple minimumMacCatalystDeploymentTarget()
static std::string getSystemOrSDKMacOSVersion(StringRef MacOSSDKVersion)
Returns the most appropriate macOS target version for the current process.
static void addDynamicLibLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static bool isObjCRuntimeLinked(const ArgList &Args)
Determine whether we are linking the ObjC runtime.
static const char * getPlatformName(Darwin::DarwinPlatformKind Platform, Darwin::DarwinEnvironmentKind Environment)
static const char * ArmMachOArchNameCPU(StringRef CPU)
static void addExportedSymbol(ArgStringList &CmdArgs, const char *Symbol)
Add an export directive for Symbol to the link command.
static StringRef getXcodeDeveloperPath(StringRef PathIntoXcode)
Take a path that speculatively points into Xcode and return the XCODE/Contents/Developer path if it i...
static void addSectalignToPage(const ArgList &Args, ArgStringList &CmdArgs, StringRef Segment, StringRef Section)
Add a sectalign directive for Segment and Section to the maximum expected page size for Darwin.
Result
Implement __builtin_bit_cast and related operations.
static StringRef getTriple(const Command &Job)
Defines types useful for describing an Objective-C runtime.
const llvm::VersionTuple & getDefaultDeploymentTarget() const
const llvm::Triple & getCanonicalPlatformTriple() const
The basic abstraction for the target Objective-C runtime.
bool hasNativeARC() const
Does this runtime natively provide the ARC entrypoints?
bool hasSubscripting() const
Does this runtime directly support the subscripting methods?
@ MacOSX
'macosx' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the non-fragile AB...
@ FragileMacOSX
'macosx-fragile' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the fragil...
@ iOS
'ios' is the Apple-provided NeXT-derived runtime on iOS or the iOS simulator; it is always non-fragil...
@ WatchOS
'watchos' is a variant of iOS for Apple's watchOS.
The base class of the type hierarchy.
Action - Represent an abstract compilation step to perform.
types::ID getType() const
ActionClass getKind() const
@ VerifyDebugInfoJobClass
Compilation - A set of tasks to perform for a single driver invocation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
std::string SysRoot
sysroot, if present
std::string GetTemporaryDirectory(StringRef Prefix) const
GetTemporaryDirectory - Return the pathname of a temporary directory to use as part of compilation; t...
DiagnosticBuilder Diag(unsigned DiagID) const
static bool GetReleaseVersion(StringRef Str, unsigned &Major, unsigned &Minor, unsigned &Micro, bool &HadExtra)
GetReleaseVersion - Parse (([0-9]+)(.
const llvm::opt::OptTable & getOpts() const
std::string GetTemporaryPath(StringRef Prefix, StringRef Suffix) const
GetTemporaryPath - Return the pathname of a temporary file to use as part of compilation; the file wi...
std::string Dir
The path the driver executable was in, as invoked from the command line.
bool needsStatsRt() const
bool needsMemProfRt() const
bool linkRuntimes() const
bool needsUbsanRt() const
bool needsRtsanRt() const
bool requiresMinimalRuntime() const
bool needsSharedRt() const
bool needsTysanRt() const
bool needsStableAbi() const
const char * getTypeTempSuffix(ID Id, bool CLStyle=false)
getTypeTempSuffix - Return the suffix to use when creating a temp file of this type,...
SmallVector< InputInfo, 4 > InputInfoList
bool willEmitRemarks(const llvm::opt::ArgList &Args)
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
SetTy< T > join(SetTy< T > A, SetTy< T > B, typename SetTy< T >::Factory &F)
Computes the union of two ImmutableSets.
Top level wrappers for InstallAPI frontend operations.
Expected< std::optional< DarwinSDKInfo > > parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath)
Parse the SDK information from the SDKSettings.json file.
@ Default
Set to the current date and time.
const FunctionProtoType * T
llvm::VersionTuple alignedAllocMinVersion(llvm::Triple::OSType OS)
llvm::StringRef getAsString(SyncScope S)
bool(*)(llvm::ArrayRef< const char * >, llvm::raw_ostream &, llvm::raw_ostream &, bool, bool) Driver
Represents a bound architecture for offload / multiple architecture compilation.
static constexpr OSEnvPair macCatalystToMacOSPair()
Returns the os-environment mapping pair that's used to represent the Mac Catalyst -> macOS version ma...
static constexpr OSEnvPair macOStoMacCatalystPair()
Returns the os-environment mapping pair that's used to represent the macOS -> Mac Catalyst version ma...
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
static constexpr ResponseFileSupport AtFileUTF8()