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({
"arm64",
"arm64e"}, llvm::Triple::aarch64)
67 .Case(
"arm64_32", llvm::Triple::aarch64_32)
68 .Case(
"r600", llvm::Triple::r600)
69 .Case(
"amdgcn", llvm::Triple::amdgcn)
70 .Case(
"nvptx", llvm::Triple::nvptx)
71 .Case(
"nvptx64", llvm::Triple::nvptx64)
72 .Case(
"amdil", llvm::Triple::amdil)
73 .Case(
"spir", llvm::Triple::spir)
74 .Default(llvm::Triple::UnknownArch);
78 const ArgList &Args) {
79 const llvm::Triple::ArchType
Arch = getArchTypeForMachOArchName(Str);
80 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Str);
82 if (
Arch != llvm::Triple::UnknownArch)
88 if ((T.getOS() != llvm::Triple::Firmware) &&
89 (ArchKind == llvm::ARM::ArchKind::ARMV6M ||
90 ArchKind == llvm::ARM::ArchKind::ARMV7M ||
91 ArchKind == llvm::ARM::ArchKind::ARMV7EM)) {
93 if (T.getOS() == llvm::Triple::IOS)
94 for (Arg *A : Args.filtered(options::OPT_mios_version_min_EQ))
95 A->ignoreTargetSpecific();
96 if (T.getOS() == llvm::Triple::WatchOS)
97 for (Arg *A : Args.filtered(options::OPT_mwatchos_version_min_EQ))
98 A->ignoreTargetSpecific();
99 if (T.getOS() == llvm::Triple::TvOS)
100 for (Arg *A : Args.filtered(options::OPT_mtvos_version_min_EQ))
101 A->ignoreTargetSpecific();
103 T.setOS(llvm::Triple::UnknownOS);
104 T.setObjectFormat(llvm::Triple::MachO);
112 const char *LinkingOutput)
const {
115 ArgStringList CmdArgs;
117 assert(Inputs.size() == 1 &&
"Unexpected number of inputs.");
121 const Action *SourceAction = &JA;
123 assert(!SourceAction->
getInputs().empty() &&
"unexpected root action!");
124 SourceAction = SourceAction->
getInputs()[0];
132 if (Args.hasArg(options::OPT_fno_integrated_as)) {
133 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
134 CmdArgs.push_back(
"-Q");
138 if (SourceAction->
getType() == types::TY_Asm ||
139 SourceAction->
getType() == types::TY_PP_Asm) {
140 if (Args.hasArg(options::OPT_gstabs))
141 CmdArgs.push_back(
"--gstabs");
142 else if (Args.hasArg(options::OPT_g_Group))
143 CmdArgs.push_back(
"-g");
150 if (T.isX86() || Args.hasArg(options::OPT_force__cpusubtype__ALL))
151 CmdArgs.push_back(
"-force_cpusubtype_ALL");
154 (((Args.hasArg(options::OPT_mkernel) ||
155 Args.hasArg(options::OPT_fapple_kext)) &&
157 Args.hasArg(options::OPT_static)))
158 CmdArgs.push_back(
"-static");
160 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
162 assert(Output.
isFilename() &&
"Unexpected lipo output.");
163 CmdArgs.push_back(
"-o");
166 assert(Input.
isFilename() &&
"Invalid input.");
171 const char *Exec = Args.MakeArgString(
getToolChain().GetProgramPath(
"as"));
173 Exec, CmdArgs, Inputs, Output));
176void darwin::MachOTool::anchor() {}
179 ArgStringList &CmdArgs)
const {
183 CmdArgs.push_back(
"-arch");
184 CmdArgs.push_back(Args.MakeArgString(ArchName));
187 if (ArchName ==
"arm")
188 CmdArgs.push_back(
"-force_cpusubtype_ALL");
191bool darwin::Linker::NeedsTempPath(
const InputInfoList &Inputs)
const {
195 for (
const auto &Input : Inputs)
196 if (Input.getType() != types::TY_Object)
210 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
211 if (A->getOption().matches(options::OPT_O0))
213 if (A->getOption().matches(options::OPT_O))
214 return llvm::StringSwitch<bool>(A->getValue())
220 if (!IsLinkerOnlyAction)
225void darwin::Linker::AddLinkArgs(Compilation &
C,
const ArgList &Args,
226 ArgStringList &CmdArgs,
228 VersionTuple Version,
bool LinkerIsLLD,
229 bool UsePlatformVersion)
const {
230 const Driver &D = getToolChain().getDriver();
231 const toolchains::MachO &MachOTC = getMachOToolChain();
235 if ((Version >= VersionTuple(100) || LinkerIsLLD) &&
236 !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
237 CmdArgs.push_back(
"-demangle");
239 if (Args.hasArg(options::OPT_rdynamic) &&
240 (Version >= VersionTuple(137) || LinkerIsLLD))
241 CmdArgs.push_back(
"-export_dynamic");
245 if (Args.hasFlag(options::OPT_fapplication_extension,
246 options::OPT_fno_application_extension,
false))
247 CmdArgs.push_back(
"-application_extension");
249 if (D.
isUsingLTO() && (Version >= VersionTuple(116) || LinkerIsLLD) &&
250 NeedsTempPath(Inputs)) {
251 std::string TmpPathName;
262 if (!TmpPathName.empty()) {
263 auto *TmpPath =
C.getArgs().MakeArgString(TmpPathName);
264 C.addTempFile(TmpPath);
265 CmdArgs.push_back(
"-object_path_lto");
266 CmdArgs.push_back(TmpPath);
279 if (Version >= VersionTuple(133) && !LinkerIsLLD) {
281 StringRef P = llvm::sys::path::parent_path(D.
Dir);
282 SmallString<128> LibLTOPath(P);
283 llvm::sys::path::append(LibLTOPath,
"lib");
284 llvm::sys::path::append(LibLTOPath,
"libLTO.dylib");
285 CmdArgs.push_back(
"-lto_library");
286 CmdArgs.push_back(
C.getArgs().MakeArgString(LibLTOPath));
292 if (Version >= VersionTuple(262) &&
294 CmdArgs.push_back(
"-no_deduplicate");
297 Args.AddAllArgs(CmdArgs, options::OPT_static);
298 if (!Args.hasArg(options::OPT_static))
299 CmdArgs.push_back(
"-dynamic");
300 if (Args.hasArg(options::OPT_fgnu_runtime)) {
305 if (!Args.hasArg(options::OPT_dynamiclib)) {
306 AddMachOArch(Args, CmdArgs);
308 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
310 Args.AddLastArg(CmdArgs, options::OPT_bundle);
311 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
312 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
315 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
316 (A = Args.getLastArg(options::OPT_current__version)) ||
317 (A = Args.getLastArg(options::OPT_install__name)))
318 D.
Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
321 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
322 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
323 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
325 CmdArgs.push_back(
"-dylib");
328 if ((A = Args.getLastArg(options::OPT_bundle)) ||
329 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
330 (A = Args.getLastArg(options::OPT_client__name)) ||
331 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
332 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
333 (A = Args.getLastArg(options::OPT_private__bundle)))
334 D.
Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
337 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
338 "-dylib_compatibility_version");
339 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
340 "-dylib_current_version");
342 AddMachOArch(Args, CmdArgs);
344 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
345 "-dylib_install_name");
348 Args.AddLastArg(CmdArgs, options::OPT_all__load);
349 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
350 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
352 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
353 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
354 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
355 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
356 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
357 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
358 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
359 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
360 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
361 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
362 Args.AddAllArgs(CmdArgs, options::OPT_init);
365 if (Version >= VersionTuple(520) || LinkerIsLLD || UsePlatformVersion)
370 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
371 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
372 Args.AddLastArg(CmdArgs, options::OPT_single__module);
373 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
374 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
377 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
378 options::OPT_fno_pie, options::OPT_fno_PIE)) {
379 if (A->getOption().matches(options::OPT_fpie) ||
380 A->getOption().matches(options::OPT_fPIE))
381 CmdArgs.push_back(
"-pie");
383 CmdArgs.push_back(
"-no_pie");
387 if (
C.getDriver().embedBitcodeEnabled()) {
390 CmdArgs.push_back(
"-bitcode_bundle");
392 if (
C.getDriver().embedBitcodeMarkerOnly() &&
393 Version >= VersionTuple(278)) {
394 CmdArgs.push_back(
"-bitcode_process_mode");
395 CmdArgs.push_back(
"marker");
398 D.
Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
402 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
403 options::OPT_fno_global_isel)) {
404 if (A->getOption().matches(options::OPT_fglobal_isel)) {
405 CmdArgs.push_back(
"-mllvm");
406 CmdArgs.push_back(
"-global-isel");
408 CmdArgs.push_back(
"-mllvm");
409 CmdArgs.push_back(
"-global-isel-abort=0");
413 if (Args.hasArg(options::OPT_mkernel) ||
414 Args.hasArg(options::OPT_fapple_kext) ||
415 Args.hasArg(options::OPT_ffreestanding)) {
416 CmdArgs.push_back(
"-mllvm");
417 CmdArgs.push_back(
"-disable-atexit-based-global-dtor-lowering");
420 Args.AddLastArg(CmdArgs, options::OPT_prebind);
421 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
422 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
423 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
424 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
425 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
426 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
427 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
428 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
429 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
430 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
431 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
432 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
433 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
434 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
435 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
441 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
442 CmdArgs.push_back(
"-syslibroot");
443 CmdArgs.push_back(A->getValue());
444 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
445 CmdArgs.push_back(
"-syslibroot");
446 CmdArgs.push_back(A->getValue());
447 }
else if (StringRef sysroot =
C.getSysRoot(); sysroot !=
"") {
448 CmdArgs.push_back(
"-syslibroot");
449 CmdArgs.push_back(
C.getArgs().MakeArgString(sysroot));
452 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
453 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
454 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
455 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
456 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
457 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
458 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
459 Args.AddAllArgs(CmdArgs, options::OPT_y);
460 Args.AddLastArg(CmdArgs, options::OPT_w);
461 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
462 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
463 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
464 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
465 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
466 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
467 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
468 Args.AddLastArg(CmdArgs, options::OPT_why_load);
469 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
470 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
471 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
472 Args.AddLastArg(CmdArgs, options::OPT_Mach);
476 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
478 : CSPGOGenerateArg->getValue());
479 llvm::sys::path::append(Path,
"default_%m.profraw");
480 CmdArgs.push_back(
"--cs-profile-generate");
481 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
483 SmallString<128> Path(
484 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
485 if (Path.empty() || llvm::sys::fs::is_directory(Path))
486 llvm::sys::path::append(Path,
"default.profdata");
487 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
490 auto *CodeGenDataGenArg =
491 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
492 if (CodeGenDataGenArg)
494 Args.MakeArgString(Twine(
"--codegen-data-generate-path=") +
495 CodeGenDataGenArg->getValue()));
502 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
505 return Args.hasArg(options::OPT_fobjc_link_runtime);
509 const llvm::Triple &Triple) {
514 Args.getAllArgValues(options::OPT_arch).size() > 1;
515 bool hasExplicitOutputFile =
516 Args.getLastArg(options::OPT_foptimization_record_file_EQ);
518 D.
Diag(diag::err_drv_invalid_output_with_multiple_archs)
519 <<
"-foptimization-record-file";
526 const llvm::Triple &Triple,
528 StringRef Format =
"yaml";
529 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
530 Format = A->getValue();
532 CmdArgs.push_back(
"-mllvm");
533 CmdArgs.push_back(
"-lto-pass-remarks-output");
534 CmdArgs.push_back(
"-mllvm");
536 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
538 CmdArgs.push_back(A->getValue());
540 assert(Output.
isFilename() &&
"Unexpected ld output.");
546 CmdArgs.push_back(Args.MakeArgString(F));
550 Args.getLastArg(options::OPT_foptimization_record_passes_EQ)) {
551 CmdArgs.push_back(
"-mllvm");
553 std::string(
"-lto-pass-remarks-filter=") + A->getValue();
554 CmdArgs.push_back(Args.MakeArgString(Passes));
557 if (!Format.empty()) {
558 CmdArgs.push_back(
"-mllvm");
559 Twine FormatArg = Twine(
"-lto-pass-remarks-format=") + Format;
560 CmdArgs.push_back(Args.MakeArgString(FormatArg));
564 CmdArgs.push_back(
"-mllvm");
565 CmdArgs.push_back(
"-lto-pass-remarks-with-hotness");
568 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
569 CmdArgs.push_back(
"-mllvm");
571 std::string(
"-lto-pass-remarks-hotness-threshold=") + A->getValue();
572 CmdArgs.push_back(Args.MakeArgString(Opt));
581 const char *LinkingOutput)
const {
582 assert((Output.
getType() == types::TY_Image ||
583 Output.
getType() == types::TY_Object) &&
584 "Invalid linker output type.");
590 llvm::opt::ArgStringList InputFileList;
595 ArgStringList CmdArgs;
601 Args.MakeArgString(
getToolChain().GetLinkerPath(&LinkerIsLLD));
605 bool UsePlatformVersion = Triple.isXROS() || Triple.isOSFirmware();
609 AddLinkArgs(
C, Args, CmdArgs, Inputs, Version, LinkerIsLLD,
619 Args.getLastArg(options::OPT_moutline, options::OPT_mno_outline)) {
620 if (A->getOption().matches(options::OPT_moutline)) {
622 CmdArgs.push_back(
"-mllvm");
623 CmdArgs.push_back(
"-enable-machine-outliner");
629 CmdArgs.push_back(
"-mllvm");
630 CmdArgs.push_back(
"-enable-machine-outliner=never");
637 CmdArgs.push_back(
"-mllvm");
638 CmdArgs.push_back(
"-enable-linkonceodr-outlining");
641 auto *CodeGenDataGenArg =
642 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
643 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
647 if (CodeGenDataGenArg && CodeGenDataUseArg)
648 D.
Diag(diag::err_drv_argument_not_allowed_with)
649 << CodeGenDataGenArg->getAsString(Args)
650 << CodeGenDataUseArg->getAsString(Args);
654 if (CodeGenDataGenArg) {
655 CmdArgs.push_back(
"-mllvm");
656 CmdArgs.push_back(
"-codegen-data-generate");
660 if (CodeGenDataUseArg) {
661 CmdArgs.push_back(
"-mllvm");
662 CmdArgs.push_back(Args.MakeArgString(Twine(
"-codegen-data-use-path=") +
663 CodeGenDataUseArg->getValue()));
669 if (!StatsFile.empty()) {
670 CmdArgs.push_back(
"-mllvm");
671 CmdArgs.push_back(Args.MakeArgString(
"-lto-stats-file=" + StatsFile.str()));
675 if (Args.hasArg(options::OPT_fstack_usage)) {
677 llvm::sys::path::replace_extension(StackUsageFile,
"su");
678 CmdArgs.push_back(
"-mllvm");
680 Args.MakeArgString(
"-stack-usage-file=" + StackUsageFile));
685 Args.addAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
686 options::OPT_Z_Flag, options::OPT_u_Group});
691 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
692 CmdArgs.push_back(
"-ObjC");
694 CmdArgs.push_back(
"-o");
697 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
700 Args.AddAllArgs(CmdArgs, options::OPT_L);
705 for (
const auto &II : Inputs) {
706 if (!II.isFilename()) {
711 if (InputFileList.size() > 0)
717 InputFileList.push_back(II.getFilename());
723 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
724 getToolChain().addFortranRuntimeLibraryPath(Args, CmdArgs);
728 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
732 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
736 CmdArgs.push_back(
"-framework");
737 CmdArgs.push_back(
"Foundation");
739 CmdArgs.push_back(
"-lobjc");
743 CmdArgs.push_back(
"-arch_multiple");
744 CmdArgs.push_back(
"-final_output");
745 CmdArgs.push_back(LinkingOutput);
748 if (Args.hasArg(options::OPT_fnested_functions))
749 CmdArgs.push_back(
"-allow_stack_execute");
754 if (!Parallelism.empty()) {
755 CmdArgs.push_back(
"-mllvm");
756 unsigned NumThreads =
757 llvm::get_threadpool_strategy(Parallelism)->compute_thread_count();
758 CmdArgs.push_back(Args.MakeArgString(
"-threads=" + Twine(NumThreads)));
764 bool NoStdOrDefaultLibs =
765 Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
766 bool ForceLinkBuiltins = Args.hasArg(options::OPT_fapple_link_rtlib);
767 if (!NoStdOrDefaultLibs || ForceLinkBuiltins) {
772 if (NoStdOrDefaultLibs && ForceLinkBuiltins) {
780 Args.ClaimAllArgs(options::OPT_pthread);
781 Args.ClaimAllArgs(options::OPT_pthreads);
785 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
789 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
790 Args.AddAllArgs(CmdArgs, options::OPT_F);
793 for (
const Arg *A : Args.filtered(options::OPT_iframework))
794 CmdArgs.push_back(Args.MakeArgString(std::string(
"-F") + A->getValue()));
796 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
797 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
798 if (A->getValue() == StringRef(
"Accelerate")) {
799 CmdArgs.push_back(
"-framework");
800 CmdArgs.push_back(
"Accelerate");
809 bool NonStandardSearchPath =
false;
811 if (Triple.isDriverKit()) {
813 NonStandardSearchPath =
814 Version.getMajor() < 605 ||
815 (Version.getMajor() == 605 && Version.getMinor().value_or(0) < 1);
820 if (NonStandardSearchPath) {
821 if (
auto *Sysroot = Args.getLastArg(options::OPT_isysroot)) {
822 auto AddSearchPath = [&](StringRef Flag, StringRef SearchPath) {
825 llvm::sys::path::append(P, SearchPath);
827 CmdArgs.push_back(Args.MakeArgString(Flag + P));
830 AddSearchPath(
"-L",
"/usr/lib");
831 AddSearchPath(
"-F",
"/System/Library/Frameworks");
837 if (Version >= VersionTuple(705) || LinkerIsLLD) {
845 std::unique_ptr<Command> Cmd = std::make_unique<Command>(
846 JA, *
this, ResponseSupport, Exec, CmdArgs, Inputs, Output);
847 Cmd->setInputFileList(std::move(InputFileList));
848 C.addCommand(std::move(Cmd));
855 const char *LinkingOutput)
const {
859 Args.ClaimAllArgs(options::OPT_g_Group);
861 Args.ClaimAllArgs(options::OPT_emit_llvm);
864 Args.ClaimAllArgs(options::OPT_w);
866 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
869 ArgStringList CmdArgs;
871 CmdArgs.push_back(
"-static");
872 CmdArgs.push_back(
"-D");
873 CmdArgs.push_back(
"-no_warning_for_no_symbols");
874 CmdArgs.push_back(
"-o");
877 for (
const auto &II : Inputs) {
878 if (II.isFilename()) {
879 CmdArgs.push_back(II.getFilename());
886 if (Output.
isFilename() && llvm::sys::fs::exists(OutputFileName)) {
887 if (std::error_code EC = llvm::sys::fs::remove(OutputFileName)) {
888 D.
Diag(diag::err_drv_unable_to_remove_file) << EC.message();
893 const char *Exec = Args.MakeArgString(
getToolChain().GetStaticLibToolPath());
894 C.addCommand(std::make_unique<Command>(JA, *
this,
896 Exec, CmdArgs, Inputs, Output));
903 const char *LinkingOutput)
const {
904 ArgStringList CmdArgs;
906 CmdArgs.push_back(
"-create");
907 assert(Output.
isFilename() &&
"Unexpected lipo output.");
909 CmdArgs.push_back(
"-output");
912 for (
const auto &II : Inputs) {
913 assert(II.isFilename() &&
"Unexpected lipo input.");
914 CmdArgs.push_back(II.getFilename());
917 StringRef LipoName = Args.getLastArgValue(options::OPT_fuse_lipo_EQ,
"lipo");
919 Args.MakeArgString(
getToolChain().GetProgramPath(LipoName.data()));
921 Exec, CmdArgs, Inputs, Output));
928 const char *LinkingOutput)
const {
929 ArgStringList CmdArgs;
931 CmdArgs.push_back(
"-o");
934 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
936 assert(Input.
isFilename() &&
"Unexpected dsymutil input.");
940 Args.MakeArgString(
getToolChain().GetProgramPath(
"dsymutil"));
942 Exec, CmdArgs, Inputs, Output));
949 const char *LinkingOutput)
const {
950 ArgStringList CmdArgs;
951 CmdArgs.push_back(
"--verify");
952 CmdArgs.push_back(
"--debug-info");
953 CmdArgs.push_back(
"--eh-frame");
954 CmdArgs.push_back(
"--quiet");
956 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
958 assert(Input.
isFilename() &&
"Unexpected verify input");
964 Args.MakeArgString(
getToolChain().GetProgramPath(
"dwarfdump"));
966 Exec, CmdArgs, Inputs, Output));
988 if (Ty == types::TY_PP_Asm)
989 return types::TY_Asm;
1009 auto T = llvm::Triple(Twine(
"arm64-apple-") +
1010 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
1034 ArgStringList &CC1Args)
const {
1039 ArgStringList &CC1Args)
const {
1044 ArgStringList &CC1Args)
const {
1053 return llvm::StringSwitch<const char *>(
Arch)
1054 .Case(
"armv6k",
"armv6")
1055 .Case(
"armv6m",
"armv6m")
1056 .Case(
"armv5tej",
"armv5")
1057 .Case(
"xscale",
"xscale")
1058 .Case(
"armv4t",
"armv4t")
1059 .Case(
"armv7",
"armv7")
1060 .Cases({
"armv7a",
"armv7-a"},
"armv7")
1061 .Cases({
"armv7r",
"armv7-r"},
"armv7")
1062 .Cases({
"armv7em",
"armv7e-m"},
"armv7em")
1063 .Cases({
"armv7k",
"armv7-k"},
"armv7k")
1064 .Cases({
"armv7m",
"armv7-m"},
"armv7m")
1065 .Cases({
"armv7s",
"armv7-s"},
"armv7s")
1070 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseCPUArch(CPU);
1071 if (ArchKind == llvm::ARM::ArchKind::INVALID)
1073 StringRef
Arch = llvm::ARM::getArchName(ArchKind);
1077 if (
Arch.starts_with(
"armv5"))
1080 else if (
Arch.starts_with(
"armv6") && !
Arch.ends_with(
"6m"))
1083 else if (
Arch.ends_with(
"v7a"))
1093 case llvm::Triple::aarch64_32:
1096 case llvm::Triple::aarch64: {
1102 case llvm::Triple::thumb:
1103 case llvm::Triple::arm:
1104 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1108 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1117 if (LinkerVersion) {
1119 VersionTuple NewLinkerVersion;
1120 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ))
1121 (void)NewLinkerVersion.tryParse(A->getValue());
1122 assert(NewLinkerVersion == LinkerVersion);
1124 return *LinkerVersion;
1127 VersionTuple NewLinkerVersion;
1128 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1131 if (NewLinkerVersion.tryParse(A->getValue()) ||
1132 NewLinkerVersion.getSubbuild())
1134 << A->getAsString(Args);
1137 LinkerVersion = NewLinkerVersion;
1138 return *LinkerVersion;
1147 llvm::Triple::OSType OS =
getTriple().getOS();
1151 case llvm::Triple::Darwin:
1152 case llvm::Triple::MacOSX:
1155 case llvm::Triple::IOS:
1158 case llvm::Triple::TvOS:
1161 case llvm::Triple::WatchOS:
1164 case llvm::Triple::XROS:
1167 case llvm::Triple::DriverKit:
1176 if (
getTriple().isSimulatorEnvironment())
1178 else if (
getTriple().isMacCatalystEnvironment())
1181 VersionTuple OsVer =
getTriple().getOSVersion();
1182 setTarget(Platform, Environment, OsVer.getMajor(),
1183 OsVer.getMinor().value_or(0), OsVer.getSubminor().value_or(0),
1191void Darwin::VerifyTripleForSDK(
const llvm::opt::ArgList &Args,
1192 const llvm::Triple Triple)
const {
1194 if (!
SDKInfo->supportsTriple(Triple))
1196 <<
SDKInfo->getDisplayName() << Triple.getTriple();
1197 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
1200 const char *isysroot = A->getValue();
1202 if (!SDKName.empty()) {
1203 bool supported =
true;
1204 if (Triple.isWatchOS())
1205 supported = SDKName.starts_with(
"Watch");
1206 else if (Triple.isTvOS())
1207 supported = SDKName.starts_with(
"AppleTV");
1208 else if (Triple.isDriverKit())
1209 supported = SDKName.starts_with(
"DriverKit");
1210 else if (Triple.isiOS())
1211 supported = SDKName.starts_with(
"iPhone");
1212 else if (Triple.isMacOSX())
1213 supported = SDKName.starts_with(
"MacOSX");
1219 << SDKName << Triple.getTriple();
1235 return Triple.getTriple();
1247 Str += llvm::Triple::getOSTypeName(llvm::Triple::XROS);
1249 Str += llvm::Triple::getOSTypeName(llvm::Triple::Firmware);
1253 Triple.setOSName(Str);
1255 VerifyTripleForSDK(Args, Triple);
1257 return Triple.getTriple();
1269 return Dsymutil.get();
1273 return VerifyDebug.get();
1290 const ArgList &Args)
1291 :
Darwin(D, Triple, Args) {}
1295 CC1Args.push_back(
"-Wundef-prefix=TARGET_OS_");
1296 CC1Args.push_back(
"-Werror=undef-prefix");
1307 CC1Args.push_back(
"-Wdeprecated-objc-isa-usage");
1308 CC1Args.push_back(
"-Werror=deprecated-objc-isa-usage");
1313 CC1Args.push_back(
"-Werror=implicit-function-declaration");
1318 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
1328 static constexpr llvm::StringLiteral XcodeAppSuffix(
1329 ".app/Contents/Developer");
1330 size_t Index = PathIntoXcode.find(XcodeAppSuffix);
1331 if (Index == StringRef::npos)
1333 return PathIntoXcode.take_front(Index + XcodeAppSuffix.size());
1337 ArgStringList &CmdArgs)
const {
1356 llvm::sys::path::remove_filename(P);
1357 llvm::sys::path::remove_filename(P);
1358 llvm::sys::path::append(P,
"lib",
"arc");
1364 if (!
getVFS().exists(P)) {
1365 auto updatePath = [&](
const Arg *A) {
1369 if (XcodePathForSDK.empty())
1372 P = XcodePathForSDK;
1373 llvm::sys::path::append(P,
"Toolchains/XcodeDefault.xctoolchain/usr",
1375 return getVFS().exists(P);
1378 bool updated =
false;
1379 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot))
1380 updated = updatePath(A);
1383 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1388 CmdArgs.push_back(
"-force_load");
1389 llvm::sys::path::append(P,
"libarclite_");
1392 P +=
"watchsimulator";
1396 P +=
"appletvsimulator";
1400 P +=
"iphonesimulator";
1408 getDriver().
Diag(clang::diag::err_drv_darwin_sdk_missing_arclite) << P;
1410 CmdArgs.push_back(Args.MakeArgString(P));
1447 bool IsShared)
const {
1455 const char *LibArg = Args.MakeArgString(P);
1456 CmdArgs.push_back(LibArg);
1464 assert(StringRef(P).ends_with(
".dylib") &&
"must be a dynamic library");
1468 CmdArgs.push_back(
"-rpath");
1469 CmdArgs.push_back(
"@executable_path");
1473 CmdArgs.push_back(
"-rpath");
1474 CmdArgs.push_back(Args.MakeArgString(llvm::sys::path::parent_path(P)));
1481 "it doesn't make sense to ask for the compiler-rt library name as an "
1485 if (Component !=
"builtins") {
1486 MachOLibName +=
'.';
1487 MachOLibName += Component;
1492 llvm::sys::path::append(FullPath,
"lib",
"darwin",
"macho_embedded",
1494 return std::string(FullPath);
1504 "it doesn't make sense to ask for the compiler-rt library name as an "
1508 if (Component !=
"builtins") {
1509 DarwinLibName += Component;
1510 DarwinLibName +=
'_';
1516 llvm::sys::path::append(FullPath,
"lib",
"darwin", DarwinLibName);
1517 return std::string(FullPath);
1522 auto BeginSDK = llvm::sys::path::rbegin(isysroot);
1523 auto EndSDK = llvm::sys::path::rend(isysroot);
1524 for (
auto IT = BeginSDK; IT != EndSDK; ++IT) {
1525 StringRef SDK = *IT;
1526 if (SDK.consume_back(
".sdk"))
1556 llvm_unreachable(
"Unsupported platform");
1561 for (Arg *A : Args) {
1562 if (A->getOption().matches(options::OPT_exported__symbols__list))
1564 if (!A->getOption().matches(options::OPT_Wl_COMMA) &&
1565 !A->getOption().matches(options::OPT_Xlinker))
1567 if (A->containsValue(
"-exported_symbols_list") ||
1568 A->containsValue(
"-exported_symbol"))
1576 CmdArgs.push_back(
"-exported_symbol");
1577 CmdArgs.push_back(Symbol);
1587 StringRef Segment, StringRef Section) {
1588 for (
const char *A : {
"-sectalign", Args.MakeArgString(Segment),
1589 Args.MakeArgString(Section),
"0x4000"})
1590 CmdArgs.push_back(A);
1594 ArgStringList &CmdArgs)
const {
1623 for (
auto IPSK : {llvm::IPSK_cnts, llvm::IPSK_bitmap, llvm::IPSK_data}) {
1625 Args, CmdArgs,
"__DATA",
1626 llvm::getInstrProfSectionName(IPSK, llvm::Triple::MachO,
1632void DarwinClang::AddLinkSanitizerLibArgs(
const ArgList &Args,
1633 ArgStringList &CmdArgs,
1634 StringRef Sanitizer,
1635 bool Shared)
const {
1641 const ArgList &Args)
const {
1642 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
1643 StringRef
Value = A->getValue();
1644 if (
Value !=
"compiler-rt" &&
Value !=
"platform")
1645 getDriver().
Diag(clang::diag::err_drv_unsupported_rtlib_for_platform)
1646 <<
Value <<
"darwin";
1653 ArgStringList &CmdArgs,
1654 bool ForceLinkBuiltinRT)
const {
1664 if (Args.hasArg(options::OPT_static) ||
1665 Args.hasArg(options::OPT_fapple_kext) ||
1666 Args.hasArg(options::OPT_mkernel)) {
1667 if (ForceLinkBuiltinRT)
1675 if (
const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
1676 getDriver().
Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
1683 const char *sanitizer =
nullptr;
1685 sanitizer =
"UndefinedBehaviorSanitizer";
1687 sanitizer =
"RealtimeSanitizer";
1689 sanitizer =
"AddressSanitizer";
1691 sanitizer =
"ThreadSanitizer";
1694 getDriver().
Diag(diag::err_drv_unsupported_static_sanitizer_darwin)
1703 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan_abi",
false);
1706 "Static sanitizer runtimes not supported");
1707 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan");
1712 "Static sanitizer runtimes not supported");
1713 AddLinkSanitizerLibArgs(Args, CmdArgs,
"rtsan");
1716 AddLinkSanitizerLibArgs(Args, CmdArgs,
"lsan");
1719 "Static sanitizer runtimes not supported");
1720 AddLinkSanitizerLibArgs(
1726 "Static sanitizer runtimes not supported");
1727 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tsan");
1730 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tysan");
1731 if (Sanitize.
needsFuzzer() && !Args.hasArg(options::OPT_dynamiclib)) {
1732 AddLinkSanitizerLibArgs(Args, CmdArgs,
"fuzzer",
false);
1744 AddLinkSanitizerLibArgs(Args, CmdArgs,
"stats");
1752 llvm::memprof::getMemprofOptionsSymbolDarwinLinkageName().data());
1762 CmdArgs.push_back(
"-framework");
1763 CmdArgs.push_back(
"DriverKit");
1769 CmdArgs.push_back(
"-lSystem");
1781 CmdArgs.push_back(
"-lgcc_s.1");
1790 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
1791 if (!SystemTriple.isMacOSX())
1792 return std::string(MacOSSDKVersion);
1793 VersionTuple SystemVersion;
1794 SystemTriple.getMacOSXVersion(SystemVersion);
1796 unsigned Major, Minor, Micro;
1800 return std::string(MacOSSDKVersion);
1801 VersionTuple SDKVersion(Major, Minor, Micro);
1803 if (SDKVersion > SystemVersion)
1804 return SystemVersion.getAsString();
1805 return std::string(MacOSSDKVersion);
1812struct DarwinPlatform {
1821 DeploymentTargetEnv,
1831 DarwinPlatformKind getPlatform()
const {
return Platform; }
1833 DarwinEnvironmentKind getEnvironment()
const {
return Environment; }
1835 void setEnvironment(DarwinEnvironmentKind Kind) {
1837 InferSimulatorFromArch =
false;
1840 const VersionTuple getOSVersion()
const {
1841 return UnderlyingOSVersion.value_or(VersionTuple());
1844 VersionTuple takeOSVersion() {
1845 assert(UnderlyingOSVersion.has_value() &&
1846 "attempting to get an unset OS version");
1847 VersionTuple
Result = *UnderlyingOSVersion;
1848 UnderlyingOSVersion.reset();
1851 bool isValidOSVersion()
const {
1852 return llvm::Triple::isValidVersionForOS(getOSFromPlatform(Platform),
1856 VersionTuple getCanonicalOSVersion()
const {
1857 return llvm::Triple::getCanonicalVersionForOS(
1858 getOSFromPlatform(Platform), getOSVersion(),
true);
1861 void setOSVersion(
const VersionTuple &Version) {
1862 UnderlyingOSVersion = Version;
1865 bool hasOSVersion()
const {
return UnderlyingOSVersion.has_value(); }
1867 VersionTuple getZipperedOSVersion()
const {
1868 assert(Environment == DarwinEnvironmentKind::MacCatalyst &&
1869 "zippered target version is specified only for Mac Catalyst");
1870 return ZipperedOSVersion;
1874 bool isExplicitlySpecified()
const {
return Kind <= DeploymentTargetEnv; }
1877 bool canInferSimulatorFromArch()
const {
return InferSimulatorFromArch; }
1879 const std::optional<llvm::Triple> &getTargetVariantTriple()
const {
1880 return TargetVariantTriple;
1884 void addOSVersionMinArgument(DerivedArgList &Args,
const OptTable &Opts) {
1888 assert(Kind != TargetArg && Kind != MTargetOSArg && Kind != OSVersionArg &&
1892 case DarwinPlatformKind::MacOS:
1893 Opt = options::OPT_mmacos_version_min_EQ;
1895 case DarwinPlatformKind::IPhoneOS:
1896 Opt = options::OPT_mios_version_min_EQ;
1898 case DarwinPlatformKind::TvOS:
1899 Opt = options::OPT_mtvos_version_min_EQ;
1901 case DarwinPlatformKind::WatchOS:
1902 Opt = options::OPT_mwatchos_version_min_EQ;
1908 Arg = Args.MakeJoinedArg(
nullptr, Opts.getOption(Opt), OSVersionStr);
1914 std::string
getAsString(DerivedArgList &Args,
const OptTable &Opts) {
1920 assert(Arg &&
"OS version argument not yet inferred");
1921 return Arg->getAsString(Args);
1922 case DeploymentTargetEnv:
1923 return (llvm::Twine(EnvVarName) +
"=" + OSVersionStr).str();
1924 case InferredFromSDK:
1925 case InferredFromArch:
1926 llvm_unreachable(
"Cannot print arguments for inferred OS version");
1928 llvm_unreachable(
"Unsupported Darwin Source Kind");
1932 std::string getInferredSource() {
1933 assert(!isExplicitlySpecified() &&
"OS version was not inferred");
1934 return InferredSource.str();
1937 void setEnvironment(llvm::Triple::EnvironmentType EnvType,
1938 const VersionTuple &OSVersion,
1939 const std::optional<DarwinSDKInfo> &SDKInfo) {
1941 case llvm::Triple::Simulator:
1942 Environment = DarwinEnvironmentKind::Simulator;
1944 case llvm::Triple::MacABI: {
1945 Environment = DarwinEnvironmentKind::MacCatalyst;
1947 ZipperedOSVersion = VersionTuple(10, 15);
1948 if (hasOSVersion() && SDKInfo) {
1949 if (
const auto *MacCatalystToMacOSMapping = SDKInfo->getVersionMapping(
1951 if (
auto MacOSVersion = MacCatalystToMacOSMapping->map(
1952 OSVersion, ZipperedOSVersion, std::nullopt)) {
1953 ZipperedOSVersion = *MacOSVersion;
1960 if (TargetVariantTriple) {
1961 auto TargetVariantVersion = TargetVariantTriple->getOSVersion();
1962 if (TargetVariantVersion.getMajor()) {
1963 if (TargetVariantVersion < ZipperedOSVersion)
1964 ZipperedOSVersion = std::move(TargetVariantVersion);
1974 static DarwinPlatform
1975 createFromTarget(
const llvm::Triple &TT, Arg *A,
1976 std::optional<llvm::Triple> TargetVariantTriple,
1977 const std::optional<DarwinSDKInfo> &SDKInfo) {
1978 DarwinPlatform
Result(TargetArg, getPlatformFromOS(TT.getOS()),
1979 TT.getOSVersion(), A);
1980 VersionTuple OsVersion = TT.getOSVersion();
1981 Result.TargetVariantTriple = std::move(TargetVariantTriple);
1982 Result.setEnvironment(TT.getEnvironment(), OsVersion, SDKInfo);
1985 static DarwinPlatform
1986 createFromMTargetOS(llvm::Triple::OSType OS, VersionTuple OSVersion,
1987 llvm::Triple::EnvironmentType Environment, Arg *A,
1988 const std::optional<DarwinSDKInfo> &SDKInfo) {
1989 DarwinPlatform
Result(MTargetOSArg, getPlatformFromOS(OS), OSVersion, A);
1990 Result.InferSimulatorFromArch =
false;
1991 Result.setEnvironment(Environment, OSVersion, SDKInfo);
1994 static DarwinPlatform createOSVersionArg(DarwinPlatformKind Platform, Arg *A,
1996 DarwinPlatform
Result{OSVersionArg, Platform,
1997 getVersionFromString(A->getValue()), A};
1999 Result.Environment = DarwinEnvironmentKind::Simulator;
2002 static DarwinPlatform createDeploymentTargetEnv(DarwinPlatformKind Platform,
2003 StringRef EnvVarName,
2004 StringRef OSVersion) {
2005 DarwinPlatform
Result(DeploymentTargetEnv, Platform,
2006 getVersionFromString(OSVersion));
2007 Result.EnvVarName = EnvVarName;
2010 static DarwinPlatform createFromSDKInfo(StringRef SDKRoot,
2011 const DarwinSDKInfo &SDKInfo) {
2012 const DarwinSDKInfo::SDKPlatformInfo PlatformInfo =
2014 const llvm::Triple::OSType
OS = PlatformInfo.
getOS();
2016 if (OS == llvm::Triple::MacOSX)
2017 Version = getVersionFromString(
2019 DarwinPlatform
Result(InferredFromSDK, getPlatformFromOS(OS), Version);
2021 Result.InferSimulatorFromArch =
false;
2022 Result.InferredSource = SDKRoot;
2025 static DarwinPlatform createFromSDK(StringRef SDKRoot,
2026 DarwinPlatformKind Platform,
2028 bool IsSimulator =
false) {
2029 DarwinPlatform
Result(InferredFromSDK, Platform,
2030 getVersionFromString(
Value));
2032 Result.Environment = DarwinEnvironmentKind::Simulator;
2033 Result.InferSimulatorFromArch =
false;
2034 Result.InferredSource = SDKRoot;
2037 static DarwinPlatform createFromArch(StringRef
Arch, llvm::Triple::OSType OS,
2038 VersionTuple Version) {
2040 DarwinPlatform(InferredFromArch, getPlatformFromOS(OS), Version);
2048 DarwinSDKInfo inferSDKInfo() {
2049 assert(Kind == InferredFromSDK &&
"can infer SDK info only");
2050 llvm::Triple::OSType
OS = getOSFromPlatform(Platform);
2051 llvm::Triple::EnvironmentType EnvironmentType =
2052 getEnvTypeFromEnvKind(Environment);
2053 StringRef PlatformPrefix =
2054 (Platform == DarwinPlatformKind::DriverKit) ?
"/System/DriverKit" :
"";
2055 return DarwinSDKInfo(
"", OS, EnvironmentType, getOSVersion(),
2056 getDisplayName(Platform, Environment, getOSVersion()),
2058 VersionTuple(getOSVersion().getMajor(), 0, 99),
2059 {DarwinSDKInfo::SDKPlatformInfo(
2060 llvm::Triple::Apple, OS, EnvironmentType,
2061 llvm::Triple::MachO, PlatformPrefix)});
2065 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform, Arg *Argument)
2067 Arguments({Argument, VersionTuple().getAsString()}) {}
2068 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform,
2069 VersionTuple
Value, Arg *Argument =
nullptr)
2073 UnderlyingOSVersion =
Value;
2076 static VersionTuple getVersionFromString(
const StringRef Input) {
2077 llvm::VersionTuple Version;
2078 bool IsValid = !Version.tryParse(Input);
2079 assert(IsValid &&
"unable to convert input version to version tuple");
2084 static DarwinPlatformKind getPlatformFromOS(llvm::Triple::OSType OS) {
2086 case llvm::Triple::Darwin:
2087 case llvm::Triple::MacOSX:
2088 return DarwinPlatformKind::MacOS;
2089 case llvm::Triple::IOS:
2090 return DarwinPlatformKind::IPhoneOS;
2091 case llvm::Triple::TvOS:
2092 return DarwinPlatformKind::TvOS;
2093 case llvm::Triple::WatchOS:
2094 return DarwinPlatformKind::WatchOS;
2095 case llvm::Triple::XROS:
2096 return DarwinPlatformKind::XROS;
2097 case llvm::Triple::DriverKit:
2098 return DarwinPlatformKind::DriverKit;
2099 case llvm::Triple::Firmware:
2100 return DarwinPlatformKind::Firmware;
2102 llvm_unreachable(
"Unable to infer Darwin variant");
2106 static llvm::Triple::OSType getOSFromPlatform(DarwinPlatformKind Platform) {
2108 case DarwinPlatformKind::MacOS:
2109 return llvm::Triple::MacOSX;
2110 case DarwinPlatformKind::IPhoneOS:
2111 return llvm::Triple::IOS;
2112 case DarwinPlatformKind::TvOS:
2113 return llvm::Triple::TvOS;
2114 case DarwinPlatformKind::WatchOS:
2115 return llvm::Triple::WatchOS;
2116 case DarwinPlatformKind::DriverKit:
2117 return llvm::Triple::DriverKit;
2118 case DarwinPlatformKind::XROS:
2119 return llvm::Triple::XROS;
2120 case DarwinPlatformKind::Firmware:
2121 return llvm::Triple::Firmware;
2123 llvm_unreachable(
"Unknown DarwinPlatformKind enum");
2126 static DarwinEnvironmentKind
2127 getEnvKindFromEnvType(llvm::Triple::EnvironmentType EnvironmentType) {
2128 switch (EnvironmentType) {
2129 case llvm::Triple::UnknownEnvironment:
2130 return DarwinEnvironmentKind::NativeEnvironment;
2131 case llvm::Triple::Simulator:
2132 return DarwinEnvironmentKind::Simulator;
2133 case llvm::Triple::MacABI:
2134 return DarwinEnvironmentKind::MacCatalyst;
2136 llvm_unreachable(
"Unable to infer Darwin environment");
2140 static llvm::Triple::EnvironmentType
2141 getEnvTypeFromEnvKind(DarwinEnvironmentKind EnvironmentKind) {
2142 switch (EnvironmentKind) {
2143 case DarwinEnvironmentKind::NativeEnvironment:
2144 return llvm::Triple::UnknownEnvironment;
2145 case DarwinEnvironmentKind::Simulator:
2146 return llvm::Triple::Simulator;
2147 case DarwinEnvironmentKind::MacCatalyst:
2148 return llvm::Triple::MacABI;
2150 llvm_unreachable(
"Unknown DarwinEnvironmentKind enum");
2153 static std::string getDisplayName(DarwinPlatformKind TargetPlatform,
2154 DarwinEnvironmentKind TargetEnvironment,
2155 VersionTuple Version) {
2156 SmallVector<std::string, 3> Components;
2157 switch (TargetPlatform) {
2158 case DarwinPlatformKind::MacOS:
2159 Components.push_back(
"macOS");
2161 case DarwinPlatformKind::IPhoneOS:
2162 Components.push_back(
"iOS");
2164 case DarwinPlatformKind::TvOS:
2165 Components.push_back(
"tvOS");
2167 case DarwinPlatformKind::WatchOS:
2168 Components.push_back(
"watchOS");
2170 case DarwinPlatformKind::DriverKit:
2171 Components.push_back(
"DriverKit");
2174 llvm::reportFatalUsageError(Twine(
"Platform: '") +
2175 std::to_string(TargetPlatform) +
2176 "' is unsupported when inferring SDK Info.");
2178 switch (TargetEnvironment) {
2179 case DarwinEnvironmentKind::NativeEnvironment:
2181 case DarwinEnvironmentKind::Simulator:
2182 Components.push_back(
"Simulator");
2185 llvm::reportFatalUsageError(Twine(
"Environment: '") +
2186 std::to_string(TargetEnvironment) +
2187 "' is unsupported when inferring SDK Info.");
2189 Components.push_back(Version.getAsString());
2190 return join(Components,
" ");
2194 DarwinPlatformKind Platform;
2195 DarwinEnvironmentKind Environment = DarwinEnvironmentKind::NativeEnvironment;
2199 VersionTuple ZipperedOSVersion;
2204 std::optional<VersionTuple> UnderlyingOSVersion;
2205 bool InferSimulatorFromArch =
true;
2206 std::pair<Arg *, std::string>
Arguments;
2207 StringRef EnvVarName;
2210 StringRef InferredSource;
2213 std::optional<llvm::Triple> TargetVariantTriple;
2218std::optional<DarwinPlatform>
2219getDeploymentTargetFromOSVersionArg(DerivedArgList &Args,
2220 const Driver &TheDriver) {
2221 Arg *macOSVersion = Args.getLastArg(options::OPT_mmacos_version_min_EQ);
2222 Arg *iOSVersion = Args.getLastArg(options::OPT_mios_version_min_EQ,
2223 options::OPT_mios_simulator_version_min_EQ);
2225 Args.getLastArg(options::OPT_mtvos_version_min_EQ,
2226 options::OPT_mtvos_simulator_version_min_EQ);
2227 Arg *WatchOSVersion =
2228 Args.getLastArg(options::OPT_mwatchos_version_min_EQ,
2229 options::OPT_mwatchos_simulator_version_min_EQ);
2231 auto GetDarwinPlatform =
2232 [&](DarwinPlatform::DarwinPlatformKind Platform, Arg *VersionArg,
2233 bool IsSimulator) -> std::optional<DarwinPlatform> {
2234 if (StringRef(VersionArg->getValue()).empty()) {
2235 TheDriver.
Diag(diag::err_drv_missing_version_number)
2236 << VersionArg->getAsString(Args);
2237 return std::nullopt;
2239 return DarwinPlatform::createOSVersionArg(Platform, VersionArg,
2244 if (iOSVersion || TvOSVersion || WatchOSVersion) {
2245 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2246 << macOSVersion->getAsString(Args)
2247 << (iOSVersion ? iOSVersion
2248 : TvOSVersion ? TvOSVersion : WatchOSVersion)
2254 }
else if (iOSVersion) {
2255 if (TvOSVersion || WatchOSVersion) {
2256 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2257 << iOSVersion->getAsString(Args)
2258 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->
getAsString(Args);
2261 iOSVersion->getOption().getID() ==
2262 options::OPT_mios_simulator_version_min_EQ);
2263 }
else if (TvOSVersion) {
2264 if (WatchOSVersion) {
2265 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2266 << TvOSVersion->getAsString(Args)
2267 << WatchOSVersion->getAsString(Args);
2270 TvOSVersion->getOption().getID() ==
2271 options::OPT_mtvos_simulator_version_min_EQ);
2272 }
else if (WatchOSVersion)
2273 return GetDarwinPlatform(
2275 WatchOSVersion->getOption().getID() ==
2276 options::OPT_mwatchos_simulator_version_min_EQ);
2277 return std::nullopt;
2282std::optional<DarwinPlatform>
2283getDeploymentTargetFromEnvironmentVariables(
const Driver &TheDriver,
2284 const llvm::Triple &Triple) {
2285 const char *EnvVars[] = {
2286 "MACOSX_DEPLOYMENT_TARGET",
2287 "IPHONEOS_DEPLOYMENT_TARGET",
2288 "TVOS_DEPLOYMENT_TARGET",
2289 "WATCHOS_DEPLOYMENT_TARGET",
2290 "DRIVERKIT_DEPLOYMENT_TARGET",
2291 "XROS_DEPLOYMENT_TARGET"
2293 std::string Targets[std::size(EnvVars)];
2294 for (
const auto &I : llvm::enumerate(llvm::ArrayRef(EnvVars))) {
2295 if (
char *Env = ::getenv(I.value()))
2296 Targets[I.index()] = Env;
2305 if (Triple.getArch() == llvm::Triple::arm ||
2306 Triple.getArch() == llvm::Triple::aarch64 ||
2307 Triple.getArch() == llvm::Triple::thumb)
2314 unsigned FirstTarget = std::size(Targets);
2315 for (
unsigned I = 0; I != std::size(Targets); ++I) {
2316 if (Targets[I].empty())
2318 if (FirstTarget == std::size(Targets))
2321 TheDriver.
Diag(diag::err_drv_conflicting_deployment_targets)
2322 << Targets[FirstTarget] << Targets[I];
2326 for (
const auto &
Target : llvm::enumerate(llvm::ArrayRef(Targets))) {
2327 if (!
Target.value().empty())
2328 return DarwinPlatform::createDeploymentTargetEnv(
2332 return std::nullopt;
2338std::optional<DarwinPlatform>
2339inferDeploymentTargetFromSDK(DerivedArgList &Args,
2340 const std::optional<DarwinSDKInfo> &SDKInfo) {
2341 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2343 return std::nullopt;
2344 StringRef isysroot = A->getValue();
2346 return DarwinPlatform::createFromSDKInfo(isysroot, *SDKInfo);
2350 return std::nullopt;
2352 std::string Version;
2355 size_t StartVer = SDK.find_first_of(
"0123456789");
2356 size_t EndVer = SDK.find_last_of(
"0123456789");
2357 if (StartVer != StringRef::npos && EndVer > StartVer)
2358 Version = std::string(SDK.slice(StartVer, EndVer + 1));
2359 if (Version.empty())
2360 return std::nullopt;
2362 if (SDK.starts_with(
"iPhoneOS") || SDK.starts_with(
"iPhoneSimulator"))
2363 return DarwinPlatform::createFromSDK(
2365 SDK.starts_with(
"iPhoneSimulator"));
2366 else if (SDK.starts_with(
"MacOSX"))
2367 return DarwinPlatform::createFromSDK(isysroot,
Darwin::MacOS,
2369 else if (SDK.starts_with(
"WatchOS") || SDK.starts_with(
"WatchSimulator"))
2370 return DarwinPlatform::createFromSDK(
2372 SDK.starts_with(
"WatchSimulator"));
2373 else if (SDK.starts_with(
"AppleTVOS") || SDK.starts_with(
"AppleTVSimulator"))
2374 return DarwinPlatform::createFromSDK(
2376 SDK.starts_with(
"AppleTVSimulator"));
2377 else if (SDK.starts_with(
"DriverKit"))
2379 return std::nullopt;
2383VersionTuple getInferredOSVersion(llvm::Triple::OSType OS,
2384 const llvm::Triple &Triple,
2385 const Driver &TheDriver) {
2386 VersionTuple OsVersion;
2387 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
2389 case llvm::Triple::Darwin:
2390 case llvm::Triple::MacOSX:
2393 if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
2394 !Triple.getOSMajorVersion())
2395 SystemTriple.getMacOSXVersion(OsVersion);
2396 else if (!Triple.getMacOSXVersion(OsVersion))
2397 TheDriver.
Diag(diag::err_drv_invalid_darwin_version)
2398 << Triple.getOSName();
2400 case llvm::Triple::IOS:
2401 if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
2402 OsVersion = VersionTuple(13, 1);
2404 OsVersion = Triple.getiOSVersion();
2406 case llvm::Triple::TvOS:
2407 OsVersion = Triple.getOSVersion();
2409 case llvm::Triple::WatchOS:
2410 OsVersion = Triple.getWatchOSVersion();
2412 case llvm::Triple::DriverKit:
2413 OsVersion = Triple.getDriverKitVersion();
2416 OsVersion = Triple.getOSVersion();
2417 if (!OsVersion.getMajor())
2418 OsVersion = OsVersion.withMajorReplaced(1);
2425std::optional<DarwinPlatform>
2426inferDeploymentTargetFromArch(DerivedArgList &Args,
const Darwin &Toolchain,
2427 const llvm::Triple &Triple,
2428 const Driver &TheDriver) {
2429 llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS;
2432 if (MachOArchName ==
"arm64" || MachOArchName ==
"arm64e")
2433 OSTy = llvm::Triple::MacOSX;
2434 else if (MachOArchName ==
"armv7" || MachOArchName ==
"armv7s" ||
2435 MachOArchName ==
"armv6")
2436 OSTy = llvm::Triple::IOS;
2437 else if (MachOArchName ==
"armv7k" || MachOArchName ==
"arm64_32")
2438 OSTy = llvm::Triple::WatchOS;
2439 else if (MachOArchName !=
"armv6m" && MachOArchName !=
"armv7m" &&
2440 MachOArchName !=
"armv7em")
2441 OSTy = llvm::Triple::MacOSX;
2442 if (OSTy == llvm::Triple::UnknownOS)
2443 return std::nullopt;
2444 return DarwinPlatform::createFromArch(
2445 MachOArchName, OSTy, getInferredOSVersion(OSTy, Triple, TheDriver));
2449std::optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
2450 DerivedArgList &Args,
const llvm::Triple &Triple,
const Driver &TheDriver,
2451 const std::optional<DarwinSDKInfo> &SDKInfo) {
2452 if (!Args.hasArg(options::OPT_target))
2453 return std::nullopt;
2454 if (Triple.getOS() == llvm::Triple::Darwin ||
2455 Triple.getOS() == llvm::Triple::UnknownOS)
2456 return std::nullopt;
2457 std::optional<llvm::Triple> TargetVariantTriple;
2458 for (
const Arg *A : Args.filtered(options::OPT_darwin_target_variant)) {
2459 llvm::Triple TVT(A->getValue());
2461 if ((Triple.getArch() == llvm::Triple::aarch64 ||
2462 TVT.getArchName() == Triple.getArchName()) &&
2463 TVT.getArch() == Triple.getArch() &&
2464 TVT.getSubArch() == Triple.getSubArch() &&
2465 TVT.getVendor() == Triple.getVendor()) {
2466 if (TargetVariantTriple)
2471 if ((Triple.isMacOSX() && TVT.getOS() == llvm::Triple::IOS &&
2472 TVT.isMacCatalystEnvironment()) ||
2473 (TVT.isMacOSX() && Triple.getOS() == llvm::Triple::IOS &&
2474 Triple.isMacCatalystEnvironment())) {
2475 TargetVariantTriple = TVT;
2478 TheDriver.
Diag(diag::err_drv_target_variant_invalid)
2479 << A->getSpelling() << A->getValue();
2482 DarwinPlatform PlatformAndVersion = DarwinPlatform::createFromTarget(
2483 Triple, Args.getLastArg(options::OPT_target), TargetVariantTriple,
2486 return PlatformAndVersion;
2490std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2491 DerivedArgList &Args,
const Driver &TheDriver,
2492 const std::optional<DarwinSDKInfo> &SDKInfo) {
2493 auto *A = Args.getLastArg(options::OPT_mtargetos_EQ);
2495 return std::nullopt;
2496 llvm::Triple TT(llvm::Twine(
"unknown-apple-") + A->getValue());
2497 switch (TT.getOS()) {
2498 case llvm::Triple::MacOSX:
2499 case llvm::Triple::IOS:
2500 case llvm::Triple::TvOS:
2501 case llvm::Triple::WatchOS:
2502 case llvm::Triple::XROS:
2505 TheDriver.
Diag(diag::err_drv_invalid_os_in_arg)
2506 << TT.getOSName() << A->getAsString(Args);
2507 return std::nullopt;
2510 VersionTuple Version = TT.getOSVersion();
2511 if (!Version.getMajor()) {
2512 TheDriver.
Diag(diag::err_drv_invalid_version_number)
2513 << A->getAsString(Args);
2514 return std::nullopt;
2516 return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
2517 TT.getEnvironment(), A, SDKInfo);
2520std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS,
2521 const ArgList &Args,
2522 const Driver &TheDriver) {
2523 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2525 return std::nullopt;
2526 StringRef isysroot = A->getValue();
2528 if (!SDKInfoOrErr) {
2529 llvm::consumeError(SDKInfoOrErr.takeError());
2530 TheDriver.
Diag(diag::warn_drv_darwin_sdk_invalid_settings);
2531 return std::nullopt;
2533 return *SDKInfoOrErr;
2538void Darwin::AddDeploymentTarget(DerivedArgList &Args)
const {
2544 bool TryXcselect =
false;
2550 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2552 if (!
getVFS().exists(A->getValue()))
2553 getDriver().
Diag(clang::diag::warn_missing_sysroot) << A->getValue();
2554 }
else if (
const char *env = ::getenv(
"SDKROOT")) {
2557 if (llvm::sys::path::is_absolute(env) &&
getVFS().exists(env) &&
2558 StringRef(env) !=
"/") {
2559 Args.append(Args.MakeSeparateArg(
2560 nullptr, Opts.getOption(options::OPT_isysroot), env));
2563 TryXcselect = !Args.hasArg(options::OPT__sysroot_EQ) &&
2564 !Args.hasArg(options::OPT_no_xcselect);
2574 std::optional<DarwinPlatform> PlatformAndVersion =
2576 if (PlatformAndVersion) {
2578 if (
const auto *MTargetOSArg = Args.getLastArg(options::OPT_mtargetos_EQ)) {
2579 std::string TargetArgStr = PlatformAndVersion->getAsString(Args, Opts);
2580 std::string MTargetOSArgStr = MTargetOSArg->getAsString(Args);
2582 << TargetArgStr << MTargetOSArgStr;
2585 bool TripleProvidedOSVersion = PlatformAndVersion->hasOSVersion();
2586 if (!TripleProvidedOSVersion)
2587 PlatformAndVersion->setOSVersion(
2590 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2591 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2592 if (PlatformAndVersionFromOSVersionArg) {
2593 unsigned TargetMajor, TargetMinor, TargetMicro;
2595 unsigned ArgMajor, ArgMinor, ArgMicro;
2597 if (PlatformAndVersion->getPlatform() !=
2598 PlatformAndVersionFromOSVersionArg->getPlatform() ||
2600 PlatformAndVersion->getOSVersion().getAsString(), TargetMajor,
2601 TargetMinor, TargetMicro, TargetExtra) &&
2603 PlatformAndVersionFromOSVersionArg->getOSVersion().getAsString(),
2604 ArgMajor, ArgMinor, ArgMicro, ArgExtra) &&
2605 (VersionTuple(TargetMajor, TargetMinor, TargetMicro) !=
2606 VersionTuple(ArgMajor, ArgMinor, ArgMicro) ||
2607 TargetExtra != ArgExtra))) {
2610 if (PlatformAndVersion->getPlatform() ==
2611 PlatformAndVersionFromOSVersionArg->getPlatform() &&
2612 !TripleProvidedOSVersion) {
2613 PlatformAndVersion->setOSVersion(
2614 PlatformAndVersionFromOSVersionArg->getOSVersion());
2618 std::string OSVersionArg =
2619 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2620 std::string TargetArg = PlatformAndVersion->getAsString(Args, Opts);
2622 << OSVersionArg << TargetArg;
2626 }
else if ((PlatformAndVersion = getDeploymentTargetFromMTargetOSArg(
2630 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2631 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2632 if (PlatformAndVersionFromOSVersionArg) {
2633 std::string MTargetOSArgStr = PlatformAndVersion->getAsString(Args, Opts);
2634 std::string OSVersionArgStr =
2635 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2637 << MTargetOSArgStr << OSVersionArgStr;
2641 PlatformAndVersion = getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2644 if (!PlatformAndVersion) {
2645 PlatformAndVersion =
2647 if (PlatformAndVersion) {
2649 std::optional<DarwinPlatform> SDKTarget =
2650 inferDeploymentTargetFromSDK(Args,
SDKInfo);
2652 PlatformAndVersion->setEnvironment(SDKTarget->getEnvironment());
2658 if (!PlatformAndVersion) {
2659 PlatformAndVersion = inferDeploymentTargetFromSDK(Args,
SDKInfo);
2662 if (PlatformAndVersion && !
SDKInfo)
2663 SDKInfo = PlatformAndVersion->inferSDKInfo();
2667 if (!PlatformAndVersion)
2668 PlatformAndVersion =
2672 assert(PlatformAndVersion &&
"Unable to infer Darwin variant");
2673 if (!PlatformAndVersion->isValidOSVersion()) {
2674 if (PlatformAndVersion->isExplicitlySpecified())
2676 << PlatformAndVersion->getAsString(Args, Opts);
2678 getDriver().
Diag(diag::err_drv_invalid_version_number_inferred)
2679 << PlatformAndVersion->getOSVersion().getAsString()
2680 << PlatformAndVersion->getInferredSource();
2685 VersionTuple CanonicalVersion = PlatformAndVersion->getCanonicalOSVersion();
2686 if (CanonicalVersion != PlatformAndVersion->getOSVersion()) {
2687 getDriver().
Diag(diag::warn_drv_overriding_deployment_version)
2688 << PlatformAndVersion->getOSVersion().getAsString()
2689 << CanonicalVersion.getAsString();
2690 PlatformAndVersion->setOSVersion(CanonicalVersion);
2693 PlatformAndVersion->addOSVersionMinArgument(Args, Opts);
2696 unsigned Major, Minor, Micro;
2699 const unsigned MajorVersionLimit = 1000;
2700 const VersionTuple OSVersion = PlatformAndVersion->takeOSVersion();
2701 const std::string OSVersionStr = OSVersion.getAsString();
2703 if (Platform ==
MacOS) {
2704#ifdef CLANG_USE_XCSELECT
2707 if (!::xcselect_host_sdk_path(CLANG_XCSELECT_HOST_SDK_POLICY, &p)) {
2708 Args.append(Args.MakeSeparateArg(
2709 nullptr, Opts.getOption(options::OPT_isysroot), p));
2718 HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
2721 << PlatformAndVersion->getAsString(Args, Opts);
2725 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2727 << PlatformAndVersion->getAsString(Args, Opts);
2729 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst &&
2730 (Major < 13 || (Major == 13 && Minor < 1))) {
2732 << PlatformAndVersion->getAsString(Args, Opts);
2739 if (
getTriple().isArch32Bit() && Major >= 11) {
2741 if (PlatformAndVersion->isExplicitlySpecified()) {
2742 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst)
2743 getDriver().
Diag(diag::err_invalid_macos_32bit_deployment_target);
2746 << PlatformAndVersion->getAsString(Args, Opts);
2754 }
else if (Platform ==
TvOS) {
2757 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2759 << PlatformAndVersion->getAsString(Args, Opts);
2760 }
else if (Platform ==
WatchOS) {
2763 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2765 << PlatformAndVersion->getAsString(Args, Opts);
2769 HadExtra || Major < 19 || Major >= MajorVersionLimit || Minor >= 100 ||
2772 << PlatformAndVersion->getAsString(Args, Opts);
2776 HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2779 << PlatformAndVersion->getAsString(Args, Opts);
2786 PlatformAndVersion->canInferSimulatorFromArch() &&
getTriple().isX86())
2789 VersionTuple ZipperedOSVersion;
2791 ZipperedOSVersion = PlatformAndVersion->getZipperedOSVersion();
2792 setTarget(Platform, Environment, Major, Minor, Micro, ZipperedOSVersion);
2804 return !
SDKInfo->getPlatformPrefix(T).empty();
2813 const llvm::Triple &T)
const {
2815 const StringRef PlatformPrefix =
SDKInfo->getPlatformPrefix(T);
2816 if (!PlatformPrefix.empty())
2817 llvm::sys::path::append(Path, PlatformPrefix);
2818 }
else if (T.isDriverKit()) {
2821 llvm::sys::path::append(Path,
"System",
"DriverKit");
2830 if (DriverArgs.hasArg(options::OPT_isysroot))
2831 Path = DriverArgs.getLastArgValue(options::OPT_isysroot);
2842 const llvm::opt::ArgList &DriverArgs,
2843 llvm::opt::ArgStringList &CC1Args)
const {
2848 bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc);
2849 bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc);
2850 bool NoBuiltinInc = DriverArgs.hasFlag(
2851 options::OPT_nobuiltininc, options::OPT_ibuiltininc,
false);
2852 bool ForceBuiltinInc = DriverArgs.hasFlag(
2853 options::OPT_ibuiltininc, options::OPT_nobuiltininc,
false);
2856 if (!NoStdInc && !NoStdlibInc) {
2858 llvm::sys::path::append(P,
"usr",
"local",
"include");
2863 if (!(NoStdInc && !ForceBuiltinInc) && !NoBuiltinInc) {
2865 llvm::sys::path::append(P,
"include");
2869 if (NoStdInc || NoStdlibInc)
2873 llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
2874 if (!CIncludeDirs.empty()) {
2876 CIncludeDirs.split(dirs,
":");
2877 for (llvm::StringRef dir : dirs) {
2878 llvm::StringRef Prefix =
2879 llvm::sys::path::is_absolute(dir) ?
"" : llvm::StringRef(Sysroot);
2885 llvm::sys::path::append(P,
"usr",
"include");
2891 const llvm::opt::ArgList &DriverArgs,
2892 llvm::opt::ArgStringList &CC1Args)
const {
2895 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc))
2904 llvm::sys::path::append(P1,
"System",
"Library",
"Frameworks");
2905 llvm::sys::path::append(P2,
"System",
"Library",
"SubFrameworks");
2906 llvm::sys::path::append(P3,
"Library",
"Frameworks");
2910bool DarwinClang::AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
2911 llvm::opt::ArgStringList &CC1Args,
2913 llvm::StringRef Version,
2914 llvm::StringRef ArchDir,
2915 llvm::StringRef BitDir)
const {
2916 llvm::sys::path::append(
Base, Version);
2924 if (!ArchDir.empty())
2925 llvm::sys::path::append(P, ArchDir);
2926 if (!BitDir.empty())
2927 llvm::sys::path::append(P, BitDir);
2934 llvm::sys::path::append(P,
"backward");
2942 const llvm::opt::ArgList &DriverArgs,
2943 llvm::opt::ArgStringList &CC1Args)
const {
2951 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
2952 options::OPT_nostdincxx))
2973 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
2974 if (
getVFS().exists(InstallBin)) {
2977 }
else if (DriverArgs.hasArg(options::OPT_v)) {
2978 llvm::errs() <<
"ignoring nonexistent directory \"" << InstallBin
2984 llvm::sys::path::append(SysrootUsr,
"usr",
"include",
"c++",
"v1");
2985 if (
getVFS().exists(SysrootUsr)) {
2988 }
else if (DriverArgs.hasArg(options::OPT_v)) {
2989 llvm::errs() <<
"ignoring nonexistent directory \"" << SysrootUsr
2998 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args);
3003void AppleMachO::AddGnuCPlusPlusIncludePaths(
3004 const llvm::opt::ArgList &DriverArgs,
3005 llvm::opt::ArgStringList &CC1Args)
const {}
3007void DarwinClang::AddGnuCPlusPlusIncludePaths(
3008 const llvm::opt::ArgList &DriverArgs,
3009 llvm::opt::ArgStringList &CC1Args)
const {
3011 llvm::sys::path::append(UsrIncludeCxx,
"usr",
"include",
"c++");
3013 llvm::Triple::ArchType arch =
getTriple().getArch();
3014 bool IsBaseFound =
true;
3019 case llvm::Triple::x86:
3020 case llvm::Triple::x86_64:
3021 IsBaseFound = AddGnuCPlusPlusIncludePaths(
3022 DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
"i686-apple-darwin10",
3023 arch == llvm::Triple::x86_64 ?
"x86_64" :
"");
3024 IsBaseFound |= AddGnuCPlusPlusIncludePaths(
3025 DriverArgs, CC1Args, UsrIncludeCxx,
"4.0.0",
"i686-apple-darwin8",
"");
3028 case llvm::Triple::arm:
3029 case llvm::Triple::thumb:
3031 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3032 "arm-apple-darwin10",
"v7");
3034 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3035 "arm-apple-darwin10",
"v6");
3038 case llvm::Triple::aarch64:
3040 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3041 "arm64-apple-darwin10",
"");
3051 ArgStringList &CmdArgs)
const {
3056 CmdArgs.push_back(
"-lc++");
3057 if (Args.hasArg(options::OPT_fexperimental_library))
3058 CmdArgs.push_back(
"-lc++experimental");
3068 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
3070 llvm::sys::path::append(P,
"usr",
"lib",
"libstdc++.dylib");
3072 if (!
getVFS().exists(P)) {
3073 llvm::sys::path::remove_filename(P);
3074 llvm::sys::path::append(P,
"libstdc++.6.dylib");
3075 if (
getVFS().exists(P)) {
3076 CmdArgs.push_back(Args.MakeArgString(P));
3085 if (!
getVFS().exists(
"/usr/lib/libstdc++.dylib") &&
3086 getVFS().exists(
"/usr/lib/libstdc++.6.dylib")) {
3087 CmdArgs.push_back(
"/usr/lib/libstdc++.6.dylib");
3092 CmdArgs.push_back(
"-lstdc++");
3098 ArgStringList &CmdArgs)
const {
3104 llvm::sys::path::append(P,
"lib",
"darwin");
3108 llvm::sys::path::append(P,
"libclang_rt.cc_kext_watchos.a");
3110 llvm::sys::path::append(P,
"libclang_rt.cc_kext_tvos.a");
3112 llvm::sys::path::append(P,
"libclang_rt.cc_kext_ios.a");
3116 llvm::sys::path::append(
3117 P, llvm::Twine(
"libclang_rt.cc_kext_") +
3118 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
".a");
3120 llvm::sys::path::append(P,
"libclang_rt.cc_kext.a");
3126 CmdArgs.push_back(Args.MakeArgString(P));
3130 StringRef BoundArch,
3132 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
3142 for (Arg *A : Args) {
3151 case options::OPT_mkernel:
3152 case options::OPT_fapple_kext:
3154 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
3157 case options::OPT_dependency_file:
3158 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
3161 case options::OPT_gfull:
3162 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3164 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
3167 case options::OPT_gused:
3168 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3170 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
3173 case options::OPT_shared:
3174 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
3177 case options::OPT_fconstant_cfstrings:
3178 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
3181 case options::OPT_fno_constant_cfstrings:
3182 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
3185 case options::OPT_Wnonportable_cfstrings:
3187 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
3190 case options::OPT_Wno_nonportable_cfstrings:
3192 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
3199 if (!BoundArch.empty()) {
3200 StringRef Name = BoundArch;
3201 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
3202 const Option MArch = Opts.getOption(options::OPT_march_EQ);
3208 else if (Name ==
"ppc601")
3209 DAL->AddJoinedArg(
nullptr, MCpu,
"601");
3210 else if (Name ==
"ppc603")
3211 DAL->AddJoinedArg(
nullptr, MCpu,
"603");
3212 else if (Name ==
"ppc604")
3213 DAL->AddJoinedArg(
nullptr, MCpu,
"604");
3214 else if (Name ==
"ppc604e")
3215 DAL->AddJoinedArg(
nullptr, MCpu,
"604e");
3216 else if (Name ==
"ppc750")
3217 DAL->AddJoinedArg(
nullptr, MCpu,
"750");
3218 else if (Name ==
"ppc7400")
3219 DAL->AddJoinedArg(
nullptr, MCpu,
"7400");
3220 else if (Name ==
"ppc7450")
3221 DAL->AddJoinedArg(
nullptr, MCpu,
"7450");
3222 else if (Name ==
"ppc970")
3223 DAL->AddJoinedArg(
nullptr, MCpu,
"970");
3225 else if (Name ==
"ppc64" || Name ==
"ppc64le")
3226 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3228 else if (Name ==
"i386")
3230 else if (Name ==
"i486")
3231 DAL->AddJoinedArg(
nullptr, MArch,
"i486");
3232 else if (Name ==
"i586")
3233 DAL->AddJoinedArg(
nullptr, MArch,
"i586");
3234 else if (Name ==
"i686")
3235 DAL->AddJoinedArg(
nullptr, MArch,
"i686");
3236 else if (Name ==
"pentium")
3237 DAL->AddJoinedArg(
nullptr, MArch,
"pentium");
3238 else if (Name ==
"pentium2")
3239 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3240 else if (Name ==
"pentpro")
3241 DAL->AddJoinedArg(
nullptr, MArch,
"pentiumpro");
3242 else if (Name ==
"pentIIm3")
3243 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3245 else if (Name ==
"x86_64" || Name ==
"x86_64h")
3246 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3248 else if (Name ==
"arm")
3249 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3250 else if (Name ==
"armv4t")
3251 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3252 else if (Name ==
"armv5")
3253 DAL->AddJoinedArg(
nullptr, MArch,
"armv5tej");
3254 else if (Name ==
"xscale")
3255 DAL->AddJoinedArg(
nullptr, MArch,
"xscale");
3256 else if (Name ==
"armv6")
3257 DAL->AddJoinedArg(
nullptr, MArch,
"armv6k");
3258 else if (Name ==
"armv6m")
3259 DAL->AddJoinedArg(
nullptr, MArch,
"armv6m");
3260 else if (Name ==
"armv7")
3261 DAL->AddJoinedArg(
nullptr, MArch,
"armv7a");
3262 else if (Name ==
"armv7em")
3263 DAL->AddJoinedArg(
nullptr, MArch,
"armv7em");
3264 else if (Name ==
"armv7k")
3265 DAL->AddJoinedArg(
nullptr, MArch,
"armv7k");
3266 else if (Name ==
"armv7m")
3267 DAL->AddJoinedArg(
nullptr, MArch,
"armv7m");
3268 else if (Name ==
"armv7s")
3269 DAL->AddJoinedArg(
nullptr, MArch,
"armv7s");
3276 ArgStringList &CmdArgs,
3277 bool ForceLinkBuiltinRT)
const {
3286 CompilerRT += Args.hasArg(options::OPT_fPIC) ?
"_pic" :
"_static";
3292 llvm::Triple::OSType OS;
3298 OS = llvm::Triple::MacOSX;
3301 OS = llvm::Triple::IOS;
3304 OS = llvm::Triple::TvOS;
3307 OS = llvm::Triple::WatchOS;
3323 switch (SDKInfo->getEnvironment()) {
3324 case llvm::Triple::UnknownEnvironment:
3325 case llvm::Triple::Simulator:
3326 case llvm::Triple::MacABI:
3335 VersionTuple SDKVersion = SDKInfo->getVersion();
3336 switch (SDKInfo->getOS()) {
3339 case llvm::Triple::MacOSX:
3340 return SDKVersion >= VersionTuple(15U);
3341 case llvm::Triple::IOS:
3342 return SDKVersion >= VersionTuple(18U);
3343 case llvm::Triple::TvOS:
3344 return SDKVersion >= VersionTuple(18U);
3345 case llvm::Triple::WatchOS:
3346 return SDKVersion >= VersionTuple(11U);
3347 case llvm::Triple::XROS:
3348 return SDKVersion >= VersionTuple(2U);
3356static inline llvm::VersionTuple
3361 case llvm::Triple::Darwin:
3362 case llvm::Triple::MacOSX:
3363 return llvm::VersionTuple(10U, 12U);
3364 case llvm::Triple::IOS:
3365 case llvm::Triple::TvOS:
3366 return llvm::VersionTuple(10U);
3367 case llvm::Triple::WatchOS:
3368 return llvm::VersionTuple(3U);
3371 llvm_unreachable(
"Unexpected OS");
3375 llvm::Triple::OSType OS;
3381 OS = llvm::Triple::MacOSX;
3384 OS = llvm::Triple::IOS;
3387 OS = llvm::Triple::TvOS;
3390 OS = llvm::Triple::WatchOS;
3401 llvm::opt::ArgStringList &CC1Args,
3410 if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3411 options::OPT_fno_ptrauth_calls))
3412 CC1Args.push_back(
"-fptrauth-calls");
3413 if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3414 options::OPT_fno_ptrauth_returns))
3415 CC1Args.push_back(
"-fptrauth-returns");
3416 if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3417 options::OPT_fno_ptrauth_intrinsics))
3418 CC1Args.push_back(
"-fptrauth-intrinsics");
3419 if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3420 options::OPT_fno_ptrauth_indirect_gotos))
3421 CC1Args.push_back(
"-fptrauth-indirect-gotos");
3422 if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3423 options::OPT_fno_ptrauth_auth_traps))
3424 CC1Args.push_back(
"-fptrauth-auth-traps");
3427 if (!DriverArgs.hasArg(
3428 options::OPT_fptrauth_vtable_pointer_address_discrimination,
3429 options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
3430 CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
3431 if (!DriverArgs.hasArg(
3432 options::OPT_fptrauth_vtable_pointer_type_discrimination,
3433 options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
3434 CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
3437 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
3438 options::OPT_fno_ptrauth_objc_isa))
3439 CC1Args.push_back(
"-fptrauth-objc-isa");
3440 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
3441 options::OPT_fno_ptrauth_objc_class_ro))
3442 CC1Args.push_back(
"-fptrauth-objc-class-ro");
3443 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
3444 options::OPT_fno_ptrauth_objc_interface_sel))
3445 CC1Args.push_back(
"-fptrauth-objc-interface-sel");
3450 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3463 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
3464 options::OPT_fno_aligned_allocation) &&
3466 CC1Args.push_back(
"-faligned-alloc-unavailable");
3470 if (!DriverArgs.hasArgNoClaim(options::OPT_fobjc_msgsend_selector_stubs,
3471 options::OPT_fno_objc_msgsend_selector_stubs) &&
3474 CC1Args.push_back(
"-fobjc-msgsend-selector-stubs");
3478 if (!DriverArgs.hasArgNoClaim(
3479 options::OPT_fobjc_msgsend_class_selector_stubs,
3480 options::OPT_fno_objc_msgsend_class_selector_stubs) &&
3483 CC1Args.push_back(
"-fobjc-msgsend-class-selector-stubs");
3487 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
3488 options::OPT_fno_sized_deallocation) &&
3490 CC1Args.push_back(
"-fno-sized-deallocation");
3497 if (!
SDKInfo->getFilePath().empty()) {
3499 ExtraDepOpt +=
SDKInfo->getFilePath();
3500 CC1Args.push_back(DriverArgs.MakeArgString(ExtraDepOpt));
3506 CC1Args.push_back(
"-fcompatibility-qualified-id-block-type-checking");
3510 if (!DriverArgs.getLastArgNoClaim(
3511 options::OPT_fvisibility_inlines_hidden_static_local_var,
3512 options::OPT_fno_visibility_inlines_hidden_static_local_var))
3513 CC1Args.push_back(
"-fvisibility-inlines-hidden-static-local-var");
3527 CC1Args.push_back(
"-fbuiltin-headers-in-system-modules");
3529 if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
3530 options::OPT_fno_define_target_os_macros))
3531 CC1Args.push_back(
"-fdefine-target-os-macros");
3535 !DriverArgs.hasFlag(options::OPT_fmodulemap_allow_subdirectory_search,
3536 options::OPT_fno_modulemap_allow_subdirectory_search,
3538 bool RequiresSubdirectorySearch;
3539 VersionTuple SDKVersion =
SDKInfo->getVersion();
3542 RequiresSubdirectorySearch =
true;
3545 RequiresSubdirectorySearch = SDKVersion < VersionTuple(15, 0);
3549 RequiresSubdirectorySearch = SDKVersion < VersionTuple(18, 0);
3552 RequiresSubdirectorySearch = SDKVersion < VersionTuple(11, 0);
3555 RequiresSubdirectorySearch = SDKVersion < VersionTuple(2, 0);
3558 if (!RequiresSubdirectorySearch)
3559 CC1Args.push_back(
"-fno-modulemap-allow-subdirectory-search");
3564 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1ASArgs)
const {
3566 CC1ASArgs.push_back(
"-darwin-target-variant-triple");
3573 auto EmitTargetSDKVersionArg = [&](
const VersionTuple &
V) {
3575 llvm::raw_string_ostream OS(Arg);
3576 OS <<
"-target-sdk-version=" <<
V;
3577 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3581 if (
const auto *MacOStoMacCatalystMapping =
SDKInfo->getVersionMapping(
3583 std::optional<VersionTuple> SDKVersion = MacOStoMacCatalystMapping->map(
3586 EmitTargetSDKVersionArg(
3590 EmitTargetSDKVersionArg(
SDKInfo->getVersion());
3598 llvm::raw_string_ostream OS(Arg);
3599 OS <<
"-darwin-target-variant-sdk-version=" <<
SDKInfo->getVersion();
3600 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3601 }
else if (
const auto *MacOStoMacCatalystMapping =
3604 if (std::optional<VersionTuple> SDKVersion =
3605 MacOStoMacCatalystMapping->map(
3609 llvm::raw_string_ostream OS(Arg);
3610 OS <<
"-darwin-target-variant-sdk-version=" << *SDKVersion;
3611 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3622 DerivedArgList *DAL =
3626 if (BoundArch.empty())
3632 AddDeploymentTarget(*DAL);
3640 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
3643 if (A->getOption().getID() != options::OPT_mkernel &&
3644 A->getOption().getID() != options::OPT_fapple_kext)
3646 assert(it != ie &&
"unexpected argument translation");
3648 assert(A->getOption().getID() == options::OPT_static &&
3649 "missing expected -static argument");
3656 if ((
Arch == llvm::Triple::arm ||
Arch == llvm::Triple::thumb)) {
3657 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
3658 options::OPT_fno_omit_frame_pointer,
false))
3659 getDriver().
Diag(clang::diag::warn_drv_unsupported_opt_for_target)
3660 <<
"-fomit-frame-pointer" << BoundArch;
3669 if (
getArch() == llvm::Triple::x86_64 ||
3671 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
3673 return (
getArch() == llvm::Triple::aarch64 ||
3674 getArch() == llvm::Triple::aarch64_32)
3682 if (
const char *S = ::getenv(
"RC_DEBUG_OPTIONS"))
3683 return S[0] !=
'\0';
3688 if (
const char *S = ::getenv(
"RC_DEBUG_PREFIX_MAP"))
3697 return llvm::ExceptionHandling::None;
3701 if (Triple.isWatchABI())
3702 return llvm::ExceptionHandling::DwarfCFI;
3704 return llvm::ExceptionHandling::SjLj;
3719 return (
getArch() == llvm::Triple::x86_64 ||
3720 getArch() == llvm::Triple::aarch64);
3729 ArgStringList &CmdArgs)
const {
3732 assert(!
isTargetXROS() &&
"xrOS always uses -platform-version");
3735 CmdArgs.push_back(
"-watchos_version_min");
3737 CmdArgs.push_back(
"-watchos_simulator_version_min");
3739 CmdArgs.push_back(
"-tvos_version_min");
3741 CmdArgs.push_back(
"-tvos_simulator_version_min");
3743 CmdArgs.push_back(
"-driverkit_version_min");
3745 CmdArgs.push_back(
"-ios_simulator_version_min");
3747 CmdArgs.push_back(
"-iphoneos_version_min");
3749 CmdArgs.push_back(
"-maccatalyst_version_min");
3752 CmdArgs.push_back(
"-macosx_version_min");
3758 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3761 VersionTuple VariantTargetVersion;
3763 CmdArgs.push_back(
"-macosx_version_min");
3768 "unexpected target variant triple");
3769 CmdArgs.push_back(
"-maccatalyst_version_min");
3772 VersionTuple MinTgtVers =
3774 if (MinTgtVers.getMajor() && MinTgtVers > VariantTargetVersion)
3775 VariantTargetVersion = MinTgtVers;
3776 CmdArgs.push_back(Args.MakeArgString(VariantTargetVersion.getAsString()));
3787 return "mac catalyst";
3800 llvm_unreachable(
"invalid platform");
3804 llvm::opt::ArgStringList &CmdArgs)
const {
3809 auto EmitPlatformVersionArg =
3812 const llvm::Triple &TT) {
3815 CmdArgs.push_back(
"-platform_version");
3816 std::string PlatformName =
3819 PlatformName +=
"-simulator";
3820 CmdArgs.push_back(Args.MakeArgString(PlatformName));
3829 VersionTuple MinTgtVers = TT.getMinimumSupportedOSVersion();
3832 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3837 std::optional<VersionTuple> iOSSDKVersion;
3839 if (
const auto *MacOStoMacCatalystMapping =
3842 iOSSDKVersion = MacOStoMacCatalystMapping->map(
3843 SDKInfo->getVersion().withoutBuild(),
3847 CmdArgs.push_back(Args.MakeArgString(
3848 (iOSSDKVersion ? *iOSSDKVersion
3855 VersionTuple SDKVersion =
SDKInfo->getVersion().withoutBuild();
3856 if (!SDKVersion.getMinor())
3857 SDKVersion = VersionTuple(SDKVersion.getMajor(), 0);
3858 CmdArgs.push_back(Args.MakeArgString(SDKVersion.getAsString()));
3869 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3878 VersionTuple TargetVariantVersion;
3886 "unexpected target variant triple");
3891 EmitPlatformVersionArg(TargetVariantVersion, Platform, Environment,
3897 ArgStringList &CmdArgs) {
3901 CmdArgs.push_back(
"-ldylib1.o");
3908 CmdArgs.push_back(
"-ldylib1.o");
3910 CmdArgs.push_back(
"-ldylib1.10.5.o");
3915 ArgStringList &CmdArgs) {
3916 if (Args.hasArg(options::OPT_static))
3921 CmdArgs.push_back(
"-lbundle1.o");
3926 ArgStringList &CmdArgs) {
3928 if (Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_object) ||
3929 Args.hasArg(options::OPT_preload)) {
3930 CmdArgs.push_back(
"-lgcrt0.o");
3932 CmdArgs.push_back(
"-lgcrt1.o");
3942 CmdArgs.push_back(
"-no_new_main");
3944 D.
getDriver().
Diag(diag::err_drv_clang_unsupported_opt_pg_darwin)
3950 ArgStringList &CmdArgs) {
3953 if (D.
getArch() == llvm::Triple::aarch64)
3956 CmdArgs.push_back(
"-lcrt1.o");
3958 CmdArgs.push_back(
"-lcrt1.3.1.o");
3965 CmdArgs.push_back(
"-lcrt1.o");
3967 CmdArgs.push_back(
"-lcrt1.10.5.o");
3969 CmdArgs.push_back(
"-lcrt1.10.6.o");
3974 ArgStringList &CmdArgs)
const {
3980 if (Args.hasArg(options::OPT_dynamiclib))
3982 else if (Args.hasArg(options::OPT_bundle))
3986 else if (Args.hasArg(options::OPT_static) ||
3987 Args.hasArg(options::OPT_object) ||
3988 Args.hasArg(options::OPT_preload))
3989 CmdArgs.push_back(
"-lcrt0.o");
3993 if (
isTargetMacOS() && Args.hasArg(options::OPT_shared_libgcc) &&
3995 const char *Str = Args.MakeArgString(
GetFilePath(
"crt3.o"));
3996 CmdArgs.push_back(Str);
4011 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
4012 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
4014 Res |= SanitizerKind::Address;
4015 Res |= SanitizerKind::PointerCompare;
4016 Res |= SanitizerKind::PointerSubtract;
4017 Res |= SanitizerKind::Realtime;
4018 Res |= SanitizerKind::Leak;
4019 Res |= SanitizerKind::Fuzzer;
4020 Res |= SanitizerKind::FuzzerNoLink;
4021 Res |= SanitizerKind::ObjCCast;
4031 Res |= SanitizerKind::Vptr;
4033 if ((IsX86_64 || IsAArch64) &&
4036 Res |= SanitizerKind::Thread;
4040 Res |= SanitizerKind::Type;
4044 Res |= SanitizerKind::NumericalStability;
Defines a function that returns the minimum OS versions supporting C++17's aligned allocation functio...
static bool hasMultipleInvocations(const llvm::Triple &Triple, const ArgList &Args)
static bool checkRemarksOptions(const Driver &D, const ArgList &Args, const llvm::Triple &Triple)
static void renderRemarksOptions(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple, const InputInfo &Input, const InputInfo &Output, const JobAction &JA)
static bool sdkSupportsBuiltinModules(const std::optional< DarwinSDKInfo > &SDKInfo)
static void addPgProfilingLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static const char * ArmMachOArchName(StringRef Arch)
static bool shouldLinkerNotDedup(bool IsLinkerOnlyAction, const ArgList &Args)
Pass -no_deduplicate to ld64 under certain conditions:
static bool hasExportSymbolDirective(const ArgList &Args)
Check if the link command contains a symbol export directive.
static void addDefaultCRTLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static void addBundleLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static llvm::VersionTuple sizedDeallocMinVersion(llvm::Triple::OSType OS)
static VersionTuple minimumMacCatalystDeploymentTarget()
static std::string getSystemOrSDKMacOSVersion(StringRef MacOSSDKVersion)
Returns the most appropriate macOS target version for the current process.
static void addDynamicLibLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static bool isObjCRuntimeLinked(const ArgList &Args)
Determine whether we are linking the ObjC runtime.
static const char * getPlatformName(Darwin::DarwinPlatformKind Platform, Darwin::DarwinEnvironmentKind Environment)
static const char * ArmMachOArchNameCPU(StringRef CPU)
static void addExportedSymbol(ArgStringList &CmdArgs, const char *Symbol)
Add an export directive for Symbol to the link command.
static StringRef getXcodeDeveloperPath(StringRef PathIntoXcode)
Take a path that speculatively points into Xcode and return the XCODE/Contents/Developer path if it i...
static void addSectalignToPage(const ArgList &Args, ArgStringList &CmdArgs, StringRef Segment, StringRef Section)
Add a sectalign directive for Segment and Section to the maximum expected page size for Darwin.
Result
Implement __builtin_bit_cast and related operations.
static StringRef getTriple(const Command &Job)
Defines types useful for describing an Objective-C runtime.
const SDKPlatformInfo & getCanonicalPlatformInfo() const
const llvm::VersionTuple & getVersion() const
The basic abstraction for the target Objective-C runtime.
bool hasNativeARC() const
Does this runtime natively provide the ARC entrypoints?
bool hasSubscripting() const
Does this runtime directly support the subscripting methods?
@ MacOSX
'macosx' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the non-fragile AB...
@ FragileMacOSX
'macosx-fragile' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the fragil...
@ iOS
'ios' is the Apple-provided NeXT-derived runtime on iOS or the iOS simulator; it is always non-fragil...
@ WatchOS
'watchos' is a variant of iOS for Apple's watchOS.
The base class of the type hierarchy.
Action - Represent an abstract compilation step to perform.
types::ID getType() const
ActionClass getKind() const
@ VerifyDebugInfoJobClass
Compilation - A set of tasks to perform for a single driver invocation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
std::string SysRoot
sysroot, if present
std::string GetTemporaryDirectory(StringRef Prefix) const
GetTemporaryDirectory - Return the pathname of a temporary directory to use as part of compilation; t...
DiagnosticBuilder Diag(unsigned DiagID) const
static bool GetReleaseVersion(StringRef Str, unsigned &Major, unsigned &Minor, unsigned &Micro, bool &HadExtra)
GetReleaseVersion - Parse (([0-9]+)(.
const llvm::opt::OptTable & getOpts() const
std::string GetTemporaryPath(StringRef Prefix, StringRef Suffix) const
GetTemporaryPath - Return the pathname of a temporary file to use as part of compilation; the file wi...
std::string Dir
The path the driver executable was in, as invoked from the command line.
bool isUsingLTO() const
Returns true if we are performing any kind of LTO.
LTOKind getLTOMode() const
Get the specific kind of LTO being performed.
bool needsStatsRt() const
bool needsMemProfRt() const
bool linkRuntimes() const
bool needsUbsanRt() const
bool needsRtsanRt() const
bool requiresMinimalRuntime() const
bool needsSharedRt() const
bool needsTysanRt() const
bool needsStableAbi() const
const char * getTypeTempSuffix(ID Id, bool CLStyle=false)
getTypeTempSuffix - Return the suffix to use when creating a temp file of this type,...
SmallVector< InputInfo, 4 > InputInfoList
bool willEmitRemarks(const llvm::opt::ArgList &Args)
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
The JSON file list parser is used to communicate input to InstallAPI.
Expected< std::optional< DarwinSDKInfo > > parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath)
Parse the SDK information from the SDKSettings.json file.
llvm::VersionTuple alignedAllocMinVersion(llvm::Triple::OSType OS)
llvm::StringRef getAsString(SyncScope S)
bool(*)(llvm::ArrayRef< const char * >, llvm::raw_ostream &, llvm::raw_ostream &, bool, bool) Driver
static constexpr OSEnvPair macCatalystToMacOSPair()
Returns the os-environment mapping pair that's used to represent the Mac Catalyst -> macOS version ma...
static constexpr OSEnvPair macOStoMacCatalystPair()
Returns the os-environment mapping pair that's used to represent the macOS -> Mac Catalyst version ma...
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
static constexpr ResponseFileSupport AtFileUTF8()