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");
195bool darwin::Linker::NeedsTempPath(
const InputInfoList &Inputs)
const {
199 for (
const auto &Input : Inputs)
200 if (Input.getType() != types::TY_Object)
214 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
215 if (A->getOption().matches(options::OPT_O0))
217 if (A->getOption().matches(options::OPT_O))
218 return llvm::StringSwitch<bool>(A->getValue())
224 if (!IsLinkerOnlyAction)
229void darwin::Linker::AddLinkArgs(Compilation &
C,
const ArgList &Args,
230 ArgStringList &CmdArgs,
232 VersionTuple Version,
bool LinkerIsLLD,
233 bool UsePlatformVersion)
const {
234 const Driver &D = getToolChain().getDriver();
235 const toolchains::MachO &MachOTC = getMachOToolChain();
239 if ((Version >= VersionTuple(100) || LinkerIsLLD) &&
240 !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
241 CmdArgs.push_back(
"-demangle");
243 if (Args.hasArg(options::OPT_rdynamic) &&
244 (Version >= VersionTuple(137) || LinkerIsLLD))
245 CmdArgs.push_back(
"-export_dynamic");
249 if (Args.hasFlag(options::OPT_fapplication_extension,
250 options::OPT_fno_application_extension,
false))
251 CmdArgs.push_back(
"-application_extension");
253 if (
auto LTO = getToolChain().getLTOMode(Args);
254 LTO !=
LTOK_None && (Version >= VersionTuple(116) || LinkerIsLLD) &&
255 NeedsTempPath(Inputs)) {
256 std::string TmpPathName;
267 if (!TmpPathName.empty()) {
268 auto *TmpPath =
C.getArgs().MakeArgString(TmpPathName);
269 C.addTempFile(TmpPath);
270 CmdArgs.push_back(
"-object_path_lto");
271 CmdArgs.push_back(TmpPath);
284 if (Version >= VersionTuple(133) && !LinkerIsLLD) {
286 StringRef P = llvm::sys::path::parent_path(D.
Dir);
287 SmallString<128> LibLTOPath(P);
288 llvm::sys::path::append(LibLTOPath,
"lib");
289 llvm::sys::path::append(LibLTOPath,
"libLTO.dylib");
290 CmdArgs.push_back(
"-lto_library");
291 CmdArgs.push_back(
C.getArgs().MakeArgString(LibLTOPath));
297 if (Version >= VersionTuple(262) &&
299 CmdArgs.push_back(
"-no_deduplicate");
302 Args.AddAllArgs(CmdArgs, options::OPT_static);
303 if (!Args.hasArg(options::OPT_static))
304 CmdArgs.push_back(
"-dynamic");
305 if (Args.hasArg(options::OPT_fgnu_runtime)) {
310 if (!Args.hasArg(options::OPT_dynamiclib)) {
311 AddMachOArch(Args, CmdArgs);
313 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
315 Args.AddLastArg(CmdArgs, options::OPT_bundle);
316 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
317 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
320 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
321 (A = Args.getLastArg(options::OPT_current__version)) ||
322 (A = Args.getLastArg(options::OPT_install__name)))
323 D.
Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
326 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
327 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
328 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
330 CmdArgs.push_back(
"-dylib");
333 if ((A = Args.getLastArg(options::OPT_bundle)) ||
334 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
335 (A = Args.getLastArg(options::OPT_client__name)) ||
336 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
337 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
338 (A = Args.getLastArg(options::OPT_private__bundle)))
339 D.
Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
342 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
343 "-dylib_compatibility_version");
344 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
345 "-dylib_current_version");
347 AddMachOArch(Args, CmdArgs);
349 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
350 "-dylib_install_name");
353 Args.AddLastArg(CmdArgs, options::OPT_all__load);
354 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
355 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
357 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
358 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
359 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
360 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
361 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
362 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
363 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
364 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
365 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
366 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
367 Args.AddAllArgs(CmdArgs, options::OPT_init);
370 if (Version >= VersionTuple(520) || LinkerIsLLD || UsePlatformVersion)
375 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
376 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
377 Args.AddLastArg(CmdArgs, options::OPT_single__module);
378 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
379 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
382 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
383 options::OPT_fno_pie, options::OPT_fno_PIE)) {
384 if (A->getOption().matches(options::OPT_fpie) ||
385 A->getOption().matches(options::OPT_fPIE))
386 CmdArgs.push_back(
"-pie");
388 CmdArgs.push_back(
"-no_pie");
392 if (
C.getDriver().embedBitcodeEnabled()) {
395 CmdArgs.push_back(
"-bitcode_bundle");
397 if (
C.getDriver().embedBitcodeMarkerOnly() &&
398 Version >= VersionTuple(278)) {
399 CmdArgs.push_back(
"-bitcode_process_mode");
400 CmdArgs.push_back(
"marker");
403 D.
Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
407 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
408 options::OPT_fno_global_isel)) {
409 if (A->getOption().matches(options::OPT_fglobal_isel)) {
410 CmdArgs.push_back(
"-mllvm");
411 CmdArgs.push_back(
"-global-isel");
413 CmdArgs.push_back(
"-mllvm");
414 CmdArgs.push_back(
"-global-isel-abort=0");
418 if (Args.hasArg(options::OPT_mkernel) ||
419 Args.hasArg(options::OPT_fapple_kext) ||
420 Args.hasArg(options::OPT_ffreestanding)) {
421 CmdArgs.push_back(
"-mllvm");
422 CmdArgs.push_back(
"-disable-atexit-based-global-dtor-lowering");
425 Args.AddLastArg(CmdArgs, options::OPT_prebind);
426 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
427 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
428 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
429 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
430 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
431 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
432 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
433 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
434 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
435 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
436 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
437 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
438 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
439 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
440 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
446 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
447 CmdArgs.push_back(
"-syslibroot");
448 CmdArgs.push_back(A->getValue());
449 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
450 CmdArgs.push_back(
"-syslibroot");
451 CmdArgs.push_back(A->getValue());
452 }
else if (StringRef sysroot =
C.getSysRoot(); sysroot !=
"") {
453 CmdArgs.push_back(
"-syslibroot");
454 CmdArgs.push_back(
C.getArgs().MakeArgString(sysroot));
457 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
458 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
459 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
460 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
461 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
462 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
463 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
464 Args.AddAllArgs(CmdArgs, options::OPT_y);
465 Args.AddLastArg(CmdArgs, options::OPT_w);
466 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
467 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
468 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
469 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
470 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
471 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
472 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
473 Args.AddLastArg(CmdArgs, options::OPT_why_load);
474 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
475 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
476 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
477 Args.AddLastArg(CmdArgs, options::OPT_Mach);
481 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
483 : CSPGOGenerateArg->getValue());
484 llvm::sys::path::append(Path,
"default_%m.profraw");
485 CmdArgs.push_back(
"--cs-profile-generate");
486 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
488 SmallString<128> Path(
489 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
490 if (Path.empty() || llvm::sys::fs::is_directory(Path))
491 llvm::sys::path::append(Path,
"default.profdata");
492 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
495 auto *CodeGenDataGenArg =
496 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
497 if (CodeGenDataGenArg)
499 Args.MakeArgString(Twine(
"--codegen-data-generate-path=") +
500 CodeGenDataGenArg->getValue()));
503 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
505 : CSPGOGenerateArg->getValue());
506 llvm::sys::path::append(Path,
"default_%m.profraw");
507 CmdArgs.push_back(
"-mllvm");
508 CmdArgs.push_back(
"-cs-profile-generate");
509 CmdArgs.push_back(
"-mllvm");
510 CmdArgs.push_back(Args.MakeArgString(Twine(
"-cs-profile-path=") + Path));
512 SmallString<128> Path(
513 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
514 if (Path.empty() || llvm::sys::fs::is_directory(Path))
515 llvm::sys::path::append(Path,
"default.profdata");
516 CmdArgs.push_back(
"-mllvm");
517 CmdArgs.push_back(Args.MakeArgString(Twine(
"-cs-profile-path=") + Path));
522 CmdArgs.push_back(
"-mllvm");
524 Args.MakeArgString(Twine(
"-sample-profile-file=") + A->getValue()));
531 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
534 return Args.hasArg(options::OPT_fobjc_link_runtime);
538 const llvm::Triple &Triple) {
543 Args.getAllArgValues(options::OPT_arch).size() > 1;
544 bool hasExplicitOutputFile =
545 Args.getLastArg(options::OPT_foptimization_record_file_EQ);
547 D.
Diag(diag::err_drv_invalid_output_with_multiple_archs)
548 <<
"-foptimization-record-file";
555 const llvm::Triple &Triple,
557 StringRef Format =
"yaml";
558 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
559 Format = A->getValue();
561 CmdArgs.push_back(
"-mllvm");
562 CmdArgs.push_back(
"-lto-pass-remarks-output");
563 CmdArgs.push_back(
"-mllvm");
565 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
567 CmdArgs.push_back(A->getValue());
569 assert(Output.
isFilename() &&
"Unexpected ld output.");
575 CmdArgs.push_back(Args.MakeArgString(F));
579 Args.getLastArg(options::OPT_foptimization_record_passes_EQ)) {
580 CmdArgs.push_back(
"-mllvm");
582 std::string(
"-lto-pass-remarks-filter=") + A->getValue();
583 CmdArgs.push_back(Args.MakeArgString(Passes));
586 if (!Format.empty()) {
587 CmdArgs.push_back(
"-mllvm");
588 Twine FormatArg = Twine(
"-lto-pass-remarks-format=") + Format;
589 CmdArgs.push_back(Args.MakeArgString(FormatArg));
593 CmdArgs.push_back(
"-mllvm");
594 CmdArgs.push_back(
"-lto-pass-remarks-with-hotness");
597 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
598 CmdArgs.push_back(
"-mllvm");
600 std::string(
"-lto-pass-remarks-hotness-threshold=") + A->getValue();
601 CmdArgs.push_back(Args.MakeArgString(Opt));
610 const char *LinkingOutput)
const {
611 assert((Output.
getType() == types::TY_Image ||
612 Output.
getType() == types::TY_Object) &&
613 "Invalid linker output type.");
619 llvm::opt::ArgStringList InputFileList;
624 ArgStringList CmdArgs;
630 Args.MakeArgString(
getToolChain().GetLinkerPath(&LinkerIsLLD));
634 bool UsePlatformVersion = Triple.isXROS() || Triple.isOSFirmware();
638 AddLinkArgs(
C, Args, CmdArgs, Inputs, Version, LinkerIsLLD,
648 Args.getLastArg(options::OPT_moutline, options::OPT_mno_outline)) {
649 if (A->getOption().matches(options::OPT_moutline)) {
651 CmdArgs.push_back(
"-mllvm");
652 CmdArgs.push_back(
"-enable-machine-outliner");
658 CmdArgs.push_back(
"-mllvm");
659 CmdArgs.push_back(
"-enable-machine-outliner=never");
666 CmdArgs.push_back(
"-mllvm");
667 CmdArgs.push_back(
"-enable-linkonceodr-outlining");
670 auto *CodeGenDataGenArg =
671 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
672 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
676 if (CodeGenDataGenArg && CodeGenDataUseArg)
677 D.
Diag(diag::err_drv_argument_not_allowed_with)
678 << CodeGenDataGenArg->getAsString(Args)
679 << CodeGenDataUseArg->getAsString(Args);
683 if (CodeGenDataGenArg) {
684 CmdArgs.push_back(
"-mllvm");
685 CmdArgs.push_back(
"-codegen-data-generate");
689 if (CodeGenDataUseArg) {
690 CmdArgs.push_back(
"-mllvm");
691 CmdArgs.push_back(Args.MakeArgString(Twine(
"-codegen-data-use-path=") +
692 CodeGenDataUseArg->getValue()));
698 if (!StatsFile.empty()) {
699 CmdArgs.push_back(
"-mllvm");
700 CmdArgs.push_back(Args.MakeArgString(
"-lto-stats-file=" + StatsFile.str()));
704 if (Args.hasArg(options::OPT_fstack_usage)) {
706 llvm::sys::path::replace_extension(StackUsageFile,
"su");
707 CmdArgs.push_back(
"-mllvm");
709 Args.MakeArgString(
"-stack-usage-file=" + StackUsageFile));
714 Args.addAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
715 options::OPT_Z_Flag, options::OPT_u_Group});
720 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
721 CmdArgs.push_back(
"-ObjC");
723 CmdArgs.push_back(
"-o");
726 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
729 Args.AddAllArgs(CmdArgs, options::OPT_L);
734 for (
const auto &II : Inputs) {
735 if (!II.isFilename()) {
740 if (InputFileList.size() > 0)
746 InputFileList.push_back(II.getFilename());
752 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
753 getToolChain().addFortranRuntimeLibraryPath(Args, CmdArgs);
757 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
761 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
765 CmdArgs.push_back(
"-framework");
766 CmdArgs.push_back(
"Foundation");
768 CmdArgs.push_back(
"-lobjc");
772 CmdArgs.push_back(
"-arch_multiple");
773 CmdArgs.push_back(
"-final_output");
774 CmdArgs.push_back(LinkingOutput);
777 if (Args.hasArg(options::OPT_fnested_functions))
778 CmdArgs.push_back(
"-allow_stack_execute");
783 if (!Parallelism.empty()) {
784 CmdArgs.push_back(
"-mllvm");
785 unsigned NumThreads =
786 llvm::get_threadpool_strategy(Parallelism)->compute_thread_count();
787 CmdArgs.push_back(Args.MakeArgString(
"-threads=" + Twine(NumThreads)));
793 bool NoStdOrDefaultLibs =
794 Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
795 bool ForceLinkBuiltins = Args.hasArg(options::OPT_fapple_link_rtlib);
796 if (!NoStdOrDefaultLibs || ForceLinkBuiltins) {
801 if (NoStdOrDefaultLibs && ForceLinkBuiltins) {
809 Args.ClaimAllArgs(options::OPT_pthread);
810 Args.ClaimAllArgs(options::OPT_pthreads);
814 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
818 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
819 Args.AddAllArgs(CmdArgs, options::OPT_F);
822 for (
const Arg *A : Args.filtered(options::OPT_iframework))
823 CmdArgs.push_back(Args.MakeArgString(std::string(
"-F") + A->getValue()));
825 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
826 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
827 if (A->getValue() == StringRef(
"Accelerate")) {
828 CmdArgs.push_back(
"-framework");
829 CmdArgs.push_back(
"Accelerate");
838 bool NonStandardSearchPath =
false;
840 if (Triple.isDriverKit()) {
842 NonStandardSearchPath =
843 Version.getMajor() < 605 ||
844 (Version.getMajor() == 605 && Version.getMinor().value_or(0) < 1);
849 if (NonStandardSearchPath) {
850 if (
auto *Sysroot = Args.getLastArg(options::OPT_isysroot)) {
851 auto AddSearchPath = [&](StringRef Flag, StringRef SearchPath) {
854 llvm::sys::path::append(P, SearchPath);
856 CmdArgs.push_back(Args.MakeArgString(Flag + P));
859 AddSearchPath(
"-L",
"/usr/lib");
860 AddSearchPath(
"-F",
"/System/Library/Frameworks");
866 if (Version >= VersionTuple(705) || LinkerIsLLD) {
874 std::unique_ptr<Command> Cmd = std::make_unique<Command>(
875 JA, *
this, ResponseSupport, Exec, CmdArgs, Inputs, Output);
876 Cmd->setInputFileList(std::move(InputFileList));
877 C.addCommand(std::move(Cmd));
884 const char *LinkingOutput)
const {
888 Args.ClaimAllArgs(options::OPT_g_Group);
890 Args.ClaimAllArgs(options::OPT_emit_llvm);
893 Args.ClaimAllArgs(options::OPT_w);
895 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
898 ArgStringList CmdArgs;
900 CmdArgs.push_back(
"-static");
901 CmdArgs.push_back(
"-D");
902 CmdArgs.push_back(
"-no_warning_for_no_symbols");
903 CmdArgs.push_back(
"-o");
906 for (
const auto &II : Inputs) {
907 if (II.isFilename()) {
908 CmdArgs.push_back(II.getFilename());
915 if (Output.
isFilename() && llvm::sys::fs::exists(OutputFileName)) {
916 if (std::error_code EC = llvm::sys::fs::remove(OutputFileName)) {
917 D.
Diag(diag::err_drv_unable_to_remove_file) << EC.message();
922 const char *Exec = Args.MakeArgString(
getToolChain().GetStaticLibToolPath());
923 C.addCommand(std::make_unique<Command>(JA, *
this,
925 Exec, CmdArgs, Inputs, Output));
932 const char *LinkingOutput)
const {
933 ArgStringList CmdArgs;
935 CmdArgs.push_back(
"-create");
936 assert(Output.
isFilename() &&
"Unexpected lipo output.");
938 CmdArgs.push_back(
"-output");
941 for (
const auto &II : Inputs) {
942 assert(II.isFilename() &&
"Unexpected lipo input.");
943 CmdArgs.push_back(II.getFilename());
946 StringRef LipoName = Args.getLastArgValue(options::OPT_fuse_lipo_EQ,
"lipo");
948 Args.MakeArgString(
getToolChain().GetProgramPath(LipoName.data()));
950 Exec, CmdArgs, Inputs, Output));
957 const char *LinkingOutput)
const {
958 ArgStringList CmdArgs;
960 CmdArgs.push_back(
"-o");
963 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
965 assert(Input.
isFilename() &&
"Unexpected dsymutil input.");
969 Args.MakeArgString(
getToolChain().GetProgramPath(
"dsymutil"));
971 Exec, CmdArgs, Inputs, Output));
978 const char *LinkingOutput)
const {
979 ArgStringList CmdArgs;
980 CmdArgs.push_back(
"--verify");
981 CmdArgs.push_back(
"--debug-info");
982 CmdArgs.push_back(
"--eh-frame");
983 CmdArgs.push_back(
"--quiet");
985 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
987 assert(Input.
isFilename() &&
"Unexpected verify input");
993 Args.MakeArgString(
getToolChain().GetProgramPath(
"dwarfdump"));
995 Exec, CmdArgs, Inputs, Output));
1005 const ArgList &Args)
1017 if (Ty == types::TY_PP_Asm)
1018 return types::TY_Asm;
1038 auto T = llvm::Triple(Twine(
"arm64-apple-") +
1039 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
1063 ArgStringList &CC1Args)
const {
1068 ArgStringList &CC1Args)
const {
1073 ArgStringList &CC1Args)
const {
1082 return llvm::StringSwitch<const char *>(
Arch)
1083 .Case(
"armv6k",
"armv6")
1084 .Case(
"armv6m",
"armv6m")
1085 .Case(
"armv5tej",
"armv5")
1086 .Case(
"xscale",
"xscale")
1087 .Case(
"armv4t",
"armv4t")
1088 .Case(
"armv7",
"armv7")
1089 .Cases({
"armv7a",
"armv7-a"},
"armv7")
1090 .Cases({
"armv7r",
"armv7-r"},
"armv7")
1091 .Cases({
"armv7em",
"armv7e-m"},
"armv7em")
1092 .Cases({
"armv7k",
"armv7-k"},
"armv7k")
1093 .Cases({
"armv7m",
"armv7-m"},
"armv7m")
1094 .Cases({
"armv7s",
"armv7-s"},
"armv7s")
1095 .Cases({
"armv8-m.base",
"armv8m.base"},
"armv8m.base")
1096 .Cases({
"armv8-m.main",
"armv8m.main"},
"armv8m.main")
1097 .Cases({
"armv8.1-m.main",
"armv8m.main"},
"armv8.1m.main")
1102 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseCPUArch(CPU);
1103 if (ArchKind == llvm::ARM::ArchKind::INVALID)
1105 StringRef
Arch = llvm::ARM::getArchName(ArchKind);
1109 if (
Arch.starts_with(
"armv5"))
1112 else if (
Arch.starts_with(
"armv6") && !
Arch.ends_with(
"6m"))
1115 else if (
Arch.ends_with(
"v7a"))
1125 case llvm::Triple::aarch64_32:
1128 case llvm::Triple::aarch64: {
1134 case llvm::Triple::thumb:
1135 case llvm::Triple::arm:
1136 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1140 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1149 if (LinkerVersion) {
1151 VersionTuple NewLinkerVersion;
1152 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ))
1153 (void)NewLinkerVersion.tryParse(A->getValue());
1154 assert(NewLinkerVersion == LinkerVersion);
1156 return *LinkerVersion;
1159 VersionTuple NewLinkerVersion;
1160 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1163 if (NewLinkerVersion.tryParse(A->getValue()) ||
1164 NewLinkerVersion.getSubbuild())
1166 << A->getAsString(Args);
1169 LinkerVersion = NewLinkerVersion;
1170 return *LinkerVersion;
1179 llvm::Triple::OSType OS =
getTriple().getOS();
1183 case llvm::Triple::Darwin:
1184 case llvm::Triple::MacOSX:
1187 case llvm::Triple::IOS:
1190 case llvm::Triple::TvOS:
1193 case llvm::Triple::WatchOS:
1196 case llvm::Triple::XROS:
1199 case llvm::Triple::DriverKit:
1208 if (
getTriple().isSimulatorEnvironment())
1210 else if (
getTriple().isMacCatalystEnvironment())
1214 if (Platform ==
MacOS) {
1218 if (!
getTriple().getMacOSXVersion(OsVer))
1223 setTarget(Platform, Environment, OsVer.getMajor(),
1224 OsVer.getMinor().value_or(0), OsVer.getSubminor().value_or(0),
1236void Darwin::VerifyTripleForSDK(
const llvm::opt::ArgList &Args,
1237 const llvm::Triple &Triple)
const {
1239 if (!
SDKInfo->supportsTriple(Triple))
1241 <<
SDKInfo->getDisplayName() << Triple.getTriple();
1242 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
1245 const char *isysroot = A->getValue();
1247 if (!SDKName.empty()) {
1248 bool supported =
true;
1249 if (Triple.isWatchOS())
1250 supported = SDKName.starts_with(
"Watch");
1251 else if (Triple.isTvOS())
1252 supported = SDKName.starts_with(
"AppleTV");
1253 else if (Triple.isDriverKit())
1254 supported = SDKName.starts_with(
"DriverKit");
1255 else if (Triple.isiOS())
1256 supported = SDKName.starts_with(
"iPhone");
1257 else if (Triple.isMacOSX())
1258 supported = SDKName.starts_with(
"MacOSX");
1264 << SDKName << Triple.getTriple();
1281 return Triple.getTriple();
1293 Str += llvm::Triple::getOSTypeName(llvm::Triple::XROS);
1295 Str += llvm::Triple::getOSTypeName(llvm::Triple::Firmware);
1299 Triple.setOSName(Str);
1301 VerifyTripleForSDK(Args, Triple);
1303 return Triple.getTriple();
1315 return Dsymutil.get();
1319 return VerifyDebug.get();
1336 const ArgList &Args)
1337 :
Darwin(D, Triple, Args) {}
1341 CC1Args.push_back(
"-Wundef-prefix=TARGET_OS_");
1342 CC1Args.push_back(
"-Werror=undef-prefix");
1353 CC1Args.push_back(
"-Wdeprecated-objc-isa-usage");
1354 CC1Args.push_back(
"-Werror=deprecated-objc-isa-usage");
1359 CC1Args.push_back(
"-Werror=implicit-function-declaration");
1364 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
1374 static constexpr llvm::StringLiteral XcodeAppSuffix(
1375 ".app/Contents/Developer");
1376 size_t Index = PathIntoXcode.find(XcodeAppSuffix);
1377 if (Index == StringRef::npos)
1379 return PathIntoXcode.take_front(Index + XcodeAppSuffix.size());
1383 ArgStringList &CmdArgs)
const {
1402 llvm::sys::path::remove_filename(P);
1403 llvm::sys::path::remove_filename(P);
1404 llvm::sys::path::append(P,
"lib",
"arc");
1410 if (!
getVFS().exists(P)) {
1411 auto updatePath = [&](
const Arg *A) {
1415 if (XcodePathForSDK.empty())
1418 P = XcodePathForSDK;
1419 llvm::sys::path::append(P,
"Toolchains/XcodeDefault.xctoolchain/usr",
1421 return getVFS().exists(P);
1424 bool updated =
false;
1425 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot))
1426 updated = updatePath(A);
1429 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1434 CmdArgs.push_back(
"-force_load");
1435 llvm::sys::path::append(P,
"libarclite_");
1438 P +=
"watchsimulator";
1442 P +=
"appletvsimulator";
1446 P +=
"iphonesimulator";
1454 getDriver().
Diag(clang::diag::err_drv_darwin_sdk_missing_arclite) << P;
1456 CmdArgs.push_back(Args.MakeArgString(P));
1493 bool IsShared)
const {
1501 const char *LibArg = Args.MakeArgString(P);
1502 CmdArgs.push_back(LibArg);
1510 assert(StringRef(P).ends_with(
".dylib") &&
"must be a dynamic library");
1514 CmdArgs.push_back(
"-rpath");
1515 CmdArgs.push_back(
"@executable_path");
1519 CmdArgs.push_back(
"-rpath");
1520 CmdArgs.push_back(Args.MakeArgString(llvm::sys::path::parent_path(P)));
1527 "it doesn't make sense to ask for the compiler-rt library name as an "
1531 if (Component !=
"builtins") {
1532 MachOLibName +=
'.';
1533 MachOLibName += Component;
1538 llvm::sys::path::append(FullPath,
"lib",
"darwin",
"macho_embedded",
1540 return std::string(FullPath);
1550 "it doesn't make sense to ask for the compiler-rt library name as an "
1554 if (Component !=
"builtins") {
1555 DarwinLibName += Component;
1556 DarwinLibName +=
'_';
1562 llvm::sys::path::append(FullPath,
"lib",
"darwin", DarwinLibName);
1563 return std::string(FullPath);
1568 auto BeginSDK = llvm::sys::path::rbegin(isysroot);
1569 auto EndSDK = llvm::sys::path::rend(isysroot);
1570 for (
auto IT = BeginSDK; IT != EndSDK; ++IT) {
1571 StringRef SDK = *IT;
1572 if (SDK.consume_back(
".sdk"))
1602 llvm_unreachable(
"Unsupported platform");
1607 for (Arg *A : Args) {
1608 if (A->getOption().matches(options::OPT_exported__symbols__list))
1610 if (!A->getOption().matches(options::OPT_Wl_COMMA) &&
1611 !A->getOption().matches(options::OPT_Xlinker))
1613 if (A->containsValue(
"-exported_symbols_list") ||
1614 A->containsValue(
"-exported_symbol"))
1622 CmdArgs.push_back(
"-exported_symbol");
1623 CmdArgs.push_back(Symbol);
1633 StringRef Segment, StringRef Section) {
1634 for (
const char *A : {
"-sectalign", Args.MakeArgString(Segment),
1635 Args.MakeArgString(Section),
"0x4000"})
1636 CmdArgs.push_back(A);
1640 ArgStringList &CmdArgs)
const {
1669 for (
auto IPSK : {llvm::IPSK_cnts, llvm::IPSK_bitmap, llvm::IPSK_data}) {
1671 Args, CmdArgs,
"__DATA",
1672 llvm::getInstrProfSectionName(IPSK, llvm::Triple::MachO,
1678void DarwinClang::AddLinkSanitizerLibArgs(
const ArgList &Args,
1679 ArgStringList &CmdArgs,
1680 StringRef Sanitizer,
1681 bool Shared)
const {
1687 const ArgList &Args)
const {
1688 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
1689 StringRef
Value = A->getValue();
1690 if (
Value !=
"compiler-rt" &&
Value !=
"platform")
1691 getDriver().
Diag(clang::diag::err_drv_unsupported_rtlib_for_platform)
1692 <<
Value <<
"darwin";
1699 ArgStringList &CmdArgs,
1700 bool ForceLinkBuiltinRT)
const {
1710 if (Args.hasArg(options::OPT_static) ||
1711 Args.hasArg(options::OPT_fapple_kext) ||
1712 Args.hasArg(options::OPT_mkernel)) {
1713 if (ForceLinkBuiltinRT)
1721 if (
const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
1722 getDriver().
Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
1729 const char *sanitizer =
nullptr;
1731 sanitizer =
"UndefinedBehaviorSanitizer";
1733 sanitizer =
"RealtimeSanitizer";
1735 sanitizer =
"AddressSanitizer";
1737 sanitizer =
"ThreadSanitizer";
1740 getDriver().
Diag(diag::err_drv_unsupported_static_sanitizer_darwin)
1749 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan_abi",
false);
1752 "Static sanitizer runtimes not supported");
1753 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan");
1758 "Static sanitizer runtimes not supported");
1759 AddLinkSanitizerLibArgs(Args, CmdArgs,
"rtsan");
1762 AddLinkSanitizerLibArgs(Args, CmdArgs,
"lsan");
1765 "Static sanitizer runtimes not supported");
1766 AddLinkSanitizerLibArgs(
1772 "Static sanitizer runtimes not supported");
1773 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tsan");
1776 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tysan");
1777 if (Sanitize.
needsFuzzer() && !Args.hasArg(options::OPT_dynamiclib)) {
1778 AddLinkSanitizerLibArgs(Args, CmdArgs,
"fuzzer",
false);
1790 AddLinkSanitizerLibArgs(Args, CmdArgs,
"stats");
1798 llvm::memprof::getMemprofOptionsSymbolDarwinLinkageName().data());
1808 CmdArgs.push_back(
"-framework");
1809 CmdArgs.push_back(
"DriverKit");
1815 CmdArgs.push_back(
"-lSystem");
1827 CmdArgs.push_back(
"-lgcc_s.1");
1836 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
1837 if (!SystemTriple.isMacOSX())
1838 return std::string(MacOSSDKVersion);
1839 VersionTuple SystemVersion;
1840 SystemTriple.getMacOSXVersion(SystemVersion);
1842 unsigned Major, Minor, Micro;
1846 return std::string(MacOSSDKVersion);
1847 VersionTuple SDKVersion(Major, Minor, Micro);
1849 if (SDKVersion > SystemVersion)
1850 return SystemVersion.getAsString();
1851 return std::string(MacOSSDKVersion);
1858struct DarwinPlatform {
1867 DeploymentTargetEnv,
1877 DarwinPlatformKind getPlatform()
const {
return Platform; }
1879 DarwinEnvironmentKind getEnvironment()
const {
return Environment; }
1881 void setEnvironment(DarwinEnvironmentKind Kind) {
1883 InferSimulatorFromArch =
false;
1886 const VersionTuple getOSVersion()
const {
1887 return UnderlyingOSVersion.value_or(VersionTuple());
1890 VersionTuple takeOSVersion() {
1891 assert(UnderlyingOSVersion.has_value() &&
1892 "attempting to get an unset OS version");
1893 VersionTuple
Result = *UnderlyingOSVersion;
1894 UnderlyingOSVersion.reset();
1897 bool isValidOSVersion()
const {
1898 return llvm::Triple::isValidVersionForOS(getOSFromPlatform(Platform),
1902 VersionTuple getCanonicalOSVersion()
const {
1903 return llvm::Triple::getCanonicalVersionForOS(
1904 getOSFromPlatform(Platform), getOSVersion(),
true);
1907 void setOSVersion(
const VersionTuple &Version) {
1908 UnderlyingOSVersion = Version;
1911 bool hasOSVersion()
const {
return UnderlyingOSVersion.has_value(); }
1913 VersionTuple getZipperedOSVersion()
const {
1914 assert(Environment == DarwinEnvironmentKind::MacCatalyst &&
1915 "zippered target version is specified only for Mac Catalyst");
1916 return ZipperedOSVersion;
1920 bool isExplicitlySpecified()
const {
return Kind <= DeploymentTargetEnv; }
1923 bool canInferSimulatorFromArch()
const {
return InferSimulatorFromArch; }
1925 const std::optional<llvm::Triple> &getTargetVariantTriple()
const {
1926 return TargetVariantTriple;
1930 void addOSVersionMinArgument(DerivedArgList &Args,
const OptTable &Opts) {
1934 assert(Kind != TargetArg && Kind != MTargetOSArg && Kind != OSVersionArg &&
1938 case DarwinPlatformKind::MacOS:
1939 Opt = options::OPT_mmacos_version_min_EQ;
1941 case DarwinPlatformKind::IPhoneOS:
1942 Opt = options::OPT_mios_version_min_EQ;
1944 case DarwinPlatformKind::TvOS:
1945 Opt = options::OPT_mtvos_version_min_EQ;
1947 case DarwinPlatformKind::WatchOS:
1948 Opt = options::OPT_mwatchos_version_min_EQ;
1954 Arg = Args.MakeJoinedArg(
nullptr, Opts.getOption(Opt), OSVersionStr);
1960 std::string
getAsString(DerivedArgList &Args,
const OptTable &Opts) {
1966 assert(Arg &&
"OS version argument not yet inferred");
1967 return Arg->getAsString(Args);
1968 case DeploymentTargetEnv:
1969 return (llvm::Twine(EnvVarName) +
"=" + OSVersionStr).str();
1970 case InferredFromSDK:
1971 case InferredFromArch:
1972 llvm_unreachable(
"Cannot print arguments for inferred OS version");
1974 llvm_unreachable(
"Unsupported Darwin Source Kind");
1978 std::string getInferredSource() {
1979 assert(!isExplicitlySpecified() &&
"OS version was not inferred");
1980 return InferredSource.str();
1983 void setEnvironment(llvm::Triple::EnvironmentType EnvType,
1984 const VersionTuple &OSVersion,
1985 const std::optional<DarwinSDKInfo> &SDKInfo) {
1987 case llvm::Triple::Simulator:
1988 Environment = DarwinEnvironmentKind::Simulator;
1990 case llvm::Triple::MacABI: {
1991 Environment = DarwinEnvironmentKind::MacCatalyst;
1993 ZipperedOSVersion = VersionTuple(10, 15);
1994 if (hasOSVersion() && SDKInfo) {
1995 if (
const auto *MacCatalystToMacOSMapping = SDKInfo->getVersionMapping(
1997 if (
auto MacOSVersion = MacCatalystToMacOSMapping->map(
1998 OSVersion, ZipperedOSVersion, std::nullopt)) {
1999 ZipperedOSVersion = *MacOSVersion;
2006 if (TargetVariantTriple) {
2007 auto TargetVariantVersion = TargetVariantTriple->getOSVersion();
2008 if (TargetVariantVersion.getMajor()) {
2009 if (TargetVariantVersion < ZipperedOSVersion)
2010 ZipperedOSVersion = std::move(TargetVariantVersion);
2020 static DarwinPlatform
2021 createFromTarget(
const llvm::Triple &TT, Arg *A,
2022 std::optional<llvm::Triple> TargetVariantTriple,
2023 const std::optional<DarwinSDKInfo> &SDKInfo) {
2024 DarwinPlatform
Result(TargetArg, getPlatformFromOS(TT.getOS()),
2025 TT.getOSVersion(), A);
2026 VersionTuple OsVersion = TT.getOSVersion();
2027 Result.TargetVariantTriple = std::move(TargetVariantTriple);
2028 Result.setEnvironment(TT.getEnvironment(), OsVersion, SDKInfo);
2031 static DarwinPlatform
2032 createFromMTargetOS(llvm::Triple::OSType OS, VersionTuple OSVersion,
2033 llvm::Triple::EnvironmentType Environment, Arg *A,
2034 const std::optional<DarwinSDKInfo> &SDKInfo) {
2035 DarwinPlatform
Result(MTargetOSArg, getPlatformFromOS(OS), OSVersion, A);
2036 Result.InferSimulatorFromArch =
false;
2037 Result.setEnvironment(Environment, OSVersion, SDKInfo);
2040 static DarwinPlatform createOSVersionArg(DarwinPlatformKind Platform, Arg *A,
2042 DarwinPlatform
Result{OSVersionArg, Platform,
2043 getVersionFromString(A->getValue()), A};
2045 Result.Environment = DarwinEnvironmentKind::Simulator;
2048 static DarwinPlatform createDeploymentTargetEnv(DarwinPlatformKind Platform,
2049 StringRef EnvVarName,
2050 StringRef OSVersion) {
2051 DarwinPlatform
Result(DeploymentTargetEnv, Platform,
2052 getVersionFromString(OSVersion));
2053 Result.EnvVarName = EnvVarName;
2056 static DarwinPlatform createFromSDKInfo(StringRef SDKRoot,
2057 const DarwinSDKInfo &SDKInfo) {
2059 const llvm::Triple::OSType
OS = PlatformTriple.getOS();
2061 if (OS == llvm::Triple::MacOSX)
2062 Version = getVersionFromString(
2064 DarwinPlatform
Result(InferredFromSDK, getPlatformFromOS(OS), Version);
2065 Result.Environment = getEnvKindFromEnvType(PlatformTriple.getEnvironment());
2066 Result.InferSimulatorFromArch =
false;
2067 Result.InferredSource = SDKRoot;
2070 static DarwinPlatform createFromSDK(StringRef SDKRoot,
2071 DarwinPlatformKind Platform,
2073 bool IsSimulator =
false) {
2074 DarwinPlatform
Result(InferredFromSDK, Platform,
2075 getVersionFromString(
Value));
2077 Result.Environment = DarwinEnvironmentKind::Simulator;
2078 Result.InferSimulatorFromArch =
false;
2079 Result.InferredSource = SDKRoot;
2082 static DarwinPlatform createFromArch(StringRef
Arch, llvm::Triple::OSType OS,
2083 VersionTuple Version) {
2085 DarwinPlatform(InferredFromArch, getPlatformFromOS(OS), Version);
2093 DarwinSDKInfo inferSDKInfo() {
2094 assert(Kind == InferredFromSDK &&
"can infer SDK info only");
2095 llvm::Triple::OSType
OS = getOSFromPlatform(Platform);
2096 llvm::Triple::EnvironmentType EnvironmentType =
2097 getEnvTypeFromEnvKind(Environment);
2098 return DarwinSDKInfo(OS, EnvironmentType, getOSVersion(),
2099 getDisplayName(Platform, Environment, getOSVersion()),
2101 VersionTuple(getOSVersion().getMajor(), 0, 99));
2105 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform, Arg *Argument)
2107 Arguments({Argument, VersionTuple().getAsString()}) {}
2108 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform,
2109 VersionTuple
Value, Arg *Argument =
nullptr)
2113 UnderlyingOSVersion =
Value;
2116 static VersionTuple getVersionFromString(
const StringRef Input) {
2117 llvm::VersionTuple Version;
2118 bool IsValid = !Version.tryParse(Input);
2119 assert(IsValid &&
"unable to convert input version to version tuple");
2124 static DarwinPlatformKind getPlatformFromOS(llvm::Triple::OSType OS) {
2126 case llvm::Triple::Darwin:
2127 case llvm::Triple::MacOSX:
2128 return DarwinPlatformKind::MacOS;
2129 case llvm::Triple::IOS:
2130 return DarwinPlatformKind::IPhoneOS;
2131 case llvm::Triple::TvOS:
2132 return DarwinPlatformKind::TvOS;
2133 case llvm::Triple::WatchOS:
2134 return DarwinPlatformKind::WatchOS;
2135 case llvm::Triple::XROS:
2136 return DarwinPlatformKind::XROS;
2137 case llvm::Triple::DriverKit:
2138 return DarwinPlatformKind::DriverKit;
2139 case llvm::Triple::Firmware:
2140 return DarwinPlatformKind::Firmware;
2142 llvm_unreachable(
"Unable to infer Darwin variant");
2146 static llvm::Triple::OSType getOSFromPlatform(DarwinPlatformKind Platform) {
2148 case DarwinPlatformKind::MacOS:
2149 return llvm::Triple::MacOSX;
2150 case DarwinPlatformKind::IPhoneOS:
2151 return llvm::Triple::IOS;
2152 case DarwinPlatformKind::TvOS:
2153 return llvm::Triple::TvOS;
2154 case DarwinPlatformKind::WatchOS:
2155 return llvm::Triple::WatchOS;
2156 case DarwinPlatformKind::DriverKit:
2157 return llvm::Triple::DriverKit;
2158 case DarwinPlatformKind::XROS:
2159 return llvm::Triple::XROS;
2160 case DarwinPlatformKind::Firmware:
2161 return llvm::Triple::Firmware;
2163 llvm_unreachable(
"Unknown DarwinPlatformKind enum");
2166 static DarwinEnvironmentKind
2167 getEnvKindFromEnvType(llvm::Triple::EnvironmentType EnvironmentType) {
2168 switch (EnvironmentType) {
2169 case llvm::Triple::UnknownEnvironment:
2170 return DarwinEnvironmentKind::NativeEnvironment;
2171 case llvm::Triple::Simulator:
2172 return DarwinEnvironmentKind::Simulator;
2173 case llvm::Triple::MacABI:
2174 return DarwinEnvironmentKind::MacCatalyst;
2176 llvm_unreachable(
"Unable to infer Darwin environment");
2180 static llvm::Triple::EnvironmentType
2181 getEnvTypeFromEnvKind(DarwinEnvironmentKind EnvironmentKind) {
2182 switch (EnvironmentKind) {
2183 case DarwinEnvironmentKind::NativeEnvironment:
2184 return llvm::Triple::UnknownEnvironment;
2185 case DarwinEnvironmentKind::Simulator:
2186 return llvm::Triple::Simulator;
2187 case DarwinEnvironmentKind::MacCatalyst:
2188 return llvm::Triple::MacABI;
2190 llvm_unreachable(
"Unknown DarwinEnvironmentKind enum");
2193 static std::string getDisplayName(DarwinPlatformKind TargetPlatform,
2194 DarwinEnvironmentKind TargetEnvironment,
2195 VersionTuple Version) {
2196 SmallVector<std::string, 3> Components;
2197 switch (TargetPlatform) {
2198 case DarwinPlatformKind::MacOS:
2199 Components.push_back(
"macOS");
2201 case DarwinPlatformKind::IPhoneOS:
2202 Components.push_back(
"iOS");
2204 case DarwinPlatformKind::TvOS:
2205 Components.push_back(
"tvOS");
2207 case DarwinPlatformKind::WatchOS:
2208 Components.push_back(
"watchOS");
2210 case DarwinPlatformKind::DriverKit:
2211 Components.push_back(
"DriverKit");
2214 llvm::reportFatalUsageError(Twine(
"Platform: '") +
2215 std::to_string(TargetPlatform) +
2216 "' is unsupported when inferring SDK Info.");
2218 switch (TargetEnvironment) {
2219 case DarwinEnvironmentKind::NativeEnvironment:
2221 case DarwinEnvironmentKind::Simulator:
2222 Components.push_back(
"Simulator");
2225 llvm::reportFatalUsageError(Twine(
"Environment: '") +
2226 std::to_string(TargetEnvironment) +
2227 "' is unsupported when inferring SDK Info.");
2229 Components.push_back(Version.getAsString());
2230 return join(Components,
" ");
2234 DarwinPlatformKind Platform;
2235 DarwinEnvironmentKind Environment = DarwinEnvironmentKind::NativeEnvironment;
2239 VersionTuple ZipperedOSVersion;
2244 std::optional<VersionTuple> UnderlyingOSVersion;
2245 bool InferSimulatorFromArch =
true;
2246 std::pair<Arg *, std::string>
Arguments;
2247 StringRef EnvVarName;
2250 StringRef InferredSource;
2253 std::optional<llvm::Triple> TargetVariantTriple;
2258std::optional<DarwinPlatform>
2259getDeploymentTargetFromOSVersionArg(DerivedArgList &Args,
2260 const Driver &TheDriver) {
2261 Arg *macOSVersion = Args.getLastArg(options::OPT_mmacos_version_min_EQ);
2262 Arg *iOSVersion = Args.getLastArg(options::OPT_mios_version_min_EQ,
2263 options::OPT_mios_simulator_version_min_EQ);
2265 Args.getLastArg(options::OPT_mtvos_version_min_EQ,
2266 options::OPT_mtvos_simulator_version_min_EQ);
2267 Arg *WatchOSVersion =
2268 Args.getLastArg(options::OPT_mwatchos_version_min_EQ,
2269 options::OPT_mwatchos_simulator_version_min_EQ);
2271 auto GetDarwinPlatform =
2272 [&](DarwinPlatform::DarwinPlatformKind Platform, Arg *VersionArg,
2273 bool IsSimulator) -> std::optional<DarwinPlatform> {
2274 if (StringRef(VersionArg->getValue()).empty()) {
2275 TheDriver.
Diag(diag::err_drv_missing_version_number)
2276 << VersionArg->getAsString(Args);
2277 return std::nullopt;
2279 return DarwinPlatform::createOSVersionArg(Platform, VersionArg,
2284 if (iOSVersion || TvOSVersion || WatchOSVersion) {
2285 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2286 << macOSVersion->getAsString(Args)
2287 << (iOSVersion ? iOSVersion
2288 : TvOSVersion ? TvOSVersion : WatchOSVersion)
2294 }
else if (iOSVersion) {
2295 if (TvOSVersion || WatchOSVersion) {
2296 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2297 << iOSVersion->getAsString(Args)
2298 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->
getAsString(Args);
2301 iOSVersion->getOption().getID() ==
2302 options::OPT_mios_simulator_version_min_EQ);
2303 }
else if (TvOSVersion) {
2304 if (WatchOSVersion) {
2305 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2306 << TvOSVersion->getAsString(Args)
2307 << WatchOSVersion->getAsString(Args);
2310 TvOSVersion->getOption().getID() ==
2311 options::OPT_mtvos_simulator_version_min_EQ);
2312 }
else if (WatchOSVersion)
2313 return GetDarwinPlatform(
2315 WatchOSVersion->getOption().getID() ==
2316 options::OPT_mwatchos_simulator_version_min_EQ);
2317 return std::nullopt;
2322std::optional<DarwinPlatform>
2323getDeploymentTargetFromEnvironmentVariables(
const Driver &TheDriver,
2324 const llvm::Triple &Triple) {
2325 const char *EnvVars[] = {
2326 "MACOSX_DEPLOYMENT_TARGET",
2327 "IPHONEOS_DEPLOYMENT_TARGET",
2328 "TVOS_DEPLOYMENT_TARGET",
2329 "WATCHOS_DEPLOYMENT_TARGET",
2330 "DRIVERKIT_DEPLOYMENT_TARGET",
2331 "XROS_DEPLOYMENT_TARGET"
2333 std::string Targets[std::size(EnvVars)];
2334 for (
const auto &I : llvm::enumerate(llvm::ArrayRef(EnvVars))) {
2335 if (
char *Env = ::getenv(I.value()))
2336 Targets[I.index()] = Env;
2345 if (Triple.getArch() == llvm::Triple::arm ||
2346 Triple.getArch() == llvm::Triple::aarch64 ||
2347 Triple.getArch() == llvm::Triple::thumb)
2354 unsigned FirstTarget = std::size(Targets);
2355 for (
unsigned I = 0; I != std::size(Targets); ++I) {
2356 if (Targets[I].empty())
2358 if (FirstTarget == std::size(Targets))
2361 TheDriver.
Diag(diag::err_drv_conflicting_deployment_targets)
2362 << Targets[FirstTarget] << Targets[I];
2366 for (
const auto &
Target : llvm::enumerate(llvm::ArrayRef(Targets))) {
2367 if (!
Target.value().empty())
2368 return DarwinPlatform::createDeploymentTargetEnv(
2372 return std::nullopt;
2378std::optional<DarwinPlatform>
2379inferDeploymentTargetFromSDK(DerivedArgList &Args,
2380 const std::optional<DarwinSDKInfo> &SDKInfo) {
2381 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2383 return std::nullopt;
2384 StringRef isysroot = A->getValue();
2386 return DarwinPlatform::createFromSDKInfo(isysroot, *SDKInfo);
2390 return std::nullopt;
2392 std::string Version;
2395 size_t StartVer = SDK.find_first_of(
"0123456789");
2396 size_t EndVer = SDK.find_last_of(
"0123456789");
2397 if (StartVer != StringRef::npos && EndVer > StartVer)
2398 Version = std::string(SDK.slice(StartVer, EndVer + 1));
2399 if (Version.empty())
2400 return std::nullopt;
2402 if (SDK.starts_with(
"iPhoneOS") || SDK.starts_with(
"iPhoneSimulator"))
2403 return DarwinPlatform::createFromSDK(
2405 SDK.starts_with(
"iPhoneSimulator"));
2406 else if (SDK.starts_with(
"MacOSX"))
2407 return DarwinPlatform::createFromSDK(isysroot,
Darwin::MacOS,
2409 else if (SDK.starts_with(
"WatchOS") || SDK.starts_with(
"WatchSimulator"))
2410 return DarwinPlatform::createFromSDK(
2412 SDK.starts_with(
"WatchSimulator"));
2413 else if (SDK.starts_with(
"AppleTVOS") || SDK.starts_with(
"AppleTVSimulator"))
2414 return DarwinPlatform::createFromSDK(
2416 SDK.starts_with(
"AppleTVSimulator"));
2417 else if (SDK.starts_with(
"DriverKit"))
2419 return std::nullopt;
2423VersionTuple getInferredOSVersion(llvm::Triple::OSType OS,
2424 const llvm::Triple &Triple,
2425 const Driver &TheDriver) {
2426 VersionTuple OsVersion;
2427 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
2429 case llvm::Triple::Darwin:
2430 case llvm::Triple::MacOSX:
2433 if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
2434 !Triple.getOSMajorVersion())
2435 SystemTriple.getMacOSXVersion(OsVersion);
2436 else if (!Triple.getMacOSXVersion(OsVersion))
2437 TheDriver.
Diag(diag::err_drv_invalid_darwin_version)
2438 << Triple.getOSName();
2440 case llvm::Triple::IOS:
2441 if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
2442 OsVersion = VersionTuple(13, 1);
2444 OsVersion = Triple.getiOSVersion();
2446 case llvm::Triple::TvOS:
2447 OsVersion = Triple.getOSVersion();
2449 case llvm::Triple::WatchOS:
2450 OsVersion = Triple.getWatchOSVersion();
2452 case llvm::Triple::DriverKit:
2453 OsVersion = Triple.getDriverKitVersion();
2456 OsVersion = Triple.getOSVersion();
2457 if (!OsVersion.getMajor())
2458 OsVersion = OsVersion.withMajorReplaced(1);
2465std::optional<DarwinPlatform>
2466inferDeploymentTargetFromArch(DerivedArgList &Args,
const Darwin &Toolchain,
2467 const llvm::Triple &Triple,
2468 const Driver &TheDriver) {
2469 llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS;
2472 if (MachOArchName ==
"arm64" || MachOArchName ==
"arm64e")
2473 OSTy = llvm::Triple::MacOSX;
2474 else if (MachOArchName ==
"armv7" || MachOArchName ==
"armv7s" ||
2475 MachOArchName ==
"armv6")
2476 OSTy = llvm::Triple::IOS;
2477 else if (MachOArchName ==
"armv7k" || MachOArchName ==
"arm64_32")
2478 OSTy = llvm::Triple::WatchOS;
2479 else if (MachOArchName !=
"armv6m" && MachOArchName !=
"armv7m" &&
2480 MachOArchName !=
"armv7em" && MachOArchName !=
"armv8m.base" &&
2481 MachOArchName !=
"armv8m.main" && MachOArchName !=
"armv8.1m.main")
2482 OSTy = llvm::Triple::MacOSX;
2483 if (OSTy == llvm::Triple::UnknownOS)
2484 return std::nullopt;
2485 return DarwinPlatform::createFromArch(
2486 MachOArchName, OSTy, getInferredOSVersion(OSTy, Triple, TheDriver));
2490std::optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
2491 DerivedArgList &Args,
const llvm::Triple &Triple,
const Driver &TheDriver,
2492 const std::optional<DarwinSDKInfo> &SDKInfo) {
2493 if (!Args.hasArg(options::OPT_target))
2494 return std::nullopt;
2495 if (Triple.getOS() == llvm::Triple::Darwin ||
2496 Triple.getOS() == llvm::Triple::UnknownOS)
2497 return std::nullopt;
2498 std::optional<llvm::Triple> TargetVariantTriple;
2499 for (
const Arg *A : Args.filtered(options::OPT_darwin_target_variant)) {
2500 llvm::Triple TVT(A->getValue());
2502 if ((Triple.getArch() == llvm::Triple::aarch64 ||
2503 TVT.getArchName() == Triple.getArchName()) &&
2504 TVT.getArch() == Triple.getArch() &&
2505 TVT.getSubArch() == Triple.getSubArch() &&
2506 TVT.getVendor() == Triple.getVendor()) {
2507 if (TargetVariantTriple)
2512 if ((Triple.isMacOSX() && TVT.getOS() == llvm::Triple::IOS &&
2513 TVT.isMacCatalystEnvironment()) ||
2514 (TVT.isMacOSX() && Triple.getOS() == llvm::Triple::IOS &&
2515 Triple.isMacCatalystEnvironment())) {
2516 TargetVariantTriple = TVT;
2519 TheDriver.
Diag(diag::err_drv_target_variant_invalid)
2520 << A->getSpelling() << A->getValue();
2523 DarwinPlatform PlatformAndVersion = DarwinPlatform::createFromTarget(
2524 Triple, Args.getLastArg(options::OPT_target), TargetVariantTriple,
2527 return PlatformAndVersion;
2531std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2532 DerivedArgList &Args,
const Driver &TheDriver,
2533 const std::optional<DarwinSDKInfo> &SDKInfo) {
2534 auto *A = Args.getLastArg(options::OPT_mtargetos_EQ);
2536 return std::nullopt;
2537 llvm::Triple TT(llvm::Twine(
"unknown-apple-") + A->getValue());
2538 switch (TT.getOS()) {
2539 case llvm::Triple::MacOSX:
2540 case llvm::Triple::IOS:
2541 case llvm::Triple::TvOS:
2542 case llvm::Triple::WatchOS:
2543 case llvm::Triple::XROS:
2546 TheDriver.
Diag(diag::err_drv_invalid_os_in_arg)
2547 << TT.getOSName() << A->getAsString(Args);
2548 return std::nullopt;
2551 VersionTuple Version = TT.getOSVersion();
2552 if (!Version.getMajor()) {
2553 TheDriver.
Diag(diag::err_drv_invalid_version_number)
2554 << A->getAsString(Args);
2555 return std::nullopt;
2557 return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
2558 TT.getEnvironment(), A, SDKInfo);
2561std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS,
2562 const ArgList &Args,
2563 const Driver &TheDriver) {
2564 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2566 return std::nullopt;
2567 StringRef isysroot = A->getValue();
2569 if (!SDKInfoOrErr) {
2570 llvm::consumeError(SDKInfoOrErr.takeError());
2571 TheDriver.
Diag(diag::warn_drv_darwin_sdk_invalid_settings);
2572 return std::nullopt;
2574 return *SDKInfoOrErr;
2579void Darwin::AddDeploymentTarget(DerivedArgList &Args)
const {
2585 bool TryXcselect =
false;
2591 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2593 if (!
getVFS().exists(A->getValue()))
2594 getDriver().
Diag(clang::diag::warn_missing_sysroot) << A->getValue();
2595 }
else if (
const char *env = ::getenv(
"SDKROOT")) {
2598 if (llvm::sys::path::is_absolute(env) &&
getVFS().exists(env) &&
2599 StringRef(env) !=
"/") {
2600 Args.append(Args.MakeSeparateArg(
2601 nullptr, Opts.getOption(options::OPT_isysroot), env));
2604 TryXcselect = !Args.hasArg(options::OPT__sysroot_EQ) &&
2605 !Args.hasArg(options::OPT_no_xcselect);
2615 std::optional<DarwinPlatform> PlatformAndVersion =
2617 if (PlatformAndVersion) {
2619 if (
const auto *MTargetOSArg = Args.getLastArg(options::OPT_mtargetos_EQ)) {
2620 std::string TargetArgStr = PlatformAndVersion->getAsString(Args, Opts);
2621 std::string MTargetOSArgStr = MTargetOSArg->getAsString(Args);
2623 << TargetArgStr << MTargetOSArgStr;
2626 bool TripleProvidedOSVersion = PlatformAndVersion->hasOSVersion();
2627 if (!TripleProvidedOSVersion)
2628 PlatformAndVersion->setOSVersion(
2631 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2632 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2633 if (PlatformAndVersionFromOSVersionArg) {
2634 unsigned TargetMajor, TargetMinor, TargetMicro;
2636 unsigned ArgMajor, ArgMinor, ArgMicro;
2638 if (PlatformAndVersion->getPlatform() !=
2639 PlatformAndVersionFromOSVersionArg->getPlatform() ||
2641 PlatformAndVersion->getOSVersion().getAsString(), TargetMajor,
2642 TargetMinor, TargetMicro, TargetExtra) &&
2644 PlatformAndVersionFromOSVersionArg->getOSVersion().getAsString(),
2645 ArgMajor, ArgMinor, ArgMicro, ArgExtra) &&
2646 (VersionTuple(TargetMajor, TargetMinor, TargetMicro) !=
2647 VersionTuple(ArgMajor, ArgMinor, ArgMicro) ||
2648 TargetExtra != ArgExtra))) {
2651 if (PlatformAndVersion->getPlatform() ==
2652 PlatformAndVersionFromOSVersionArg->getPlatform() &&
2653 !TripleProvidedOSVersion) {
2654 PlatformAndVersion->setOSVersion(
2655 PlatformAndVersionFromOSVersionArg->getOSVersion());
2659 std::string OSVersionArg =
2660 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2661 std::string TargetArg = PlatformAndVersion->getAsString(Args, Opts);
2663 << OSVersionArg << TargetArg;
2667 }
else if ((PlatformAndVersion = getDeploymentTargetFromMTargetOSArg(
2671 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2672 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2673 if (PlatformAndVersionFromOSVersionArg) {
2674 std::string MTargetOSArgStr = PlatformAndVersion->getAsString(Args, Opts);
2675 std::string OSVersionArgStr =
2676 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2678 << MTargetOSArgStr << OSVersionArgStr;
2682 PlatformAndVersion = getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2685 if (!PlatformAndVersion) {
2686 PlatformAndVersion =
2688 if (PlatformAndVersion) {
2690 std::optional<DarwinPlatform> SDKTarget =
2691 inferDeploymentTargetFromSDK(Args,
SDKInfo);
2693 PlatformAndVersion->setEnvironment(SDKTarget->getEnvironment());
2699 if (!PlatformAndVersion) {
2700 PlatformAndVersion = inferDeploymentTargetFromSDK(Args,
SDKInfo);
2703 if (PlatformAndVersion && !
SDKInfo)
2704 SDKInfo = PlatformAndVersion->inferSDKInfo();
2708 if (!PlatformAndVersion)
2709 PlatformAndVersion =
2713 assert(PlatformAndVersion &&
"Unable to infer Darwin variant");
2714 if (!PlatformAndVersion->isValidOSVersion()) {
2715 if (PlatformAndVersion->isExplicitlySpecified())
2717 << PlatformAndVersion->getAsString(Args, Opts);
2719 getDriver().
Diag(diag::err_drv_invalid_version_number_inferred)
2720 << PlatformAndVersion->getOSVersion().getAsString()
2721 << PlatformAndVersion->getInferredSource();
2726 VersionTuple CanonicalVersion = PlatformAndVersion->getCanonicalOSVersion();
2727 if (CanonicalVersion != PlatformAndVersion->getOSVersion()) {
2728 getDriver().
Diag(diag::warn_drv_overriding_deployment_version)
2729 << PlatformAndVersion->getOSVersion().getAsString()
2730 << CanonicalVersion.getAsString();
2731 PlatformAndVersion->setOSVersion(CanonicalVersion);
2734 PlatformAndVersion->addOSVersionMinArgument(Args, Opts);
2737 unsigned Major, Minor, Micro;
2740 const unsigned MajorVersionLimit = 1000;
2741 const VersionTuple OSVersion = PlatformAndVersion->takeOSVersion();
2742 const std::string OSVersionStr = OSVersion.getAsString();
2744 if (Platform ==
MacOS) {
2745#ifdef CLANG_USE_XCSELECT
2748 if (!::xcselect_host_sdk_path(CLANG_XCSELECT_HOST_SDK_POLICY, &p)) {
2749 Args.append(Args.MakeSeparateArg(
2750 nullptr, Opts.getOption(options::OPT_isysroot), p));
2759 HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
2762 << PlatformAndVersion->getAsString(Args, Opts);
2766 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2768 << PlatformAndVersion->getAsString(Args, Opts);
2770 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst &&
2771 (Major < 13 || (Major == 13 && Minor < 1))) {
2773 << PlatformAndVersion->getAsString(Args, Opts);
2780 if (
getTriple().isArch32Bit() && Major >= 11) {
2782 if (PlatformAndVersion->isExplicitlySpecified()) {
2783 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst)
2784 getDriver().
Diag(diag::err_invalid_macos_32bit_deployment_target);
2787 << PlatformAndVersion->getAsString(Args, Opts);
2795 }
else if (Platform ==
TvOS) {
2798 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2800 << PlatformAndVersion->getAsString(Args, Opts);
2801 }
else if (Platform ==
WatchOS) {
2804 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2806 << PlatformAndVersion->getAsString(Args, Opts);
2810 HadExtra || Major < 19 || Major >= MajorVersionLimit || Minor >= 100 ||
2813 << PlatformAndVersion->getAsString(Args, Opts);
2817 HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2820 << PlatformAndVersion->getAsString(Args, Opts);
2827 PlatformAndVersion->canInferSimulatorFromArch() &&
getTriple().isX86())
2830 VersionTuple ZipperedOSVersion;
2832 ZipperedOSVersion = PlatformAndVersion->getZipperedOSVersion();
2833 setTarget(Platform, Environment, Major, Minor, Micro, ZipperedOSVersion);
2845 return !
SDKInfo->getPlatformPrefix(
T).empty();
2854 const llvm::Triple &
T)
const {
2856 const StringRef PlatformPrefix =
SDKInfo->getPlatformPrefix(
T);
2857 if (!PlatformPrefix.empty())
2858 llvm::sys::path::append(Path, PlatformPrefix);
2859 }
else if (
T.isDriverKit()) {
2862 llvm::sys::path::append(Path,
"System",
"DriverKit");
2871 if (DriverArgs.hasArg(options::OPT_isysroot))
2872 Path = DriverArgs.getLastArgValue(options::OPT_isysroot);
2883 const llvm::opt::ArgList &DriverArgs,
2884 llvm::opt::ArgStringList &CC1Args)
const {
2889 bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc);
2890 bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc);
2891 bool NoBuiltinInc = DriverArgs.hasFlag(
2892 options::OPT_nobuiltininc, options::OPT_ibuiltininc,
false);
2893 bool ForceBuiltinInc = DriverArgs.hasFlag(
2894 options::OPT_ibuiltininc, options::OPT_nobuiltininc,
false);
2897 if (!NoStdInc && !NoStdlibInc) {
2899 llvm::sys::path::append(P,
"usr",
"local",
"include");
2904 if (!(NoStdInc && !ForceBuiltinInc) && !NoBuiltinInc) {
2906 llvm::sys::path::append(P,
"include");
2910 if (NoStdInc || NoStdlibInc)
2914 llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
2915 if (!CIncludeDirs.empty()) {
2917 CIncludeDirs.split(dirs,
":");
2918 for (llvm::StringRef dir : dirs) {
2919 llvm::StringRef Prefix =
2920 llvm::sys::path::is_absolute(dir) ?
"" : llvm::StringRef(Sysroot);
2926 llvm::sys::path::append(P,
"usr",
"include");
2932 const llvm::opt::ArgList &DriverArgs,
2933 llvm::opt::ArgStringList &CC1Args)
const {
2936 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc))
2945 llvm::sys::path::append(P1,
"System",
"Library",
"Frameworks");
2946 llvm::sys::path::append(P2,
"System",
"Library",
"SubFrameworks");
2947 llvm::sys::path::append(P3,
"Library",
"Frameworks");
2951bool DarwinClang::AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
2952 llvm::opt::ArgStringList &CC1Args,
2954 llvm::StringRef Version,
2955 llvm::StringRef ArchDir,
2956 llvm::StringRef BitDir)
const {
2957 llvm::sys::path::append(
Base, Version);
2965 if (!ArchDir.empty())
2966 llvm::sys::path::append(P, ArchDir);
2967 if (!BitDir.empty())
2968 llvm::sys::path::append(P, BitDir);
2975 llvm::sys::path::append(P,
"backward");
2983 const llvm::opt::ArgList &DriverArgs,
2984 llvm::opt::ArgStringList &CC1Args)
const {
2992 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
2993 options::OPT_nostdincxx))
3014 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
3015 if (
getVFS().exists(InstallBin)) {
3018 }
else if (DriverArgs.hasArg(options::OPT_v)) {
3019 llvm::errs() <<
"ignoring nonexistent directory \"" << InstallBin
3025 llvm::sys::path::append(SysrootUsr,
"usr",
"include",
"c++",
"v1");
3026 if (
getVFS().exists(SysrootUsr)) {
3029 }
else if (DriverArgs.hasArg(options::OPT_v)) {
3030 llvm::errs() <<
"ignoring nonexistent directory \"" << SysrootUsr
3039 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args);
3044void AppleMachO::AddGnuCPlusPlusIncludePaths(
3045 const llvm::opt::ArgList &DriverArgs,
3046 llvm::opt::ArgStringList &CC1Args)
const {}
3048void DarwinClang::AddGnuCPlusPlusIncludePaths(
3049 const llvm::opt::ArgList &DriverArgs,
3050 llvm::opt::ArgStringList &CC1Args)
const {
3052 llvm::sys::path::append(UsrIncludeCxx,
"usr",
"include",
"c++");
3054 llvm::Triple::ArchType arch =
getTriple().getArch();
3055 bool IsBaseFound =
true;
3060 case llvm::Triple::x86:
3061 case llvm::Triple::x86_64:
3062 IsBaseFound = AddGnuCPlusPlusIncludePaths(
3063 DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
"i686-apple-darwin10",
3064 arch == llvm::Triple::x86_64 ?
"x86_64" :
"");
3065 IsBaseFound |= AddGnuCPlusPlusIncludePaths(
3066 DriverArgs, CC1Args, UsrIncludeCxx,
"4.0.0",
"i686-apple-darwin8",
"");
3069 case llvm::Triple::arm:
3070 case llvm::Triple::thumb:
3072 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3073 "arm-apple-darwin10",
"v7");
3075 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3076 "arm-apple-darwin10",
"v6");
3079 case llvm::Triple::aarch64:
3081 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3082 "arm64-apple-darwin10",
"");
3092 ArgStringList &CmdArgs)
const {
3097 CmdArgs.push_back(
"-lc++");
3098 if (Args.hasArg(options::OPT_fexperimental_library))
3099 CmdArgs.push_back(
"-lc++experimental");
3109 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
3111 llvm::sys::path::append(P,
"usr",
"lib",
"libstdc++.dylib");
3113 if (!
getVFS().exists(P)) {
3114 llvm::sys::path::remove_filename(P);
3115 llvm::sys::path::append(P,
"libstdc++.6.dylib");
3116 if (
getVFS().exists(P)) {
3117 CmdArgs.push_back(Args.MakeArgString(P));
3126 if (!
getVFS().exists(
"/usr/lib/libstdc++.dylib") &&
3127 getVFS().exists(
"/usr/lib/libstdc++.6.dylib")) {
3128 CmdArgs.push_back(
"/usr/lib/libstdc++.6.dylib");
3133 CmdArgs.push_back(
"-lstdc++");
3139 ArgStringList &CmdArgs)
const {
3145 llvm::sys::path::append(P,
"lib",
"darwin");
3149 llvm::sys::path::append(P,
"libclang_rt.cc_kext_watchos.a");
3151 llvm::sys::path::append(P,
"libclang_rt.cc_kext_tvos.a");
3153 llvm::sys::path::append(P,
"libclang_rt.cc_kext_ios.a");
3157 llvm::sys::path::append(
3158 P, llvm::Twine(
"libclang_rt.cc_kext_") +
3159 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
".a");
3161 llvm::sys::path::append(P,
"libclang_rt.cc_kext.a");
3167 CmdArgs.push_back(Args.MakeArgString(P));
3172 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
3182 for (Arg *A : Args) {
3191 case options::OPT_mkernel:
3192 case options::OPT_fapple_kext:
3194 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
3197 case options::OPT_dependency_file:
3198 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
3201 case options::OPT_gfull:
3202 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3204 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
3207 case options::OPT_gused:
3208 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3210 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
3213 case options::OPT_shared:
3214 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
3217 case options::OPT_fconstant_cfstrings:
3218 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
3221 case options::OPT_fno_constant_cfstrings:
3222 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
3225 case options::OPT_Wnonportable_cfstrings:
3227 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
3230 case options::OPT_Wno_nonportable_cfstrings:
3232 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
3241 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
3242 const Option MArch = Opts.getOption(options::OPT_march_EQ);
3248 else if (Name ==
"ppc601")
3249 DAL->AddJoinedArg(
nullptr, MCpu,
"601");
3250 else if (Name ==
"ppc603")
3251 DAL->AddJoinedArg(
nullptr, MCpu,
"603");
3252 else if (Name ==
"ppc604")
3253 DAL->AddJoinedArg(
nullptr, MCpu,
"604");
3254 else if (Name ==
"ppc604e")
3255 DAL->AddJoinedArg(
nullptr, MCpu,
"604e");
3256 else if (Name ==
"ppc750")
3257 DAL->AddJoinedArg(
nullptr, MCpu,
"750");
3258 else if (Name ==
"ppc7400")
3259 DAL->AddJoinedArg(
nullptr, MCpu,
"7400");
3260 else if (Name ==
"ppc7450")
3261 DAL->AddJoinedArg(
nullptr, MCpu,
"7450");
3262 else if (Name ==
"ppc970")
3263 DAL->AddJoinedArg(
nullptr, MCpu,
"970");
3265 else if (Name ==
"ppc64" || Name ==
"ppc64le")
3266 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3268 else if (Name ==
"i386")
3270 else if (Name ==
"i486")
3271 DAL->AddJoinedArg(
nullptr, MArch,
"i486");
3272 else if (Name ==
"i586")
3273 DAL->AddJoinedArg(
nullptr, MArch,
"i586");
3274 else if (Name ==
"i686")
3275 DAL->AddJoinedArg(
nullptr, MArch,
"i686");
3276 else if (Name ==
"pentium")
3277 DAL->AddJoinedArg(
nullptr, MArch,
"pentium");
3278 else if (Name ==
"pentium2")
3279 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3280 else if (Name ==
"pentpro")
3281 DAL->AddJoinedArg(
nullptr, MArch,
"pentiumpro");
3282 else if (Name ==
"pentIIm3")
3283 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3285 else if (Name ==
"x86_64" || Name ==
"x86_64h")
3286 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3288 else if (Name ==
"arm")
3289 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3290 else if (Name ==
"armv4t")
3291 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3292 else if (Name ==
"armv5")
3293 DAL->AddJoinedArg(
nullptr, MArch,
"armv5tej");
3294 else if (Name ==
"xscale")
3295 DAL->AddJoinedArg(
nullptr, MArch,
"xscale");
3296 else if (Name ==
"armv6")
3297 DAL->AddJoinedArg(
nullptr, MArch,
"armv6k");
3298 else if (Name ==
"armv6m")
3299 DAL->AddJoinedArg(
nullptr, MArch,
"armv6m");
3300 else if (Name ==
"armv7")
3301 DAL->AddJoinedArg(
nullptr, MArch,
"armv7a");
3302 else if (Name ==
"armv7em")
3303 DAL->AddJoinedArg(
nullptr, MArch,
"armv7em");
3304 else if (Name ==
"armv7k")
3305 DAL->AddJoinedArg(
nullptr, MArch,
"armv7k");
3306 else if (Name ==
"armv7m")
3307 DAL->AddJoinedArg(
nullptr, MArch,
"armv7m");
3308 else if (Name ==
"armv7s")
3309 DAL->AddJoinedArg(
nullptr, MArch,
"armv7s");
3310 else if (Name ==
"armv8-m.base" || Name ==
"armv8m.base")
3311 DAL->AddJoinedArg(
nullptr, MArch,
"armv8m.base");
3312 else if (Name ==
"armv8-m.main" || Name ==
"armv8m.main")
3313 DAL->AddJoinedArg(
nullptr, MArch,
"armv8m.main");
3314 else if (Name ==
"armv8.1-m.main" || Name ==
"armv8.1m.main")
3315 DAL->AddJoinedArg(
nullptr, MArch,
"armv8.1m.main");
3322 ArgStringList &CmdArgs,
3323 bool ForceLinkBuiltinRT)
const {
3332 CompilerRT += Args.hasArg(options::OPT_fPIC) ?
"_pic" :
"_static";
3338 llvm::Triple::OSType OS;
3344 OS = llvm::Triple::MacOSX;
3347 OS = llvm::Triple::IOS;
3350 OS = llvm::Triple::TvOS;
3353 OS = llvm::Triple::WatchOS;
3369 switch (SDKInfo->getEnvironment()) {
3370 case llvm::Triple::UnknownEnvironment:
3371 case llvm::Triple::Simulator:
3372 case llvm::Triple::MacABI:
3381 VersionTuple SDKVersion = SDKInfo->getVersion();
3382 switch (SDKInfo->getOS()) {
3385 case llvm::Triple::MacOSX:
3386 return SDKVersion >= VersionTuple(15U);
3387 case llvm::Triple::IOS:
3388 return SDKVersion >= VersionTuple(18U);
3389 case llvm::Triple::TvOS:
3390 return SDKVersion >= VersionTuple(18U);
3391 case llvm::Triple::WatchOS:
3392 return SDKVersion >= VersionTuple(11U);
3393 case llvm::Triple::XROS:
3394 return SDKVersion >= VersionTuple(2U);
3402static inline llvm::VersionTuple
3407 case llvm::Triple::Darwin:
3408 case llvm::Triple::MacOSX:
3409 return llvm::VersionTuple(10U, 12U);
3410 case llvm::Triple::IOS:
3411 case llvm::Triple::TvOS:
3412 return llvm::VersionTuple(10U);
3413 case llvm::Triple::WatchOS:
3414 return llvm::VersionTuple(3U);
3417 llvm_unreachable(
"Unexpected OS");
3421 llvm::Triple::OSType OS;
3427 OS = llvm::Triple::MacOSX;
3430 OS = llvm::Triple::IOS;
3433 OS = llvm::Triple::TvOS;
3436 OS = llvm::Triple::WatchOS;
3447 llvm::opt::ArgStringList &CC1Args,
3457 if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3458 options::OPT_fno_ptrauth_calls))
3459 CC1Args.push_back(
"-fptrauth-calls");
3460 if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3461 options::OPT_fno_ptrauth_returns))
3462 CC1Args.push_back(
"-fptrauth-returns");
3463 if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3464 options::OPT_fno_ptrauth_intrinsics))
3465 CC1Args.push_back(
"-fptrauth-intrinsics");
3466 if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3467 options::OPT_fno_ptrauth_indirect_gotos))
3468 CC1Args.push_back(
"-fptrauth-indirect-gotos");
3469 if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3470 options::OPT_fno_ptrauth_auth_traps))
3471 CC1Args.push_back(
"-fptrauth-auth-traps");
3474 if (!DriverArgs.hasArg(
3475 options::OPT_fptrauth_vtable_pointer_address_discrimination,
3476 options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
3477 CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
3478 if (!DriverArgs.hasArg(
3479 options::OPT_fptrauth_vtable_pointer_type_discrimination,
3480 options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
3481 CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
3484 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
3485 options::OPT_fno_ptrauth_objc_isa))
3486 CC1Args.push_back(
"-fptrauth-objc-isa");
3487 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
3488 options::OPT_fno_ptrauth_objc_class_ro))
3489 CC1Args.push_back(
"-fptrauth-objc-class-ro");
3490 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
3491 options::OPT_fno_ptrauth_objc_interface_sel))
3492 CC1Args.push_back(
"-fptrauth-objc-interface-sel");
3497 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3510 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
3511 options::OPT_fno_aligned_allocation) &&
3513 CC1Args.push_back(
"-faligned-alloc-unavailable");
3517 if (!DriverArgs.hasArgNoClaim(options::OPT_fobjc_msgsend_selector_stubs,
3518 options::OPT_fno_objc_msgsend_selector_stubs) &&
3521 CC1Args.push_back(
"-fobjc-msgsend-selector-stubs");
3525 if (!DriverArgs.hasArgNoClaim(
3526 options::OPT_fobjc_msgsend_class_selector_stubs,
3527 options::OPT_fno_objc_msgsend_class_selector_stubs) &&
3530 CC1Args.push_back(
"-fobjc-msgsend-class-selector-stubs");
3534 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
3535 options::OPT_fno_sized_deallocation) &&
3537 CC1Args.push_back(
"-fno-sized-deallocation");
3544 if (!
SDKInfo->getFilePath().empty()) {
3546 ExtraDepOpt +=
SDKInfo->getFilePath();
3547 CC1Args.push_back(DriverArgs.MakeArgString(ExtraDepOpt));
3553 CC1Args.push_back(
"-fcompatibility-qualified-id-block-type-checking");
3557 if (!DriverArgs.getLastArgNoClaim(
3558 options::OPT_fvisibility_inlines_hidden_static_local_var,
3559 options::OPT_fno_visibility_inlines_hidden_static_local_var))
3560 CC1Args.push_back(
"-fvisibility-inlines-hidden-static-local-var");
3574 CC1Args.push_back(
"-fbuiltin-headers-in-system-modules");
3576 if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
3577 options::OPT_fno_define_target_os_macros))
3578 CC1Args.push_back(
"-fdefine-target-os-macros");
3582 !DriverArgs.hasFlag(options::OPT_fmodulemap_allow_subdirectory_search,
3583 options::OPT_fno_modulemap_allow_subdirectory_search,
3585 bool RequiresSubdirectorySearch;
3586 VersionTuple SDKVersion =
SDKInfo->getVersion();
3589 RequiresSubdirectorySearch =
true;
3592 RequiresSubdirectorySearch = SDKVersion < VersionTuple(15, 0);
3596 RequiresSubdirectorySearch = SDKVersion < VersionTuple(18, 0);
3599 RequiresSubdirectorySearch = SDKVersion < VersionTuple(11, 0);
3602 RequiresSubdirectorySearch = SDKVersion < VersionTuple(2, 0);
3605 if (!RequiresSubdirectorySearch)
3606 CC1Args.push_back(
"-fno-modulemap-allow-subdirectory-search");
3611 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1ASArgs)
const {
3613 CC1ASArgs.push_back(
"-darwin-target-variant-triple");
3620 auto EmitTargetSDKVersionArg = [&](
const VersionTuple &
V) {
3622 llvm::raw_string_ostream OS(Arg);
3623 OS <<
"-target-sdk-version=" <<
V;
3624 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3628 if (
const auto *MacOStoMacCatalystMapping =
SDKInfo->getVersionMapping(
3630 std::optional<VersionTuple> SDKVersion = MacOStoMacCatalystMapping->map(
3633 EmitTargetSDKVersionArg(
3637 EmitTargetSDKVersionArg(
SDKInfo->getVersion());
3645 llvm::raw_string_ostream OS(Arg);
3646 OS <<
"-darwin-target-variant-sdk-version=" <<
SDKInfo->getVersion();
3647 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3648 }
else if (
const auto *MacOStoMacCatalystMapping =
3651 if (std::optional<VersionTuple> SDKVersion =
3652 MacOStoMacCatalystMapping->map(
3656 llvm::raw_string_ostream OS(Arg);
3657 OS <<
"-darwin-target-variant-sdk-version=" << *SDKVersion;
3658 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3678 AddDeploymentTarget(*DAL);
3686 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
3689 if (A->getOption().getID() != options::OPT_mkernel &&
3690 A->getOption().getID() != options::OPT_fapple_kext)
3692 assert(it != ie &&
"unexpected argument translation");
3694 assert(A->getOption().getID() == options::OPT_static &&
3695 "missing expected -static argument");
3702 if ((
Arch == llvm::Triple::arm ||
Arch == llvm::Triple::thumb)) {
3703 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
3704 options::OPT_fno_omit_frame_pointer,
false))
3705 getDriver().
Diag(clang::diag::warn_drv_unsupported_opt_for_target)
3706 <<
"-fomit-frame-pointer" << BA.
ArchName;
3715 if (
getArch() == llvm::Triple::x86_64 ||
3717 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
3719 return (
getArch() == llvm::Triple::aarch64 ||
3720 getArch() == llvm::Triple::aarch64_32)
3728 if (
const char *S = ::getenv(
"RC_DEBUG_OPTIONS"))
3729 return S[0] !=
'\0';
3734 if (
const char *S = ::getenv(
"RC_DEBUG_PREFIX_MAP"))
3743 return llvm::ExceptionHandling::None;
3747 if (Triple.isWatchABI())
3748 return llvm::ExceptionHandling::DwarfCFI;
3750 return llvm::ExceptionHandling::SjLj;
3765 return (
getArch() == llvm::Triple::x86_64 ||
3766 getArch() == llvm::Triple::aarch64);
3775 ArgStringList &CmdArgs)
const {
3778 assert(!
isTargetXROS() &&
"xrOS always uses -platform-version");
3781 CmdArgs.push_back(
"-watchos_version_min");
3783 CmdArgs.push_back(
"-watchos_simulator_version_min");
3785 CmdArgs.push_back(
"-tvos_version_min");
3787 CmdArgs.push_back(
"-tvos_simulator_version_min");
3789 CmdArgs.push_back(
"-driverkit_version_min");
3791 CmdArgs.push_back(
"-ios_simulator_version_min");
3793 CmdArgs.push_back(
"-iphoneos_version_min");
3795 CmdArgs.push_back(
"-maccatalyst_version_min");
3798 CmdArgs.push_back(
"-macosx_version_min");
3804 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3807 VersionTuple VariantTargetVersion;
3809 CmdArgs.push_back(
"-macosx_version_min");
3814 "unexpected target variant triple");
3815 CmdArgs.push_back(
"-maccatalyst_version_min");
3818 VersionTuple MinTgtVers =
3820 if (MinTgtVers.getMajor() && MinTgtVers > VariantTargetVersion)
3821 VariantTargetVersion = MinTgtVers;
3822 CmdArgs.push_back(Args.MakeArgString(VariantTargetVersion.getAsString()));
3833 return "mac catalyst";
3846 llvm_unreachable(
"invalid platform");
3850 llvm::opt::ArgStringList &CmdArgs)
const {
3855 auto EmitPlatformVersionArg =
3858 const llvm::Triple &TT) {
3861 CmdArgs.push_back(
"-platform_version");
3862 std::string PlatformName =
3865 PlatformName +=
"-simulator";
3866 CmdArgs.push_back(Args.MakeArgString(PlatformName));
3875 VersionTuple MinTgtVers = TT.getMinimumSupportedOSVersion();
3878 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3883 std::optional<VersionTuple> iOSSDKVersion;
3885 if (
const auto *MacOStoMacCatalystMapping =
3888 iOSSDKVersion = MacOStoMacCatalystMapping->map(
3889 SDKInfo->getVersion().withoutBuild(),
3893 CmdArgs.push_back(Args.MakeArgString(
3894 (iOSSDKVersion ? *iOSSDKVersion
3901 VersionTuple SDKVersion =
SDKInfo->getVersion().withoutBuild();
3902 if (!SDKVersion.getMinor())
3903 SDKVersion = VersionTuple(SDKVersion.getMajor(), 0);
3904 CmdArgs.push_back(Args.MakeArgString(SDKVersion.getAsString()));
3915 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3924 VersionTuple TargetVariantVersion;
3932 "unexpected target variant triple");
3937 EmitPlatformVersionArg(TargetVariantVersion, Platform, Environment,
3943 ArgStringList &CmdArgs) {
3947 CmdArgs.push_back(
"-ldylib1.o");
3954 CmdArgs.push_back(
"-ldylib1.o");
3956 CmdArgs.push_back(
"-ldylib1.10.5.o");
3961 ArgStringList &CmdArgs) {
3962 if (Args.hasArg(options::OPT_static))
3967 CmdArgs.push_back(
"-lbundle1.o");
3972 ArgStringList &CmdArgs) {
3974 if (Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_object) ||
3975 Args.hasArg(options::OPT_preload)) {
3976 CmdArgs.push_back(
"-lgcrt0.o");
3978 CmdArgs.push_back(
"-lgcrt1.o");
3988 CmdArgs.push_back(
"-no_new_main");
3990 D.
getDriver().
Diag(diag::err_drv_clang_unsupported_opt_pg_darwin)
3996 ArgStringList &CmdArgs) {
3999 if (D.
getArch() == llvm::Triple::aarch64)
4002 CmdArgs.push_back(
"-lcrt1.o");
4004 CmdArgs.push_back(
"-lcrt1.3.1.o");
4011 CmdArgs.push_back(
"-lcrt1.o");
4013 CmdArgs.push_back(
"-lcrt1.10.5.o");
4015 CmdArgs.push_back(
"-lcrt1.10.6.o");
4020 ArgStringList &CmdArgs)
const {
4026 if (Args.hasArg(options::OPT_dynamiclib))
4028 else if (Args.hasArg(options::OPT_bundle))
4032 else if (Args.hasArg(options::OPT_static) ||
4033 Args.hasArg(options::OPT_object) ||
4034 Args.hasArg(options::OPT_preload))
4035 CmdArgs.push_back(
"-lcrt0.o");
4039 if (
isTargetMacOS() && Args.hasArg(options::OPT_shared_libgcc) &&
4041 const char *Str = Args.MakeArgString(
GetFilePath(
"crt3.o"));
4042 CmdArgs.push_back(Str);
4059 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
4060 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
4062 Res |= SanitizerKind::Address;
4063 Res |= SanitizerKind::PointerCompare;
4064 Res |= SanitizerKind::PointerSubtract;
4065 Res |= SanitizerKind::Realtime;
4066 Res |= SanitizerKind::Leak;
4067 Res |= SanitizerKind::Fuzzer;
4068 Res |= SanitizerKind::FuzzerNoLink;
4069 Res |= SanitizerKind::ObjCCast;
4079 Res |= SanitizerKind::Vptr;
4081 if ((IsX86_64 || IsAArch64) &&
4084 Res |= SanitizerKind::Thread;
4088 Res |= SanitizerKind::Type;
4092 Res |= SanitizerKind::NumericalStability;
Defines a function that returns the minimum OS versions supporting C++17's aligned allocation functio...
static bool hasMultipleInvocations(const llvm::Triple &Triple, const ArgList &Args)
static bool checkRemarksOptions(const Driver &D, const ArgList &Args, const llvm::Triple &Triple)
static void renderRemarksOptions(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple, const InputInfo &Input, const InputInfo &Output, const JobAction &JA)
static bool sdkSupportsBuiltinModules(const std::optional< DarwinSDKInfo > &SDKInfo)
static void addPgProfilingLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static const char * ArmMachOArchName(StringRef Arch)
static bool shouldLinkerNotDedup(bool IsLinkerOnlyAction, const ArgList &Args)
Pass -no_deduplicate to ld64 under certain conditions:
static bool hasExportSymbolDirective(const ArgList &Args)
Check if the link command contains a symbol export directive.
static void addDefaultCRTLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static void addBundleLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static llvm::VersionTuple sizedDeallocMinVersion(llvm::Triple::OSType OS)
static VersionTuple minimumMacCatalystDeploymentTarget()
static std::string getSystemOrSDKMacOSVersion(StringRef MacOSSDKVersion)
Returns the most appropriate macOS target version for the current process.
static void addDynamicLibLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static bool isObjCRuntimeLinked(const ArgList &Args)
Determine whether we are linking the ObjC runtime.
static const char * getPlatformName(Darwin::DarwinPlatformKind Platform, Darwin::DarwinEnvironmentKind Environment)
static const char * ArmMachOArchNameCPU(StringRef CPU)
static void addExportedSymbol(ArgStringList &CmdArgs, const char *Symbol)
Add an export directive for Symbol to the link command.
static StringRef getXcodeDeveloperPath(StringRef PathIntoXcode)
Take a path that speculatively points into Xcode and return the XCODE/Contents/Developer path if it i...
static void addSectalignToPage(const ArgList &Args, ArgStringList &CmdArgs, StringRef Segment, StringRef Section)
Add a sectalign directive for Segment and Section to the maximum expected page size for Darwin.
Result
Implement __builtin_bit_cast and related operations.
static StringRef getTriple(const Command &Job)
Defines types useful for describing an Objective-C runtime.
const llvm::VersionTuple & getVersion() const
const llvm::Triple & getCanonicalPlatformTriple() const
The basic abstraction for the target Objective-C runtime.
bool hasNativeARC() const
Does this runtime natively provide the ARC entrypoints?
bool hasSubscripting() const
Does this runtime directly support the subscripting methods?
@ MacOSX
'macosx' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the non-fragile AB...
@ FragileMacOSX
'macosx-fragile' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the fragil...
@ iOS
'ios' is the Apple-provided NeXT-derived runtime on iOS or the iOS simulator; it is always non-fragil...
@ WatchOS
'watchos' is a variant of iOS for Apple's watchOS.
The base class of the type hierarchy.
Action - Represent an abstract compilation step to perform.
types::ID getType() const
ActionClass getKind() const
@ VerifyDebugInfoJobClass
Compilation - A set of tasks to perform for a single driver invocation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
std::string SysRoot
sysroot, if present
std::string GetTemporaryDirectory(StringRef Prefix) const
GetTemporaryDirectory - Return the pathname of a temporary directory to use as part of compilation; t...
DiagnosticBuilder Diag(unsigned DiagID) const
static bool GetReleaseVersion(StringRef Str, unsigned &Major, unsigned &Minor, unsigned &Micro, bool &HadExtra)
GetReleaseVersion - Parse (([0-9]+)(.
const llvm::opt::OptTable & getOpts() const
std::string GetTemporaryPath(StringRef Prefix, StringRef Suffix) const
GetTemporaryPath - Return the pathname of a temporary file to use as part of compilation; the file wi...
std::string Dir
The path the driver executable was in, as invoked from the command line.
bool needsStatsRt() const
bool needsMemProfRt() const
bool linkRuntimes() const
bool needsUbsanRt() const
bool needsRtsanRt() const
bool requiresMinimalRuntime() const
bool needsSharedRt() const
bool needsTysanRt() const
bool needsStableAbi() const
const char * getTypeTempSuffix(ID Id, bool CLStyle=false)
getTypeTempSuffix - Return the suffix to use when creating a temp file of this type,...
SmallVector< InputInfo, 4 > InputInfoList
bool willEmitRemarks(const llvm::opt::ArgList &Args)
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
SetTy< T > join(SetTy< T > A, SetTy< T > B, typename SetTy< T >::Factory &F)
Computes the union of two ImmutableSets.
The JSON file list parser is used to communicate input to InstallAPI.
Expected< std::optional< DarwinSDKInfo > > parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath)
Parse the SDK information from the SDKSettings.json file.
@ Default
Set to the current date and time.
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()