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"
37 return VersionTuple(13, 1);
53 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
54 .Cases({
"i386",
"i486",
"i486SX",
"i586",
"i686"}, llvm::Triple::x86)
55 .Cases({
"pentium",
"pentpro",
"pentIIm3",
"pentIIm5",
"pentium4"},
57 .Cases({
"x86_64",
"x86_64h"}, llvm::Triple::x86_64)
59 .Cases({
"arm",
"armv4t",
"armv5",
"armv6",
"armv6m"}, llvm::Triple::arm)
60 .Cases({
"armv7",
"armv7em",
"armv7k",
"armv7m"}, llvm::Triple::arm)
61 .Cases({
"armv7s",
"xscale"}, llvm::Triple::arm)
62 .Cases({
"arm64",
"arm64e"}, llvm::Triple::aarch64)
63 .Case(
"arm64_32", llvm::Triple::aarch64_32)
64 .Case(
"r600", llvm::Triple::r600)
65 .Case(
"amdgcn", llvm::Triple::amdgcn)
66 .Case(
"nvptx", llvm::Triple::nvptx)
67 .Case(
"nvptx64", llvm::Triple::nvptx64)
68 .Case(
"amdil", llvm::Triple::amdil)
69 .Case(
"spir", llvm::Triple::spir)
70 .Default(llvm::Triple::UnknownArch);
74 const ArgList &Args) {
75 const llvm::Triple::ArchType
Arch = getArchTypeForMachOArchName(Str);
76 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Str);
78 if (
Arch != llvm::Triple::UnknownArch)
81 if (ArchKind == llvm::ARM::ArchKind::ARMV6M ||
82 ArchKind == llvm::ARM::ArchKind::ARMV7M ||
83 ArchKind == llvm::ARM::ArchKind::ARMV7EM) {
85 if (
T.getOS() == llvm::Triple::IOS)
86 for (Arg *A : Args.filtered(options::OPT_mios_version_min_EQ))
87 A->ignoreTargetSpecific();
88 if (
T.getOS() == llvm::Triple::WatchOS)
89 for (Arg *A : Args.filtered(options::OPT_mwatchos_version_min_EQ))
90 A->ignoreTargetSpecific();
91 if (
T.getOS() == llvm::Triple::TvOS)
92 for (Arg *A : Args.filtered(options::OPT_mtvos_version_min_EQ))
93 A->ignoreTargetSpecific();
95 T.setOS(llvm::Triple::UnknownOS);
96 T.setObjectFormat(llvm::Triple::MachO);
104 const char *LinkingOutput)
const {
107 ArgStringList CmdArgs;
109 assert(Inputs.size() == 1 &&
"Unexpected number of inputs.");
113 const Action *SourceAction = &JA;
115 assert(!SourceAction->
getInputs().empty() &&
"unexpected root action!");
116 SourceAction = SourceAction->
getInputs()[0];
124 if (Args.hasArg(options::OPT_fno_integrated_as)) {
125 if (!(
T.isMacOSX() &&
T.isMacOSXVersionLT(10, 7)))
126 CmdArgs.push_back(
"-Q");
130 if (SourceAction->
getType() == types::TY_Asm ||
131 SourceAction->
getType() == types::TY_PP_Asm) {
132 if (Args.hasArg(options::OPT_gstabs))
133 CmdArgs.push_back(
"--gstabs");
134 else if (Args.hasArg(options::OPT_g_Group))
135 CmdArgs.push_back(
"-g");
142 if (
T.isX86() || Args.hasArg(options::OPT_force__cpusubtype__ALL))
143 CmdArgs.push_back(
"-force_cpusubtype_ALL");
146 (((Args.hasArg(options::OPT_mkernel) ||
147 Args.hasArg(options::OPT_fapple_kext)) &&
149 Args.hasArg(options::OPT_static)))
150 CmdArgs.push_back(
"-static");
152 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
154 assert(Output.
isFilename() &&
"Unexpected lipo output.");
155 CmdArgs.push_back(
"-o");
158 assert(Input.
isFilename() &&
"Invalid input.");
163 const char *Exec = Args.MakeArgString(
getToolChain().GetProgramPath(
"as"));
165 Exec, CmdArgs, Inputs, Output));
168void darwin::MachOTool::anchor() {}
171 ArgStringList &CmdArgs)
const {
175 CmdArgs.push_back(
"-arch");
176 CmdArgs.push_back(Args.MakeArgString(ArchName));
179 if (ArchName ==
"arm")
180 CmdArgs.push_back(
"-force_cpusubtype_ALL");
183bool darwin::Linker::NeedsTempPath(
const InputInfoList &Inputs)
const {
187 for (
const auto &Input : Inputs)
188 if (Input.getType() != types::TY_Object)
202 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
203 if (A->getOption().matches(options::OPT_O0))
205 if (A->getOption().matches(options::OPT_O))
206 return llvm::StringSwitch<bool>(A->getValue())
212 if (!IsLinkerOnlyAction)
217void darwin::Linker::AddLinkArgs(Compilation &
C,
const ArgList &Args,
218 ArgStringList &CmdArgs,
220 VersionTuple Version,
bool LinkerIsLLD,
221 bool UsePlatformVersion)
const {
222 const Driver &D = getToolChain().getDriver();
223 const toolchains::MachO &MachOTC = getMachOToolChain();
227 if ((Version >= VersionTuple(100) || LinkerIsLLD) &&
228 !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
229 CmdArgs.push_back(
"-demangle");
231 if (Args.hasArg(options::OPT_rdynamic) &&
232 (Version >= VersionTuple(137) || LinkerIsLLD))
233 CmdArgs.push_back(
"-export_dynamic");
237 if (Args.hasFlag(options::OPT_fapplication_extension,
238 options::OPT_fno_application_extension,
false))
239 CmdArgs.push_back(
"-application_extension");
241 if (D.
isUsingLTO() && (Version >= VersionTuple(116) || LinkerIsLLD) &&
242 NeedsTempPath(Inputs)) {
243 std::string TmpPathName;
254 if (!TmpPathName.empty()) {
255 auto *TmpPath =
C.getArgs().MakeArgString(TmpPathName);
256 C.addTempFile(TmpPath);
257 CmdArgs.push_back(
"-object_path_lto");
258 CmdArgs.push_back(TmpPath);
271 if (Version >= VersionTuple(133) && !LinkerIsLLD) {
273 StringRef P = llvm::sys::path::parent_path(D.
Dir);
274 SmallString<128> LibLTOPath(P);
275 llvm::sys::path::append(LibLTOPath,
"lib");
276 llvm::sys::path::append(LibLTOPath,
"libLTO.dylib");
277 CmdArgs.push_back(
"-lto_library");
278 CmdArgs.push_back(
C.getArgs().MakeArgString(LibLTOPath));
284 if (Version >= VersionTuple(262) &&
286 CmdArgs.push_back(
"-no_deduplicate");
289 Args.AddAllArgs(CmdArgs, options::OPT_static);
290 if (!Args.hasArg(options::OPT_static))
291 CmdArgs.push_back(
"-dynamic");
292 if (Args.hasArg(options::OPT_fgnu_runtime)) {
297 if (!Args.hasArg(options::OPT_dynamiclib)) {
298 AddMachOArch(Args, CmdArgs);
300 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
302 Args.AddLastArg(CmdArgs, options::OPT_bundle);
303 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
304 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
307 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
308 (A = Args.getLastArg(options::OPT_current__version)) ||
309 (A = Args.getLastArg(options::OPT_install__name)))
310 D.
Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
313 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
314 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
315 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
317 CmdArgs.push_back(
"-dylib");
320 if ((A = Args.getLastArg(options::OPT_bundle)) ||
321 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
322 (A = Args.getLastArg(options::OPT_client__name)) ||
323 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
324 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
325 (A = Args.getLastArg(options::OPT_private__bundle)))
326 D.
Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
329 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
330 "-dylib_compatibility_version");
331 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
332 "-dylib_current_version");
334 AddMachOArch(Args, CmdArgs);
336 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
337 "-dylib_install_name");
340 Args.AddLastArg(CmdArgs, options::OPT_all__load);
341 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
342 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
344 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
345 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
346 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
347 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
348 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
349 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
350 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
351 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
352 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
353 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
354 Args.AddAllArgs(CmdArgs, options::OPT_init);
357 if (Version >= VersionTuple(520) || LinkerIsLLD || UsePlatformVersion)
362 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
363 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
364 Args.AddLastArg(CmdArgs, options::OPT_single__module);
365 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
366 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
369 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
370 options::OPT_fno_pie, options::OPT_fno_PIE)) {
371 if (A->getOption().matches(options::OPT_fpie) ||
372 A->getOption().matches(options::OPT_fPIE))
373 CmdArgs.push_back(
"-pie");
375 CmdArgs.push_back(
"-no_pie");
379 if (
C.getDriver().embedBitcodeEnabled()) {
382 CmdArgs.push_back(
"-bitcode_bundle");
384 if (
C.getDriver().embedBitcodeMarkerOnly() &&
385 Version >= VersionTuple(278)) {
386 CmdArgs.push_back(
"-bitcode_process_mode");
387 CmdArgs.push_back(
"marker");
390 D.
Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
394 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
395 options::OPT_fno_global_isel)) {
396 if (A->getOption().matches(options::OPT_fglobal_isel)) {
397 CmdArgs.push_back(
"-mllvm");
398 CmdArgs.push_back(
"-global-isel");
400 CmdArgs.push_back(
"-mllvm");
401 CmdArgs.push_back(
"-global-isel-abort=0");
405 if (Args.hasArg(options::OPT_mkernel) ||
406 Args.hasArg(options::OPT_fapple_kext) ||
407 Args.hasArg(options::OPT_ffreestanding)) {
408 CmdArgs.push_back(
"-mllvm");
409 CmdArgs.push_back(
"-disable-atexit-based-global-dtor-lowering");
412 Args.AddLastArg(CmdArgs, options::OPT_prebind);
413 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
414 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
415 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
416 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
417 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
418 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
419 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
420 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
421 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
422 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
423 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
424 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
425 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
426 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
427 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
433 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
434 CmdArgs.push_back(
"-syslibroot");
435 CmdArgs.push_back(A->getValue());
436 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
437 CmdArgs.push_back(
"-syslibroot");
438 CmdArgs.push_back(A->getValue());
439 }
else if (StringRef sysroot =
C.getSysRoot(); sysroot !=
"") {
440 CmdArgs.push_back(
"-syslibroot");
441 CmdArgs.push_back(
C.getArgs().MakeArgString(sysroot));
444 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
445 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
446 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
447 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
448 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
449 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
450 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
451 Args.AddAllArgs(CmdArgs, options::OPT_y);
452 Args.AddLastArg(CmdArgs, options::OPT_w);
453 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
454 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
455 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
456 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
457 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
458 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
459 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
460 Args.AddLastArg(CmdArgs, options::OPT_why_load);
461 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
462 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
463 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
464 Args.AddLastArg(CmdArgs, options::OPT_Mach);
468 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
470 : CSPGOGenerateArg->getValue());
471 llvm::sys::path::append(Path,
"default_%m.profraw");
472 CmdArgs.push_back(
"--cs-profile-generate");
473 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
475 SmallString<128> Path(
476 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
477 if (Path.empty() || llvm::sys::fs::is_directory(Path))
478 llvm::sys::path::append(Path,
"default.profdata");
479 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
482 auto *CodeGenDataGenArg =
483 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
484 if (CodeGenDataGenArg)
486 Args.MakeArgString(Twine(
"--codegen-data-generate-path=") +
487 CodeGenDataGenArg->getValue()));
494 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
497 return Args.hasArg(options::OPT_fobjc_link_runtime);
501 const llvm::Triple &Triple) {
506 Args.getAllArgValues(options::OPT_arch).size() > 1;
507 bool hasExplicitOutputFile =
508 Args.getLastArg(options::OPT_foptimization_record_file_EQ);
510 D.
Diag(diag::err_drv_invalid_output_with_multiple_archs)
511 <<
"-foptimization-record-file";
518 const llvm::Triple &Triple,
520 StringRef Format =
"yaml";
521 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
522 Format = A->getValue();
524 CmdArgs.push_back(
"-mllvm");
525 CmdArgs.push_back(
"-lto-pass-remarks-output");
526 CmdArgs.push_back(
"-mllvm");
528 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
530 CmdArgs.push_back(A->getValue());
532 assert(Output.
isFilename() &&
"Unexpected ld output.");
538 CmdArgs.push_back(Args.MakeArgString(F));
542 Args.getLastArg(options::OPT_foptimization_record_passes_EQ)) {
543 CmdArgs.push_back(
"-mllvm");
545 std::string(
"-lto-pass-remarks-filter=") + A->getValue();
546 CmdArgs.push_back(Args.MakeArgString(Passes));
549 if (!Format.empty()) {
550 CmdArgs.push_back(
"-mllvm");
551 Twine FormatArg = Twine(
"-lto-pass-remarks-format=") + Format;
552 CmdArgs.push_back(Args.MakeArgString(FormatArg));
556 CmdArgs.push_back(
"-mllvm");
557 CmdArgs.push_back(
"-lto-pass-remarks-with-hotness");
560 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
561 CmdArgs.push_back(
"-mllvm");
563 std::string(
"-lto-pass-remarks-hotness-threshold=") + A->getValue();
564 CmdArgs.push_back(Args.MakeArgString(Opt));
573 const char *LinkingOutput)
const {
574 assert(Output.
getType() == types::TY_Image &&
"Invalid linker output type.");
580 llvm::opt::ArgStringList InputFileList;
585 ArgStringList CmdArgs;
591 Args.MakeArgString(
getToolChain().GetLinkerPath(&LinkerIsLLD));
594 bool UsePlatformVersion =
getToolChain().getTriple().isXROS();
598 AddLinkArgs(
C, Args, CmdArgs, Inputs, Version, LinkerIsLLD,
608 Args.getLastArg(options::OPT_moutline, options::OPT_mno_outline)) {
609 if (A->getOption().matches(options::OPT_moutline)) {
611 CmdArgs.push_back(
"-mllvm");
612 CmdArgs.push_back(
"-enable-machine-outliner");
618 CmdArgs.push_back(
"-mllvm");
619 CmdArgs.push_back(
"-enable-machine-outliner=never");
626 CmdArgs.push_back(
"-mllvm");
627 CmdArgs.push_back(
"-enable-linkonceodr-outlining");
630 auto *CodeGenDataGenArg =
631 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
632 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
636 if (CodeGenDataGenArg && CodeGenDataUseArg)
637 D.
Diag(diag::err_drv_argument_not_allowed_with)
638 << CodeGenDataGenArg->getAsString(Args)
639 << CodeGenDataUseArg->getAsString(Args);
643 if (CodeGenDataGenArg) {
644 CmdArgs.push_back(
"-mllvm");
645 CmdArgs.push_back(
"-codegen-data-generate");
649 if (CodeGenDataUseArg) {
650 CmdArgs.push_back(
"-mllvm");
651 CmdArgs.push_back(Args.MakeArgString(Twine(
"-codegen-data-use-path=") +
652 CodeGenDataUseArg->getValue()));
658 if (!StatsFile.empty()) {
659 CmdArgs.push_back(
"-mllvm");
660 CmdArgs.push_back(Args.MakeArgString(
"-lto-stats-file=" + StatsFile.str()));
665 Args.addAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
666 options::OPT_Z_Flag, options::OPT_u_Group});
671 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
672 CmdArgs.push_back(
"-ObjC");
674 CmdArgs.push_back(
"-o");
677 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
680 Args.AddAllArgs(CmdArgs, options::OPT_L);
685 for (
const auto &II : Inputs) {
686 if (!II.isFilename()) {
691 if (InputFileList.size() > 0)
697 InputFileList.push_back(II.getFilename());
703 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
704 getToolChain().addFortranRuntimeLibraryPath(Args, CmdArgs);
708 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
712 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
716 CmdArgs.push_back(
"-framework");
717 CmdArgs.push_back(
"Foundation");
719 CmdArgs.push_back(
"-lobjc");
723 CmdArgs.push_back(
"-arch_multiple");
724 CmdArgs.push_back(
"-final_output");
725 CmdArgs.push_back(LinkingOutput);
728 if (Args.hasArg(options::OPT_fnested_functions))
729 CmdArgs.push_back(
"-allow_stack_execute");
734 if (!Parallelism.empty()) {
735 CmdArgs.push_back(
"-mllvm");
736 unsigned NumThreads =
737 llvm::get_threadpool_strategy(Parallelism)->compute_thread_count();
738 CmdArgs.push_back(Args.MakeArgString(
"-threads=" + Twine(NumThreads)));
744 bool NoStdOrDefaultLibs =
745 Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
746 bool ForceLinkBuiltins = Args.hasArg(options::OPT_fapple_link_rtlib);
747 if (!NoStdOrDefaultLibs || ForceLinkBuiltins) {
752 if (NoStdOrDefaultLibs && ForceLinkBuiltins) {
760 Args.ClaimAllArgs(options::OPT_pthread);
761 Args.ClaimAllArgs(options::OPT_pthreads);
765 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
769 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
770 Args.AddAllArgs(CmdArgs, options::OPT_F);
773 for (
const Arg *A : Args.filtered(options::OPT_iframework))
774 CmdArgs.push_back(Args.MakeArgString(std::string(
"-F") + A->getValue()));
776 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
777 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
778 if (A->getValue() == StringRef(
"Accelerate")) {
779 CmdArgs.push_back(
"-framework");
780 CmdArgs.push_back(
"Accelerate");
789 bool NonStandardSearchPath =
false;
791 if (Triple.isDriverKit()) {
793 NonStandardSearchPath =
794 Version.getMajor() < 605 ||
795 (Version.getMajor() == 605 && Version.getMinor().value_or(0) < 1);
800 if (NonStandardSearchPath) {
801 if (
auto *Sysroot = Args.getLastArg(options::OPT_isysroot)) {
802 auto AddSearchPath = [&](StringRef Flag, StringRef SearchPath) {
805 llvm::sys::path::append(P, SearchPath);
807 CmdArgs.push_back(Args.MakeArgString(Flag + P));
810 AddSearchPath(
"-L",
"/usr/lib");
811 AddSearchPath(
"-F",
"/System/Library/Frameworks");
817 if (Version >= VersionTuple(705) || LinkerIsLLD) {
825 std::unique_ptr<Command> Cmd = std::make_unique<Command>(
826 JA, *
this, ResponseSupport, Exec, CmdArgs, Inputs, Output);
827 Cmd->setInputFileList(std::move(InputFileList));
828 C.addCommand(std::move(Cmd));
835 const char *LinkingOutput)
const {
839 Args.ClaimAllArgs(options::OPT_g_Group);
841 Args.ClaimAllArgs(options::OPT_emit_llvm);
844 Args.ClaimAllArgs(options::OPT_w);
846 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
849 ArgStringList CmdArgs;
851 CmdArgs.push_back(
"-static");
852 CmdArgs.push_back(
"-D");
853 CmdArgs.push_back(
"-no_warning_for_no_symbols");
854 CmdArgs.push_back(
"-o");
857 for (
const auto &II : Inputs) {
858 if (II.isFilename()) {
859 CmdArgs.push_back(II.getFilename());
866 if (Output.
isFilename() && llvm::sys::fs::exists(OutputFileName)) {
867 if (std::error_code EC = llvm::sys::fs::remove(OutputFileName)) {
868 D.
Diag(diag::err_drv_unable_to_remove_file) << EC.message();
873 const char *Exec = Args.MakeArgString(
getToolChain().GetStaticLibToolPath());
874 C.addCommand(std::make_unique<Command>(JA, *
this,
876 Exec, CmdArgs, Inputs, Output));
883 const char *LinkingOutput)
const {
884 ArgStringList CmdArgs;
886 CmdArgs.push_back(
"-create");
887 assert(Output.
isFilename() &&
"Unexpected lipo output.");
889 CmdArgs.push_back(
"-output");
892 for (
const auto &II : Inputs) {
893 assert(II.isFilename() &&
"Unexpected lipo input.");
894 CmdArgs.push_back(II.getFilename());
897 StringRef LipoName = Args.getLastArgValue(options::OPT_fuse_lipo_EQ,
"lipo");
899 Args.MakeArgString(
getToolChain().GetProgramPath(LipoName.data()));
901 Exec, CmdArgs, Inputs, Output));
908 const char *LinkingOutput)
const {
909 ArgStringList CmdArgs;
911 CmdArgs.push_back(
"-o");
914 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
916 assert(Input.
isFilename() &&
"Unexpected dsymutil input.");
920 Args.MakeArgString(
getToolChain().GetProgramPath(
"dsymutil"));
922 Exec, CmdArgs, Inputs, Output));
929 const char *LinkingOutput)
const {
930 ArgStringList CmdArgs;
931 CmdArgs.push_back(
"--verify");
932 CmdArgs.push_back(
"--debug-info");
933 CmdArgs.push_back(
"--eh-frame");
934 CmdArgs.push_back(
"--quiet");
936 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
938 assert(Input.
isFilename() &&
"Unexpected verify input");
944 Args.MakeArgString(
getToolChain().GetProgramPath(
"dwarfdump"));
946 Exec, CmdArgs, Inputs, Output));
968 if (Ty == types::TY_PP_Asm)
969 return types::TY_Asm;
989 auto T = llvm::Triple(Twine(
"arm64-apple-") +
990 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
1012 ArgStringList &CC1Args)
const {
1017 ArgStringList &CC1Args)
const {
1022 ArgStringList &CC1Args)
const {
1031 return llvm::StringSwitch<const char *>(
Arch)
1032 .Case(
"armv6k",
"armv6")
1033 .Case(
"armv6m",
"armv6m")
1034 .Case(
"armv5tej",
"armv5")
1035 .Case(
"xscale",
"xscale")
1036 .Case(
"armv4t",
"armv4t")
1037 .Case(
"armv7",
"armv7")
1038 .Cases({
"armv7a",
"armv7-a"},
"armv7")
1039 .Cases({
"armv7r",
"armv7-r"},
"armv7")
1040 .Cases({
"armv7em",
"armv7e-m"},
"armv7em")
1041 .Cases({
"armv7k",
"armv7-k"},
"armv7k")
1042 .Cases({
"armv7m",
"armv7-m"},
"armv7m")
1043 .Cases({
"armv7s",
"armv7-s"},
"armv7s")
1048 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseCPUArch(CPU);
1049 if (ArchKind == llvm::ARM::ArchKind::INVALID)
1051 StringRef
Arch = llvm::ARM::getArchName(ArchKind);
1055 if (
Arch.starts_with(
"armv5"))
1058 else if (
Arch.starts_with(
"armv6") && !
Arch.ends_with(
"6m"))
1061 else if (
Arch.ends_with(
"v7a"))
1071 case llvm::Triple::aarch64_32:
1074 case llvm::Triple::aarch64: {
1080 case llvm::Triple::thumb:
1081 case llvm::Triple::arm:
1082 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1086 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1095 if (LinkerVersion) {
1097 VersionTuple NewLinkerVersion;
1098 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ))
1099 (void)NewLinkerVersion.tryParse(A->getValue());
1100 assert(NewLinkerVersion == LinkerVersion);
1102 return *LinkerVersion;
1105 VersionTuple NewLinkerVersion;
1106 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ))
1107 if (NewLinkerVersion.tryParse(A->getValue()))
1109 << A->getAsString(Args);
1111 LinkerVersion = NewLinkerVersion;
1112 return *LinkerVersion;
1128 return Triple.getTriple();
1140 Str += llvm::Triple::getOSTypeName(llvm::Triple::XROS);
1144 Triple.setOSName(Str);
1146 return Triple.getTriple();
1158 return Dsymutil.get();
1162 return VerifyDebug.get();
1179 const ArgList &Args)
1180 :
Darwin(D, Triple, Args) {}
1184 CC1Args.push_back(
"-Wundef-prefix=TARGET_OS_");
1185 CC1Args.push_back(
"-Werror=undef-prefix");
1191 CC1Args.push_back(
"-Wdeprecated-objc-isa-usage");
1192 CC1Args.push_back(
"-Werror=deprecated-objc-isa-usage");
1197 CC1Args.push_back(
"-Werror=implicit-function-declaration");
1202 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
1212 static constexpr llvm::StringLiteral XcodeAppSuffix(
1213 ".app/Contents/Developer");
1214 size_t Index = PathIntoXcode.find(XcodeAppSuffix);
1215 if (Index == StringRef::npos)
1217 return PathIntoXcode.take_front(Index + XcodeAppSuffix.size());
1221 ArgStringList &CmdArgs)
const {
1240 llvm::sys::path::remove_filename(P);
1241 llvm::sys::path::remove_filename(P);
1242 llvm::sys::path::append(P,
"lib",
"arc");
1248 if (!
getVFS().exists(P)) {
1249 auto updatePath = [&](
const Arg *A) {
1253 if (XcodePathForSDK.empty())
1256 P = XcodePathForSDK;
1257 llvm::sys::path::append(P,
"Toolchains/XcodeDefault.xctoolchain/usr",
1259 return getVFS().exists(P);
1262 bool updated =
false;
1263 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot))
1264 updated = updatePath(A);
1267 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1272 CmdArgs.push_back(
"-force_load");
1273 llvm::sys::path::append(P,
"libarclite_");
1276 P +=
"watchsimulator";
1280 P +=
"appletvsimulator";
1284 P +=
"iphonesimulator";
1292 getDriver().
Diag(clang::diag::err_drv_darwin_sdk_missing_arclite) << P;
1294 CmdArgs.push_back(Args.MakeArgString(P));
1316 bool IsShared)
const {
1324 const char *LibArg = Args.MakeArgString(P);
1325 CmdArgs.push_back(LibArg);
1333 assert(StringRef(P).ends_with(
".dylib") &&
"must be a dynamic library");
1337 CmdArgs.push_back(
"-rpath");
1338 CmdArgs.push_back(
"@executable_path");
1342 CmdArgs.push_back(
"-rpath");
1343 CmdArgs.push_back(Args.MakeArgString(llvm::sys::path::parent_path(P)));
1350 "it doesn't make sense to ask for the compiler-rt library name as an "
1354 if (Component !=
"builtins") {
1355 MachOLibName +=
'.';
1356 MachOLibName += Component;
1361 llvm::sys::path::append(FullPath,
"lib",
"darwin",
"macho_embedded",
1363 return std::string(FullPath);
1369 "it doesn't make sense to ask for the compiler-rt library name as an "
1373 if (Component !=
"builtins") {
1374 DarwinLibName += Component;
1375 DarwinLibName +=
'_';
1381 llvm::sys::path::append(FullPath,
"lib",
"darwin", DarwinLibName);
1382 return std::string(FullPath);
1402 llvm_unreachable(
"Unsupported platform");
1407 auto BeginSDK = llvm::sys::path::rbegin(isysroot);
1408 auto EndSDK = llvm::sys::path::rend(isysroot);
1409 for (
auto IT = BeginSDK; IT != EndSDK; ++IT) {
1410 StringRef SDK = *IT;
1411 if (SDK.consume_back(
".sdk"))
1438 llvm_unreachable(
"Unsupported platform");
1443 for (Arg *A : Args) {
1444 if (A->getOption().matches(options::OPT_exported__symbols__list))
1446 if (!A->getOption().matches(options::OPT_Wl_COMMA) &&
1447 !A->getOption().matches(options::OPT_Xlinker))
1449 if (A->containsValue(
"-exported_symbols_list") ||
1450 A->containsValue(
"-exported_symbol"))
1458 CmdArgs.push_back(
"-exported_symbol");
1459 CmdArgs.push_back(Symbol);
1469 StringRef Segment, StringRef Section) {
1470 for (
const char *A : {
"-sectalign", Args.MakeArgString(Segment),
1471 Args.MakeArgString(Section),
"0x4000"})
1472 CmdArgs.push_back(A);
1476 ArgStringList &CmdArgs)
const {
1505 for (
auto IPSK : {llvm::IPSK_cnts, llvm::IPSK_bitmap, llvm::IPSK_data}) {
1507 Args, CmdArgs,
"__DATA",
1508 llvm::getInstrProfSectionName(IPSK, llvm::Triple::MachO,
1514void DarwinClang::AddLinkSanitizerLibArgs(
const ArgList &Args,
1515 ArgStringList &CmdArgs,
1516 StringRef Sanitizer,
1517 bool Shared)
const {
1523 const ArgList &Args)
const {
1524 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
1525 StringRef
Value = A->getValue();
1526 if (
Value !=
"compiler-rt" &&
Value !=
"platform")
1527 getDriver().
Diag(clang::diag::err_drv_unsupported_rtlib_for_platform)
1528 <<
Value <<
"darwin";
1535 ArgStringList &CmdArgs,
1536 bool ForceLinkBuiltinRT)
const {
1542 if (Args.hasArg(options::OPT_static) ||
1543 Args.hasArg(options::OPT_fapple_kext) ||
1544 Args.hasArg(options::OPT_mkernel)) {
1545 if (ForceLinkBuiltinRT)
1553 if (
const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
1554 getDriver().
Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
1561 const char *sanitizer =
nullptr;
1563 sanitizer =
"UndefinedBehaviorSanitizer";
1565 sanitizer =
"RealtimeSanitizer";
1567 sanitizer =
"AddressSanitizer";
1569 sanitizer =
"ThreadSanitizer";
1572 getDriver().
Diag(diag::err_drv_unsupported_static_sanitizer_darwin)
1581 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan_abi",
false);
1584 "Static sanitizer runtimes not supported");
1585 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan");
1590 "Static sanitizer runtimes not supported");
1591 AddLinkSanitizerLibArgs(Args, CmdArgs,
"rtsan");
1594 AddLinkSanitizerLibArgs(Args, CmdArgs,
"lsan");
1597 "Static sanitizer runtimes not supported");
1598 AddLinkSanitizerLibArgs(
1604 "Static sanitizer runtimes not supported");
1605 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tsan");
1608 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tysan");
1609 if (Sanitize.
needsFuzzer() && !Args.hasArg(options::OPT_dynamiclib)) {
1610 AddLinkSanitizerLibArgs(Args, CmdArgs,
"fuzzer",
false);
1622 AddLinkSanitizerLibArgs(Args, CmdArgs,
"stats");
1630 llvm::memprof::getMemprofOptionsSymbolDarwinLinkageName().data());
1640 CmdArgs.push_back(
"-framework");
1641 CmdArgs.push_back(
"DriverKit");
1647 CmdArgs.push_back(
"-lSystem");
1659 CmdArgs.push_back(
"-lgcc_s.1");
1668 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
1669 if (!SystemTriple.isMacOSX())
1670 return std::string(MacOSSDKVersion);
1671 VersionTuple SystemVersion;
1672 SystemTriple.getMacOSXVersion(SystemVersion);
1674 unsigned Major, Minor, Micro;
1678 return std::string(MacOSSDKVersion);
1679 VersionTuple SDKVersion(Major, Minor, Micro);
1681 if (SDKVersion > SystemVersion)
1682 return SystemVersion.getAsString();
1683 return std::string(MacOSSDKVersion);
1690struct DarwinPlatform {
1699 DeploymentTargetEnv,
1709 DarwinPlatformKind getPlatform()
const {
return Platform; }
1711 DarwinEnvironmentKind getEnvironment()
const {
return Environment; }
1713 void setEnvironment(DarwinEnvironmentKind Kind) {
1715 InferSimulatorFromArch =
false;
1718 const VersionTuple getOSVersion()
const {
1719 return UnderlyingOSVersion.value_or(VersionTuple());
1722 VersionTuple takeOSVersion() {
1723 assert(UnderlyingOSVersion.has_value() &&
1724 "attempting to get an unset OS version");
1725 VersionTuple
Result = *UnderlyingOSVersion;
1726 UnderlyingOSVersion.reset();
1729 bool isValidOSVersion()
const {
1730 return llvm::Triple::isValidVersionForOS(getOSFromPlatform(Platform),
1734 VersionTuple getCanonicalOSVersion()
const {
1735 return llvm::Triple::getCanonicalVersionForOS(
1736 getOSFromPlatform(Platform), getOSVersion(),
true);
1739 void setOSVersion(
const VersionTuple &Version) {
1740 UnderlyingOSVersion = Version;
1743 bool hasOSVersion()
const {
return UnderlyingOSVersion.has_value(); }
1745 VersionTuple getZipperedOSVersion()
const {
1746 assert(Environment == DarwinEnvironmentKind::MacCatalyst &&
1747 "zippered target version is specified only for Mac Catalyst");
1748 return ZipperedOSVersion;
1752 bool isExplicitlySpecified()
const {
return Kind <= DeploymentTargetEnv; }
1755 bool canInferSimulatorFromArch()
const {
return InferSimulatorFromArch; }
1757 const std::optional<llvm::Triple> &getTargetVariantTriple()
const {
1758 return TargetVariantTriple;
1762 void addOSVersionMinArgument(DerivedArgList &Args,
const OptTable &Opts) {
1766 assert(Kind != TargetArg && Kind != MTargetOSArg && Kind != OSVersionArg &&
1770 case DarwinPlatformKind::MacOS:
1771 Opt = options::OPT_mmacos_version_min_EQ;
1773 case DarwinPlatformKind::IPhoneOS:
1774 Opt = options::OPT_mios_version_min_EQ;
1776 case DarwinPlatformKind::TvOS:
1777 Opt = options::OPT_mtvos_version_min_EQ;
1779 case DarwinPlatformKind::WatchOS:
1780 Opt = options::OPT_mwatchos_version_min_EQ;
1782 case DarwinPlatformKind::XROS:
1785 case DarwinPlatformKind::DriverKit:
1789 Arg = Args.MakeJoinedArg(
nullptr, Opts.getOption(Opt), OSVersionStr);
1795 std::string
getAsString(DerivedArgList &Args,
const OptTable &Opts) {
1801 assert(Arg &&
"OS version argument not yet inferred");
1802 return Arg->getAsString(Args);
1803 case DeploymentTargetEnv:
1804 return (llvm::Twine(EnvVarName) +
"=" + OSVersionStr).str();
1805 case InferredFromSDK:
1806 case InferredFromArch:
1807 llvm_unreachable(
"Cannot print arguments for inferred OS version");
1809 llvm_unreachable(
"Unsupported Darwin Source Kind");
1813 std::string getInferredSource() {
1814 assert(!isExplicitlySpecified() &&
"OS version was not inferred");
1815 return InferredSource.str();
1818 void setEnvironment(llvm::Triple::EnvironmentType EnvType,
1819 const VersionTuple &OSVersion,
1820 const std::optional<DarwinSDKInfo> &SDKInfo) {
1822 case llvm::Triple::Simulator:
1823 Environment = DarwinEnvironmentKind::Simulator;
1825 case llvm::Triple::MacABI: {
1826 Environment = DarwinEnvironmentKind::MacCatalyst;
1828 ZipperedOSVersion = VersionTuple(10, 15);
1829 if (hasOSVersion() && SDKInfo) {
1830 if (
const auto *MacCatalystToMacOSMapping = SDKInfo->getVersionMapping(
1832 if (
auto MacOSVersion = MacCatalystToMacOSMapping->map(
1833 OSVersion, ZipperedOSVersion, std::nullopt)) {
1834 ZipperedOSVersion = *MacOSVersion;
1841 if (TargetVariantTriple) {
1842 auto TargetVariantVersion = TargetVariantTriple->getOSVersion();
1843 if (TargetVariantVersion.getMajor()) {
1844 if (TargetVariantVersion < ZipperedOSVersion)
1845 ZipperedOSVersion = TargetVariantVersion;
1855 static DarwinPlatform
1856 createFromTarget(
const llvm::Triple &TT, Arg *A,
1857 std::optional<llvm::Triple> TargetVariantTriple,
1858 const std::optional<DarwinSDKInfo> &SDKInfo) {
1859 DarwinPlatform
Result(TargetArg, getPlatformFromOS(TT.getOS()),
1860 TT.getOSVersion(), A);
1861 VersionTuple OsVersion = TT.getOSVersion();
1862 Result.TargetVariantTriple = TargetVariantTriple;
1863 Result.setEnvironment(TT.getEnvironment(), OsVersion, SDKInfo);
1866 static DarwinPlatform
1867 createFromMTargetOS(llvm::Triple::OSType OS, VersionTuple OSVersion,
1868 llvm::Triple::EnvironmentType Environment, Arg *A,
1869 const std::optional<DarwinSDKInfo> &SDKInfo) {
1870 DarwinPlatform
Result(MTargetOSArg, getPlatformFromOS(OS), OSVersion, A);
1871 Result.InferSimulatorFromArch =
false;
1872 Result.setEnvironment(Environment, OSVersion, SDKInfo);
1875 static DarwinPlatform createOSVersionArg(DarwinPlatformKind Platform, Arg *A,
1877 DarwinPlatform
Result{OSVersionArg, Platform,
1878 getVersionFromString(A->getValue()), A};
1880 Result.Environment = DarwinEnvironmentKind::Simulator;
1883 static DarwinPlatform createDeploymentTargetEnv(DarwinPlatformKind Platform,
1884 StringRef EnvVarName,
1885 StringRef OSVersion) {
1886 DarwinPlatform
Result(DeploymentTargetEnv, Platform,
1887 getVersionFromString(OSVersion));
1888 Result.EnvVarName = EnvVarName;
1891 static DarwinPlatform createFromSDK(StringRef SDKRoot,
1892 DarwinPlatformKind Platform,
1894 bool IsSimulator =
false) {
1895 DarwinPlatform
Result(InferredFromSDK, Platform,
1896 getVersionFromString(
Value));
1898 Result.Environment = DarwinEnvironmentKind::Simulator;
1899 Result.InferSimulatorFromArch =
false;
1900 Result.InferredSource = SDKRoot;
1903 static DarwinPlatform createFromArch(StringRef
Arch, llvm::Triple::OSType OS,
1904 VersionTuple Version) {
1906 DarwinPlatform(InferredFromArch, getPlatformFromOS(OS), Version);
1914 DarwinSDKInfo inferSDKInfo() {
1915 assert(Kind == InferredFromSDK &&
"can infer SDK info only");
1916 llvm::Triple::OSType
OS = getOSFromPlatform(Platform);
1917 StringRef PlatformPrefix =
1918 (Platform == DarwinPlatformKind::DriverKit) ?
"/System/DriverKit" :
"";
1919 return DarwinSDKInfo(
1921 VersionTuple(getOSVersion().getMajor(), 0, 99),
1922 {DarwinSDKInfo::SDKPlatformInfo(llvm::Triple::Apple, OS,
1923 llvm::Triple::UnknownEnvironment,
1924 llvm::Triple::MachO, PlatformPrefix)});
1928 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform, Arg *Argument)
1930 Arguments({Argument, VersionTuple().getAsString()}) {}
1931 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform,
1932 VersionTuple
Value, Arg *Argument =
nullptr)
1936 UnderlyingOSVersion =
Value;
1939 static VersionTuple getVersionFromString(
const StringRef Input) {
1940 llvm::VersionTuple Version;
1941 bool IsValid = !Version.tryParse(Input);
1942 assert(IsValid &&
"unable to convert input version to version tuple");
1947 static DarwinPlatformKind getPlatformFromOS(llvm::Triple::OSType OS) {
1949 case llvm::Triple::Darwin:
1950 case llvm::Triple::MacOSX:
1951 return DarwinPlatformKind::MacOS;
1952 case llvm::Triple::IOS:
1953 return DarwinPlatformKind::IPhoneOS;
1954 case llvm::Triple::TvOS:
1955 return DarwinPlatformKind::TvOS;
1956 case llvm::Triple::WatchOS:
1957 return DarwinPlatformKind::WatchOS;
1958 case llvm::Triple::XROS:
1959 return DarwinPlatformKind::XROS;
1960 case llvm::Triple::DriverKit:
1961 return DarwinPlatformKind::DriverKit;
1963 llvm_unreachable(
"Unable to infer Darwin variant");
1967 static llvm::Triple::OSType getOSFromPlatform(DarwinPlatformKind Platform) {
1969 case DarwinPlatformKind::MacOS:
1970 return llvm::Triple::MacOSX;
1971 case DarwinPlatformKind::IPhoneOS:
1972 return llvm::Triple::IOS;
1973 case DarwinPlatformKind::TvOS:
1974 return llvm::Triple::TvOS;
1975 case DarwinPlatformKind::WatchOS:
1976 return llvm::Triple::WatchOS;
1977 case DarwinPlatformKind::DriverKit:
1978 return llvm::Triple::DriverKit;
1979 case DarwinPlatformKind::XROS:
1980 return llvm::Triple::XROS;
1982 llvm_unreachable(
"Unknown DarwinPlatformKind enum");
1986 DarwinPlatformKind Platform;
1987 DarwinEnvironmentKind Environment = DarwinEnvironmentKind::NativeEnvironment;
1991 VersionTuple ZipperedOSVersion;
1996 std::optional<VersionTuple> UnderlyingOSVersion;
1997 bool InferSimulatorFromArch =
true;
1998 std::pair<Arg *, std::string>
Arguments;
1999 StringRef EnvVarName;
2002 StringRef InferredSource;
2005 std::optional<llvm::Triple> TargetVariantTriple;
2010std::optional<DarwinPlatform>
2011getDeploymentTargetFromOSVersionArg(DerivedArgList &Args,
2012 const Driver &TheDriver) {
2013 Arg *macOSVersion = Args.getLastArg(options::OPT_mmacos_version_min_EQ);
2014 Arg *iOSVersion = Args.getLastArg(options::OPT_mios_version_min_EQ,
2015 options::OPT_mios_simulator_version_min_EQ);
2017 Args.getLastArg(options::OPT_mtvos_version_min_EQ,
2018 options::OPT_mtvos_simulator_version_min_EQ);
2019 Arg *WatchOSVersion =
2020 Args.getLastArg(options::OPT_mwatchos_version_min_EQ,
2021 options::OPT_mwatchos_simulator_version_min_EQ);
2023 auto GetDarwinPlatform =
2024 [&](DarwinPlatform::DarwinPlatformKind Platform, Arg *VersionArg,
2025 bool IsSimulator) -> std::optional<DarwinPlatform> {
2026 if (StringRef(VersionArg->getValue()).empty()) {
2027 TheDriver.
Diag(diag::err_drv_missing_version_number)
2028 << VersionArg->getAsString(Args);
2029 return std::nullopt;
2031 return DarwinPlatform::createOSVersionArg(Platform, VersionArg,
2036 if (iOSVersion || TvOSVersion || WatchOSVersion) {
2037 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2038 << macOSVersion->getAsString(Args)
2039 << (iOSVersion ? iOSVersion
2040 : TvOSVersion ? TvOSVersion : WatchOSVersion)
2046 }
else if (iOSVersion) {
2047 if (TvOSVersion || WatchOSVersion) {
2048 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2049 << iOSVersion->getAsString(Args)
2050 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->
getAsString(Args);
2053 iOSVersion->getOption().getID() ==
2054 options::OPT_mios_simulator_version_min_EQ);
2055 }
else if (TvOSVersion) {
2056 if (WatchOSVersion) {
2057 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2058 << TvOSVersion->getAsString(Args)
2059 << WatchOSVersion->getAsString(Args);
2062 TvOSVersion->getOption().getID() ==
2063 options::OPT_mtvos_simulator_version_min_EQ);
2064 }
else if (WatchOSVersion)
2065 return GetDarwinPlatform(
2067 WatchOSVersion->getOption().getID() ==
2068 options::OPT_mwatchos_simulator_version_min_EQ);
2069 return std::nullopt;
2074std::optional<DarwinPlatform>
2075getDeploymentTargetFromEnvironmentVariables(
const Driver &TheDriver,
2076 const llvm::Triple &Triple) {
2078 const char *EnvVars[] = {
2079 "MACOSX_DEPLOYMENT_TARGET",
2080 "IPHONEOS_DEPLOYMENT_TARGET",
2081 "TVOS_DEPLOYMENT_TARGET",
2082 "WATCHOS_DEPLOYMENT_TARGET",
2083 "DRIVERKIT_DEPLOYMENT_TARGET",
2084 "XROS_DEPLOYMENT_TARGET"
2087 "Missing platform");
2088 for (
const auto &I : llvm::enumerate(llvm::ArrayRef(EnvVars))) {
2089 if (
char *Env = ::getenv(I.value()))
2090 Targets[I.index()] = Env;
2099 if (Triple.getArch() == llvm::Triple::arm ||
2100 Triple.getArch() == llvm::Triple::aarch64 ||
2101 Triple.getArch() == llvm::Triple::thumb)
2108 unsigned FirstTarget = std::size(Targets);
2109 for (
unsigned I = 0; I != std::size(Targets); ++I) {
2110 if (Targets[I].empty())
2112 if (FirstTarget == std::size(Targets))
2115 TheDriver.
Diag(diag::err_drv_conflicting_deployment_targets)
2116 << Targets[FirstTarget] << Targets[I];
2120 for (
const auto &
Target : llvm::enumerate(llvm::ArrayRef(Targets))) {
2121 if (!
Target.value().empty())
2122 return DarwinPlatform::createDeploymentTargetEnv(
2126 return std::nullopt;
2131static StringRef dropSDKNamePrefix(StringRef SDKName) {
2132 size_t PrefixPos = SDKName.find(
'.');
2133 if (PrefixPos == StringRef::npos)
2135 return SDKName.substr(PrefixPos + 1);
2141std::optional<DarwinPlatform>
2142inferDeploymentTargetFromSDK(DerivedArgList &Args,
2143 const std::optional<DarwinSDKInfo> &SDKInfo) {
2144 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2146 return std::nullopt;
2147 StringRef isysroot = A->getValue();
2150 return std::nullopt;
2152 std::string Version;
2155 Version = SDKInfo->getVersion().getAsString();
2159 size_t StartVer = SDK.find_first_of(
"0123456789");
2160 size_t EndVer = SDK.find_last_of(
"0123456789");
2161 if (StartVer != StringRef::npos && EndVer > StartVer)
2162 Version = std::string(SDK.slice(StartVer, EndVer + 1));
2164 if (Version.empty())
2165 return std::nullopt;
2167 auto CreatePlatformFromSDKName =
2168 [&](StringRef SDK) -> std::optional<DarwinPlatform> {
2169 if (SDK.starts_with(
"iPhoneOS") || SDK.starts_with(
"iPhoneSimulator"))
2170 return DarwinPlatform::createFromSDK(
2172 SDK.starts_with(
"iPhoneSimulator"));
2173 else if (SDK.starts_with(
"MacOSX"))
2174 return DarwinPlatform::createFromSDK(isysroot,
Darwin::MacOS,
2176 else if (SDK.starts_with(
"WatchOS") || SDK.starts_with(
"WatchSimulator"))
2177 return DarwinPlatform::createFromSDK(
2179 SDK.starts_with(
"WatchSimulator"));
2180 else if (SDK.starts_with(
"AppleTVOS") ||
2181 SDK.starts_with(
"AppleTVSimulator"))
2182 return DarwinPlatform::createFromSDK(
2184 SDK.starts_with(
"AppleTVSimulator"));
2185 else if (SDK.starts_with(
"XR"))
2186 return DarwinPlatform::createFromSDK(
2188 SDK.contains(
"Simulator"));
2189 else if (SDK.starts_with(
"DriverKit"))
2192 return std::nullopt;
2194 if (
auto Result = CreatePlatformFromSDKName(SDK))
2197 return CreatePlatformFromSDKName(dropSDKNamePrefix(SDK));
2200VersionTuple getInferredOSVersion(llvm::Triple::OSType OS,
2201 const llvm::Triple &Triple,
2202 const Driver &TheDriver) {
2203 VersionTuple OsVersion;
2204 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
2206 case llvm::Triple::Darwin:
2207 case llvm::Triple::MacOSX:
2210 if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
2211 !Triple.getOSMajorVersion())
2212 SystemTriple.getMacOSXVersion(OsVersion);
2213 else if (!Triple.getMacOSXVersion(OsVersion))
2214 TheDriver.
Diag(diag::err_drv_invalid_darwin_version)
2215 << Triple.getOSName();
2217 case llvm::Triple::IOS:
2218 if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
2219 OsVersion = VersionTuple(13, 1);
2221 OsVersion = Triple.getiOSVersion();
2223 case llvm::Triple::TvOS:
2224 OsVersion = Triple.getOSVersion();
2226 case llvm::Triple::WatchOS:
2227 OsVersion = Triple.getWatchOSVersion();
2229 case llvm::Triple::XROS:
2230 OsVersion = Triple.getOSVersion();
2231 if (!OsVersion.getMajor())
2232 OsVersion = OsVersion.withMajorReplaced(1);
2234 case llvm::Triple::DriverKit:
2235 OsVersion = Triple.getDriverKitVersion();
2238 llvm_unreachable(
"Unexpected OS type");
2245std::optional<DarwinPlatform>
2246inferDeploymentTargetFromArch(DerivedArgList &Args,
const Darwin &Toolchain,
2247 const llvm::Triple &Triple,
2248 const Driver &TheDriver) {
2249 llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS;
2252 if (MachOArchName ==
"arm64" || MachOArchName ==
"arm64e")
2253 OSTy = llvm::Triple::MacOSX;
2254 else if (MachOArchName ==
"armv7" || MachOArchName ==
"armv7s" ||
2255 MachOArchName ==
"armv6")
2256 OSTy = llvm::Triple::IOS;
2257 else if (MachOArchName ==
"armv7k" || MachOArchName ==
"arm64_32")
2258 OSTy = llvm::Triple::WatchOS;
2259 else if (MachOArchName !=
"armv6m" && MachOArchName !=
"armv7m" &&
2260 MachOArchName !=
"armv7em")
2261 OSTy = llvm::Triple::MacOSX;
2262 if (OSTy == llvm::Triple::UnknownOS)
2263 return std::nullopt;
2264 return DarwinPlatform::createFromArch(
2265 MachOArchName, OSTy, getInferredOSVersion(OSTy, Triple, TheDriver));
2269std::optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
2270 DerivedArgList &Args,
const llvm::Triple &Triple,
const Driver &TheDriver,
2271 const std::optional<DarwinSDKInfo> &SDKInfo) {
2272 if (!Args.hasArg(options::OPT_target))
2273 return std::nullopt;
2274 if (Triple.getOS() == llvm::Triple::Darwin ||
2275 Triple.getOS() == llvm::Triple::UnknownOS)
2276 return std::nullopt;
2277 std::optional<llvm::Triple> TargetVariantTriple;
2278 for (
const Arg *A : Args.filtered(options::OPT_darwin_target_variant)) {
2279 llvm::Triple TVT(A->getValue());
2281 if ((Triple.getArch() == llvm::Triple::aarch64 ||
2282 TVT.getArchName() == Triple.getArchName()) &&
2283 TVT.getArch() == Triple.getArch() &&
2284 TVT.getSubArch() == Triple.getSubArch() &&
2285 TVT.getVendor() == Triple.getVendor()) {
2286 if (TargetVariantTriple)
2291 if ((Triple.isMacOSX() && TVT.getOS() == llvm::Triple::IOS &&
2292 TVT.isMacCatalystEnvironment()) ||
2293 (TVT.isMacOSX() && Triple.getOS() == llvm::Triple::IOS &&
2294 Triple.isMacCatalystEnvironment())) {
2295 TargetVariantTriple = TVT;
2298 TheDriver.
Diag(diag::err_drv_target_variant_invalid)
2299 << A->getSpelling() << A->getValue();
2302 DarwinPlatform PlatformAndVersion = DarwinPlatform::createFromTarget(
2303 Triple, Args.getLastArg(options::OPT_target), TargetVariantTriple,
2306 return PlatformAndVersion;
2310std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2311 DerivedArgList &Args,
const Driver &TheDriver,
2312 const std::optional<DarwinSDKInfo> &SDKInfo) {
2313 auto *A = Args.getLastArg(options::OPT_mtargetos_EQ);
2315 return std::nullopt;
2316 llvm::Triple TT(llvm::Twine(
"unknown-apple-") + A->getValue());
2317 switch (TT.getOS()) {
2318 case llvm::Triple::MacOSX:
2319 case llvm::Triple::IOS:
2320 case llvm::Triple::TvOS:
2321 case llvm::Triple::WatchOS:
2322 case llvm::Triple::XROS:
2325 TheDriver.
Diag(diag::err_drv_invalid_os_in_arg)
2326 << TT.getOSName() << A->getAsString(Args);
2327 return std::nullopt;
2330 VersionTuple Version = TT.getOSVersion();
2331 if (!Version.getMajor()) {
2332 TheDriver.
Diag(diag::err_drv_invalid_version_number)
2333 << A->getAsString(Args);
2334 return std::nullopt;
2336 return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
2337 TT.getEnvironment(), A, SDKInfo);
2340std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS,
2341 const ArgList &Args,
2342 const Driver &TheDriver) {
2343 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2345 return std::nullopt;
2346 StringRef isysroot = A->getValue();
2348 if (!SDKInfoOrErr) {
2349 llvm::consumeError(SDKInfoOrErr.takeError());
2350 TheDriver.
Diag(diag::warn_drv_darwin_sdk_invalid_settings);
2351 return std::nullopt;
2353 return *SDKInfoOrErr;
2358void Darwin::AddDeploymentTarget(DerivedArgList &Args)
const {
2364 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2366 if (!
getVFS().exists(A->getValue()))
2367 getDriver().
Diag(clang::diag::warn_missing_sysroot) << A->getValue();
2369 if (
char *env = ::getenv(
"SDKROOT")) {
2372 if (llvm::sys::path::is_absolute(env) &&
getVFS().exists(env) &&
2373 StringRef(env) !=
"/") {
2374 Args.append(Args.MakeSeparateArg(
2375 nullptr, Opts.getOption(options::OPT_isysroot), env));
2385 std::optional<DarwinPlatform> PlatformAndVersion =
2387 if (PlatformAndVersion) {
2389 if (
const auto *MTargetOSArg = Args.getLastArg(options::OPT_mtargetos_EQ)) {
2390 std::string TargetArgStr = PlatformAndVersion->getAsString(Args, Opts);
2391 std::string MTargetOSArgStr = MTargetOSArg->getAsString(Args);
2393 << TargetArgStr << MTargetOSArgStr;
2396 bool TripleProvidedOSVersion = PlatformAndVersion->hasOSVersion();
2397 if (!TripleProvidedOSVersion)
2398 PlatformAndVersion->setOSVersion(
2401 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2402 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2403 if (PlatformAndVersionFromOSVersionArg) {
2404 unsigned TargetMajor, TargetMinor, TargetMicro;
2406 unsigned ArgMajor, ArgMinor, ArgMicro;
2408 if (PlatformAndVersion->getPlatform() !=
2409 PlatformAndVersionFromOSVersionArg->getPlatform() ||
2411 PlatformAndVersion->getOSVersion().getAsString(), TargetMajor,
2412 TargetMinor, TargetMicro, TargetExtra) &&
2414 PlatformAndVersionFromOSVersionArg->getOSVersion().getAsString(),
2415 ArgMajor, ArgMinor, ArgMicro, ArgExtra) &&
2416 (VersionTuple(TargetMajor, TargetMinor, TargetMicro) !=
2417 VersionTuple(ArgMajor, ArgMinor, ArgMicro) ||
2418 TargetExtra != ArgExtra))) {
2421 if (PlatformAndVersion->getPlatform() ==
2422 PlatformAndVersionFromOSVersionArg->getPlatform() &&
2423 !TripleProvidedOSVersion) {
2424 PlatformAndVersion->setOSVersion(
2425 PlatformAndVersionFromOSVersionArg->getOSVersion());
2429 std::string OSVersionArg =
2430 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2431 std::string TargetArg = PlatformAndVersion->getAsString(Args, Opts);
2433 << OSVersionArg << TargetArg;
2437 }
else if ((PlatformAndVersion = getDeploymentTargetFromMTargetOSArg(
2441 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2442 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2443 if (PlatformAndVersionFromOSVersionArg) {
2444 std::string MTargetOSArgStr = PlatformAndVersion->getAsString(Args, Opts);
2445 std::string OSVersionArgStr =
2446 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2448 << MTargetOSArgStr << OSVersionArgStr;
2452 PlatformAndVersion = getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2455 if (!PlatformAndVersion) {
2456 PlatformAndVersion =
2458 if (PlatformAndVersion) {
2460 std::optional<DarwinPlatform> SDKTarget =
2461 inferDeploymentTargetFromSDK(Args,
SDKInfo);
2463 PlatformAndVersion->setEnvironment(SDKTarget->getEnvironment());
2469 if (!PlatformAndVersion) {
2470 PlatformAndVersion = inferDeploymentTargetFromSDK(Args,
SDKInfo);
2473 if (PlatformAndVersion && !
SDKInfo)
2474 SDKInfo = PlatformAndVersion->inferSDKInfo();
2478 if (!PlatformAndVersion)
2479 PlatformAndVersion =
2483 assert(PlatformAndVersion &&
"Unable to infer Darwin variant");
2484 if (!PlatformAndVersion->isValidOSVersion()) {
2485 if (PlatformAndVersion->isExplicitlySpecified())
2487 << PlatformAndVersion->getAsString(Args, Opts);
2489 getDriver().
Diag(diag::err_drv_invalid_version_number_inferred)
2490 << PlatformAndVersion->getOSVersion().getAsString()
2491 << PlatformAndVersion->getInferredSource();
2496 VersionTuple CanonicalVersion = PlatformAndVersion->getCanonicalOSVersion();
2497 if (CanonicalVersion != PlatformAndVersion->getOSVersion()) {
2498 getDriver().
Diag(diag::warn_drv_overriding_deployment_version)
2499 << PlatformAndVersion->getOSVersion().getAsString()
2500 << CanonicalVersion.getAsString();
2501 PlatformAndVersion->setOSVersion(CanonicalVersion);
2504 PlatformAndVersion->addOSVersionMinArgument(Args, Opts);
2507 unsigned Major, Minor, Micro;
2510 const unsigned MajorVersionLimit = 1000;
2511 const VersionTuple OSVersion = PlatformAndVersion->takeOSVersion();
2512 const std::string OSVersionStr = OSVersion.getAsString();
2514 if (Platform ==
MacOS) {
2517 HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
2520 << PlatformAndVersion->getAsString(Args, Opts);
2524 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2526 << PlatformAndVersion->getAsString(Args, Opts);
2528 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst &&
2529 (Major < 13 || (Major == 13 && Minor < 1))) {
2531 << PlatformAndVersion->getAsString(Args, Opts);
2538 if (
getTriple().isArch32Bit() && Major >= 11) {
2540 if (PlatformAndVersion->isExplicitlySpecified()) {
2541 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst)
2542 getDriver().
Diag(diag::err_invalid_macos_32bit_deployment_target);
2545 << PlatformAndVersion->getAsString(Args, Opts);
2553 }
else if (Platform ==
TvOS) {
2556 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2558 << PlatformAndVersion->getAsString(Args, Opts);
2559 }
else if (Platform ==
WatchOS) {
2562 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2564 << PlatformAndVersion->getAsString(Args, Opts);
2568 HadExtra || Major < 19 || Major >= MajorVersionLimit || Minor >= 100 ||
2571 << PlatformAndVersion->getAsString(Args, Opts);
2572 }
else if (Platform ==
XROS) {
2575 HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2578 << PlatformAndVersion->getAsString(Args, Opts);
2580 llvm_unreachable(
"unknown kind of Darwin platform");
2586 PlatformAndVersion->canInferSimulatorFromArch() &&
getTriple().isX86())
2589 VersionTuple ZipperedOSVersion;
2591 ZipperedOSVersion = PlatformAndVersion->getZipperedOSVersion();
2592 setTarget(Platform, Environment, Major, Minor, Micro, ZipperedOSVersion);
2601 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2603 if (SDK.size() > 0) {
2604 size_t StartVer = SDK.find_first_of(
"0123456789");
2605 StringRef SDKName = SDK.slice(0, StartVer);
2616 return !
SDKInfo->getPlatformPrefix(
T).empty();
2625 const llvm::Triple &
T)
const {
2627 const StringRef PlatformPrefix =
SDKInfo->getPlatformPrefix(
T);
2628 if (!PlatformPrefix.empty())
2629 llvm::sys::path::append(Path, PlatformPrefix);
2630 }
else if (
T.isDriverKit()) {
2633 llvm::sys::path::append(Path,
"System",
"DriverKit");
2642 if (DriverArgs.hasArg(options::OPT_isysroot))
2643 Path = DriverArgs.getLastArgValue(options::OPT_isysroot);
2654 const llvm::opt::ArgList &DriverArgs,
2655 llvm::opt::ArgStringList &CC1Args)
const {
2660 bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc);
2661 bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc);
2662 bool NoBuiltinInc = DriverArgs.hasFlag(
2663 options::OPT_nobuiltininc, options::OPT_ibuiltininc,
false);
2664 bool ForceBuiltinInc = DriverArgs.hasFlag(
2665 options::OPT_ibuiltininc, options::OPT_nobuiltininc,
false);
2668 if (!NoStdInc && !NoStdlibInc) {
2670 llvm::sys::path::append(P,
"usr",
"local",
"include");
2675 if (!(NoStdInc && !ForceBuiltinInc) && !NoBuiltinInc) {
2677 llvm::sys::path::append(P,
"include");
2681 if (NoStdInc || NoStdlibInc)
2685 llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
2686 if (!CIncludeDirs.empty()) {
2688 CIncludeDirs.split(dirs,
":");
2689 for (llvm::StringRef dir : dirs) {
2690 llvm::StringRef Prefix =
2691 llvm::sys::path::is_absolute(dir) ?
"" : llvm::StringRef(Sysroot);
2697 llvm::sys::path::append(P,
"usr",
"include");
2703 const llvm::opt::ArgList &DriverArgs,
2704 llvm::opt::ArgStringList &CC1Args)
const {
2707 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc))
2716 llvm::sys::path::append(P1,
"System",
"Library",
"Frameworks");
2717 llvm::sys::path::append(P2,
"System",
"Library",
"SubFrameworks");
2718 llvm::sys::path::append(P3,
"Library",
"Frameworks");
2722bool DarwinClang::AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
2723 llvm::opt::ArgStringList &CC1Args,
2725 llvm::StringRef Version,
2726 llvm::StringRef ArchDir,
2727 llvm::StringRef BitDir)
const {
2728 llvm::sys::path::append(
Base, Version);
2736 if (!ArchDir.empty())
2737 llvm::sys::path::append(P, ArchDir);
2738 if (!BitDir.empty())
2739 llvm::sys::path::append(P, BitDir);
2746 llvm::sys::path::append(P,
"backward");
2754 const llvm::opt::ArgList &DriverArgs,
2755 llvm::opt::ArgStringList &CC1Args)
const {
2763 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
2764 options::OPT_nostdincxx))
2785 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
2786 if (
getVFS().exists(InstallBin)) {
2789 }
else if (DriverArgs.hasArg(options::OPT_v)) {
2790 llvm::errs() <<
"ignoring nonexistent directory \"" << InstallBin
2796 llvm::sys::path::append(SysrootUsr,
"usr",
"include",
"c++",
"v1");
2797 if (
getVFS().exists(SysrootUsr)) {
2800 }
else if (DriverArgs.hasArg(options::OPT_v)) {
2801 llvm::errs() <<
"ignoring nonexistent directory \"" << SysrootUsr
2810 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args);
2815void AppleMachO::AddGnuCPlusPlusIncludePaths(
2816 const llvm::opt::ArgList &DriverArgs,
2817 llvm::opt::ArgStringList &CC1Args)
const {}
2819void DarwinClang::AddGnuCPlusPlusIncludePaths(
2820 const llvm::opt::ArgList &DriverArgs,
2821 llvm::opt::ArgStringList &CC1Args)
const {
2823 llvm::sys::path::append(UsrIncludeCxx,
"usr",
"include",
"c++");
2825 llvm::Triple::ArchType arch =
getTriple().getArch();
2826 bool IsBaseFound =
true;
2831 case llvm::Triple::x86:
2832 case llvm::Triple::x86_64:
2833 IsBaseFound = AddGnuCPlusPlusIncludePaths(
2834 DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
"i686-apple-darwin10",
2835 arch == llvm::Triple::x86_64 ?
"x86_64" :
"");
2836 IsBaseFound |= AddGnuCPlusPlusIncludePaths(
2837 DriverArgs, CC1Args, UsrIncludeCxx,
"4.0.0",
"i686-apple-darwin8",
"");
2840 case llvm::Triple::arm:
2841 case llvm::Triple::thumb:
2843 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2844 "arm-apple-darwin10",
"v7");
2846 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2847 "arm-apple-darwin10",
"v6");
2850 case llvm::Triple::aarch64:
2852 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2853 "arm64-apple-darwin10",
"");
2863 ArgStringList &CmdArgs)
const {
2868 CmdArgs.push_back(
"-lc++");
2869 if (Args.hasArg(options::OPT_fexperimental_library))
2870 CmdArgs.push_back(
"-lc++experimental");
2880 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2882 llvm::sys::path::append(P,
"usr",
"lib",
"libstdc++.dylib");
2884 if (!
getVFS().exists(P)) {
2885 llvm::sys::path::remove_filename(P);
2886 llvm::sys::path::append(P,
"libstdc++.6.dylib");
2887 if (
getVFS().exists(P)) {
2888 CmdArgs.push_back(Args.MakeArgString(P));
2897 if (!
getVFS().exists(
"/usr/lib/libstdc++.dylib") &&
2898 getVFS().exists(
"/usr/lib/libstdc++.6.dylib")) {
2899 CmdArgs.push_back(
"/usr/lib/libstdc++.6.dylib");
2904 CmdArgs.push_back(
"-lstdc++");
2910 ArgStringList &CmdArgs)
const {
2916 llvm::sys::path::append(P,
"lib",
"darwin");
2920 llvm::sys::path::append(P,
"libclang_rt.cc_kext_watchos.a");
2922 llvm::sys::path::append(P,
"libclang_rt.cc_kext_tvos.a");
2924 llvm::sys::path::append(P,
"libclang_rt.cc_kext_ios.a");
2928 llvm::sys::path::append(
2929 P, llvm::Twine(
"libclang_rt.cc_kext_") +
2930 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
".a");
2932 llvm::sys::path::append(P,
"libclang_rt.cc_kext.a");
2938 CmdArgs.push_back(Args.MakeArgString(P));
2942 StringRef BoundArch,
2944 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
2954 for (Arg *A : Args) {
2963 case options::OPT_mkernel:
2964 case options::OPT_fapple_kext:
2966 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
2969 case options::OPT_dependency_file:
2970 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
2973 case options::OPT_gfull:
2974 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
2976 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
2979 case options::OPT_gused:
2980 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
2982 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
2985 case options::OPT_shared:
2986 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
2989 case options::OPT_fconstant_cfstrings:
2990 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
2993 case options::OPT_fno_constant_cfstrings:
2994 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
2997 case options::OPT_Wnonportable_cfstrings:
2999 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
3002 case options::OPT_Wno_nonportable_cfstrings:
3004 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
3011 if (!BoundArch.empty()) {
3012 StringRef Name = BoundArch;
3013 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
3014 const Option MArch = Opts.getOption(options::OPT_march_EQ);
3020 else if (Name ==
"ppc601")
3021 DAL->AddJoinedArg(
nullptr, MCpu,
"601");
3022 else if (Name ==
"ppc603")
3023 DAL->AddJoinedArg(
nullptr, MCpu,
"603");
3024 else if (Name ==
"ppc604")
3025 DAL->AddJoinedArg(
nullptr, MCpu,
"604");
3026 else if (Name ==
"ppc604e")
3027 DAL->AddJoinedArg(
nullptr, MCpu,
"604e");
3028 else if (Name ==
"ppc750")
3029 DAL->AddJoinedArg(
nullptr, MCpu,
"750");
3030 else if (Name ==
"ppc7400")
3031 DAL->AddJoinedArg(
nullptr, MCpu,
"7400");
3032 else if (Name ==
"ppc7450")
3033 DAL->AddJoinedArg(
nullptr, MCpu,
"7450");
3034 else if (Name ==
"ppc970")
3035 DAL->AddJoinedArg(
nullptr, MCpu,
"970");
3037 else if (Name ==
"ppc64" || Name ==
"ppc64le")
3038 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3040 else if (Name ==
"i386")
3042 else if (Name ==
"i486")
3043 DAL->AddJoinedArg(
nullptr, MArch,
"i486");
3044 else if (Name ==
"i586")
3045 DAL->AddJoinedArg(
nullptr, MArch,
"i586");
3046 else if (Name ==
"i686")
3047 DAL->AddJoinedArg(
nullptr, MArch,
"i686");
3048 else if (Name ==
"pentium")
3049 DAL->AddJoinedArg(
nullptr, MArch,
"pentium");
3050 else if (Name ==
"pentium2")
3051 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3052 else if (Name ==
"pentpro")
3053 DAL->AddJoinedArg(
nullptr, MArch,
"pentiumpro");
3054 else if (Name ==
"pentIIm3")
3055 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3057 else if (Name ==
"x86_64" || Name ==
"x86_64h")
3058 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3060 else if (Name ==
"arm")
3061 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3062 else if (Name ==
"armv4t")
3063 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3064 else if (Name ==
"armv5")
3065 DAL->AddJoinedArg(
nullptr, MArch,
"armv5tej");
3066 else if (Name ==
"xscale")
3067 DAL->AddJoinedArg(
nullptr, MArch,
"xscale");
3068 else if (Name ==
"armv6")
3069 DAL->AddJoinedArg(
nullptr, MArch,
"armv6k");
3070 else if (Name ==
"armv6m")
3071 DAL->AddJoinedArg(
nullptr, MArch,
"armv6m");
3072 else if (Name ==
"armv7")
3073 DAL->AddJoinedArg(
nullptr, MArch,
"armv7a");
3074 else if (Name ==
"armv7em")
3075 DAL->AddJoinedArg(
nullptr, MArch,
"armv7em");
3076 else if (Name ==
"armv7k")
3077 DAL->AddJoinedArg(
nullptr, MArch,
"armv7k");
3078 else if (Name ==
"armv7m")
3079 DAL->AddJoinedArg(
nullptr, MArch,
"armv7m");
3080 else if (Name ==
"armv7s")
3081 DAL->AddJoinedArg(
nullptr, MArch,
"armv7s");
3088 ArgStringList &CmdArgs,
3089 bool ForceLinkBuiltinRT)
const {
3098 CompilerRT += Args.hasArg(options::OPT_fPIC) ?
"_pic" :
"_static";
3104 llvm::Triple::OSType OS;
3110 OS = llvm::Triple::MacOSX;
3113 OS = llvm::Triple::IOS;
3116 OS = llvm::Triple::TvOS;
3119 OS = llvm::Triple::WatchOS;
3142 SDKInfo->getCanonicalPlatformInfo();
3144 case llvm::Triple::UnknownEnvironment:
3145 case llvm::Triple::Simulator:
3146 case llvm::Triple::MacABI:
3155 VersionTuple SDKVersion = SDKInfo->getVersion();
3156 switch (PlatformInfo.
getOS()) {
3159 case llvm::Triple::MacOSX:
3160 return SDKVersion >= VersionTuple(15U);
3161 case llvm::Triple::IOS:
3162 return SDKVersion >= VersionTuple(18U);
3163 case llvm::Triple::TvOS:
3164 return SDKVersion >= VersionTuple(18U);
3165 case llvm::Triple::WatchOS:
3166 return SDKVersion >= VersionTuple(11U);
3167 case llvm::Triple::XROS:
3168 return SDKVersion >= VersionTuple(2U);
3176static inline llvm::VersionTuple
3181 case llvm::Triple::Darwin:
3182 case llvm::Triple::MacOSX:
3183 return llvm::VersionTuple(10U, 12U);
3184 case llvm::Triple::IOS:
3185 case llvm::Triple::TvOS:
3186 return llvm::VersionTuple(10U);
3187 case llvm::Triple::WatchOS:
3188 return llvm::VersionTuple(3U);
3191 llvm_unreachable(
"Unexpected OS");
3195 llvm::Triple::OSType OS;
3201 OS = llvm::Triple::MacOSX;
3204 OS = llvm::Triple::IOS;
3207 OS = llvm::Triple::TvOS;
3210 OS = llvm::Triple::WatchOS;
3222 llvm::opt::ArgStringList &CC1Args,
3231 if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3232 options::OPT_fno_ptrauth_calls))
3233 CC1Args.push_back(
"-fptrauth-calls");
3234 if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3235 options::OPT_fno_ptrauth_returns))
3236 CC1Args.push_back(
"-fptrauth-returns");
3237 if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3238 options::OPT_fno_ptrauth_intrinsics))
3239 CC1Args.push_back(
"-fptrauth-intrinsics");
3240 if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3241 options::OPT_fno_ptrauth_indirect_gotos))
3242 CC1Args.push_back(
"-fptrauth-indirect-gotos");
3243 if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3244 options::OPT_fno_ptrauth_auth_traps))
3245 CC1Args.push_back(
"-fptrauth-auth-traps");
3248 if (!DriverArgs.hasArg(
3249 options::OPT_fptrauth_vtable_pointer_address_discrimination,
3250 options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
3251 CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
3252 if (!DriverArgs.hasArg(
3253 options::OPT_fptrauth_vtable_pointer_type_discrimination,
3254 options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
3255 CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
3258 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
3259 options::OPT_fno_ptrauth_objc_isa))
3260 CC1Args.push_back(
"-fptrauth-objc-isa");
3261 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
3262 options::OPT_fno_ptrauth_objc_class_ro))
3263 CC1Args.push_back(
"-fptrauth-objc-class-ro");
3264 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
3265 options::OPT_fno_ptrauth_objc_interface_sel))
3266 CC1Args.push_back(
"-fptrauth-objc-interface-sel");
3271 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3278 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
3279 options::OPT_fno_aligned_allocation) &&
3281 CC1Args.push_back(
"-faligned-alloc-unavailable");
3285 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
3286 options::OPT_fno_sized_deallocation) &&
3288 CC1Args.push_back(
"-fno-sized-deallocation");
3294 CC1Args.push_back(
"-fcompatibility-qualified-id-block-type-checking");
3298 if (!DriverArgs.getLastArgNoClaim(
3299 options::OPT_fvisibility_inlines_hidden_static_local_var,
3300 options::OPT_fno_visibility_inlines_hidden_static_local_var))
3301 CC1Args.push_back(
"-fvisibility-inlines-hidden-static-local-var");
3315 CC1Args.push_back(
"-fbuiltin-headers-in-system-modules");
3317 if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
3318 options::OPT_fno_define_target_os_macros))
3319 CC1Args.push_back(
"-fdefine-target-os-macros");
3323 !DriverArgs.hasFlag(options::OPT_fmodulemap_allow_subdirectory_search,
3324 options::OPT_fno_modulemap_allow_subdirectory_search,
3326 bool RequiresSubdirectorySearch;
3327 VersionTuple SDKVersion =
SDKInfo->getVersion();
3330 RequiresSubdirectorySearch =
true;
3333 RequiresSubdirectorySearch = SDKVersion < VersionTuple(15, 0);
3337 RequiresSubdirectorySearch = SDKVersion < VersionTuple(18, 0);
3340 RequiresSubdirectorySearch = SDKVersion < VersionTuple(11, 0);
3343 RequiresSubdirectorySearch = SDKVersion < VersionTuple(2, 0);
3346 if (!RequiresSubdirectorySearch)
3347 CC1Args.push_back(
"-fno-modulemap-allow-subdirectory-search");
3352 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1ASArgs)
const {
3354 CC1ASArgs.push_back(
"-darwin-target-variant-triple");
3361 auto EmitTargetSDKVersionArg = [&](
const VersionTuple &
V) {
3363 llvm::raw_string_ostream OS(Arg);
3364 OS <<
"-target-sdk-version=" <<
V;
3365 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3369 if (
const auto *MacOStoMacCatalystMapping =
SDKInfo->getVersionMapping(
3371 std::optional<VersionTuple> SDKVersion = MacOStoMacCatalystMapping->map(
3374 EmitTargetSDKVersionArg(
3378 EmitTargetSDKVersionArg(
SDKInfo->getVersion());
3386 llvm::raw_string_ostream OS(Arg);
3387 OS <<
"-darwin-target-variant-sdk-version=" <<
SDKInfo->getVersion();
3388 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3389 }
else if (
const auto *MacOStoMacCatalystMapping =
3392 if (std::optional<VersionTuple> SDKVersion =
3393 MacOStoMacCatalystMapping->map(
3397 llvm::raw_string_ostream OS(Arg);
3398 OS <<
"-darwin-target-variant-sdk-version=" << *SDKVersion;
3399 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3410 DerivedArgList *DAL =
3414 if (BoundArch.empty())
3420 AddDeploymentTarget(*DAL);
3428 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
3431 if (A->getOption().getID() != options::OPT_mkernel &&
3432 A->getOption().getID() != options::OPT_fapple_kext)
3434 assert(it != ie &&
"unexpected argument translation");
3436 assert(A->getOption().getID() == options::OPT_static &&
3437 "missing expected -static argument");
3444 if ((
Arch == llvm::Triple::arm ||
Arch == llvm::Triple::thumb)) {
3445 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
3446 options::OPT_fno_omit_frame_pointer,
false))
3447 getDriver().
Diag(clang::diag::warn_drv_unsupported_opt_for_target)
3448 <<
"-fomit-frame-pointer" << BoundArch;
3457 if (
getArch() == llvm::Triple::x86_64 ||
3459 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
3461 return (
getArch() == llvm::Triple::aarch64 ||
3462 getArch() == llvm::Triple::aarch64_32)
3470 if (
const char *S = ::getenv(
"RC_DEBUG_OPTIONS"))
3471 return S[0] !=
'\0';
3476 if (
const char *S = ::getenv(
"RC_DEBUG_PREFIX_MAP"))
3485 return llvm::ExceptionHandling::None;
3489 if (Triple.isWatchABI())
3490 return llvm::ExceptionHandling::DwarfCFI;
3492 return llvm::ExceptionHandling::SjLj;
3507 return (
getArch() == llvm::Triple::x86_64 ||
3508 getArch() == llvm::Triple::aarch64);
3517 ArgStringList &CmdArgs)
const {
3520 assert(!
isTargetXROS() &&
"xrOS always uses -platform-version");
3523 CmdArgs.push_back(
"-watchos_version_min");
3525 CmdArgs.push_back(
"-watchos_simulator_version_min");
3527 CmdArgs.push_back(
"-tvos_version_min");
3529 CmdArgs.push_back(
"-tvos_simulator_version_min");
3531 CmdArgs.push_back(
"-driverkit_version_min");
3533 CmdArgs.push_back(
"-ios_simulator_version_min");
3535 CmdArgs.push_back(
"-iphoneos_version_min");
3537 CmdArgs.push_back(
"-maccatalyst_version_min");
3540 CmdArgs.push_back(
"-macosx_version_min");
3546 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3549 VersionTuple VariantTargetVersion;
3551 CmdArgs.push_back(
"-macosx_version_min");
3556 "unexpected target variant triple");
3557 CmdArgs.push_back(
"-maccatalyst_version_min");
3560 VersionTuple MinTgtVers =
3562 if (MinTgtVers.getMajor() && MinTgtVers > VariantTargetVersion)
3563 VariantTargetVersion = MinTgtVers;
3564 CmdArgs.push_back(Args.MakeArgString(VariantTargetVersion.getAsString()));
3575 return "mac catalyst";
3586 llvm_unreachable(
"invalid platform");
3590 llvm::opt::ArgStringList &CmdArgs)
const {
3591 auto EmitPlatformVersionArg =
3594 const llvm::Triple &TT) {
3597 CmdArgs.push_back(
"-platform_version");
3598 std::string PlatformName =
3601 PlatformName +=
"-simulator";
3602 CmdArgs.push_back(Args.MakeArgString(PlatformName));
3611 VersionTuple MinTgtVers = TT.getMinimumSupportedOSVersion();
3614 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3619 std::optional<VersionTuple> iOSSDKVersion;
3621 if (
const auto *MacOStoMacCatalystMapping =
3624 iOSSDKVersion = MacOStoMacCatalystMapping->map(
3625 SDKInfo->getVersion().withoutBuild(),
3629 CmdArgs.push_back(Args.MakeArgString(
3630 (iOSSDKVersion ? *iOSSDKVersion
3637 VersionTuple SDKVersion =
SDKInfo->getVersion().withoutBuild();
3638 if (!SDKVersion.getMinor())
3639 SDKVersion = VersionTuple(SDKVersion.getMajor(), 0);
3640 CmdArgs.push_back(Args.MakeArgString(SDKVersion.getAsString()));
3651 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3660 VersionTuple TargetVariantVersion;
3668 "unexpected target variant triple");
3673 EmitPlatformVersionArg(TargetVariantVersion, Platform, Environment,
3679 ArgStringList &CmdArgs) {
3683 CmdArgs.push_back(
"-ldylib1.o");
3690 CmdArgs.push_back(
"-ldylib1.o");
3692 CmdArgs.push_back(
"-ldylib1.10.5.o");
3697 ArgStringList &CmdArgs) {
3698 if (Args.hasArg(options::OPT_static))
3703 CmdArgs.push_back(
"-lbundle1.o");
3708 ArgStringList &CmdArgs) {
3710 if (Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_object) ||
3711 Args.hasArg(options::OPT_preload)) {
3712 CmdArgs.push_back(
"-lgcrt0.o");
3714 CmdArgs.push_back(
"-lgcrt1.o");
3724 CmdArgs.push_back(
"-no_new_main");
3726 D.
getDriver().
Diag(diag::err_drv_clang_unsupported_opt_pg_darwin)
3732 ArgStringList &CmdArgs) {
3735 if (D.
getArch() == llvm::Triple::aarch64)
3738 CmdArgs.push_back(
"-lcrt1.o");
3740 CmdArgs.push_back(
"-lcrt1.3.1.o");
3747 CmdArgs.push_back(
"-lcrt1.o");
3749 CmdArgs.push_back(
"-lcrt1.10.5.o");
3751 CmdArgs.push_back(
"-lcrt1.10.6.o");
3756 ArgStringList &CmdArgs)
const {
3758 if (Args.hasArg(options::OPT_dynamiclib))
3760 else if (Args.hasArg(options::OPT_bundle))
3764 else if (Args.hasArg(options::OPT_static) ||
3765 Args.hasArg(options::OPT_object) ||
3766 Args.hasArg(options::OPT_preload))
3767 CmdArgs.push_back(
"-lcrt0.o");
3771 if (
isTargetMacOS() && Args.hasArg(options::OPT_shared_libgcc) &&
3773 const char *Str = Args.MakeArgString(
GetFilePath(
"crt3.o"));
3774 CmdArgs.push_back(Str);
3786 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
3787 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
3789 Res |= SanitizerKind::Address;
3790 Res |= SanitizerKind::PointerCompare;
3791 Res |= SanitizerKind::PointerSubtract;
3792 Res |= SanitizerKind::Realtime;
3793 Res |= SanitizerKind::Leak;
3794 Res |= SanitizerKind::Fuzzer;
3795 Res |= SanitizerKind::FuzzerNoLink;
3796 Res |= SanitizerKind::ObjCCast;
3803 Res |= SanitizerKind::Vptr;
3805 if ((IsX86_64 || IsAArch64) &&
3808 Res |= SanitizerKind::Thread;
3812 Res |= SanitizerKind::Type;
3816 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.
Defines types useful for describing an Objective-C runtime.
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.
@ Result
The result type of a method or function.
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
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()