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));
 
 
  575                                  const char *LinkingOutput)
 const {
 
  576  assert(Output.
getType() == types::TY_Image && 
"Invalid linker output type.");
 
  582  llvm::opt::ArgStringList InputFileList;
 
  587  ArgStringList CmdArgs;
 
  593      Args.MakeArgString(
getToolChain().GetLinkerPath(&LinkerIsLLD));
 
  596  bool UsePlatformVersion = 
getToolChain().getTriple().isXROS();
 
  600  AddLinkArgs(
C, Args, CmdArgs, Inputs, Version, LinkerIsLLD,
 
  610          Args.getLastArg(options::OPT_moutline, options::OPT_mno_outline)) {
 
  611    if (A->getOption().matches(options::OPT_moutline)) {
 
  613        CmdArgs.push_back(
"-mllvm");
 
  614        CmdArgs.push_back(
"-enable-machine-outliner");
 
  620      CmdArgs.push_back(
"-mllvm");
 
  621      CmdArgs.push_back(
"-enable-machine-outliner=never");
 
  628  CmdArgs.push_back(
"-mllvm");
 
  629  CmdArgs.push_back(
"-enable-linkonceodr-outlining");
 
  632  auto *CodeGenDataGenArg =
 
  633      Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
 
  634  auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
 
  638  if (CodeGenDataGenArg && CodeGenDataUseArg)
 
  639    D.
Diag(diag::err_drv_argument_not_allowed_with)
 
  640        << CodeGenDataGenArg->getAsString(Args)
 
  641        << CodeGenDataUseArg->getAsString(Args);
 
  645  if (CodeGenDataGenArg) {
 
  646    CmdArgs.push_back(
"-mllvm");
 
  647    CmdArgs.push_back(
"-codegen-data-generate");
 
  651  if (CodeGenDataUseArg) {
 
  652    CmdArgs.push_back(
"-mllvm");
 
  653    CmdArgs.push_back(Args.MakeArgString(Twine(
"-codegen-data-use-path=") +
 
  654                                         CodeGenDataUseArg->getValue()));
 
  660  if (!StatsFile.empty()) {
 
  661    CmdArgs.push_back(
"-mllvm");
 
  662    CmdArgs.push_back(Args.MakeArgString(
"-lto-stats-file=" + StatsFile.str()));
 
  667  Args.addAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
 
  668                            options::OPT_Z_Flag, options::OPT_u_Group});
 
  673  if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
 
  674    CmdArgs.push_back(
"-ObjC");
 
  676  CmdArgs.push_back(
"-o");
 
  679  if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
 
  682  Args.AddAllArgs(CmdArgs, options::OPT_L);
 
  687  for (
const auto &II : Inputs) {
 
  688    if (!II.isFilename()) {
 
  693      if (InputFileList.size() > 0)
 
  699    InputFileList.push_back(II.getFilename());
 
  705      !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
 
  706    getToolChain().addFortranRuntimeLibraryPath(Args, CmdArgs);
 
  710  if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
 
  714      !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
 
  718    CmdArgs.push_back(
"-framework");
 
  719    CmdArgs.push_back(
"Foundation");
 
  721    CmdArgs.push_back(
"-lobjc");
 
  725    CmdArgs.push_back(
"-arch_multiple");
 
  726    CmdArgs.push_back(
"-final_output");
 
  727    CmdArgs.push_back(LinkingOutput);
 
  730  if (Args.hasArg(options::OPT_fnested_functions))
 
  731    CmdArgs.push_back(
"-allow_stack_execute");
 
  736  if (!Parallelism.empty()) {
 
  737    CmdArgs.push_back(
"-mllvm");
 
  738    unsigned NumThreads =
 
  739        llvm::get_threadpool_strategy(Parallelism)->compute_thread_count();
 
  740    CmdArgs.push_back(Args.MakeArgString(
"-threads=" + Twine(NumThreads)));
 
  746  bool NoStdOrDefaultLibs =
 
  747      Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
 
  748  bool ForceLinkBuiltins = Args.hasArg(options::OPT_fapple_link_rtlib);
 
  749  if (!NoStdOrDefaultLibs || ForceLinkBuiltins) {
 
  754    if (NoStdOrDefaultLibs && ForceLinkBuiltins) {
 
  762      Args.ClaimAllArgs(options::OPT_pthread);
 
  763      Args.ClaimAllArgs(options::OPT_pthreads);
 
  767  if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
 
  771  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
 
  772  Args.AddAllArgs(CmdArgs, options::OPT_F);
 
  775  for (
const Arg *A : Args.filtered(options::OPT_iframework))
 
  776    CmdArgs.push_back(Args.MakeArgString(std::string(
"-F") + A->getValue()));
 
  778  if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
 
  779    if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
 
  780      if (A->getValue() == StringRef(
"Accelerate")) {
 
  781        CmdArgs.push_back(
"-framework");
 
  782        CmdArgs.push_back(
"Accelerate");
 
  791    bool NonStandardSearchPath = 
false;
 
  793    if (Triple.isDriverKit()) {
 
  795      NonStandardSearchPath =
 
  796          Version.getMajor() < 605 ||
 
  797          (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(clang::driver::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    return DarwinSDKInfo(getOSVersion(),
 
 1918                         VersionTuple(getOSVersion().getMajor(), 0, 99),
 
 1919                         getOSFromPlatform(Platform));
 
 1923  DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform, Arg *Argument)
 
 1925        Arguments({Argument, VersionTuple().getAsString()}) {}
 
 1926  DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform,
 
 1927                 VersionTuple 
Value, Arg *Argument = 
nullptr)
 
 1931      UnderlyingOSVersion = 
Value;
 
 1934  static VersionTuple getVersionFromString(
const StringRef Input) {
 
 1935    llvm::VersionTuple Version;
 
 1936    bool IsValid = !Version.tryParse(Input);
 
 1937    assert(IsValid && 
"unable to convert input version to version tuple");
 
 1942  static DarwinPlatformKind getPlatformFromOS(llvm::Triple::OSType OS) {
 
 1944    case llvm::Triple::Darwin:
 
 1945    case llvm::Triple::MacOSX:
 
 1946      return DarwinPlatformKind::MacOS;
 
 1947    case llvm::Triple::IOS:
 
 1948      return DarwinPlatformKind::IPhoneOS;
 
 1949    case llvm::Triple::TvOS:
 
 1950      return DarwinPlatformKind::TvOS;
 
 1951    case llvm::Triple::WatchOS:
 
 1952      return DarwinPlatformKind::WatchOS;
 
 1953    case llvm::Triple::XROS:
 
 1954      return DarwinPlatformKind::XROS;
 
 1955    case llvm::Triple::DriverKit:
 
 1956      return DarwinPlatformKind::DriverKit;
 
 1958      llvm_unreachable(
"Unable to infer Darwin variant");
 
 1962  static llvm::Triple::OSType getOSFromPlatform(DarwinPlatformKind Platform) {
 
 1964    case DarwinPlatformKind::MacOS:
 
 1965      return llvm::Triple::MacOSX;
 
 1966    case DarwinPlatformKind::IPhoneOS:
 
 1967      return llvm::Triple::IOS;
 
 1968    case DarwinPlatformKind::TvOS:
 
 1969      return llvm::Triple::TvOS;
 
 1970    case DarwinPlatformKind::WatchOS:
 
 1971      return llvm::Triple::WatchOS;
 
 1972    case DarwinPlatformKind::DriverKit:
 
 1973      return llvm::Triple::DriverKit;
 
 1974    case DarwinPlatformKind::XROS:
 
 1975      return llvm::Triple::XROS;
 
 1977    llvm_unreachable(
"Unknown DarwinPlatformKind enum");
 
 1981  DarwinPlatformKind Platform;
 
 1982  DarwinEnvironmentKind Environment = DarwinEnvironmentKind::NativeEnvironment;
 
 1986  VersionTuple ZipperedOSVersion;
 
 1991  std::optional<VersionTuple> UnderlyingOSVersion;
 
 1992  bool InferSimulatorFromArch = 
true;
 
 1993  std::pair<Arg *, std::string> 
Arguments;
 
 1994  StringRef EnvVarName;
 
 1997  StringRef InferredSource;
 
 2000  std::optional<llvm::Triple> TargetVariantTriple;
 
 2005std::optional<DarwinPlatform>
 
 2006getDeploymentTargetFromOSVersionArg(DerivedArgList &Args,
 
 2007                                    const Driver &TheDriver) {
 
 2008  Arg *macOSVersion = Args.getLastArg(options::OPT_mmacos_version_min_EQ);
 
 2009  Arg *iOSVersion = Args.getLastArg(options::OPT_mios_version_min_EQ,
 
 2010                                    options::OPT_mios_simulator_version_min_EQ);
 
 2012      Args.getLastArg(options::OPT_mtvos_version_min_EQ,
 
 2013                      options::OPT_mtvos_simulator_version_min_EQ);
 
 2014  Arg *WatchOSVersion =
 
 2015      Args.getLastArg(options::OPT_mwatchos_version_min_EQ,
 
 2016                      options::OPT_mwatchos_simulator_version_min_EQ);
 
 2018  auto GetDarwinPlatform =
 
 2019      [&](DarwinPlatform::DarwinPlatformKind Platform, Arg *VersionArg,
 
 2020          bool IsSimulator) -> std::optional<DarwinPlatform> {
 
 2021    if (StringRef(VersionArg->getValue()).empty()) {
 
 2022      TheDriver.
Diag(diag::err_drv_missing_version_number)
 
 2023          << VersionArg->getAsString(Args);
 
 2024      return std::nullopt;
 
 2026    return DarwinPlatform::createOSVersionArg(Platform, VersionArg,
 
 2031    if (iOSVersion || TvOSVersion || WatchOSVersion) {
 
 2032      TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
 
 2033          << macOSVersion->getAsString(Args)
 
 2034          << (iOSVersion ? iOSVersion
 
 2035                         : TvOSVersion ? TvOSVersion : WatchOSVersion)
 
 2041  } 
else if (iOSVersion) {
 
 2042    if (TvOSVersion || WatchOSVersion) {
 
 2043      TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
 
 2044          << iOSVersion->getAsString(Args)
 
 2045          << (TvOSVersion ? TvOSVersion : WatchOSVersion)->
getAsString(Args);
 
 2048                             iOSVersion->getOption().getID() ==
 
 2049                                 options::OPT_mios_simulator_version_min_EQ);
 
 2050  } 
else if (TvOSVersion) {
 
 2051    if (WatchOSVersion) {
 
 2052      TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
 
 2053          << TvOSVersion->getAsString(Args)
 
 2054          << WatchOSVersion->getAsString(Args);
 
 2057                             TvOSVersion->getOption().getID() ==
 
 2058                                 options::OPT_mtvos_simulator_version_min_EQ);
 
 2059  } 
else if (WatchOSVersion)
 
 2060    return GetDarwinPlatform(
 
 2062        WatchOSVersion->getOption().getID() ==
 
 2063            options::OPT_mwatchos_simulator_version_min_EQ);
 
 2064  return std::nullopt;
 
 2069std::optional<DarwinPlatform>
 
 2070getDeploymentTargetFromEnvironmentVariables(
const Driver &TheDriver,
 
 2071                                            const llvm::Triple &Triple) {
 
 2073  const char *EnvVars[] = {
 
 2074      "MACOSX_DEPLOYMENT_TARGET",
 
 2075      "IPHONEOS_DEPLOYMENT_TARGET",
 
 2076      "TVOS_DEPLOYMENT_TARGET",
 
 2077      "WATCHOS_DEPLOYMENT_TARGET",
 
 2078      "DRIVERKIT_DEPLOYMENT_TARGET",
 
 2079      "XROS_DEPLOYMENT_TARGET" 
 2082                "Missing platform");
 
 2083  for (
const auto &I : llvm::enumerate(llvm::ArrayRef(EnvVars))) {
 
 2084    if (
char *Env = ::getenv(I.value()))
 
 2085      Targets[I.index()] = Env;
 
 2094    if (Triple.getArch() == llvm::Triple::arm ||
 
 2095        Triple.getArch() == llvm::Triple::aarch64 ||
 
 2096        Triple.getArch() == llvm::Triple::thumb)
 
 2103    unsigned FirstTarget = std::size(Targets);
 
 2104    for (
unsigned I = 0; I != std::size(Targets); ++I) {
 
 2105      if (Targets[I].empty())
 
 2107      if (FirstTarget == std::size(Targets))
 
 2110        TheDriver.
Diag(diag::err_drv_conflicting_deployment_targets)
 
 2111            << Targets[FirstTarget] << Targets[I];
 
 2115  for (
const auto &
Target : llvm::enumerate(llvm::ArrayRef(Targets))) {
 
 2116    if (!
Target.value().empty())
 
 2117      return DarwinPlatform::createDeploymentTargetEnv(
 
 2121  return std::nullopt;
 
 2126static StringRef dropSDKNamePrefix(StringRef SDKName) {
 
 2127  size_t PrefixPos = SDKName.find(
'.');
 
 2128  if (PrefixPos == StringRef::npos)
 
 2130  return SDKName.substr(PrefixPos + 1);
 
 2136std::optional<DarwinPlatform>
 
 2137inferDeploymentTargetFromSDK(DerivedArgList &Args,
 
 2138                             const std::optional<DarwinSDKInfo> &SDKInfo) {
 
 2139  const Arg *A = Args.getLastArg(options::OPT_isysroot);
 
 2141    return std::nullopt;
 
 2142  StringRef isysroot = A->getValue();
 
 2145    return std::nullopt;
 
 2147  std::string Version;
 
 2150    Version = SDKInfo->getVersion().getAsString();
 
 2154    size_t StartVer = SDK.find_first_of(
"0123456789");
 
 2155    size_t EndVer = SDK.find_last_of(
"0123456789");
 
 2156    if (StartVer != StringRef::npos && EndVer > StartVer)
 
 2157      Version = std::string(SDK.slice(StartVer, EndVer + 1));
 
 2159  if (Version.empty())
 
 2160    return std::nullopt;
 
 2162  auto CreatePlatformFromSDKName =
 
 2163      [&](StringRef SDK) -> std::optional<DarwinPlatform> {
 
 2164    if (SDK.starts_with(
"iPhoneOS") || SDK.starts_with(
"iPhoneSimulator"))
 
 2165      return DarwinPlatform::createFromSDK(
 
 2167          SDK.starts_with(
"iPhoneSimulator"));
 
 2168    else if (SDK.starts_with(
"MacOSX"))
 
 2169      return DarwinPlatform::createFromSDK(isysroot, 
Darwin::MacOS,
 
 2171    else if (SDK.starts_with(
"WatchOS") || SDK.starts_with(
"WatchSimulator"))
 
 2172      return DarwinPlatform::createFromSDK(
 
 2174          SDK.starts_with(
"WatchSimulator"));
 
 2175    else if (SDK.starts_with(
"AppleTVOS") ||
 
 2176             SDK.starts_with(
"AppleTVSimulator"))
 
 2177      return DarwinPlatform::createFromSDK(
 
 2179          SDK.starts_with(
"AppleTVSimulator"));
 
 2180    else if (SDK.starts_with(
"XR"))
 
 2181      return DarwinPlatform::createFromSDK(
 
 2183          SDK.contains(
"Simulator"));
 
 2184    else if (SDK.starts_with(
"DriverKit"))
 
 2187    return std::nullopt;
 
 2189  if (
auto Result = CreatePlatformFromSDKName(SDK))
 
 2192  return CreatePlatformFromSDKName(dropSDKNamePrefix(SDK));
 
 2195VersionTuple getInferredOSVersion(llvm::Triple::OSType OS,
 
 2196                                  const llvm::Triple &Triple,
 
 2197                                  const Driver &TheDriver) {
 
 2198  VersionTuple OsVersion;
 
 2199  llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
 
 2201  case llvm::Triple::Darwin:
 
 2202  case llvm::Triple::MacOSX:
 
 2205    if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
 
 2206        !Triple.getOSMajorVersion())
 
 2207      SystemTriple.getMacOSXVersion(OsVersion);
 
 2208    else if (!Triple.getMacOSXVersion(OsVersion))
 
 2209      TheDriver.
Diag(diag::err_drv_invalid_darwin_version)
 
 2210          << Triple.getOSName();
 
 2212  case llvm::Triple::IOS:
 
 2213    if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
 
 2214      OsVersion = VersionTuple(13, 1);
 
 2216      OsVersion = Triple.getiOSVersion();
 
 2218  case llvm::Triple::TvOS:
 
 2219    OsVersion = Triple.getOSVersion();
 
 2221  case llvm::Triple::WatchOS:
 
 2222    OsVersion = Triple.getWatchOSVersion();
 
 2224  case llvm::Triple::XROS:
 
 2225    OsVersion = Triple.getOSVersion();
 
 2226    if (!OsVersion.getMajor())
 
 2227      OsVersion = OsVersion.withMajorReplaced(1);
 
 2229  case llvm::Triple::DriverKit:
 
 2230    OsVersion = Triple.getDriverKitVersion();
 
 2233    llvm_unreachable(
"Unexpected OS type");
 
 2240std::optional<DarwinPlatform>
 
 2241inferDeploymentTargetFromArch(DerivedArgList &Args, 
const Darwin &Toolchain,
 
 2242                              const llvm::Triple &Triple,
 
 2243                              const Driver &TheDriver) {
 
 2244  llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS;
 
 2247  if (MachOArchName == 
"arm64" || MachOArchName == 
"arm64e")
 
 2248    OSTy = llvm::Triple::MacOSX;
 
 2249  else if (MachOArchName == 
"armv7" || MachOArchName == 
"armv7s" ||
 
 2250           MachOArchName == 
"armv6")
 
 2251    OSTy = llvm::Triple::IOS;
 
 2252  else if (MachOArchName == 
"armv7k" || MachOArchName == 
"arm64_32")
 
 2253    OSTy = llvm::Triple::WatchOS;
 
 2254  else if (MachOArchName != 
"armv6m" && MachOArchName != 
"armv7m" &&
 
 2255           MachOArchName != 
"armv7em")
 
 2256    OSTy = llvm::Triple::MacOSX;
 
 2257  if (OSTy == llvm::Triple::UnknownOS)
 
 2258    return std::nullopt;
 
 2259  return DarwinPlatform::createFromArch(
 
 2260      MachOArchName, OSTy, getInferredOSVersion(OSTy, Triple, TheDriver));
 
 2264std::optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
 
 2265    DerivedArgList &Args, 
const llvm::Triple &Triple, 
const Driver &TheDriver,
 
 2266    const std::optional<DarwinSDKInfo> &SDKInfo) {
 
 2267  if (!Args.hasArg(options::OPT_target))
 
 2268    return std::nullopt;
 
 2269  if (Triple.getOS() == llvm::Triple::Darwin ||
 
 2270      Triple.getOS() == llvm::Triple::UnknownOS)
 
 2271    return std::nullopt;
 
 2272  std::optional<llvm::Triple> TargetVariantTriple;
 
 2273  for (
const Arg *A : Args.filtered(options::OPT_darwin_target_variant)) {
 
 2274    llvm::Triple TVT(A->getValue());
 
 2276    if ((Triple.getArch() == llvm::Triple::aarch64 ||
 
 2277         TVT.getArchName() == Triple.getArchName()) &&
 
 2278        TVT.getArch() == Triple.getArch() &&
 
 2279        TVT.getSubArch() == Triple.getSubArch() &&
 
 2280        TVT.getVendor() == Triple.getVendor()) {
 
 2281      if (TargetVariantTriple)
 
 2286      if ((Triple.isMacOSX() && TVT.getOS() == llvm::Triple::IOS &&
 
 2287           TVT.isMacCatalystEnvironment()) ||
 
 2288          (TVT.isMacOSX() && Triple.getOS() == llvm::Triple::IOS &&
 
 2289           Triple.isMacCatalystEnvironment())) {
 
 2290        TargetVariantTriple = TVT;
 
 2293      TheDriver.
Diag(diag::err_drv_target_variant_invalid)
 
 2294          << A->getSpelling() << A->getValue();
 
 2297  DarwinPlatform PlatformAndVersion = DarwinPlatform::createFromTarget(
 
 2298      Triple, Args.getLastArg(options::OPT_target), TargetVariantTriple,
 
 2301  return PlatformAndVersion;
 
 2305std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
 
 2306    DerivedArgList &Args, 
const Driver &TheDriver,
 
 2307    const std::optional<DarwinSDKInfo> &SDKInfo) {
 
 2308  auto *A = Args.getLastArg(options::OPT_mtargetos_EQ);
 
 2310    return std::nullopt;
 
 2311  llvm::Triple TT(llvm::Twine(
"unknown-apple-") + A->getValue());
 
 2312  switch (TT.getOS()) {
 
 2313  case llvm::Triple::MacOSX:
 
 2314  case llvm::Triple::IOS:
 
 2315  case llvm::Triple::TvOS:
 
 2316  case llvm::Triple::WatchOS:
 
 2317  case llvm::Triple::XROS:
 
 2320    TheDriver.
Diag(diag::err_drv_invalid_os_in_arg)
 
 2321        << TT.getOSName() << A->getAsString(Args);
 
 2322    return std::nullopt;
 
 2325  VersionTuple Version = TT.getOSVersion();
 
 2326  if (!Version.getMajor()) {
 
 2327    TheDriver.
Diag(diag::err_drv_invalid_version_number)
 
 2328        << A->getAsString(Args);
 
 2329    return std::nullopt;
 
 2331  return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
 
 2332                                             TT.getEnvironment(), A, SDKInfo);
 
 2335std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS,
 
 2336                                              const ArgList &Args,
 
 2337                                              const Driver &TheDriver) {
 
 2338  const Arg *A = Args.getLastArg(options::OPT_isysroot);
 
 2340    return std::nullopt;
 
 2341  StringRef isysroot = A->getValue();
 
 2343  if (!SDKInfoOrErr) {
 
 2344    llvm::consumeError(SDKInfoOrErr.takeError());
 
 2345    TheDriver.
Diag(diag::warn_drv_darwin_sdk_invalid_settings);
 
 2346    return std::nullopt;
 
 2348  return *SDKInfoOrErr;
 
 2353void Darwin::AddDeploymentTarget(DerivedArgList &Args)
 const {
 
 2359  if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
 
 2361    if (!
getVFS().exists(A->getValue()))
 
 2362      getDriver().
Diag(clang::diag::warn_missing_sysroot) << A->getValue();
 
 2364    if (
char *env = ::getenv(
"SDKROOT")) {
 
 2367      if (llvm::sys::path::is_absolute(env) && 
getVFS().exists(env) &&
 
 2368          StringRef(env) != 
"/") {
 
 2369        Args.append(Args.MakeSeparateArg(
 
 2370            nullptr, Opts.getOption(options::OPT_isysroot), env));
 
 2380  std::optional<DarwinPlatform> PlatformAndVersion =
 
 2382  if (PlatformAndVersion) {
 
 2384    if (
const auto *MTargetOSArg = Args.getLastArg(options::OPT_mtargetos_EQ)) {
 
 2385      std::string TargetArgStr = PlatformAndVersion->getAsString(Args, Opts);
 
 2386      std::string MTargetOSArgStr = MTargetOSArg->getAsString(Args);
 
 2388          << TargetArgStr << MTargetOSArgStr;
 
 2391    bool TripleProvidedOSVersion = PlatformAndVersion->hasOSVersion();
 
 2392    if (!TripleProvidedOSVersion)
 
 2393      PlatformAndVersion->setOSVersion(
 
 2396    std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
 
 2397        getDeploymentTargetFromOSVersionArg(Args, 
getDriver());
 
 2398    if (PlatformAndVersionFromOSVersionArg) {
 
 2399      unsigned TargetMajor, TargetMinor, TargetMicro;
 
 2401      unsigned ArgMajor, ArgMinor, ArgMicro;
 
 2403      if (PlatformAndVersion->getPlatform() !=
 
 2404              PlatformAndVersionFromOSVersionArg->getPlatform() ||
 
 2406               PlatformAndVersion->getOSVersion().getAsString(), TargetMajor,
 
 2407               TargetMinor, TargetMicro, TargetExtra) &&
 
 2409               PlatformAndVersionFromOSVersionArg->getOSVersion().getAsString(),
 
 2410               ArgMajor, ArgMinor, ArgMicro, ArgExtra) &&
 
 2411           (VersionTuple(TargetMajor, TargetMinor, TargetMicro) !=
 
 2412                VersionTuple(ArgMajor, ArgMinor, ArgMicro) ||
 
 2413            TargetExtra != ArgExtra))) {
 
 2416        if (PlatformAndVersion->getPlatform() ==
 
 2417                PlatformAndVersionFromOSVersionArg->getPlatform() &&
 
 2418            !TripleProvidedOSVersion) {
 
 2419          PlatformAndVersion->setOSVersion(
 
 2420              PlatformAndVersionFromOSVersionArg->getOSVersion());
 
 2424          std::string OSVersionArg =
 
 2425              PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
 
 2426          std::string TargetArg = PlatformAndVersion->getAsString(Args, Opts);
 
 2428              << OSVersionArg << TargetArg;
 
 2432  } 
else if ((PlatformAndVersion = getDeploymentTargetFromMTargetOSArg(
 
 2436    std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
 
 2437        getDeploymentTargetFromOSVersionArg(Args, 
getDriver());
 
 2438    if (PlatformAndVersionFromOSVersionArg) {
 
 2439      std::string MTargetOSArgStr = PlatformAndVersion->getAsString(Args, Opts);
 
 2440      std::string OSVersionArgStr =
 
 2441          PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
 
 2443          << MTargetOSArgStr << OSVersionArgStr;
 
 2447    PlatformAndVersion = getDeploymentTargetFromOSVersionArg(Args, 
getDriver());
 
 2450    if (!PlatformAndVersion) {
 
 2451      PlatformAndVersion =
 
 2453      if (PlatformAndVersion) {
 
 2455        std::optional<DarwinPlatform> SDKTarget =
 
 2456            inferDeploymentTargetFromSDK(Args, 
SDKInfo);
 
 2458          PlatformAndVersion->setEnvironment(SDKTarget->getEnvironment());
 
 2464    if (!PlatformAndVersion) {
 
 2465      PlatformAndVersion = inferDeploymentTargetFromSDK(Args, 
SDKInfo);
 
 2468      if (PlatformAndVersion && !
SDKInfo)
 
 2469        SDKInfo = PlatformAndVersion->inferSDKInfo();
 
 2473    if (!PlatformAndVersion)
 
 2474      PlatformAndVersion =
 
 2478  assert(PlatformAndVersion && 
"Unable to infer Darwin variant");
 
 2479  if (!PlatformAndVersion->isValidOSVersion()) {
 
 2480    if (PlatformAndVersion->isExplicitlySpecified())
 
 2482          << PlatformAndVersion->getAsString(Args, Opts);
 
 2484      getDriver().
Diag(diag::err_drv_invalid_version_number_inferred)
 
 2485          << PlatformAndVersion->getOSVersion().getAsString()
 
 2486          << PlatformAndVersion->getInferredSource();
 
 2491  VersionTuple CanonicalVersion = PlatformAndVersion->getCanonicalOSVersion();
 
 2492  if (CanonicalVersion != PlatformAndVersion->getOSVersion()) {
 
 2493    getDriver().
Diag(diag::warn_drv_overriding_deployment_version)
 
 2494        << PlatformAndVersion->getOSVersion().getAsString()
 
 2495        << CanonicalVersion.getAsString();
 
 2496    PlatformAndVersion->setOSVersion(CanonicalVersion);
 
 2499  PlatformAndVersion->addOSVersionMinArgument(Args, Opts);
 
 2502  unsigned Major, Minor, Micro;
 
 2505  const unsigned MajorVersionLimit = 1000;
 
 2506  const VersionTuple OSVersion = PlatformAndVersion->takeOSVersion();
 
 2507  const std::string OSVersionStr = OSVersion.getAsString();
 
 2509  if (Platform == 
MacOS) {
 
 2512        HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
 
 2515          << PlatformAndVersion->getAsString(Args, Opts);
 
 2519        HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
 
 2521          << PlatformAndVersion->getAsString(Args, Opts);
 
 2523    if (PlatformAndVersion->getEnvironment() == 
MacCatalyst &&
 
 2524        (Major < 13 || (Major == 13 && Minor < 1))) {
 
 2526          << PlatformAndVersion->getAsString(Args, Opts);
 
 2533    if (
getTriple().isArch32Bit() && Major >= 11) {
 
 2535      if (PlatformAndVersion->isExplicitlySpecified()) {
 
 2536        if (PlatformAndVersion->getEnvironment() == 
MacCatalyst)
 
 2537          getDriver().
Diag(diag::err_invalid_macos_32bit_deployment_target);
 
 2540              << PlatformAndVersion->getAsString(Args, Opts);
 
 2548  } 
else if (Platform == 
TvOS) {
 
 2551        HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
 
 2553          << PlatformAndVersion->getAsString(Args, Opts);
 
 2554  } 
else if (Platform == 
WatchOS) {
 
 2557        HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
 
 2559          << PlatformAndVersion->getAsString(Args, Opts);
 
 2563        HadExtra || Major < 19 || Major >= MajorVersionLimit || Minor >= 100 ||
 
 2566          << PlatformAndVersion->getAsString(Args, Opts);
 
 2567  } 
else if (Platform == 
XROS) {
 
 2570        HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
 
 2573          << PlatformAndVersion->getAsString(Args, Opts);
 
 2575    llvm_unreachable(
"unknown kind of Darwin platform");
 
 2581      PlatformAndVersion->canInferSimulatorFromArch() && 
getTriple().isX86())
 
 2584  VersionTuple ZipperedOSVersion;
 
 2586    ZipperedOSVersion = PlatformAndVersion->getZipperedOSVersion();
 
 2587  setTarget(Platform, Environment, Major, Minor, Micro, ZipperedOSVersion);
 
 2596  if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
 
 2598    if (SDK.size() > 0) {
 
 2599      size_t StartVer = SDK.find_first_of(
"0123456789");
 
 2600      StringRef SDKName = SDK.slice(0, StartVer);
 
 2613                                 const llvm::Triple &
T) {
 
 2614  if (
T.isDriverKit()) {
 
 2615    llvm::sys::path::append(Path, 
"System", 
"DriverKit");
 
 
 2621llvm::SmallString<128>
 
 2624  if (DriverArgs.hasArg(options::OPT_isysroot))
 
 2625    Path = DriverArgs.getLastArgValue(options::OPT_isysroot);
 
 
 2636    const llvm::opt::ArgList &DriverArgs,
 
 2637    llvm::opt::ArgStringList &CC1Args)
 const {
 
 2642  bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc);
 
 2643  bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc);
 
 2644  bool NoBuiltinInc = DriverArgs.hasFlag(
 
 2645      options::OPT_nobuiltininc, options::OPT_ibuiltininc, 
false);
 
 2646  bool ForceBuiltinInc = DriverArgs.hasFlag(
 
 2647      options::OPT_ibuiltininc, options::OPT_nobuiltininc, 
false);
 
 2650  if (!NoStdInc && !NoStdlibInc) {
 
 2652      llvm::sys::path::append(P, 
"usr", 
"local", 
"include");
 
 2657  if (!(NoStdInc && !ForceBuiltinInc) && !NoBuiltinInc) {
 
 2659    llvm::sys::path::append(P, 
"include");
 
 2663  if (NoStdInc || NoStdlibInc)
 
 2667  llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
 
 2668  if (!CIncludeDirs.empty()) {
 
 2670    CIncludeDirs.split(dirs, 
":");
 
 2671    for (llvm::StringRef dir : dirs) {
 
 2672      llvm::StringRef Prefix =
 
 2673          llvm::sys::path::is_absolute(dir) ? 
"" : llvm::StringRef(Sysroot);
 
 2679    llvm::sys::path::append(P, 
"usr", 
"include");
 
 
 2685    const llvm::opt::ArgList &DriverArgs,
 
 2686    llvm::opt::ArgStringList &CC1Args)
 const {
 
 2689  if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc))
 
 2698  llvm::sys::path::append(P1, 
"System", 
"Library", 
"Frameworks");
 
 2699  llvm::sys::path::append(P2, 
"System", 
"Library", 
"SubFrameworks");
 
 2700  llvm::sys::path::append(P3, 
"Library", 
"Frameworks");
 
 
 2704bool DarwinClang::AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
 
 2705                                              llvm::opt::ArgStringList &CC1Args,
 
 2707                                              llvm::StringRef Version,
 
 2708                                              llvm::StringRef ArchDir,
 
 2709                                              llvm::StringRef BitDir)
 const {
 
 2710  llvm::sys::path::append(
Base, Version);
 
 2718    if (!ArchDir.empty())
 
 2719      llvm::sys::path::append(P, ArchDir);
 
 2720    if (!BitDir.empty())
 
 2721      llvm::sys::path::append(P, BitDir);
 
 2728    llvm::sys::path::append(P, 
"backward");
 
 2736    const llvm::opt::ArgList &DriverArgs,
 
 2737    llvm::opt::ArgStringList &CC1Args)
 const {
 
 2745  if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
 
 2746                        options::OPT_nostdincxx))
 
 2767    llvm::sys::path::append(InstallBin, 
"..", 
"include", 
"c++", 
"v1");
 
 2768    if (
getVFS().exists(InstallBin)) {
 
 2771    } 
else if (DriverArgs.hasArg(options::OPT_v)) {
 
 2772      llvm::errs() << 
"ignoring nonexistent directory \"" << InstallBin
 
 2778    llvm::sys::path::append(SysrootUsr, 
"usr", 
"include", 
"c++", 
"v1");
 
 2779    if (
getVFS().exists(SysrootUsr)) {
 
 2782    } 
else if (DriverArgs.hasArg(options::OPT_v)) {
 
 2783      llvm::errs() << 
"ignoring nonexistent directory \"" << SysrootUsr
 
 2792    AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args);
 
 
 2797void AppleMachO::AddGnuCPlusPlusIncludePaths(
 
 2798    const llvm::opt::ArgList &DriverArgs,
 
 2799    llvm::opt::ArgStringList &CC1Args)
 const {}
 
 2801void DarwinClang::AddGnuCPlusPlusIncludePaths(
 
 2802    const llvm::opt::ArgList &DriverArgs,
 
 2803    llvm::opt::ArgStringList &CC1Args)
 const {
 
 2805  llvm::sys::path::append(UsrIncludeCxx, 
"usr", 
"include", 
"c++");
 
 2807  llvm::Triple::ArchType arch = 
getTriple().getArch();
 
 2808  bool IsBaseFound = 
true;
 
 2813  case llvm::Triple::x86:
 
 2814  case llvm::Triple::x86_64:
 
 2815    IsBaseFound = AddGnuCPlusPlusIncludePaths(
 
 2816        DriverArgs, CC1Args, UsrIncludeCxx, 
"4.2.1", 
"i686-apple-darwin10",
 
 2817        arch == llvm::Triple::x86_64 ? 
"x86_64" : 
"");
 
 2818    IsBaseFound |= AddGnuCPlusPlusIncludePaths(
 
 2819        DriverArgs, CC1Args, UsrIncludeCxx, 
"4.0.0", 
"i686-apple-darwin8", 
"");
 
 2822  case llvm::Triple::arm:
 
 2823  case llvm::Triple::thumb:
 
 2825        AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx, 
"4.2.1",
 
 2826                                    "arm-apple-darwin10", 
"v7");
 
 2828        AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx, 
"4.2.1",
 
 2829                                    "arm-apple-darwin10", 
"v6");
 
 2832  case llvm::Triple::aarch64:
 
 2834        AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx, 
"4.2.1",
 
 2835                                    "arm64-apple-darwin10", 
"");
 
 2845                                     ArgStringList &CmdArgs)
 const {
 
 2850    CmdArgs.push_back(
"-lc++");
 
 2851    if (Args.hasArg(options::OPT_fexperimental_library))
 
 2852      CmdArgs.push_back(
"-lc++experimental");
 
 2862    if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
 
 2864      llvm::sys::path::append(P, 
"usr", 
"lib", 
"libstdc++.dylib");
 
 2866      if (!
getVFS().exists(P)) {
 
 2867        llvm::sys::path::remove_filename(P);
 
 2868        llvm::sys::path::append(P, 
"libstdc++.6.dylib");
 
 2869        if (
getVFS().exists(P)) {
 
 2870          CmdArgs.push_back(Args.MakeArgString(P));
 
 2879    if (!
getVFS().exists(
"/usr/lib/libstdc++.dylib") &&
 
 2880        getVFS().exists(
"/usr/lib/libstdc++.6.dylib")) {
 
 2881      CmdArgs.push_back(
"/usr/lib/libstdc++.6.dylib");
 
 2886    CmdArgs.push_back(
"-lstdc++");
 
 
 2892                                   ArgStringList &CmdArgs)
 const {
 
 2898  llvm::sys::path::append(P, 
"lib", 
"darwin");
 
 2902    llvm::sys::path::append(P, 
"libclang_rt.cc_kext_watchos.a");
 
 2904    llvm::sys::path::append(P, 
"libclang_rt.cc_kext_tvos.a");
 
 2906    llvm::sys::path::append(P, 
"libclang_rt.cc_kext_ios.a");
 
 2910    llvm::sys::path::append(
 
 2911        P, llvm::Twine(
"libclang_rt.cc_kext_") +
 
 2912               llvm::Triple::getOSTypeName(llvm::Triple::XROS) + 
".a");
 
 2914    llvm::sys::path::append(P, 
"libclang_rt.cc_kext.a");
 
 2920    CmdArgs.push_back(Args.MakeArgString(P));
 
 
 2924                                     StringRef BoundArch,
 
 2926  DerivedArgList *DAL = 
new DerivedArgList(Args.getBaseArgs());
 
 2936  for (Arg *A : Args) {
 
 2945    case options::OPT_mkernel:
 
 2946    case options::OPT_fapple_kext:
 
 2948      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
 
 2951    case options::OPT_dependency_file:
 
 2952      DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
 
 2955    case options::OPT_gfull:
 
 2956      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
 
 2958          A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
 
 2961    case options::OPT_gused:
 
 2962      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
 
 2964          A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
 
 2967    case options::OPT_shared:
 
 2968      DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
 
 2971    case options::OPT_fconstant_cfstrings:
 
 2972      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
 
 2975    case options::OPT_fno_constant_cfstrings:
 
 2976      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
 
 2979    case options::OPT_Wnonportable_cfstrings:
 
 2981                      Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
 
 2984    case options::OPT_Wno_nonportable_cfstrings:
 
 2986          A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
 
 2993  if (!BoundArch.empty()) {
 
 2994    StringRef Name = BoundArch;
 
 2995    const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
 
 2996    const Option MArch = Opts.getOption(clang::driver::options::OPT_march_EQ);
 
 3002    else if (Name == 
"ppc601")
 
 3003      DAL->AddJoinedArg(
nullptr, MCpu, 
"601");
 
 3004    else if (Name == 
"ppc603")
 
 3005      DAL->AddJoinedArg(
nullptr, MCpu, 
"603");
 
 3006    else if (Name == 
"ppc604")
 
 3007      DAL->AddJoinedArg(
nullptr, MCpu, 
"604");
 
 3008    else if (Name == 
"ppc604e")
 
 3009      DAL->AddJoinedArg(
nullptr, MCpu, 
"604e");
 
 3010    else if (Name == 
"ppc750")
 
 3011      DAL->AddJoinedArg(
nullptr, MCpu, 
"750");
 
 3012    else if (Name == 
"ppc7400")
 
 3013      DAL->AddJoinedArg(
nullptr, MCpu, 
"7400");
 
 3014    else if (Name == 
"ppc7450")
 
 3015      DAL->AddJoinedArg(
nullptr, MCpu, 
"7450");
 
 3016    else if (Name == 
"ppc970")
 
 3017      DAL->AddJoinedArg(
nullptr, MCpu, 
"970");
 
 3019    else if (Name == 
"ppc64" || Name == 
"ppc64le")
 
 3020      DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
 
 3022    else if (Name == 
"i386")
 
 3024    else if (Name == 
"i486")
 
 3025      DAL->AddJoinedArg(
nullptr, MArch, 
"i486");
 
 3026    else if (Name == 
"i586")
 
 3027      DAL->AddJoinedArg(
nullptr, MArch, 
"i586");
 
 3028    else if (Name == 
"i686")
 
 3029      DAL->AddJoinedArg(
nullptr, MArch, 
"i686");
 
 3030    else if (Name == 
"pentium")
 
 3031      DAL->AddJoinedArg(
nullptr, MArch, 
"pentium");
 
 3032    else if (Name == 
"pentium2")
 
 3033      DAL->AddJoinedArg(
nullptr, MArch, 
"pentium2");
 
 3034    else if (Name == 
"pentpro")
 
 3035      DAL->AddJoinedArg(
nullptr, MArch, 
"pentiumpro");
 
 3036    else if (Name == 
"pentIIm3")
 
 3037      DAL->AddJoinedArg(
nullptr, MArch, 
"pentium2");
 
 3039    else if (Name == 
"x86_64" || Name == 
"x86_64h")
 
 3040      DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
 
 3042    else if (Name == 
"arm")
 
 3043      DAL->AddJoinedArg(
nullptr, MArch, 
"armv4t");
 
 3044    else if (Name == 
"armv4t")
 
 3045      DAL->AddJoinedArg(
nullptr, MArch, 
"armv4t");
 
 3046    else if (Name == 
"armv5")
 
 3047      DAL->AddJoinedArg(
nullptr, MArch, 
"armv5tej");
 
 3048    else if (Name == 
"xscale")
 
 3049      DAL->AddJoinedArg(
nullptr, MArch, 
"xscale");
 
 3050    else if (Name == 
"armv6")
 
 3051      DAL->AddJoinedArg(
nullptr, MArch, 
"armv6k");
 
 3052    else if (Name == 
"armv6m")
 
 3053      DAL->AddJoinedArg(
nullptr, MArch, 
"armv6m");
 
 3054    else if (Name == 
"armv7")
 
 3055      DAL->AddJoinedArg(
nullptr, MArch, 
"armv7a");
 
 3056    else if (Name == 
"armv7em")
 
 3057      DAL->AddJoinedArg(
nullptr, MArch, 
"armv7em");
 
 3058    else if (Name == 
"armv7k")
 
 3059      DAL->AddJoinedArg(
nullptr, MArch, 
"armv7k");
 
 3060    else if (Name == 
"armv7m")
 
 3061      DAL->AddJoinedArg(
nullptr, MArch, 
"armv7m");
 
 3062    else if (Name == 
"armv7s")
 
 3063      DAL->AddJoinedArg(
nullptr, MArch, 
"armv7s");
 
 
 3070                                  ArgStringList &CmdArgs,
 
 3071                                  bool ForceLinkBuiltinRT)
 const {
 
 3080  CompilerRT += Args.hasArg(options::OPT_fPIC) ? 
"_pic" : 
"_static";
 
 
 3086  llvm::Triple::OSType OS;
 
 3092    OS = llvm::Triple::MacOSX;
 
 3095    OS = llvm::Triple::IOS;
 
 3098    OS = llvm::Triple::TvOS;
 
 3101    OS = llvm::Triple::WatchOS;
 
 
 3123  VersionTuple SDKVersion = SDKInfo->getVersion();
 
 3124  switch (SDKInfo->getOS()) {
 
 3127  case llvm::Triple::MacOSX:
 
 3128    return SDKVersion >= VersionTuple(15U);
 
 3129  case llvm::Triple::IOS:
 
 3130    return SDKVersion >= VersionTuple(18U);
 
 3131  case llvm::Triple::TvOS:
 
 3132    return SDKVersion >= VersionTuple(18U);
 
 3133  case llvm::Triple::WatchOS:
 
 3134    return SDKVersion >= VersionTuple(11U);
 
 3135  case llvm::Triple::XROS:
 
 3136    return SDKVersion >= VersionTuple(2U);
 
 
 3144static inline llvm::VersionTuple
 
 3149  case llvm::Triple::Darwin:
 
 3150  case llvm::Triple::MacOSX: 
 
 3151    return llvm::VersionTuple(10U, 12U);
 
 3152  case llvm::Triple::IOS:
 
 3153  case llvm::Triple::TvOS: 
 
 3154    return llvm::VersionTuple(10U);
 
 3155  case llvm::Triple::WatchOS: 
 
 3156    return llvm::VersionTuple(3U);
 
 3159  llvm_unreachable(
"Unexpected OS");
 
 
 3163  llvm::Triple::OSType OS;
 
 3169    OS = llvm::Triple::MacOSX;
 
 3172    OS = llvm::Triple::IOS;
 
 3175    OS = llvm::Triple::TvOS;
 
 3178    OS = llvm::Triple::WatchOS;
 
 
 3190                                  llvm::opt::ArgStringList &CC1Args,
 
 3199    if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
 
 3200                           options::OPT_fno_ptrauth_calls))
 
 3201      CC1Args.push_back(
"-fptrauth-calls");
 
 3202    if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
 
 3203                           options::OPT_fno_ptrauth_returns))
 
 3204      CC1Args.push_back(
"-fptrauth-returns");
 
 3205    if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
 
 3206                           options::OPT_fno_ptrauth_intrinsics))
 
 3207      CC1Args.push_back(
"-fptrauth-intrinsics");
 
 3208    if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
 
 3209                           options::OPT_fno_ptrauth_indirect_gotos))
 
 3210      CC1Args.push_back(
"-fptrauth-indirect-gotos");
 
 3211    if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
 
 3212                           options::OPT_fno_ptrauth_auth_traps))
 
 3213      CC1Args.push_back(
"-fptrauth-auth-traps");
 
 3216    if (!DriverArgs.hasArg(
 
 3217            options::OPT_fptrauth_vtable_pointer_address_discrimination,
 
 3218            options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
 
 3219      CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
 
 3220    if (!DriverArgs.hasArg(
 
 3221            options::OPT_fptrauth_vtable_pointer_type_discrimination,
 
 3222            options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
 
 3223      CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
 
 3226    if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
 
 3227                           options::OPT_fno_ptrauth_objc_isa))
 
 3228      CC1Args.push_back(
"-fptrauth-objc-isa");
 
 3229    if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
 
 3230                           options::OPT_fno_ptrauth_objc_class_ro))
 
 3231      CC1Args.push_back(
"-fptrauth-objc-class-ro");
 
 3232    if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
 
 3233                           options::OPT_fno_ptrauth_objc_interface_sel))
 
 3234      CC1Args.push_back(
"-fptrauth-objc-interface-sel");
 
 
 3239    const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
 
 3246  if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
 
 3247                                options::OPT_fno_aligned_allocation) &&
 
 3249    CC1Args.push_back(
"-faligned-alloc-unavailable");
 
 3253  if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
 
 3254                                options::OPT_fno_sized_deallocation) &&
 
 3256    CC1Args.push_back(
"-fno-sized-deallocation");
 
 3262  CC1Args.push_back(
"-fcompatibility-qualified-id-block-type-checking");
 
 3266  if (!DriverArgs.getLastArgNoClaim(
 
 3267          options::OPT_fvisibility_inlines_hidden_static_local_var,
 
 3268          options::OPT_fno_visibility_inlines_hidden_static_local_var))
 
 3269    CC1Args.push_back(
"-fvisibility-inlines-hidden-static-local-var");
 
 3283    CC1Args.push_back(
"-fbuiltin-headers-in-system-modules");
 
 3285  if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
 
 3286                                options::OPT_fno_define_target_os_macros))
 
 3287    CC1Args.push_back(
"-fdefine-target-os-macros");
 
 3291      !DriverArgs.hasFlag(options::OPT_fmodulemap_allow_subdirectory_search,
 
 3292                          options::OPT_fno_modulemap_allow_subdirectory_search,
 
 3294    bool RequiresSubdirectorySearch;
 
 3295    VersionTuple SDKVersion = 
SDKInfo->getVersion();
 
 3298      RequiresSubdirectorySearch = 
true;
 
 3301      RequiresSubdirectorySearch = SDKVersion < VersionTuple(15, 0);
 
 3305      RequiresSubdirectorySearch = SDKVersion < VersionTuple(18, 0);
 
 3308      RequiresSubdirectorySearch = SDKVersion < VersionTuple(11, 0);
 
 3311      RequiresSubdirectorySearch = SDKVersion < VersionTuple(2, 0);
 
 3314    if (!RequiresSubdirectorySearch)
 
 3315      CC1Args.push_back(
"-fno-modulemap-allow-subdirectory-search");
 
 
 3320    const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1ASArgs)
 const {
 
 3322    CC1ASArgs.push_back(
"-darwin-target-variant-triple");
 
 3329    auto EmitTargetSDKVersionArg = [&](
const VersionTuple &
V) {
 
 3331      llvm::raw_string_ostream OS(Arg);
 
 3332      OS << 
"-target-sdk-version=" << 
V;
 
 3333      CC1ASArgs.push_back(Args.MakeArgString(Arg));
 
 3337      if (
const auto *MacOStoMacCatalystMapping = 
SDKInfo->getVersionMapping(
 
 3339        std::optional<VersionTuple> SDKVersion = MacOStoMacCatalystMapping->map(
 
 3342        EmitTargetSDKVersionArg(
 
 3346      EmitTargetSDKVersionArg(
SDKInfo->getVersion());
 
 3354        llvm::raw_string_ostream OS(Arg);
 
 3355        OS << 
"-darwin-target-variant-sdk-version=" << 
SDKInfo->getVersion();
 
 3356        CC1ASArgs.push_back(Args.MakeArgString(Arg));
 
 3357      } 
else if (
const auto *MacOStoMacCatalystMapping =
 
 3360        if (std::optional<VersionTuple> SDKVersion =
 
 3361                MacOStoMacCatalystMapping->map(
 
 3365          llvm::raw_string_ostream OS(Arg);
 
 3366          OS << 
"-darwin-target-variant-sdk-version=" << *SDKVersion;
 
 3367          CC1ASArgs.push_back(Args.MakeArgString(Arg));
 
 
 3378  DerivedArgList *DAL =
 
 3382  if (BoundArch.empty())
 
 3388  AddDeploymentTarget(*DAL);
 
 3396    for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
 
 3399      if (A->getOption().getID() != options::OPT_mkernel &&
 
 3400          A->getOption().getID() != options::OPT_fapple_kext)
 
 3402      assert(it != ie && 
"unexpected argument translation");
 
 3404      assert(A->getOption().getID() == options::OPT_static &&
 
 3405             "missing expected -static argument");
 
 3412  if ((
Arch == llvm::Triple::arm || 
Arch == llvm::Triple::thumb)) {
 
 3413    if (Args.hasFlag(options::OPT_fomit_frame_pointer,
 
 3414                     options::OPT_fno_omit_frame_pointer, 
false))
 
 3415      getDriver().
Diag(clang::diag::warn_drv_unsupported_opt_for_target)
 
 3416          << 
"-fomit-frame-pointer" << BoundArch;
 
 
 3425  if (
getArch() == llvm::Triple::x86_64 ||
 
 3427       Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
 
 3429    return (
getArch() == llvm::Triple::aarch64 ||
 
 3430            getArch() == llvm::Triple::aarch64_32)
 
 
 3438  if (
const char *S = ::getenv(
"RC_DEBUG_OPTIONS"))
 
 3439    return S[0] != 
'\0';
 
 
 3444  if (
const char *S = ::getenv(
"RC_DEBUG_PREFIX_MAP"))
 
 
 3453    return llvm::ExceptionHandling::None;
 
 3457  if (Triple.isWatchABI())
 
 3458    return llvm::ExceptionHandling::DwarfCFI;
 
 3460  return llvm::ExceptionHandling::SjLj;
 
 
 3475  return (
getArch() == llvm::Triple::x86_64 ||
 
 3476          getArch() == llvm::Triple::aarch64);
 
 
 3485                               ArgStringList &CmdArgs)
 const {
 
 3488  assert(!
isTargetXROS() && 
"xrOS always uses -platform-version");
 
 3491    CmdArgs.push_back(
"-watchos_version_min");
 
 3493    CmdArgs.push_back(
"-watchos_simulator_version_min");
 
 3495    CmdArgs.push_back(
"-tvos_version_min");
 
 3497    CmdArgs.push_back(
"-tvos_simulator_version_min");
 
 3499    CmdArgs.push_back(
"-driverkit_version_min");
 
 3501    CmdArgs.push_back(
"-ios_simulator_version_min");
 
 3503    CmdArgs.push_back(
"-iphoneos_version_min");
 
 3505    CmdArgs.push_back(
"-maccatalyst_version_min");
 
 3508    CmdArgs.push_back(
"-macosx_version_min");
 
 3514  CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
 
 3517    VersionTuple VariantTargetVersion;
 
 3519      CmdArgs.push_back(
"-macosx_version_min");
 
 3524             "unexpected target variant triple");
 
 3525      CmdArgs.push_back(
"-maccatalyst_version_min");
 
 3528    VersionTuple MinTgtVers =
 
 3530    if (MinTgtVers.getMajor() && MinTgtVers > VariantTargetVersion)
 
 3531      VariantTargetVersion = MinTgtVers;
 
 3532    CmdArgs.push_back(Args.MakeArgString(VariantTargetVersion.getAsString()));
 
 
 3543      return "mac catalyst";
 
 3554  llvm_unreachable(
"invalid platform");
 
 
 3558                                    llvm::opt::ArgStringList &CmdArgs)
 const {
 
 3559  auto EmitPlatformVersionArg =
 
 3562          const llvm::Triple &TT) {
 
 3565        CmdArgs.push_back(
"-platform_version");
 
 3566        std::string PlatformName =
 
 3569          PlatformName += 
"-simulator";
 
 3570        CmdArgs.push_back(Args.MakeArgString(PlatformName));
 
 3579        VersionTuple MinTgtVers = TT.getMinimumSupportedOSVersion();
 
 3582        CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
 
 3587          std::optional<VersionTuple> iOSSDKVersion;
 
 3589            if (
const auto *MacOStoMacCatalystMapping =
 
 3592              iOSSDKVersion = MacOStoMacCatalystMapping->map(
 
 3593                  SDKInfo->getVersion().withoutBuild(),
 
 3597          CmdArgs.push_back(Args.MakeArgString(
 
 3598              (iOSSDKVersion ? *iOSSDKVersion
 
 3605          VersionTuple SDKVersion = 
SDKInfo->getVersion().withoutBuild();
 
 3606          if (!SDKVersion.getMinor())
 
 3607            SDKVersion = VersionTuple(SDKVersion.getMajor(), 0);
 
 3608          CmdArgs.push_back(Args.MakeArgString(SDKVersion.getAsString()));
 
 3619          CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
 
 3628  VersionTuple TargetVariantVersion;
 
 3636           "unexpected target variant triple");
 
 3641  EmitPlatformVersionArg(TargetVariantVersion, Platform, Environment,
 
 
 3647                                  ArgStringList &CmdArgs) {
 
 3651      CmdArgs.push_back(
"-ldylib1.o");
 
 3658    CmdArgs.push_back(
"-ldylib1.o");
 
 3660    CmdArgs.push_back(
"-ldylib1.10.5.o");
 
 
 3665                              ArgStringList &CmdArgs) {
 
 3666  if (Args.hasArg(options::OPT_static))
 
 3671    CmdArgs.push_back(
"-lbundle1.o");
 
 
 3676                                   ArgStringList &CmdArgs) {
 
 3678    if (Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_object) ||
 
 3679        Args.hasArg(options::OPT_preload)) {
 
 3680      CmdArgs.push_back(
"-lgcrt0.o");
 
 3682      CmdArgs.push_back(
"-lgcrt1.o");
 
 3692      CmdArgs.push_back(
"-no_new_main");
 
 3694    D.
getDriver().
Diag(diag::err_drv_clang_unsupported_opt_pg_darwin)
 
 
 3700                                  ArgStringList &CmdArgs) {
 
 3703    if (D.
getArch() == llvm::Triple::aarch64)
 
 3706      CmdArgs.push_back(
"-lcrt1.o");
 
 3708      CmdArgs.push_back(
"-lcrt1.3.1.o");
 
 3715    CmdArgs.push_back(
"-lcrt1.o");
 
 3717    CmdArgs.push_back(
"-lcrt1.10.5.o");
 
 3719    CmdArgs.push_back(
"-lcrt1.10.6.o");
 
 
 3724                                    ArgStringList &CmdArgs)
 const {
 
 3726  if (Args.hasArg(options::OPT_dynamiclib))
 
 3728  else if (Args.hasArg(options::OPT_bundle))
 
 3732  else if (Args.hasArg(options::OPT_static) ||
 
 3733           Args.hasArg(options::OPT_object) ||
 
 3734           Args.hasArg(options::OPT_preload))
 
 3735    CmdArgs.push_back(
"-lcrt0.o");
 
 3739  if (
isTargetMacOS() && Args.hasArg(options::OPT_shared_libgcc) &&
 
 3741    const char *Str = Args.MakeArgString(
GetFilePath(
"crt3.o"));
 
 3742    CmdArgs.push_back(Str);
 
 
 3754  const bool IsX86_64 = 
getTriple().getArch() == llvm::Triple::x86_64;
 
 3755  const bool IsAArch64 = 
getTriple().getArch() == llvm::Triple::aarch64;
 
 3757  Res |= SanitizerKind::Address;
 
 3758  Res |= SanitizerKind::PointerCompare;
 
 3759  Res |= SanitizerKind::PointerSubtract;
 
 3760  Res |= SanitizerKind::Realtime;
 
 3761  Res |= SanitizerKind::Leak;
 
 3762  Res |= SanitizerKind::Fuzzer;
 
 3763  Res |= SanitizerKind::FuzzerNoLink;
 
 3764  Res |= SanitizerKind::ObjCCast;
 
 3771    Res |= SanitizerKind::Vptr;
 
 3773  if ((IsX86_64 || IsAArch64) &&
 
 3776    Res |= SanitizerKind::Thread;
 
 3780    Res |= SanitizerKind::Type;
 
 3784    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 void AppendPlatformPrefix(SmallString< 128 > &Path, const llvm::Triple &T)
 
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)
 
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()