Home | History | Annotate | Download | only in Driver
      1 //===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "Tools.h"
     11 #include "InputInfo.h"
     12 #include "ToolChains.h"
     13 #include "clang/Basic/CharInfo.h"
     14 #include "clang/Basic/LangOptions.h"
     15 #include "clang/Basic/ObjCRuntime.h"
     16 #include "clang/Basic/Version.h"
     17 #include "clang/Config/config.h"
     18 #include "clang/Driver/Action.h"
     19 #include "clang/Driver/Compilation.h"
     20 #include "clang/Driver/Driver.h"
     21 #include "clang/Driver/DriverDiagnostic.h"
     22 #include "clang/Driver/Job.h"
     23 #include "clang/Driver/Options.h"
     24 #include "clang/Driver/SanitizerArgs.h"
     25 #include "clang/Driver/ToolChain.h"
     26 #include "clang/Driver/Util.h"
     27 #include "llvm/ADT/STLExtras.h"
     28 #include "llvm/ADT/SmallString.h"
     29 #include "llvm/ADT/StringExtras.h"
     30 #include "llvm/ADT/StringSwitch.h"
     31 #include "llvm/ADT/Twine.h"
     32 #include "llvm/Option/Arg.h"
     33 #include "llvm/Option/ArgList.h"
     34 #include "llvm/Option/Option.h"
     35 #include "llvm/Support/CodeGen.h"
     36 #include "llvm/Support/Compression.h"
     37 #include "llvm/Support/ErrorHandling.h"
     38 #include "llvm/Support/FileSystem.h"
     39 #include "llvm/Support/Host.h"
     40 #include "llvm/Support/Path.h"
     41 #include "llvm/Support/Process.h"
     42 #include "llvm/Support/Program.h"
     43 #include "llvm/Support/raw_ostream.h"
     44 #include "llvm/Support/TargetParser.h"
     45 
     46 #ifdef LLVM_ON_UNIX
     47 #include <unistd.h> // For getuid().
     48 #endif
     49 
     50 using namespace clang::driver;
     51 using namespace clang::driver::tools;
     52 using namespace clang;
     53 using namespace llvm::opt;
     54 
     55 static const char *getSparcAsmModeForCPU(StringRef Name,
     56                                          const llvm::Triple &Triple) {
     57   if (Triple.getArch() == llvm::Triple::sparcv9) {
     58     return llvm::StringSwitch<const char *>(Name)
     59           .Case("niagara", "-Av9b")
     60           .Case("niagara2", "-Av9b")
     61           .Case("niagara3", "-Av9d")
     62           .Case("niagara4", "-Av9d")
     63           .Default("-Av9");
     64   } else {
     65     return llvm::StringSwitch<const char *>(Name)
     66           .Case("v8", "-Av8")
     67           .Case("supersparc", "-Av8")
     68           .Case("sparclite", "-Asparclite")
     69           .Case("f934", "-Asparclite")
     70           .Case("hypersparc", "-Av8")
     71           .Case("sparclite86x", "-Asparclite")
     72           .Case("sparclet", "-Asparclet")
     73           .Case("tsc701", "-Asparclet")
     74           .Case("v9", "-Av8plus")
     75           .Case("ultrasparc", "-Av8plus")
     76           .Case("ultrasparc3", "-Av8plus")
     77           .Case("niagara", "-Av8plusb")
     78           .Case("niagara2", "-Av8plusb")
     79           .Case("niagara3", "-Av8plusd")
     80           .Case("niagara4", "-Av8plusd")
     81           .Default("-Av8");
     82   }
     83 }
     84 
     85 /// CheckPreprocessingOptions - Perform some validation of preprocessing
     86 /// arguments that is shared with gcc.
     87 static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
     88   if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
     89     if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
     90         !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
     91       D.Diag(diag::err_drv_argument_only_allowed_with)
     92           << A->getBaseArg().getAsString(Args)
     93           << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
     94     }
     95   }
     96 }
     97 
     98 /// CheckCodeGenerationOptions - Perform some validation of code generation
     99 /// arguments that is shared with gcc.
    100 static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
    101   // In gcc, only ARM checks this, but it seems reasonable to check universally.
    102   if (Args.hasArg(options::OPT_static))
    103     if (const Arg *A =
    104             Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
    105       D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
    106                                                       << "-static";
    107 }
    108 
    109 // Add backslashes to escape spaces and other backslashes.
    110 // This is used for the space-separated argument list specified with
    111 // the -dwarf-debug-flags option.
    112 static void EscapeSpacesAndBackslashes(const char *Arg,
    113                                        SmallVectorImpl<char> &Res) {
    114   for (; *Arg; ++Arg) {
    115     switch (*Arg) {
    116     default:
    117       break;
    118     case ' ':
    119     case '\\':
    120       Res.push_back('\\');
    121       break;
    122     }
    123     Res.push_back(*Arg);
    124   }
    125 }
    126 
    127 // Quote target names for inclusion in GNU Make dependency files.
    128 // Only the characters '$', '#', ' ', '\t' are quoted.
    129 static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
    130   for (unsigned i = 0, e = Target.size(); i != e; ++i) {
    131     switch (Target[i]) {
    132     case ' ':
    133     case '\t':
    134       // Escape the preceding backslashes
    135       for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
    136         Res.push_back('\\');
    137 
    138       // Escape the space/tab
    139       Res.push_back('\\');
    140       break;
    141     case '$':
    142       Res.push_back('$');
    143       break;
    144     case '#':
    145       Res.push_back('\\');
    146       break;
    147     default:
    148       break;
    149     }
    150 
    151     Res.push_back(Target[i]);
    152   }
    153 }
    154 
    155 static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
    156                              const char *ArgName, const char *EnvVar) {
    157   const char *DirList = ::getenv(EnvVar);
    158   bool CombinedArg = false;
    159 
    160   if (!DirList)
    161     return; // Nothing to do.
    162 
    163   StringRef Name(ArgName);
    164   if (Name.equals("-I") || Name.equals("-L"))
    165     CombinedArg = true;
    166 
    167   StringRef Dirs(DirList);
    168   if (Dirs.empty()) // Empty string should not add '.'.
    169     return;
    170 
    171   StringRef::size_type Delim;
    172   while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
    173     if (Delim == 0) { // Leading colon.
    174       if (CombinedArg) {
    175         CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
    176       } else {
    177         CmdArgs.push_back(ArgName);
    178         CmdArgs.push_back(".");
    179       }
    180     } else {
    181       if (CombinedArg) {
    182         CmdArgs.push_back(
    183             Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
    184       } else {
    185         CmdArgs.push_back(ArgName);
    186         CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
    187       }
    188     }
    189     Dirs = Dirs.substr(Delim + 1);
    190   }
    191 
    192   if (Dirs.empty()) { // Trailing colon.
    193     if (CombinedArg) {
    194       CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
    195     } else {
    196       CmdArgs.push_back(ArgName);
    197       CmdArgs.push_back(".");
    198     }
    199   } else { // Add the last path.
    200     if (CombinedArg) {
    201       CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
    202     } else {
    203       CmdArgs.push_back(ArgName);
    204       CmdArgs.push_back(Args.MakeArgString(Dirs));
    205     }
    206   }
    207 }
    208 
    209 static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
    210                             const ArgList &Args, ArgStringList &CmdArgs) {
    211   const Driver &D = TC.getDriver();
    212 
    213   // Add extra linker input arguments which are not treated as inputs
    214   // (constructed via -Xarch_).
    215   Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
    216 
    217   for (const auto &II : Inputs) {
    218     if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
    219       // Don't try to pass LLVM inputs unless we have native support.
    220       D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
    221 
    222     // Add filenames immediately.
    223     if (II.isFilename()) {
    224       CmdArgs.push_back(II.getFilename());
    225       continue;
    226     }
    227 
    228     // Otherwise, this is a linker input argument.
    229     const Arg &A = II.getInputArg();
    230 
    231     // Handle reserved library options.
    232     if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
    233       TC.AddCXXStdlibLibArgs(Args, CmdArgs);
    234     else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
    235       TC.AddCCKextLibArgs(Args, CmdArgs);
    236     else if (A.getOption().matches(options::OPT_z)) {
    237       // Pass -z prefix for gcc linker compatibility.
    238       A.claim();
    239       A.render(Args, CmdArgs);
    240     } else {
    241       A.renderAsInput(Args, CmdArgs);
    242     }
    243   }
    244 
    245   // LIBRARY_PATH - included following the user specified library paths.
    246   //                and only supported on native toolchains.
    247   if (!TC.isCrossCompiling())
    248     addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
    249 }
    250 
    251 /// \brief Determine whether Objective-C automated reference counting is
    252 /// enabled.
    253 static bool isObjCAutoRefCount(const ArgList &Args) {
    254   return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
    255 }
    256 
    257 /// \brief Determine whether we are linking the ObjC runtime.
    258 static bool isObjCRuntimeLinked(const ArgList &Args) {
    259   if (isObjCAutoRefCount(Args)) {
    260     Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
    261     return true;
    262   }
    263   return Args.hasArg(options::OPT_fobjc_link_runtime);
    264 }
    265 
    266 static bool forwardToGCC(const Option &O) {
    267   // Don't forward inputs from the original command line.  They are added from
    268   // InputInfoList.
    269   return O.getKind() != Option::InputClass &&
    270          !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
    271 }
    272 
    273 void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
    274                                     const Driver &D, const ArgList &Args,
    275                                     ArgStringList &CmdArgs,
    276                                     const InputInfo &Output,
    277                                     const InputInfoList &Inputs,
    278                                     const ToolChain *AuxToolChain) const {
    279   Arg *A;
    280 
    281   CheckPreprocessingOptions(D, Args);
    282 
    283   Args.AddLastArg(CmdArgs, options::OPT_C);
    284   Args.AddLastArg(CmdArgs, options::OPT_CC);
    285 
    286   // Handle dependency file generation.
    287   if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
    288       (A = Args.getLastArg(options::OPT_MD)) ||
    289       (A = Args.getLastArg(options::OPT_MMD))) {
    290     // Determine the output location.
    291     const char *DepFile;
    292     if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
    293       DepFile = MF->getValue();
    294       C.addFailureResultFile(DepFile, &JA);
    295     } else if (Output.getType() == types::TY_Dependencies) {
    296       DepFile = Output.getFilename();
    297     } else if (A->getOption().matches(options::OPT_M) ||
    298                A->getOption().matches(options::OPT_MM)) {
    299       DepFile = "-";
    300     } else {
    301       DepFile = getDependencyFileName(Args, Inputs);
    302       C.addFailureResultFile(DepFile, &JA);
    303     }
    304     CmdArgs.push_back("-dependency-file");
    305     CmdArgs.push_back(DepFile);
    306 
    307     // Add a default target if one wasn't specified.
    308     if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
    309       const char *DepTarget;
    310 
    311       // If user provided -o, that is the dependency target, except
    312       // when we are only generating a dependency file.
    313       Arg *OutputOpt = Args.getLastArg(options::OPT_o);
    314       if (OutputOpt && Output.getType() != types::TY_Dependencies) {
    315         DepTarget = OutputOpt->getValue();
    316       } else {
    317         // Otherwise derive from the base input.
    318         //
    319         // FIXME: This should use the computed output file location.
    320         SmallString<128> P(Inputs[0].getBaseInput());
    321         llvm::sys::path::replace_extension(P, "o");
    322         DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
    323       }
    324 
    325       CmdArgs.push_back("-MT");
    326       SmallString<128> Quoted;
    327       QuoteTarget(DepTarget, Quoted);
    328       CmdArgs.push_back(Args.MakeArgString(Quoted));
    329     }
    330 
    331     if (A->getOption().matches(options::OPT_M) ||
    332         A->getOption().matches(options::OPT_MD))
    333       CmdArgs.push_back("-sys-header-deps");
    334     if ((isa<PrecompileJobAction>(JA) &&
    335          !Args.hasArg(options::OPT_fno_module_file_deps)) ||
    336         Args.hasArg(options::OPT_fmodule_file_deps))
    337       CmdArgs.push_back("-module-file-deps");
    338   }
    339 
    340   if (Args.hasArg(options::OPT_MG)) {
    341     if (!A || A->getOption().matches(options::OPT_MD) ||
    342         A->getOption().matches(options::OPT_MMD))
    343       D.Diag(diag::err_drv_mg_requires_m_or_mm);
    344     CmdArgs.push_back("-MG");
    345   }
    346 
    347   Args.AddLastArg(CmdArgs, options::OPT_MP);
    348   Args.AddLastArg(CmdArgs, options::OPT_MV);
    349 
    350   // Convert all -MQ <target> args to -MT <quoted target>
    351   for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
    352     A->claim();
    353 
    354     if (A->getOption().matches(options::OPT_MQ)) {
    355       CmdArgs.push_back("-MT");
    356       SmallString<128> Quoted;
    357       QuoteTarget(A->getValue(), Quoted);
    358       CmdArgs.push_back(Args.MakeArgString(Quoted));
    359 
    360       // -MT flag - no change
    361     } else {
    362       A->render(Args, CmdArgs);
    363     }
    364   }
    365 
    366   // Add -i* options, and automatically translate to
    367   // -include-pch/-include-pth for transparent PCH support. It's
    368   // wonky, but we include looking for .gch so we can support seamless
    369   // replacement into a build system already set up to be generating
    370   // .gch files.
    371   bool RenderedImplicitInclude = false;
    372   for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
    373     if (A->getOption().matches(options::OPT_include)) {
    374       bool IsFirstImplicitInclude = !RenderedImplicitInclude;
    375       RenderedImplicitInclude = true;
    376 
    377       // Use PCH if the user requested it.
    378       bool UsePCH = D.CCCUsePCH;
    379 
    380       bool FoundPTH = false;
    381       bool FoundPCH = false;
    382       SmallString<128> P(A->getValue());
    383       // We want the files to have a name like foo.h.pch. Add a dummy extension
    384       // so that replace_extension does the right thing.
    385       P += ".dummy";
    386       if (UsePCH) {
    387         llvm::sys::path::replace_extension(P, "pch");
    388         if (llvm::sys::fs::exists(P))
    389           FoundPCH = true;
    390       }
    391 
    392       if (!FoundPCH) {
    393         llvm::sys::path::replace_extension(P, "pth");
    394         if (llvm::sys::fs::exists(P))
    395           FoundPTH = true;
    396       }
    397 
    398       if (!FoundPCH && !FoundPTH) {
    399         llvm::sys::path::replace_extension(P, "gch");
    400         if (llvm::sys::fs::exists(P)) {
    401           FoundPCH = UsePCH;
    402           FoundPTH = !UsePCH;
    403         }
    404       }
    405 
    406       if (FoundPCH || FoundPTH) {
    407         if (IsFirstImplicitInclude) {
    408           A->claim();
    409           if (UsePCH)
    410             CmdArgs.push_back("-include-pch");
    411           else
    412             CmdArgs.push_back("-include-pth");
    413           CmdArgs.push_back(Args.MakeArgString(P));
    414           continue;
    415         } else {
    416           // Ignore the PCH if not first on command line and emit warning.
    417           D.Diag(diag::warn_drv_pch_not_first_include) << P
    418                                                        << A->getAsString(Args);
    419         }
    420       }
    421     }
    422 
    423     // Not translated, render as usual.
    424     A->claim();
    425     A->render(Args, CmdArgs);
    426   }
    427 
    428   Args.AddAllArgs(CmdArgs,
    429                   {options::OPT_D, options::OPT_U, options::OPT_I_Group,
    430                    options::OPT_F, options::OPT_index_header_map});
    431 
    432   // Add -Wp, and -Xpreprocessor if using the preprocessor.
    433 
    434   // FIXME: There is a very unfortunate problem here, some troubled
    435   // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
    436   // really support that we would have to parse and then translate
    437   // those options. :(
    438   Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
    439                        options::OPT_Xpreprocessor);
    440 
    441   // -I- is a deprecated GCC feature, reject it.
    442   if (Arg *A = Args.getLastArg(options::OPT_I_))
    443     D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
    444 
    445   // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
    446   // -isysroot to the CC1 invocation.
    447   StringRef sysroot = C.getSysRoot();
    448   if (sysroot != "") {
    449     if (!Args.hasArg(options::OPT_isysroot)) {
    450       CmdArgs.push_back("-isysroot");
    451       CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
    452     }
    453   }
    454 
    455   // Parse additional include paths from environment variables.
    456   // FIXME: We should probably sink the logic for handling these from the
    457   // frontend into the driver. It will allow deleting 4 otherwise unused flags.
    458   // CPATH - included following the user specified includes (but prior to
    459   // builtin and standard includes).
    460   addDirectoryList(Args, CmdArgs, "-I", "CPATH");
    461   // C_INCLUDE_PATH - system includes enabled when compiling C.
    462   addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
    463   // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
    464   addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
    465   // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
    466   addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
    467   // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
    468   addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
    469 
    470   // Optional AuxToolChain indicates that we need to include headers
    471   // for more than one target. If that's the case, add include paths
    472   // from AuxToolChain right after include paths of the same kind for
    473   // the current target.
    474 
    475   // Add C++ include arguments, if needed.
    476   if (types::isCXX(Inputs[0].getType())) {
    477     getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
    478     if (AuxToolChain)
    479       AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
    480   }
    481 
    482   // Add system include arguments.
    483   getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
    484   if (AuxToolChain)
    485       AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
    486 
    487   // Add CUDA include arguments, if needed.
    488   if (types::isCuda(Inputs[0].getType()))
    489     getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
    490 }
    491 
    492 // FIXME: Move to target hook.
    493 static bool isSignedCharDefault(const llvm::Triple &Triple) {
    494   switch (Triple.getArch()) {
    495   default:
    496     return true;
    497 
    498   case llvm::Triple::aarch64:
    499   case llvm::Triple::aarch64_be:
    500   case llvm::Triple::arm:
    501   case llvm::Triple::armeb:
    502   case llvm::Triple::thumb:
    503   case llvm::Triple::thumbeb:
    504     if (Triple.isOSDarwin() || Triple.isOSWindows())
    505       return true;
    506     return false;
    507 
    508   case llvm::Triple::ppc:
    509   case llvm::Triple::ppc64:
    510     if (Triple.isOSDarwin())
    511       return true;
    512     return false;
    513 
    514   case llvm::Triple::hexagon:
    515   case llvm::Triple::ppc64le:
    516   case llvm::Triple::systemz:
    517   case llvm::Triple::xcore:
    518     return false;
    519   }
    520 }
    521 
    522 static bool isNoCommonDefault(const llvm::Triple &Triple) {
    523   switch (Triple.getArch()) {
    524   default:
    525     return false;
    526 
    527   case llvm::Triple::xcore:
    528   case llvm::Triple::wasm32:
    529   case llvm::Triple::wasm64:
    530     return true;
    531   }
    532 }
    533 
    534 // ARM tools start.
    535 
    536 // Get SubArch (vN).
    537 static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
    538   llvm::StringRef Arch = Triple.getArchName();
    539   return llvm::ARM::parseArchVersion(Arch);
    540 }
    541 
    542 // True if M-profile.
    543 static bool isARMMProfile(const llvm::Triple &Triple) {
    544   llvm::StringRef Arch = Triple.getArchName();
    545   unsigned Profile = llvm::ARM::parseArchProfile(Arch);
    546   return Profile == llvm::ARM::PK_M;
    547 }
    548 
    549 // Get Arch/CPU from args.
    550 static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
    551                                   llvm::StringRef &CPU, bool FromAs = false) {
    552   if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
    553     CPU = A->getValue();
    554   if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
    555     Arch = A->getValue();
    556   if (!FromAs)
    557     return;
    558 
    559   for (const Arg *A :
    560        Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
    561     StringRef Value = A->getValue();
    562     if (Value.startswith("-mcpu="))
    563       CPU = Value.substr(6);
    564     if (Value.startswith("-march="))
    565       Arch = Value.substr(7);
    566   }
    567 }
    568 
    569 // Handle -mhwdiv=.
    570 // FIXME: Use ARMTargetParser.
    571 static void getARMHWDivFeatures(const Driver &D, const Arg *A,
    572                                 const ArgList &Args, StringRef HWDiv,
    573                                 std::vector<const char *> &Features) {
    574   unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
    575   if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
    576     D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
    577 }
    578 
    579 // Handle -mfpu=.
    580 static void getARMFPUFeatures(const Driver &D, const Arg *A,
    581                               const ArgList &Args, StringRef FPU,
    582                               std::vector<const char *> &Features) {
    583   unsigned FPUID = llvm::ARM::parseFPU(FPU);
    584   if (!llvm::ARM::getFPUFeatures(FPUID, Features))
    585     D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
    586 }
    587 
    588 // Decode ARM features from string like +[no]featureA+[no]featureB+...
    589 static bool DecodeARMFeatures(const Driver &D, StringRef text,
    590                               std::vector<const char *> &Features) {
    591   SmallVector<StringRef, 8> Split;
    592   text.split(Split, StringRef("+"), -1, false);
    593 
    594   for (StringRef Feature : Split) {
    595     const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
    596     if (FeatureName)
    597       Features.push_back(FeatureName);
    598     else
    599       return false;
    600   }
    601   return true;
    602 }
    603 
    604 // Check if -march is valid by checking if it can be canonicalised and parsed.
    605 // getARMArch is used here instead of just checking the -march value in order
    606 // to handle -march=native correctly.
    607 static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
    608                              llvm::StringRef ArchName,
    609                              std::vector<const char *> &Features,
    610                              const llvm::Triple &Triple) {
    611   std::pair<StringRef, StringRef> Split = ArchName.split("+");
    612 
    613   std::string MArch = arm::getARMArch(ArchName, Triple);
    614   if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
    615       (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
    616     D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
    617 }
    618 
    619 // Check -mcpu=. Needs ArchName to handle -mcpu=generic.
    620 static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
    621                             llvm::StringRef CPUName, llvm::StringRef ArchName,
    622                             std::vector<const char *> &Features,
    623                             const llvm::Triple &Triple) {
    624   std::pair<StringRef, StringRef> Split = CPUName.split("+");
    625 
    626   std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
    627   if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
    628       (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
    629     D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
    630 }
    631 
    632 static bool useAAPCSForMachO(const llvm::Triple &T) {
    633   // The backend is hardwired to assume AAPCS for M-class processors, ensure
    634   // the frontend matches that.
    635   return T.getEnvironment() == llvm::Triple::EABI ||
    636          T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
    637 }
    638 
    639 // Select the float ABI as determined by -msoft-float, -mhard-float, and
    640 // -mfloat-abi=.
    641 arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
    642   const Driver &D = TC.getDriver();
    643   const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
    644   auto SubArch = getARMSubArchVersionNumber(Triple);
    645   arm::FloatABI ABI = FloatABI::Invalid;
    646   if (Arg *A =
    647           Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
    648                           options::OPT_mfloat_abi_EQ)) {
    649     if (A->getOption().matches(options::OPT_msoft_float)) {
    650       ABI = FloatABI::Soft;
    651     } else if (A->getOption().matches(options::OPT_mhard_float)) {
    652       ABI = FloatABI::Hard;
    653     } else {
    654       ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
    655                 .Case("soft", FloatABI::Soft)
    656                 .Case("softfp", FloatABI::SoftFP)
    657                 .Case("hard", FloatABI::Hard)
    658                 .Default(FloatABI::Invalid);
    659       if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
    660         D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
    661         ABI = FloatABI::Soft;
    662       }
    663     }
    664 
    665     // It is incorrect to select hard float ABI on MachO platforms if the ABI is
    666     // "apcs-gnu".
    667     if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
    668         ABI == FloatABI::Hard) {
    669       D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
    670                                                        << Triple.getArchName();
    671     }
    672   }
    673 
    674   // If unspecified, choose the default based on the platform.
    675   if (ABI == FloatABI::Invalid) {
    676     switch (Triple.getOS()) {
    677     case llvm::Triple::Darwin:
    678     case llvm::Triple::MacOSX:
    679     case llvm::Triple::IOS:
    680     case llvm::Triple::TvOS: {
    681       // Darwin defaults to "softfp" for v6 and v7.
    682       ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
    683       break;
    684     }
    685     case llvm::Triple::WatchOS:
    686       ABI = FloatABI::Hard;
    687       break;
    688 
    689     // FIXME: this is invalid for WindowsCE
    690     case llvm::Triple::Win32:
    691       ABI = FloatABI::Hard;
    692       break;
    693 
    694     case llvm::Triple::FreeBSD:
    695       switch (Triple.getEnvironment()) {
    696       case llvm::Triple::GNUEABIHF:
    697         ABI = FloatABI::Hard;
    698         break;
    699       default:
    700         // FreeBSD defaults to soft float
    701         ABI = FloatABI::Soft;
    702         break;
    703       }
    704       break;
    705 
    706     default:
    707       switch (Triple.getEnvironment()) {
    708       case llvm::Triple::GNUEABIHF:
    709       case llvm::Triple::EABIHF:
    710         ABI = FloatABI::Hard;
    711         break;
    712       case llvm::Triple::GNUEABI:
    713       case llvm::Triple::EABI:
    714         // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
    715         ABI = FloatABI::SoftFP;
    716         break;
    717       case llvm::Triple::Android:
    718         ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
    719         break;
    720       default:
    721         // Assume "soft", but warn the user we are guessing.
    722         ABI = FloatABI::Soft;
    723         if (Triple.getOS() != llvm::Triple::UnknownOS ||
    724             !Triple.isOSBinFormatMachO())
    725           D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
    726         break;
    727       }
    728     }
    729   }
    730 
    731   assert(ABI != FloatABI::Invalid && "must select an ABI");
    732   return ABI;
    733 }
    734 
    735 static void getARMTargetFeatures(const ToolChain &TC,
    736                                  const llvm::Triple &Triple,
    737                                  const ArgList &Args,
    738                                  std::vector<const char *> &Features,
    739                                  bool ForAS) {
    740   const Driver &D = TC.getDriver();
    741 
    742   bool KernelOrKext =
    743       Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
    744   arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
    745   const Arg *WaCPU = nullptr, *WaFPU = nullptr;
    746   const Arg *WaHDiv = nullptr, *WaArch = nullptr;
    747 
    748   if (!ForAS) {
    749     // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
    750     // yet (it uses the -mfloat-abi and -msoft-float options), and it is
    751     // stripped out by the ARM target. We should probably pass this a new
    752     // -target-option, which is handled by the -cc1/-cc1as invocation.
    753     //
    754     // FIXME2:  For consistency, it would be ideal if we set up the target
    755     // machine state the same when using the frontend or the assembler. We don't
    756     // currently do that for the assembler, we pass the options directly to the
    757     // backend and never even instantiate the frontend TargetInfo. If we did,
    758     // and used its handleTargetFeatures hook, then we could ensure the
    759     // assembler and the frontend behave the same.
    760 
    761     // Use software floating point operations?
    762     if (ABI == arm::FloatABI::Soft)
    763       Features.push_back("+soft-float");
    764 
    765     // Use software floating point argument passing?
    766     if (ABI != arm::FloatABI::Hard)
    767       Features.push_back("+soft-float-abi");
    768   } else {
    769     // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
    770     // to the assembler correctly.
    771     for (const Arg *A :
    772          Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
    773       StringRef Value = A->getValue();
    774       if (Value.startswith("-mfpu=")) {
    775         WaFPU = A;
    776       } else if (Value.startswith("-mcpu=")) {
    777         WaCPU = A;
    778       } else if (Value.startswith("-mhwdiv=")) {
    779         WaHDiv = A;
    780       } else if (Value.startswith("-march=")) {
    781         WaArch = A;
    782       }
    783     }
    784   }
    785 
    786   // Check -march. ClangAs gives preference to -Wa,-march=.
    787   const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
    788   StringRef ArchName;
    789   if (WaArch) {
    790     if (ArchArg)
    791       D.Diag(clang::diag::warn_drv_unused_argument)
    792           << ArchArg->getAsString(Args);
    793     ArchName = StringRef(WaArch->getValue()).substr(7);
    794     checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
    795     // FIXME: Set Arch.
    796     D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
    797   } else if (ArchArg) {
    798     ArchName = ArchArg->getValue();
    799     checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
    800   }
    801 
    802   // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
    803   const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
    804   StringRef CPUName;
    805   if (WaCPU) {
    806     if (CPUArg)
    807       D.Diag(clang::diag::warn_drv_unused_argument)
    808           << CPUArg->getAsString(Args);
    809     CPUName = StringRef(WaCPU->getValue()).substr(6);
    810     checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
    811   } else if (CPUArg) {
    812     CPUName = CPUArg->getValue();
    813     checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
    814   }
    815 
    816   // Add CPU features for generic CPUs
    817   if (CPUName == "native") {
    818     llvm::StringMap<bool> HostFeatures;
    819     if (llvm::sys::getHostCPUFeatures(HostFeatures))
    820       for (auto &F : HostFeatures)
    821         Features.push_back(
    822             Args.MakeArgString((F.second ? "+" : "-") + F.first()));
    823   }
    824 
    825   // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
    826   const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
    827   if (WaFPU) {
    828     if (FPUArg)
    829       D.Diag(clang::diag::warn_drv_unused_argument)
    830           << FPUArg->getAsString(Args);
    831     getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
    832                       Features);
    833   } else if (FPUArg) {
    834     getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
    835   }
    836 
    837   // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
    838   const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
    839   if (WaHDiv) {
    840     if (HDivArg)
    841       D.Diag(clang::diag::warn_drv_unused_argument)
    842           << HDivArg->getAsString(Args);
    843     getARMHWDivFeatures(D, WaHDiv, Args,
    844                         StringRef(WaHDiv->getValue()).substr(8), Features);
    845   } else if (HDivArg)
    846     getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
    847 
    848   // Setting -msoft-float effectively disables NEON because of the GCC
    849   // implementation, although the same isn't true of VFP or VFP3.
    850   if (ABI == arm::FloatABI::Soft) {
    851     Features.push_back("-neon");
    852     // Also need to explicitly disable features which imply NEON.
    853     Features.push_back("-crypto");
    854   }
    855 
    856   // En/disable crc code generation.
    857   if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
    858     if (A->getOption().matches(options::OPT_mcrc))
    859       Features.push_back("+crc");
    860     else
    861       Features.push_back("-crc");
    862   }
    863 
    864   if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
    865     Features.insert(Features.begin(), "+v8.1a");
    866   }
    867 
    868   // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
    869   // neither options are specified, see if we are compiling for kernel/kext and
    870   // decide whether to pass "+long-calls" based on the OS and its version.
    871   if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
    872                                options::OPT_mno_long_calls)) {
    873     if (A->getOption().matches(options::OPT_mlong_calls))
    874       Features.push_back("+long-calls");
    875   } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
    876              !Triple.isWatchOS()) {
    877       Features.push_back("+long-calls");
    878   }
    879 
    880   // Kernel code has more strict alignment requirements.
    881   if (KernelOrKext)
    882     Features.push_back("+strict-align");
    883   else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
    884                                     options::OPT_munaligned_access)) {
    885     if (A->getOption().matches(options::OPT_munaligned_access)) {
    886       // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
    887       if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
    888         D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
    889     } else
    890       Features.push_back("+strict-align");
    891   } else {
    892     // Assume pre-ARMv6 doesn't support unaligned accesses.
    893     //
    894     // ARMv6 may or may not support unaligned accesses depending on the
    895     // SCTLR.U bit, which is architecture-specific. We assume ARMv6
    896     // Darwin and NetBSD targets support unaligned accesses, and others don't.
    897     //
    898     // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
    899     // which raises an alignment fault on unaligned accesses. Linux
    900     // defaults this bit to 0 and handles it as a system-wide (not
    901     // per-process) setting. It is therefore safe to assume that ARMv7+
    902     // Linux targets support unaligned accesses. The same goes for NaCl.
    903     //
    904     // The above behavior is consistent with GCC.
    905     int VersionNum = getARMSubArchVersionNumber(Triple);
    906     if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
    907       if (VersionNum < 6 ||
    908           Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
    909         Features.push_back("+strict-align");
    910     } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
    911       if (VersionNum < 7)
    912         Features.push_back("+strict-align");
    913     } else
    914       Features.push_back("+strict-align");
    915   }
    916 
    917   // llvm does not support reserving registers in general. There is support
    918   // for reserving r9 on ARM though (defined as a platform-specific register
    919   // in ARM EABI).
    920   if (Args.hasArg(options::OPT_ffixed_r9))
    921     Features.push_back("+reserve-r9");
    922 
    923   // The kext linker doesn't know how to deal with movw/movt.
    924   if (KernelOrKext)
    925     Features.push_back("+no-movt");
    926 }
    927 
    928 void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
    929                              ArgStringList &CmdArgs, bool KernelOrKext) const {
    930   // Select the ABI to use.
    931   // FIXME: Support -meabi.
    932   // FIXME: Parts of this are duplicated in the backend, unify this somehow.
    933   const char *ABIName = nullptr;
    934   if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
    935     ABIName = A->getValue();
    936   } else if (Triple.isOSBinFormatMachO()) {
    937     if (useAAPCSForMachO(Triple)) {
    938       ABIName = "aapcs";
    939     } else if (Triple.isWatchOS()) {
    940       ABIName = "aapcs16";
    941     } else {
    942       ABIName = "apcs-gnu";
    943     }
    944   } else if (Triple.isOSWindows()) {
    945     // FIXME: this is invalid for WindowsCE
    946     ABIName = "aapcs";
    947   } else {
    948     // Select the default based on the platform.
    949     switch (Triple.getEnvironment()) {
    950     case llvm::Triple::Android:
    951     case llvm::Triple::GNUEABI:
    952     case llvm::Triple::GNUEABIHF:
    953       ABIName = "aapcs-linux";
    954       break;
    955     case llvm::Triple::EABIHF:
    956     case llvm::Triple::EABI:
    957       ABIName = "aapcs";
    958       break;
    959     default:
    960       if (Triple.getOS() == llvm::Triple::NetBSD)
    961         ABIName = "apcs-gnu";
    962       else
    963         ABIName = "aapcs";
    964       break;
    965     }
    966   }
    967   CmdArgs.push_back("-target-abi");
    968   CmdArgs.push_back(ABIName);
    969 
    970   // Determine floating point ABI from the options & target defaults.
    971   arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
    972   if (ABI == arm::FloatABI::Soft) {
    973     // Floating point operations and argument passing are soft.
    974     // FIXME: This changes CPP defines, we need -target-soft-float.
    975     CmdArgs.push_back("-msoft-float");
    976     CmdArgs.push_back("-mfloat-abi");
    977     CmdArgs.push_back("soft");
    978   } else if (ABI == arm::FloatABI::SoftFP) {
    979     // Floating point operations are hard, but argument passing is soft.
    980     CmdArgs.push_back("-mfloat-abi");
    981     CmdArgs.push_back("soft");
    982   } else {
    983     // Floating point operations and argument passing are hard.
    984     assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
    985     CmdArgs.push_back("-mfloat-abi");
    986     CmdArgs.push_back("hard");
    987   }
    988 
    989   // Forward the -mglobal-merge option for explicit control over the pass.
    990   if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
    991                                options::OPT_mno_global_merge)) {
    992     CmdArgs.push_back("-backend-option");
    993     if (A->getOption().matches(options::OPT_mno_global_merge))
    994       CmdArgs.push_back("-arm-global-merge=false");
    995     else
    996       CmdArgs.push_back("-arm-global-merge=true");
    997   }
    998 
    999   if (!Args.hasFlag(options::OPT_mimplicit_float,
   1000                     options::OPT_mno_implicit_float, true))
   1001     CmdArgs.push_back("-no-implicit-float");
   1002 }
   1003 // ARM tools end.
   1004 
   1005 /// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
   1006 /// targeting.
   1007 static std::string getAArch64TargetCPU(const ArgList &Args) {
   1008   Arg *A;
   1009   std::string CPU;
   1010   // If we have -mtune or -mcpu, use that.
   1011   if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
   1012     CPU = StringRef(A->getValue()).lower();
   1013   } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
   1014     StringRef Mcpu = A->getValue();
   1015     CPU = Mcpu.split("+").first.lower();
   1016   }
   1017 
   1018   // Handle CPU name is 'native'.
   1019   if (CPU == "native")
   1020     return llvm::sys::getHostCPUName();
   1021   else if (CPU.size())
   1022     return CPU;
   1023 
   1024   // Make sure we pick "cyclone" if -arch is used.
   1025   // FIXME: Should this be picked by checking the target triple instead?
   1026   if (Args.getLastArg(options::OPT_arch))
   1027     return "cyclone";
   1028 
   1029   return "generic";
   1030 }
   1031 
   1032 void Clang::AddAArch64TargetArgs(const ArgList &Args,
   1033                                  ArgStringList &CmdArgs) const {
   1034   std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
   1035   llvm::Triple Triple(TripleStr);
   1036 
   1037   if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
   1038       Args.hasArg(options::OPT_mkernel) ||
   1039       Args.hasArg(options::OPT_fapple_kext))
   1040     CmdArgs.push_back("-disable-red-zone");
   1041 
   1042   if (!Args.hasFlag(options::OPT_mimplicit_float,
   1043                     options::OPT_mno_implicit_float, true))
   1044     CmdArgs.push_back("-no-implicit-float");
   1045 
   1046   const char *ABIName = nullptr;
   1047   if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
   1048     ABIName = A->getValue();
   1049   else if (Triple.isOSDarwin())
   1050     ABIName = "darwinpcs";
   1051   else
   1052     ABIName = "aapcs";
   1053 
   1054   CmdArgs.push_back("-target-abi");
   1055   CmdArgs.push_back(ABIName);
   1056 
   1057   if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
   1058                                options::OPT_mno_fix_cortex_a53_835769)) {
   1059     CmdArgs.push_back("-backend-option");
   1060     if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
   1061       CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
   1062     else
   1063       CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
   1064   } else if (Triple.isAndroid()) {
   1065     // Enabled A53 errata (835769) workaround by default on android
   1066     CmdArgs.push_back("-backend-option");
   1067     CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
   1068   }
   1069 
   1070   // Forward the -mglobal-merge option for explicit control over the pass.
   1071   if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
   1072                                options::OPT_mno_global_merge)) {
   1073     CmdArgs.push_back("-backend-option");
   1074     if (A->getOption().matches(options::OPT_mno_global_merge))
   1075       CmdArgs.push_back("-aarch64-global-merge=false");
   1076     else
   1077       CmdArgs.push_back("-aarch64-global-merge=true");
   1078   }
   1079 }
   1080 
   1081 // Get CPU and ABI names. They are not independent
   1082 // so we have to calculate them together.
   1083 void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
   1084                             StringRef &CPUName, StringRef &ABIName) {
   1085   const char *DefMips32CPU = "mips32r2";
   1086   const char *DefMips64CPU = "mips64r2";
   1087 
   1088   // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
   1089   // default for mips64(el)?-img-linux-gnu.
   1090   if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
   1091       Triple.getEnvironment() == llvm::Triple::GNU) {
   1092     DefMips32CPU = "mips32r6";
   1093     DefMips64CPU = "mips64r6";
   1094   }
   1095 
   1096   // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
   1097   if (Triple.isAndroid())
   1098     DefMips64CPU = "mips64r6";
   1099 
   1100   // MIPS3 is the default for mips64*-unknown-openbsd.
   1101   if (Triple.getOS() == llvm::Triple::OpenBSD)
   1102     DefMips64CPU = "mips3";
   1103 
   1104   if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
   1105     CPUName = A->getValue();
   1106 
   1107   if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
   1108     ABIName = A->getValue();
   1109     // Convert a GNU style Mips ABI name to the name
   1110     // accepted by LLVM Mips backend.
   1111     ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
   1112                   .Case("32", "o32")
   1113                   .Case("64", "n64")
   1114                   .Default(ABIName);
   1115   }
   1116 
   1117   // Setup default CPU and ABI names.
   1118   if (CPUName.empty() && ABIName.empty()) {
   1119     switch (Triple.getArch()) {
   1120     default:
   1121       llvm_unreachable("Unexpected triple arch name");
   1122     case llvm::Triple::mips:
   1123     case llvm::Triple::mipsel:
   1124       CPUName = DefMips32CPU;
   1125       break;
   1126     case llvm::Triple::mips64:
   1127     case llvm::Triple::mips64el:
   1128       CPUName = DefMips64CPU;
   1129       break;
   1130     }
   1131   }
   1132 
   1133   if (ABIName.empty()) {
   1134     // Deduce ABI name from the target triple.
   1135     if (Triple.getArch() == llvm::Triple::mips ||
   1136         Triple.getArch() == llvm::Triple::mipsel)
   1137       ABIName = "o32";
   1138     else
   1139       ABIName = "n64";
   1140   }
   1141 
   1142   if (CPUName.empty()) {
   1143     // Deduce CPU name from ABI name.
   1144     CPUName = llvm::StringSwitch<const char *>(ABIName)
   1145                   .Cases("o32", "eabi", DefMips32CPU)
   1146                   .Cases("n32", "n64", DefMips64CPU)
   1147                   .Default("");
   1148   }
   1149 
   1150   // FIXME: Warn on inconsistent use of -march and -mabi.
   1151 }
   1152 
   1153 std::string mips::getMipsABILibSuffix(const ArgList &Args,
   1154                                       const llvm::Triple &Triple) {
   1155   StringRef CPUName, ABIName;
   1156   tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
   1157   return llvm::StringSwitch<std::string>(ABIName)
   1158       .Case("o32", "")
   1159       .Case("n32", "32")
   1160       .Case("n64", "64");
   1161 }
   1162 
   1163 // Convert ABI name to the GNU tools acceptable variant.
   1164 static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
   1165   return llvm::StringSwitch<llvm::StringRef>(ABI)
   1166       .Case("o32", "32")
   1167       .Case("n64", "64")
   1168       .Default(ABI);
   1169 }
   1170 
   1171 // Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
   1172 // and -mfloat-abi=.
   1173 static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
   1174   mips::FloatABI ABI = mips::FloatABI::Invalid;
   1175   if (Arg *A =
   1176           Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
   1177                           options::OPT_mfloat_abi_EQ)) {
   1178     if (A->getOption().matches(options::OPT_msoft_float))
   1179       ABI = mips::FloatABI::Soft;
   1180     else if (A->getOption().matches(options::OPT_mhard_float))
   1181       ABI = mips::FloatABI::Hard;
   1182     else {
   1183       ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
   1184                 .Case("soft", mips::FloatABI::Soft)
   1185                 .Case("hard", mips::FloatABI::Hard)
   1186                 .Default(mips::FloatABI::Invalid);
   1187       if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
   1188         D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
   1189         ABI = mips::FloatABI::Hard;
   1190       }
   1191     }
   1192   }
   1193 
   1194   // If unspecified, choose the default based on the platform.
   1195   if (ABI == mips::FloatABI::Invalid) {
   1196     // Assume "hard", because it's a default value used by gcc.
   1197     // When we start to recognize specific target MIPS processors,
   1198     // we will be able to select the default more correctly.
   1199     ABI = mips::FloatABI::Hard;
   1200   }
   1201 
   1202   assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
   1203   return ABI;
   1204 }
   1205 
   1206 static void AddTargetFeature(const ArgList &Args,
   1207                              std::vector<const char *> &Features,
   1208                              OptSpecifier OnOpt, OptSpecifier OffOpt,
   1209                              StringRef FeatureName) {
   1210   if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
   1211     if (A->getOption().matches(OnOpt))
   1212       Features.push_back(Args.MakeArgString("+" + FeatureName));
   1213     else
   1214       Features.push_back(Args.MakeArgString("-" + FeatureName));
   1215   }
   1216 }
   1217 
   1218 static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
   1219                                   const ArgList &Args,
   1220                                   std::vector<const char *> &Features) {
   1221   StringRef CPUName;
   1222   StringRef ABIName;
   1223   mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
   1224   ABIName = getGnuCompatibleMipsABIName(ABIName);
   1225 
   1226   AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
   1227                    options::OPT_mabicalls, "noabicalls");
   1228 
   1229   mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
   1230   if (FloatABI == mips::FloatABI::Soft) {
   1231     // FIXME: Note, this is a hack. We need to pass the selected float
   1232     // mode to the MipsTargetInfoBase to define appropriate macros there.
   1233     // Now it is the only method.
   1234     Features.push_back("+soft-float");
   1235   }
   1236 
   1237   if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
   1238     StringRef Val = StringRef(A->getValue());
   1239     if (Val == "2008") {
   1240       if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
   1241         Features.push_back("+nan2008");
   1242       else {
   1243         Features.push_back("-nan2008");
   1244         D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
   1245       }
   1246     } else if (Val == "legacy") {
   1247       if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
   1248         Features.push_back("-nan2008");
   1249       else {
   1250         Features.push_back("+nan2008");
   1251         D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
   1252       }
   1253     } else
   1254       D.Diag(diag::err_drv_unsupported_option_argument)
   1255           << A->getOption().getName() << Val;
   1256   }
   1257 
   1258   AddTargetFeature(Args, Features, options::OPT_msingle_float,
   1259                    options::OPT_mdouble_float, "single-float");
   1260   AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
   1261                    "mips16");
   1262   AddTargetFeature(Args, Features, options::OPT_mmicromips,
   1263                    options::OPT_mno_micromips, "micromips");
   1264   AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
   1265                    "dsp");
   1266   AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
   1267                    "dspr2");
   1268   AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
   1269                    "msa");
   1270 
   1271   // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
   1272   // pass -mfpxx
   1273   if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
   1274                                options::OPT_mfp64)) {
   1275     if (A->getOption().matches(options::OPT_mfp32))
   1276       Features.push_back(Args.MakeArgString("-fp64"));
   1277     else if (A->getOption().matches(options::OPT_mfpxx)) {
   1278       Features.push_back(Args.MakeArgString("+fpxx"));
   1279       Features.push_back(Args.MakeArgString("+nooddspreg"));
   1280     } else
   1281       Features.push_back(Args.MakeArgString("+fp64"));
   1282   } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
   1283     Features.push_back(Args.MakeArgString("+fpxx"));
   1284     Features.push_back(Args.MakeArgString("+nooddspreg"));
   1285   }
   1286 
   1287   AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
   1288                    options::OPT_modd_spreg, "nooddspreg");
   1289 }
   1290 
   1291 void Clang::AddMIPSTargetArgs(const ArgList &Args,
   1292                               ArgStringList &CmdArgs) const {
   1293   const Driver &D = getToolChain().getDriver();
   1294   StringRef CPUName;
   1295   StringRef ABIName;
   1296   const llvm::Triple &Triple = getToolChain().getTriple();
   1297   mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
   1298 
   1299   CmdArgs.push_back("-target-abi");
   1300   CmdArgs.push_back(ABIName.data());
   1301 
   1302   mips::FloatABI ABI = getMipsFloatABI(D, Args);
   1303   if (ABI == mips::FloatABI::Soft) {
   1304     // Floating point operations and argument passing are soft.
   1305     CmdArgs.push_back("-msoft-float");
   1306     CmdArgs.push_back("-mfloat-abi");
   1307     CmdArgs.push_back("soft");
   1308   } else {
   1309     // Floating point operations and argument passing are hard.
   1310     assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
   1311     CmdArgs.push_back("-mfloat-abi");
   1312     CmdArgs.push_back("hard");
   1313   }
   1314 
   1315   if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
   1316     if (A->getOption().matches(options::OPT_mxgot)) {
   1317       CmdArgs.push_back("-mllvm");
   1318       CmdArgs.push_back("-mxgot");
   1319     }
   1320   }
   1321 
   1322   if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
   1323                                options::OPT_mno_ldc1_sdc1)) {
   1324     if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
   1325       CmdArgs.push_back("-mllvm");
   1326       CmdArgs.push_back("-mno-ldc1-sdc1");
   1327     }
   1328   }
   1329 
   1330   if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
   1331                                options::OPT_mno_check_zero_division)) {
   1332     if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
   1333       CmdArgs.push_back("-mllvm");
   1334       CmdArgs.push_back("-mno-check-zero-division");
   1335     }
   1336   }
   1337 
   1338   if (Arg *A = Args.getLastArg(options::OPT_G)) {
   1339     StringRef v = A->getValue();
   1340     CmdArgs.push_back("-mllvm");
   1341     CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
   1342     A->claim();
   1343   }
   1344 }
   1345 
   1346 /// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
   1347 static std::string getPPCTargetCPU(const ArgList &Args) {
   1348   if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
   1349     StringRef CPUName = A->getValue();
   1350 
   1351     if (CPUName == "native") {
   1352       std::string CPU = llvm::sys::getHostCPUName();
   1353       if (!CPU.empty() && CPU != "generic")
   1354         return CPU;
   1355       else
   1356         return "";
   1357     }
   1358 
   1359     return llvm::StringSwitch<const char *>(CPUName)
   1360         .Case("common", "generic")
   1361         .Case("440", "440")
   1362         .Case("440fp", "440")
   1363         .Case("450", "450")
   1364         .Case("601", "601")
   1365         .Case("602", "602")
   1366         .Case("603", "603")
   1367         .Case("603e", "603e")
   1368         .Case("603ev", "603ev")
   1369         .Case("604", "604")
   1370         .Case("604e", "604e")
   1371         .Case("620", "620")
   1372         .Case("630", "pwr3")
   1373         .Case("G3", "g3")
   1374         .Case("7400", "7400")
   1375         .Case("G4", "g4")
   1376         .Case("7450", "7450")
   1377         .Case("G4+", "g4+")
   1378         .Case("750", "750")
   1379         .Case("970", "970")
   1380         .Case("G5", "g5")
   1381         .Case("a2", "a2")
   1382         .Case("a2q", "a2q")
   1383         .Case("e500mc", "e500mc")
   1384         .Case("e5500", "e5500")
   1385         .Case("power3", "pwr3")
   1386         .Case("power4", "pwr4")
   1387         .Case("power5", "pwr5")
   1388         .Case("power5x", "pwr5x")
   1389         .Case("power6", "pwr6")
   1390         .Case("power6x", "pwr6x")
   1391         .Case("power7", "pwr7")
   1392         .Case("power8", "pwr8")
   1393         .Case("pwr3", "pwr3")
   1394         .Case("pwr4", "pwr4")
   1395         .Case("pwr5", "pwr5")
   1396         .Case("pwr5x", "pwr5x")
   1397         .Case("pwr6", "pwr6")
   1398         .Case("pwr6x", "pwr6x")
   1399         .Case("pwr7", "pwr7")
   1400         .Case("pwr8", "pwr8")
   1401         .Case("powerpc", "ppc")
   1402         .Case("powerpc64", "ppc64")
   1403         .Case("powerpc64le", "ppc64le")
   1404         .Default("");
   1405   }
   1406 
   1407   return "";
   1408 }
   1409 
   1410 static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
   1411                                  const ArgList &Args,
   1412                                  std::vector<const char *> &Features) {
   1413   for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
   1414     StringRef Name = A->getOption().getName();
   1415     A->claim();
   1416 
   1417     // Skip over "-m".
   1418     assert(Name.startswith("m") && "Invalid feature name.");
   1419     Name = Name.substr(1);
   1420 
   1421     bool IsNegative = Name.startswith("no-");
   1422     if (IsNegative)
   1423       Name = Name.substr(3);
   1424     Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
   1425   }
   1426 
   1427   ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
   1428   if (FloatABI == ppc::FloatABI::Soft &&
   1429       !(Triple.getArch() == llvm::Triple::ppc64 ||
   1430         Triple.getArch() == llvm::Triple::ppc64le))
   1431     Features.push_back("+soft-float");
   1432   else if (FloatABI == ppc::FloatABI::Soft &&
   1433            (Triple.getArch() == llvm::Triple::ppc64 ||
   1434             Triple.getArch() == llvm::Triple::ppc64le))
   1435     D.Diag(diag::err_drv_invalid_mfloat_abi)
   1436         << "soft float is not supported for ppc64";
   1437 
   1438   // Altivec is a bit weird, allow overriding of the Altivec feature here.
   1439   AddTargetFeature(Args, Features, options::OPT_faltivec,
   1440                    options::OPT_fno_altivec, "altivec");
   1441 }
   1442 
   1443 ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
   1444   ppc::FloatABI ABI = ppc::FloatABI::Invalid;
   1445   if (Arg *A =
   1446           Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
   1447                           options::OPT_mfloat_abi_EQ)) {
   1448     if (A->getOption().matches(options::OPT_msoft_float))
   1449       ABI = ppc::FloatABI::Soft;
   1450     else if (A->getOption().matches(options::OPT_mhard_float))
   1451       ABI = ppc::FloatABI::Hard;
   1452     else {
   1453       ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
   1454                 .Case("soft", ppc::FloatABI::Soft)
   1455                 .Case("hard", ppc::FloatABI::Hard)
   1456                 .Default(ppc::FloatABI::Invalid);
   1457       if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
   1458         D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
   1459         ABI = ppc::FloatABI::Hard;
   1460       }
   1461     }
   1462   }
   1463 
   1464   // If unspecified, choose the default based on the platform.
   1465   if (ABI == ppc::FloatABI::Invalid) {
   1466     ABI = ppc::FloatABI::Hard;
   1467   }
   1468 
   1469   return ABI;
   1470 }
   1471 
   1472 void Clang::AddPPCTargetArgs(const ArgList &Args,
   1473                              ArgStringList &CmdArgs) const {
   1474   // Select the ABI to use.
   1475   const char *ABIName = nullptr;
   1476   if (getToolChain().getTriple().isOSLinux())
   1477     switch (getToolChain().getArch()) {
   1478     case llvm::Triple::ppc64: {
   1479       // When targeting a processor that supports QPX, or if QPX is
   1480       // specifically enabled, default to using the ABI that supports QPX (so
   1481       // long as it is not specifically disabled).
   1482       bool HasQPX = false;
   1483       if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
   1484         HasQPX = A->getValue() == StringRef("a2q");
   1485       HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
   1486       if (HasQPX) {
   1487         ABIName = "elfv1-qpx";
   1488         break;
   1489       }
   1490 
   1491       ABIName = "elfv1";
   1492       break;
   1493     }
   1494     case llvm::Triple::ppc64le:
   1495       ABIName = "elfv2";
   1496       break;
   1497     default:
   1498       break;
   1499     }
   1500 
   1501   if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
   1502     // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
   1503     // the option if given as we don't have backend support for any targets
   1504     // that don't use the altivec abi.
   1505     if (StringRef(A->getValue()) != "altivec")
   1506       ABIName = A->getValue();
   1507 
   1508   ppc::FloatABI FloatABI =
   1509       ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
   1510 
   1511   if (FloatABI == ppc::FloatABI::Soft) {
   1512     // Floating point operations and argument passing are soft.
   1513     CmdArgs.push_back("-msoft-float");
   1514     CmdArgs.push_back("-mfloat-abi");
   1515     CmdArgs.push_back("soft");
   1516   } else {
   1517     // Floating point operations and argument passing are hard.
   1518     assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
   1519     CmdArgs.push_back("-mfloat-abi");
   1520     CmdArgs.push_back("hard");
   1521   }
   1522 
   1523   if (ABIName) {
   1524     CmdArgs.push_back("-target-abi");
   1525     CmdArgs.push_back(ABIName);
   1526   }
   1527 }
   1528 
   1529 bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
   1530   Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
   1531   return A && (A->getValue() == StringRef(Value));
   1532 }
   1533 
   1534 /// Get the (LLVM) name of the R600 gpu we are targeting.
   1535 static std::string getR600TargetGPU(const ArgList &Args) {
   1536   if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
   1537     const char *GPUName = A->getValue();
   1538     return llvm::StringSwitch<const char *>(GPUName)
   1539         .Cases("rv630", "rv635", "r600")
   1540         .Cases("rv610", "rv620", "rs780", "rs880")
   1541         .Case("rv740", "rv770")
   1542         .Case("palm", "cedar")
   1543         .Cases("sumo", "sumo2", "sumo")
   1544         .Case("hemlock", "cypress")
   1545         .Case("aruba", "cayman")
   1546         .Default(GPUName);
   1547   }
   1548   return "";
   1549 }
   1550 
   1551 void Clang::AddSparcTargetArgs(const ArgList &Args,
   1552                                ArgStringList &CmdArgs) const {
   1553   const Driver &D = getToolChain().getDriver();
   1554   std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
   1555 
   1556   bool SoftFloatABI = false;
   1557   if (Arg *A =
   1558           Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
   1559     if (A->getOption().matches(options::OPT_msoft_float))
   1560       SoftFloatABI = true;
   1561   }
   1562 
   1563   // Only the hard-float ABI on Sparc is standardized, and it is the
   1564   // default. GCC also supports a nonstandard soft-float ABI mode, and
   1565   // perhaps LLVM should implement that, too. However, since llvm
   1566   // currently does not support Sparc soft-float, at all, display an
   1567   // error if it's requested.
   1568   if (SoftFloatABI) {
   1569     D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
   1570                                                      << Triple;
   1571   }
   1572 }
   1573 
   1574 static const char *getSystemZTargetCPU(const ArgList &Args) {
   1575   if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
   1576     return A->getValue();
   1577   return "z10";
   1578 }
   1579 
   1580 static void getSystemZTargetFeatures(const ArgList &Args,
   1581                                      std::vector<const char *> &Features) {
   1582   // -m(no-)htm overrides use of the transactional-execution facility.
   1583   if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
   1584     if (A->getOption().matches(options::OPT_mhtm))
   1585       Features.push_back("+transactional-execution");
   1586     else
   1587       Features.push_back("-transactional-execution");
   1588   }
   1589   // -m(no-)vx overrides use of the vector facility.
   1590   if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
   1591     if (A->getOption().matches(options::OPT_mvx))
   1592       Features.push_back("+vector");
   1593     else
   1594       Features.push_back("-vector");
   1595   }
   1596 }
   1597 
   1598 static const char *getX86TargetCPU(const ArgList &Args,
   1599                                    const llvm::Triple &Triple) {
   1600   if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
   1601     if (StringRef(A->getValue()) != "native") {
   1602       if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
   1603         return "core-avx2";
   1604 
   1605       return A->getValue();
   1606     }
   1607 
   1608     // FIXME: Reject attempts to use -march=native unless the target matches
   1609     // the host.
   1610     //
   1611     // FIXME: We should also incorporate the detected target features for use
   1612     // with -native.
   1613     std::string CPU = llvm::sys::getHostCPUName();
   1614     if (!CPU.empty() && CPU != "generic")
   1615       return Args.MakeArgString(CPU);
   1616   }
   1617 
   1618   if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
   1619     // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
   1620     StringRef Arch = A->getValue();
   1621     const char *CPU;
   1622     if (Triple.getArch() == llvm::Triple::x86) {
   1623       CPU = llvm::StringSwitch<const char *>(Arch)
   1624                 .Case("IA32", "i386")
   1625                 .Case("SSE", "pentium3")
   1626                 .Case("SSE2", "pentium4")
   1627                 .Case("AVX", "sandybridge")
   1628                 .Case("AVX2", "haswell")
   1629                 .Default(nullptr);
   1630     } else {
   1631       CPU = llvm::StringSwitch<const char *>(Arch)
   1632                 .Case("AVX", "sandybridge")
   1633                 .Case("AVX2", "haswell")
   1634                 .Default(nullptr);
   1635     }
   1636     if (CPU)
   1637       return CPU;
   1638   }
   1639 
   1640   // Select the default CPU if none was given (or detection failed).
   1641 
   1642   if (Triple.getArch() != llvm::Triple::x86_64 &&
   1643       Triple.getArch() != llvm::Triple::x86)
   1644     return nullptr; // This routine is only handling x86 targets.
   1645 
   1646   bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
   1647 
   1648   // FIXME: Need target hooks.
   1649   if (Triple.isOSDarwin()) {
   1650     if (Triple.getArchName() == "x86_64h")
   1651       return "core-avx2";
   1652     return Is64Bit ? "core2" : "yonah";
   1653   }
   1654 
   1655   // Set up default CPU name for PS4 compilers.
   1656   if (Triple.isPS4CPU())
   1657     return "btver2";
   1658 
   1659   // On Android use targets compatible with gcc
   1660   if (Triple.isAndroid())
   1661     return Is64Bit ? "x86-64" : "i686";
   1662 
   1663   // Everything else goes to x86-64 in 64-bit mode.
   1664   if (Is64Bit)
   1665     return "x86-64";
   1666 
   1667   switch (Triple.getOS()) {
   1668   case llvm::Triple::FreeBSD:
   1669   case llvm::Triple::NetBSD:
   1670   case llvm::Triple::OpenBSD:
   1671     return "i486";
   1672   case llvm::Triple::Haiku:
   1673     return "i586";
   1674   case llvm::Triple::Bitrig:
   1675     return "i686";
   1676   default:
   1677     // Fallback to p4.
   1678     return "pentium4";
   1679   }
   1680 }
   1681 
   1682 /// Get the (LLVM) name of the WebAssembly cpu we are targeting.
   1683 static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
   1684   // If we have -mcpu=, use that.
   1685   if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
   1686     StringRef CPU = A->getValue();
   1687 
   1688 #ifdef __wasm__
   1689     // Handle "native" by examining the host. "native" isn't meaningful when
   1690     // cross compiling, so only support this when the host is also WebAssembly.
   1691     if (CPU == "native")
   1692       return llvm::sys::getHostCPUName();
   1693 #endif
   1694 
   1695     return CPU;
   1696   }
   1697 
   1698   return "generic";
   1699 }
   1700 
   1701 static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
   1702                               bool FromAs = false) {
   1703   switch (T.getArch()) {
   1704   default:
   1705     return "";
   1706 
   1707   case llvm::Triple::aarch64:
   1708   case llvm::Triple::aarch64_be:
   1709     return getAArch64TargetCPU(Args);
   1710 
   1711   case llvm::Triple::arm:
   1712   case llvm::Triple::armeb:
   1713   case llvm::Triple::thumb:
   1714   case llvm::Triple::thumbeb: {
   1715     StringRef MArch, MCPU;
   1716     getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
   1717     return arm::getARMTargetCPU(MCPU, MArch, T);
   1718   }
   1719   case llvm::Triple::mips:
   1720   case llvm::Triple::mipsel:
   1721   case llvm::Triple::mips64:
   1722   case llvm::Triple::mips64el: {
   1723     StringRef CPUName;
   1724     StringRef ABIName;
   1725     mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
   1726     return CPUName;
   1727   }
   1728 
   1729   case llvm::Triple::nvptx:
   1730   case llvm::Triple::nvptx64:
   1731     if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
   1732       return A->getValue();
   1733     return "";
   1734 
   1735   case llvm::Triple::ppc:
   1736   case llvm::Triple::ppc64:
   1737   case llvm::Triple::ppc64le: {
   1738     std::string TargetCPUName = getPPCTargetCPU(Args);
   1739     // LLVM may default to generating code for the native CPU,
   1740     // but, like gcc, we default to a more generic option for
   1741     // each architecture. (except on Darwin)
   1742     if (TargetCPUName.empty() && !T.isOSDarwin()) {
   1743       if (T.getArch() == llvm::Triple::ppc64)
   1744         TargetCPUName = "ppc64";
   1745       else if (T.getArch() == llvm::Triple::ppc64le)
   1746         TargetCPUName = "ppc64le";
   1747       else
   1748         TargetCPUName = "ppc";
   1749     }
   1750     return TargetCPUName;
   1751   }
   1752 
   1753   case llvm::Triple::sparc:
   1754   case llvm::Triple::sparcel:
   1755   case llvm::Triple::sparcv9:
   1756     if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
   1757       return A->getValue();
   1758     return "";
   1759 
   1760   case llvm::Triple::x86:
   1761   case llvm::Triple::x86_64:
   1762     return getX86TargetCPU(Args, T);
   1763 
   1764   case llvm::Triple::hexagon:
   1765     return "hexagon" +
   1766            toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
   1767 
   1768   case llvm::Triple::systemz:
   1769     return getSystemZTargetCPU(Args);
   1770 
   1771   case llvm::Triple::r600:
   1772   case llvm::Triple::amdgcn:
   1773     return getR600TargetGPU(Args);
   1774 
   1775   case llvm::Triple::wasm32:
   1776   case llvm::Triple::wasm64:
   1777     return getWebAssemblyTargetCPU(Args);
   1778   }
   1779 }
   1780 
   1781 static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
   1782                           ArgStringList &CmdArgs, bool IsThinLTO) {
   1783   // Tell the linker to load the plugin. This has to come before AddLinkerInputs
   1784   // as gold requires -plugin to come before any -plugin-opt that -Wl might
   1785   // forward.
   1786   CmdArgs.push_back("-plugin");
   1787   std::string Plugin =
   1788       ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
   1789   CmdArgs.push_back(Args.MakeArgString(Plugin));
   1790 
   1791   // Try to pass driver level flags relevant to LTO code generation down to
   1792   // the plugin.
   1793 
   1794   // Handle flags for selecting CPU variants.
   1795   std::string CPU = getCPUName(Args, ToolChain.getTriple());
   1796   if (!CPU.empty())
   1797     CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
   1798 
   1799   if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
   1800     StringRef OOpt;
   1801     if (A->getOption().matches(options::OPT_O4) ||
   1802         A->getOption().matches(options::OPT_Ofast))
   1803       OOpt = "3";
   1804     else if (A->getOption().matches(options::OPT_O))
   1805       OOpt = A->getValue();
   1806     else if (A->getOption().matches(options::OPT_O0))
   1807       OOpt = "0";
   1808     if (!OOpt.empty())
   1809       CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
   1810   }
   1811 
   1812   if (IsThinLTO)
   1813     CmdArgs.push_back("-plugin-opt=thinlto");
   1814 }
   1815 
   1816 /// This is a helper function for validating the optional refinement step
   1817 /// parameter in reciprocal argument strings. Return false if there is an error
   1818 /// parsing the refinement step. Otherwise, return true and set the Position
   1819 /// of the refinement step in the input string.
   1820 static bool getRefinementStep(StringRef In, const Driver &D,
   1821                               const Arg &A, size_t &Position) {
   1822   const char RefinementStepToken = ':';
   1823   Position = In.find(RefinementStepToken);
   1824   if (Position != StringRef::npos) {
   1825     StringRef Option = A.getOption().getName();
   1826     StringRef RefStep = In.substr(Position + 1);
   1827     // Allow exactly one numeric character for the additional refinement
   1828     // step parameter. This is reasonable for all currently-supported
   1829     // operations and architectures because we would expect that a larger value
   1830     // of refinement steps would cause the estimate "optimization" to
   1831     // under-perform the native operation. Also, if the estimate does not
   1832     // converge quickly, it probably will not ever converge, so further
   1833     // refinement steps will not produce a better answer.
   1834     if (RefStep.size() != 1) {
   1835       D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
   1836       return false;
   1837     }
   1838     char RefStepChar = RefStep[0];
   1839     if (RefStepChar < '0' || RefStepChar > '9') {
   1840       D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
   1841       return false;
   1842     }
   1843   }
   1844   return true;
   1845 }
   1846 
   1847 /// The -mrecip flag requires processing of many optional parameters.
   1848 static void ParseMRecip(const Driver &D, const ArgList &Args,
   1849                         ArgStringList &OutStrings) {
   1850   StringRef DisabledPrefixIn = "!";
   1851   StringRef DisabledPrefixOut = "!";
   1852   StringRef EnabledPrefixOut = "";
   1853   StringRef Out = "-mrecip=";
   1854 
   1855   Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
   1856   if (!A)
   1857     return;
   1858 
   1859   unsigned NumOptions = A->getNumValues();
   1860   if (NumOptions == 0) {
   1861     // No option is the same as "all".
   1862     OutStrings.push_back(Args.MakeArgString(Out + "all"));
   1863     return;
   1864   }
   1865 
   1866   // Pass through "all", "none", or "default" with an optional refinement step.
   1867   if (NumOptions == 1) {
   1868     StringRef Val = A->getValue(0);
   1869     size_t RefStepLoc;
   1870     if (!getRefinementStep(Val, D, *A, RefStepLoc))
   1871       return;
   1872     StringRef ValBase = Val.slice(0, RefStepLoc);
   1873     if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
   1874       OutStrings.push_back(Args.MakeArgString(Out + Val));
   1875       return;
   1876     }
   1877   }
   1878 
   1879   // Each reciprocal type may be enabled or disabled individually.
   1880   // Check each input value for validity, concatenate them all back together,
   1881   // and pass through.
   1882 
   1883   llvm::StringMap<bool> OptionStrings;
   1884   OptionStrings.insert(std::make_pair("divd", false));
   1885   OptionStrings.insert(std::make_pair("divf", false));
   1886   OptionStrings.insert(std::make_pair("vec-divd", false));
   1887   OptionStrings.insert(std::make_pair("vec-divf", false));
   1888   OptionStrings.insert(std::make_pair("sqrtd", false));
   1889   OptionStrings.insert(std::make_pair("sqrtf", false));
   1890   OptionStrings.insert(std::make_pair("vec-sqrtd", false));
   1891   OptionStrings.insert(std::make_pair("vec-sqrtf", false));
   1892 
   1893   for (unsigned i = 0; i != NumOptions; ++i) {
   1894     StringRef Val = A->getValue(i);
   1895 
   1896     bool IsDisabled = Val.startswith(DisabledPrefixIn);
   1897     // Ignore the disablement token for string matching.
   1898     if (IsDisabled)
   1899       Val = Val.substr(1);
   1900 
   1901     size_t RefStep;
   1902     if (!getRefinementStep(Val, D, *A, RefStep))
   1903       return;
   1904 
   1905     StringRef ValBase = Val.slice(0, RefStep);
   1906     llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
   1907     if (OptionIter == OptionStrings.end()) {
   1908       // Try again specifying float suffix.
   1909       OptionIter = OptionStrings.find(ValBase.str() + 'f');
   1910       if (OptionIter == OptionStrings.end()) {
   1911         // The input name did not match any known option string.
   1912         D.Diag(diag::err_drv_unknown_argument) << Val;
   1913         return;
   1914       }
   1915       // The option was specified without a float or double suffix.
   1916       // Make sure that the double entry was not already specified.
   1917       // The float entry will be checked below.
   1918       if (OptionStrings[ValBase.str() + 'd']) {
   1919         D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
   1920         return;
   1921       }
   1922     }
   1923 
   1924     if (OptionIter->second == true) {
   1925       // Duplicate option specified.
   1926       D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
   1927       return;
   1928     }
   1929 
   1930     // Mark the matched option as found. Do not allow duplicate specifiers.
   1931     OptionIter->second = true;
   1932 
   1933     // If the precision was not specified, also mark the double entry as found.
   1934     if (ValBase.back() != 'f' && ValBase.back() != 'd')
   1935       OptionStrings[ValBase.str() + 'd'] = true;
   1936 
   1937     // Build the output string.
   1938     StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
   1939     Out = Args.MakeArgString(Out + Prefix + Val);
   1940     if (i != NumOptions - 1)
   1941       Out = Args.MakeArgString(Out + ",");
   1942   }
   1943 
   1944   OutStrings.push_back(Args.MakeArgString(Out));
   1945 }
   1946 
   1947 static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
   1948                                  const ArgList &Args,
   1949                                  std::vector<const char *> &Features) {
   1950   // If -march=native, autodetect the feature list.
   1951   if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
   1952     if (StringRef(A->getValue()) == "native") {
   1953       llvm::StringMap<bool> HostFeatures;
   1954       if (llvm::sys::getHostCPUFeatures(HostFeatures))
   1955         for (auto &F : HostFeatures)
   1956           Features.push_back(
   1957               Args.MakeArgString((F.second ? "+" : "-") + F.first()));
   1958     }
   1959   }
   1960 
   1961   if (Triple.getArchName() == "x86_64h") {
   1962     // x86_64h implies quite a few of the more modern subtarget features
   1963     // for Haswell class CPUs, but not all of them. Opt-out of a few.
   1964     Features.push_back("-rdrnd");
   1965     Features.push_back("-aes");
   1966     Features.push_back("-pclmul");
   1967     Features.push_back("-rtm");
   1968     Features.push_back("-hle");
   1969     Features.push_back("-fsgsbase");
   1970   }
   1971 
   1972   const llvm::Triple::ArchType ArchType = Triple.getArch();
   1973   // Add features to be compatible with gcc for Android.
   1974   if (Triple.isAndroid()) {
   1975     if (ArchType == llvm::Triple::x86_64) {
   1976       Features.push_back("+sse4.2");
   1977       Features.push_back("+popcnt");
   1978     } else
   1979       Features.push_back("+ssse3");
   1980   }
   1981 
   1982   // Set features according to the -arch flag on MSVC.
   1983   if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
   1984     StringRef Arch = A->getValue();
   1985     bool ArchUsed = false;
   1986     // First, look for flags that are shared in x86 and x86-64.
   1987     if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
   1988       if (Arch == "AVX" || Arch == "AVX2") {
   1989         ArchUsed = true;
   1990         Features.push_back(Args.MakeArgString("+" + Arch.lower()));
   1991       }
   1992     }
   1993     // Then, look for x86-specific flags.
   1994     if (ArchType == llvm::Triple::x86) {
   1995       if (Arch == "IA32") {
   1996         ArchUsed = true;
   1997       } else if (Arch == "SSE" || Arch == "SSE2") {
   1998         ArchUsed = true;
   1999         Features.push_back(Args.MakeArgString("+" + Arch.lower()));
   2000       }
   2001     }
   2002     if (!ArchUsed)
   2003       D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
   2004   }
   2005 
   2006   // Now add any that the user explicitly requested on the command line,
   2007   // which may override the defaults.
   2008   for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
   2009     StringRef Name = A->getOption().getName();
   2010     A->claim();
   2011 
   2012     // Skip over "-m".
   2013     assert(Name.startswith("m") && "Invalid feature name.");
   2014     Name = Name.substr(1);
   2015 
   2016     bool IsNegative = Name.startswith("no-");
   2017     if (IsNegative)
   2018       Name = Name.substr(3);
   2019 
   2020     Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
   2021   }
   2022 }
   2023 
   2024 void Clang::AddX86TargetArgs(const ArgList &Args,
   2025                              ArgStringList &CmdArgs) const {
   2026   if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
   2027       Args.hasArg(options::OPT_mkernel) ||
   2028       Args.hasArg(options::OPT_fapple_kext))
   2029     CmdArgs.push_back("-disable-red-zone");
   2030 
   2031   // Default to avoid implicit floating-point for kernel/kext code, but allow
   2032   // that to be overridden with -mno-soft-float.
   2033   bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
   2034                           Args.hasArg(options::OPT_fapple_kext));
   2035   if (Arg *A = Args.getLastArg(
   2036           options::OPT_msoft_float, options::OPT_mno_soft_float,
   2037           options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
   2038     const Option &O = A->getOption();
   2039     NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
   2040                        O.matches(options::OPT_msoft_float));
   2041   }
   2042   if (NoImplicitFloat)
   2043     CmdArgs.push_back("-no-implicit-float");
   2044 
   2045   if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
   2046     StringRef Value = A->getValue();
   2047     if (Value == "intel" || Value == "att") {
   2048       CmdArgs.push_back("-mllvm");
   2049       CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
   2050     } else {
   2051       getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
   2052           << A->getOption().getName() << Value;
   2053     }
   2054   }
   2055 }
   2056 
   2057 void Clang::AddHexagonTargetArgs(const ArgList &Args,
   2058                                  ArgStringList &CmdArgs) const {
   2059   CmdArgs.push_back("-mqdsp6-compat");
   2060   CmdArgs.push_back("-Wreturn-type");
   2061 
   2062   if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
   2063     std::string N = llvm::utostr(G.getValue());
   2064     std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
   2065     CmdArgs.push_back("-mllvm");
   2066     CmdArgs.push_back(Args.MakeArgString(Opt));
   2067   }
   2068 
   2069   if (!Args.hasArg(options::OPT_fno_short_enums))
   2070     CmdArgs.push_back("-fshort-enums");
   2071   if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
   2072     CmdArgs.push_back("-mllvm");
   2073     CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
   2074   }
   2075   CmdArgs.push_back("-mllvm");
   2076   CmdArgs.push_back("-machine-sink-split=0");
   2077 }
   2078 
   2079 // Decode AArch64 features from string like +[no]featureA+[no]featureB+...
   2080 static bool DecodeAArch64Features(const Driver &D, StringRef text,
   2081                                   std::vector<const char *> &Features) {
   2082   SmallVector<StringRef, 8> Split;
   2083   text.split(Split, StringRef("+"), -1, false);
   2084 
   2085   for (StringRef Feature : Split) {
   2086     const char *result = llvm::StringSwitch<const char *>(Feature)
   2087                              .Case("fp", "+fp-armv8")
   2088                              .Case("simd", "+neon")
   2089                              .Case("crc", "+crc")
   2090                              .Case("crypto", "+crypto")
   2091                              .Case("fp16", "+fullfp16")
   2092                              .Case("profile", "+spe")
   2093                              .Case("nofp", "-fp-armv8")
   2094                              .Case("nosimd", "-neon")
   2095                              .Case("nocrc", "-crc")
   2096                              .Case("nocrypto", "-crypto")
   2097                              .Case("nofp16", "-fullfp16")
   2098                              .Case("noprofile", "-spe")
   2099                              .Default(nullptr);
   2100     if (result)
   2101       Features.push_back(result);
   2102     else if (Feature == "neon" || Feature == "noneon")
   2103       D.Diag(diag::err_drv_no_neon_modifier);
   2104     else
   2105       return false;
   2106   }
   2107   return true;
   2108 }
   2109 
   2110 // Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
   2111 // decode CPU and feature.
   2112 static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
   2113                               std::vector<const char *> &Features) {
   2114   std::pair<StringRef, StringRef> Split = Mcpu.split("+");
   2115   CPU = Split.first;
   2116   if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
   2117       CPU == "cortex-a72" || CPU == "cortex-a35") {
   2118     Features.push_back("+neon");
   2119     Features.push_back("+crc");
   2120     Features.push_back("+crypto");
   2121   } else if (CPU == "generic") {
   2122     Features.push_back("+neon");
   2123   } else {
   2124     return false;
   2125   }
   2126 
   2127   if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
   2128     return false;
   2129 
   2130   return true;
   2131 }
   2132 
   2133 static bool
   2134 getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
   2135                                 const ArgList &Args,
   2136                                 std::vector<const char *> &Features) {
   2137   std::string MarchLowerCase = March.lower();
   2138   std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
   2139 
   2140   if (Split.first == "armv8-a" || Split.first == "armv8a") {
   2141     // ok, no additional features.
   2142   } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
   2143     Features.push_back("+v8.1a");
   2144   } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
   2145     Features.push_back("+v8.2a");
   2146   } else {
   2147     return false;
   2148   }
   2149 
   2150   if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
   2151     return false;
   2152 
   2153   return true;
   2154 }
   2155 
   2156 static bool
   2157 getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
   2158                                const ArgList &Args,
   2159                                std::vector<const char *> &Features) {
   2160   StringRef CPU;
   2161   std::string McpuLowerCase = Mcpu.lower();
   2162   if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
   2163     return false;
   2164 
   2165   return true;
   2166 }
   2167 
   2168 static bool
   2169 getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
   2170                                      const ArgList &Args,
   2171                                      std::vector<const char *> &Features) {
   2172   std::string MtuneLowerCase = Mtune.lower();
   2173   // Handle CPU name is 'native'.
   2174   if (MtuneLowerCase == "native")
   2175     MtuneLowerCase = llvm::sys::getHostCPUName();
   2176   if (MtuneLowerCase == "cyclone") {
   2177     Features.push_back("+zcm");
   2178     Features.push_back("+zcz");
   2179   }
   2180   return true;
   2181 }
   2182 
   2183 static bool
   2184 getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
   2185                                     const ArgList &Args,
   2186                                     std::vector<const char *> &Features) {
   2187   StringRef CPU;
   2188   std::vector<const char *> DecodedFeature;
   2189   std::string McpuLowerCase = Mcpu.lower();
   2190   if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
   2191     return false;
   2192 
   2193   return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
   2194 }
   2195 
   2196 static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
   2197                                      std::vector<const char *> &Features) {
   2198   Arg *A;
   2199   bool success = true;
   2200   // Enable NEON by default.
   2201   Features.push_back("+neon");
   2202   if ((A = Args.getLastArg(options::OPT_march_EQ)))
   2203     success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
   2204   else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
   2205     success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
   2206   else if (Args.hasArg(options::OPT_arch))
   2207     success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
   2208                                              Features);
   2209 
   2210   if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
   2211     success =
   2212         getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
   2213   else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
   2214     success =
   2215         getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
   2216   else if (Args.hasArg(options::OPT_arch))
   2217     success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
   2218                                                   Args, Features);
   2219 
   2220   if (!success)
   2221     D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
   2222 
   2223   if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
   2224     Features.push_back("-fp-armv8");
   2225     Features.push_back("-crypto");
   2226     Features.push_back("-neon");
   2227   }
   2228 
   2229   // En/disable crc
   2230   if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
   2231     if (A->getOption().matches(options::OPT_mcrc))
   2232       Features.push_back("+crc");
   2233     else
   2234       Features.push_back("-crc");
   2235   }
   2236 
   2237   if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
   2238                                options::OPT_munaligned_access))
   2239     if (A->getOption().matches(options::OPT_mno_unaligned_access))
   2240       Features.push_back("+strict-align");
   2241 
   2242   if (Args.hasArg(options::OPT_ffixed_x18))
   2243     Features.push_back("+reserve-x18");
   2244 }
   2245 
   2246 static void getHexagonTargetFeatures(const ArgList &Args,
   2247                                      std::vector<const char *> &Features) {
   2248   bool HasHVX = false, HasHVXD = false;
   2249 
   2250   for (auto &A : Args) {
   2251     auto &Opt = A->getOption();
   2252     if (Opt.matches(options::OPT_mhexagon_hvx))
   2253       HasHVX = true;
   2254     else if (Opt.matches(options::OPT_mno_hexagon_hvx))
   2255       HasHVXD = HasHVX = false;
   2256     else if (Opt.matches(options::OPT_mhexagon_hvx_double))
   2257       HasHVXD = HasHVX = true;
   2258     else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
   2259       HasHVXD = false;
   2260     else
   2261       continue;
   2262     A->claim();
   2263   }
   2264 
   2265   Features.push_back(HasHVX  ? "+hvx" : "-hvx");
   2266   Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
   2267 }
   2268 
   2269 static void getWebAssemblyTargetFeatures(const ArgList &Args,
   2270                                          std::vector<const char *> &Features) {
   2271   for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
   2272     StringRef Name = A->getOption().getName();
   2273     A->claim();
   2274 
   2275     // Skip over "-m".
   2276     assert(Name.startswith("m") && "Invalid feature name.");
   2277     Name = Name.substr(1);
   2278 
   2279     bool IsNegative = Name.startswith("no-");
   2280     if (IsNegative)
   2281       Name = Name.substr(3);
   2282 
   2283     Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
   2284   }
   2285 }
   2286 
   2287 static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
   2288                               const ArgList &Args, ArgStringList &CmdArgs,
   2289                               bool ForAS) {
   2290   const Driver &D = TC.getDriver();
   2291   std::vector<const char *> Features;
   2292   switch (Triple.getArch()) {
   2293   default:
   2294     break;
   2295   case llvm::Triple::mips:
   2296   case llvm::Triple::mipsel:
   2297   case llvm::Triple::mips64:
   2298   case llvm::Triple::mips64el:
   2299     getMIPSTargetFeatures(D, Triple, Args, Features);
   2300     break;
   2301 
   2302   case llvm::Triple::arm:
   2303   case llvm::Triple::armeb:
   2304   case llvm::Triple::thumb:
   2305   case llvm::Triple::thumbeb:
   2306     getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
   2307     break;
   2308 
   2309   case llvm::Triple::ppc:
   2310   case llvm::Triple::ppc64:
   2311   case llvm::Triple::ppc64le:
   2312     getPPCTargetFeatures(D, Triple, Args, Features);
   2313     break;
   2314   case llvm::Triple::systemz:
   2315     getSystemZTargetFeatures(Args, Features);
   2316     break;
   2317   case llvm::Triple::aarch64:
   2318   case llvm::Triple::aarch64_be:
   2319     getAArch64TargetFeatures(D, Args, Features);
   2320     break;
   2321   case llvm::Triple::x86:
   2322   case llvm::Triple::x86_64:
   2323     getX86TargetFeatures(D, Triple, Args, Features);
   2324     break;
   2325   case llvm::Triple::hexagon:
   2326     getHexagonTargetFeatures(Args, Features);
   2327     break;
   2328   case llvm::Triple::wasm32:
   2329   case llvm::Triple::wasm64:
   2330     getWebAssemblyTargetFeatures(Args, Features);
   2331     break;
   2332   }
   2333 
   2334   // Find the last of each feature.
   2335   llvm::StringMap<unsigned> LastOpt;
   2336   for (unsigned I = 0, N = Features.size(); I < N; ++I) {
   2337     const char *Name = Features[I];
   2338     assert(Name[0] == '-' || Name[0] == '+');
   2339     LastOpt[Name + 1] = I;
   2340   }
   2341 
   2342   for (unsigned I = 0, N = Features.size(); I < N; ++I) {
   2343     // If this feature was overridden, ignore it.
   2344     const char *Name = Features[I];
   2345     llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
   2346     assert(LastI != LastOpt.end());
   2347     unsigned Last = LastI->second;
   2348     if (Last != I)
   2349       continue;
   2350 
   2351     CmdArgs.push_back("-target-feature");
   2352     CmdArgs.push_back(Name);
   2353   }
   2354 }
   2355 
   2356 static bool
   2357 shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
   2358                                           const llvm::Triple &Triple) {
   2359   // We use the zero-cost exception tables for Objective-C if the non-fragile
   2360   // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
   2361   // later.
   2362   if (runtime.isNonFragile())
   2363     return true;
   2364 
   2365   if (!Triple.isMacOSX())
   2366     return false;
   2367 
   2368   return (!Triple.isMacOSXVersionLT(10, 5) &&
   2369           (Triple.getArch() == llvm::Triple::x86_64 ||
   2370            Triple.getArch() == llvm::Triple::arm));
   2371 }
   2372 
   2373 /// Adds exception related arguments to the driver command arguments. There's a
   2374 /// master flag, -fexceptions and also language specific flags to enable/disable
   2375 /// C++ and Objective-C exceptions. This makes it possible to for example
   2376 /// disable C++ exceptions but enable Objective-C exceptions.
   2377 static void addExceptionArgs(const ArgList &Args, types::ID InputType,
   2378                              const ToolChain &TC, bool KernelOrKext,
   2379                              const ObjCRuntime &objcRuntime,
   2380                              ArgStringList &CmdArgs) {
   2381   const Driver &D = TC.getDriver();
   2382   const llvm::Triple &Triple = TC.getTriple();
   2383 
   2384   if (KernelOrKext) {
   2385     // -mkernel and -fapple-kext imply no exceptions, so claim exception related
   2386     // arguments now to avoid warnings about unused arguments.
   2387     Args.ClaimAllArgs(options::OPT_fexceptions);
   2388     Args.ClaimAllArgs(options::OPT_fno_exceptions);
   2389     Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
   2390     Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
   2391     Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
   2392     Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
   2393     return;
   2394   }
   2395 
   2396   // See if the user explicitly enabled exceptions.
   2397   bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
   2398                          false);
   2399 
   2400   // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
   2401   // is not necessarily sensible, but follows GCC.
   2402   if (types::isObjC(InputType) &&
   2403       Args.hasFlag(options::OPT_fobjc_exceptions,
   2404                    options::OPT_fno_objc_exceptions, true)) {
   2405     CmdArgs.push_back("-fobjc-exceptions");
   2406 
   2407     EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
   2408   }
   2409 
   2410   if (types::isCXX(InputType)) {
   2411     // Disable C++ EH by default on XCore, PS4, and MSVC.
   2412     // FIXME: Remove MSVC from this list once things work.
   2413     bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
   2414                                 !Triple.isPS4CPU() &&
   2415                                 !Triple.isWindowsMSVCEnvironment();
   2416     Arg *ExceptionArg = Args.getLastArg(
   2417         options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
   2418         options::OPT_fexceptions, options::OPT_fno_exceptions);
   2419     if (ExceptionArg)
   2420       CXXExceptionsEnabled =
   2421           ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
   2422           ExceptionArg->getOption().matches(options::OPT_fexceptions);
   2423 
   2424     if (CXXExceptionsEnabled) {
   2425       if (Triple.isPS4CPU()) {
   2426         ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
   2427         assert(ExceptionArg &&
   2428                "On the PS4 exceptions should only be enabled if passing "
   2429                "an argument");
   2430         if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
   2431           const Arg *RTTIArg = TC.getRTTIArg();
   2432           assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
   2433           D.Diag(diag::err_drv_argument_not_allowed_with)
   2434               << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
   2435         } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
   2436           D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
   2437       } else
   2438         assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
   2439 
   2440       CmdArgs.push_back("-fcxx-exceptions");
   2441 
   2442       EH = true;
   2443     }
   2444   }
   2445 
   2446   if (EH)
   2447     CmdArgs.push_back("-fexceptions");
   2448 }
   2449 
   2450 static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
   2451   bool Default = true;
   2452   if (TC.getTriple().isOSDarwin()) {
   2453     // The native darwin assembler doesn't support the linker_option directives,
   2454     // so we disable them if we think the .s file will be passed to it.
   2455     Default = TC.useIntegratedAs();
   2456   }
   2457   return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
   2458                        Default);
   2459 }
   2460 
   2461 static bool ShouldDisableDwarfDirectory(const ArgList &Args,
   2462                                         const ToolChain &TC) {
   2463   bool UseDwarfDirectory =
   2464       Args.hasFlag(options::OPT_fdwarf_directory_asm,
   2465                    options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
   2466   return !UseDwarfDirectory;
   2467 }
   2468 
   2469 /// \brief Check whether the given input tree contains any compilation actions.
   2470 static bool ContainsCompileAction(const Action *A) {
   2471   if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
   2472     return true;
   2473 
   2474   for (const auto &Act : *A)
   2475     if (ContainsCompileAction(Act))
   2476       return true;
   2477 
   2478   return false;
   2479 }
   2480 
   2481 /// \brief Check if -relax-all should be passed to the internal assembler.
   2482 /// This is done by default when compiling non-assembler source with -O0.
   2483 static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
   2484   bool RelaxDefault = true;
   2485 
   2486   if (Arg *A = Args.getLastArg(options::OPT_O_Group))
   2487     RelaxDefault = A->getOption().matches(options::OPT_O0);
   2488 
   2489   if (RelaxDefault) {
   2490     RelaxDefault = false;
   2491     for (const auto &Act : C.getActions()) {
   2492       if (ContainsCompileAction(Act)) {
   2493         RelaxDefault = true;
   2494         break;
   2495       }
   2496     }
   2497   }
   2498 
   2499   return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
   2500                       RelaxDefault);
   2501 }
   2502 
   2503 // Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
   2504 // to the corresponding DebugInfoKind.
   2505 static CodeGenOptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
   2506   assert(A.getOption().matches(options::OPT_gN_Group) &&
   2507          "Not a -g option that specifies a debug-info level");
   2508   if (A.getOption().matches(options::OPT_g0) ||
   2509       A.getOption().matches(options::OPT_ggdb0))
   2510     return CodeGenOptions::NoDebugInfo;
   2511   if (A.getOption().matches(options::OPT_gline_tables_only) ||
   2512       A.getOption().matches(options::OPT_ggdb1))
   2513     return CodeGenOptions::DebugLineTablesOnly;
   2514   return CodeGenOptions::LimitedDebugInfo;
   2515 }
   2516 
   2517 // Extract the integer N from a string spelled "-dwarf-N", returning 0
   2518 // on mismatch. The StringRef input (rather than an Arg) allows
   2519 // for use by the "-Xassembler" option parser.
   2520 static unsigned DwarfVersionNum(StringRef ArgValue) {
   2521   return llvm::StringSwitch<unsigned>(ArgValue)
   2522       .Case("-gdwarf-2", 2)
   2523       .Case("-gdwarf-3", 3)
   2524       .Case("-gdwarf-4", 4)
   2525       .Default(0);
   2526 }
   2527 
   2528 static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
   2529                                     CodeGenOptions::DebugInfoKind DebugInfoKind,
   2530                                     unsigned DwarfVersion,
   2531                                     llvm::DebuggerKind DebuggerTuning) {
   2532   switch (DebugInfoKind) {
   2533   case CodeGenOptions::DebugLineTablesOnly:
   2534     CmdArgs.push_back("-debug-info-kind=line-tables-only");
   2535     break;
   2536   case CodeGenOptions::LimitedDebugInfo:
   2537     CmdArgs.push_back("-debug-info-kind=limited");
   2538     break;
   2539   case CodeGenOptions::FullDebugInfo:
   2540     CmdArgs.push_back("-debug-info-kind=standalone");
   2541     break;
   2542   default:
   2543     break;
   2544   }
   2545   if (DwarfVersion > 0)
   2546     CmdArgs.push_back(
   2547         Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
   2548   switch (DebuggerTuning) {
   2549   case llvm::DebuggerKind::GDB:
   2550     CmdArgs.push_back("-debugger-tuning=gdb");
   2551     break;
   2552   case llvm::DebuggerKind::LLDB:
   2553     CmdArgs.push_back("-debugger-tuning=lldb");
   2554     break;
   2555   case llvm::DebuggerKind::SCE:
   2556     CmdArgs.push_back("-debugger-tuning=sce");
   2557     break;
   2558   default:
   2559     break;
   2560   }
   2561 }
   2562 
   2563 static void CollectArgsForIntegratedAssembler(Compilation &C,
   2564                                               const ArgList &Args,
   2565                                               ArgStringList &CmdArgs,
   2566                                               const Driver &D) {
   2567   if (UseRelaxAll(C, Args))
   2568     CmdArgs.push_back("-mrelax-all");
   2569 
   2570   // Only default to -mincremental-linker-compatible if we think we are
   2571   // targeting the MSVC linker.
   2572   bool DefaultIncrementalLinkerCompatible =
   2573       C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
   2574   if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
   2575                    options::OPT_mno_incremental_linker_compatible,
   2576                    DefaultIncrementalLinkerCompatible))
   2577     CmdArgs.push_back("-mincremental-linker-compatible");
   2578 
   2579   // When passing -I arguments to the assembler we sometimes need to
   2580   // unconditionally take the next argument.  For example, when parsing
   2581   // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
   2582   // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
   2583   // arg after parsing the '-I' arg.
   2584   bool TakeNextArg = false;
   2585 
   2586   // When using an integrated assembler, translate -Wa, and -Xassembler
   2587   // options.
   2588   bool CompressDebugSections = false;
   2589   for (const Arg *A :
   2590        Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
   2591     A->claim();
   2592 
   2593     for (StringRef Value : A->getValues()) {
   2594       if (TakeNextArg) {
   2595         CmdArgs.push_back(Value.data());
   2596         TakeNextArg = false;
   2597         continue;
   2598       }
   2599 
   2600       switch (C.getDefaultToolChain().getArch()) {
   2601       default:
   2602         break;
   2603       case llvm::Triple::mips:
   2604       case llvm::Triple::mipsel:
   2605       case llvm::Triple::mips64:
   2606       case llvm::Triple::mips64el:
   2607         if (Value == "--trap") {
   2608           CmdArgs.push_back("-target-feature");
   2609           CmdArgs.push_back("+use-tcc-in-div");
   2610           continue;
   2611         }
   2612         if (Value == "--break") {
   2613           CmdArgs.push_back("-target-feature");
   2614           CmdArgs.push_back("-use-tcc-in-div");
   2615           continue;
   2616         }
   2617         if (Value.startswith("-msoft-float")) {
   2618           CmdArgs.push_back("-target-feature");
   2619           CmdArgs.push_back("+soft-float");
   2620           continue;
   2621         }
   2622         if (Value.startswith("-mhard-float")) {
   2623           CmdArgs.push_back("-target-feature");
   2624           CmdArgs.push_back("-soft-float");
   2625           continue;
   2626         }
   2627         break;
   2628       }
   2629 
   2630       if (Value == "-force_cpusubtype_ALL") {
   2631         // Do nothing, this is the default and we don't support anything else.
   2632       } else if (Value == "-L") {
   2633         CmdArgs.push_back("-msave-temp-labels");
   2634       } else if (Value == "--fatal-warnings") {
   2635         CmdArgs.push_back("-massembler-fatal-warnings");
   2636       } else if (Value == "--noexecstack") {
   2637         CmdArgs.push_back("-mnoexecstack");
   2638       } else if (Value == "-compress-debug-sections" ||
   2639                  Value == "--compress-debug-sections") {
   2640         CompressDebugSections = true;
   2641       } else if (Value == "-nocompress-debug-sections" ||
   2642                  Value == "--nocompress-debug-sections") {
   2643         CompressDebugSections = false;
   2644       } else if (Value.startswith("-I")) {
   2645         CmdArgs.push_back(Value.data());
   2646         // We need to consume the next argument if the current arg is a plain
   2647         // -I. The next arg will be the include directory.
   2648         if (Value == "-I")
   2649           TakeNextArg = true;
   2650       } else if (Value.startswith("-gdwarf-")) {
   2651         // "-gdwarf-N" options are not cc1as options.
   2652         unsigned DwarfVersion = DwarfVersionNum(Value);
   2653         if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
   2654           CmdArgs.push_back(Value.data());
   2655         } else {
   2656           RenderDebugEnablingArgs(
   2657               Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion,
   2658               llvm::DebuggerKind::Default);
   2659         }
   2660       } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
   2661                  Value.startswith("-mhwdiv") || Value.startswith("-march")) {
   2662         // Do nothing, we'll validate it later.
   2663       } else {
   2664         D.Diag(diag::err_drv_unsupported_option_argument)
   2665             << A->getOption().getName() << Value;
   2666       }
   2667     }
   2668   }
   2669   if (CompressDebugSections) {
   2670     if (llvm::zlib::isAvailable())
   2671       CmdArgs.push_back("-compress-debug-sections");
   2672     else
   2673       D.Diag(diag::warn_debug_compression_unavailable);
   2674   }
   2675 }
   2676 
   2677 // This adds the static libclang_rt.builtins-arch.a directly to the command line
   2678 // FIXME: Make sure we can also emit shared objects if they're requested
   2679 // and available, check for possible errors, etc.
   2680 static void addClangRT(const ToolChain &TC, const ArgList &Args,
   2681                        ArgStringList &CmdArgs) {
   2682   CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
   2683 }
   2684 
   2685 namespace {
   2686 enum OpenMPRuntimeKind {
   2687   /// An unknown OpenMP runtime. We can't generate effective OpenMP code
   2688   /// without knowing what runtime to target.
   2689   OMPRT_Unknown,
   2690 
   2691   /// The LLVM OpenMP runtime. When completed and integrated, this will become
   2692   /// the default for Clang.
   2693   OMPRT_OMP,
   2694 
   2695   /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
   2696   /// this runtime but can swallow the pragmas, and find and link against the
   2697   /// runtime library itself.
   2698   OMPRT_GOMP,
   2699 
   2700   /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
   2701   /// OpenMP runtime. We support this mode for users with existing dependencies
   2702   /// on this runtime library name.
   2703   OMPRT_IOMP5
   2704 };
   2705 }
   2706 
   2707 /// Compute the desired OpenMP runtime from the flag provided.
   2708 static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
   2709                                           const ArgList &Args) {
   2710   StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
   2711 
   2712   const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
   2713   if (A)
   2714     RuntimeName = A->getValue();
   2715 
   2716   auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
   2717                 .Case("libomp", OMPRT_OMP)
   2718                 .Case("libgomp", OMPRT_GOMP)
   2719                 .Case("libiomp5", OMPRT_IOMP5)
   2720                 .Default(OMPRT_Unknown);
   2721 
   2722   if (RT == OMPRT_Unknown) {
   2723     if (A)
   2724       TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
   2725           << A->getOption().getName() << A->getValue();
   2726     else
   2727       // FIXME: We could use a nicer diagnostic here.
   2728       TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
   2729   }
   2730 
   2731   return RT;
   2732 }
   2733 
   2734 static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
   2735                               const ArgList &Args) {
   2736   if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
   2737                     options::OPT_fno_openmp, false))
   2738     return;
   2739 
   2740   switch (getOpenMPRuntime(TC, Args)) {
   2741   case OMPRT_OMP:
   2742     CmdArgs.push_back("-lomp");
   2743     break;
   2744   case OMPRT_GOMP:
   2745     CmdArgs.push_back("-lgomp");
   2746     break;
   2747   case OMPRT_IOMP5:
   2748     CmdArgs.push_back("-liomp5");
   2749     break;
   2750   case OMPRT_Unknown:
   2751     // Already diagnosed.
   2752     break;
   2753   }
   2754 }
   2755 
   2756 static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
   2757                                 ArgStringList &CmdArgs, StringRef Sanitizer,
   2758                                 bool IsShared) {
   2759   // Static runtimes must be forced into executable, so we wrap them in
   2760   // whole-archive.
   2761   if (!IsShared) CmdArgs.push_back("-whole-archive");
   2762   CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
   2763   if (!IsShared) CmdArgs.push_back("-no-whole-archive");
   2764 }
   2765 
   2766 // Tries to use a file with the list of dynamic symbols that need to be exported
   2767 // from the runtime library. Returns true if the file was found.
   2768 static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
   2769                                     ArgStringList &CmdArgs,
   2770                                     StringRef Sanitizer) {
   2771   SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
   2772   if (llvm::sys::fs::exists(SanRT + ".syms")) {
   2773     CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
   2774     return true;
   2775   }
   2776   return false;
   2777 }
   2778 
   2779 static void linkSanitizerRuntimeDeps(const ToolChain &TC,
   2780                                      ArgStringList &CmdArgs) {
   2781   // Force linking against the system libraries sanitizers depends on
   2782   // (see PR15823 why this is necessary).
   2783   CmdArgs.push_back("--no-as-needed");
   2784   CmdArgs.push_back("-lpthread");
   2785   CmdArgs.push_back("-lrt");
   2786   CmdArgs.push_back("-lm");
   2787   // There's no libdl on FreeBSD.
   2788   if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
   2789     CmdArgs.push_back("-ldl");
   2790 }
   2791 
   2792 static void
   2793 collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
   2794                          SmallVectorImpl<StringRef> &SharedRuntimes,
   2795                          SmallVectorImpl<StringRef> &StaticRuntimes,
   2796                          SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
   2797   const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
   2798   // Collect shared runtimes.
   2799   if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
   2800     SharedRuntimes.push_back("asan");
   2801   }
   2802 
   2803   // Collect static runtimes.
   2804   if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
   2805     // Don't link static runtimes into DSOs or if compiling for Android.
   2806     return;
   2807   }
   2808   if (SanArgs.needsAsanRt()) {
   2809     if (SanArgs.needsSharedAsanRt()) {
   2810       HelperStaticRuntimes.push_back("asan-preinit");
   2811     } else {
   2812       StaticRuntimes.push_back("asan");
   2813       if (SanArgs.linkCXXRuntimes())
   2814         StaticRuntimes.push_back("asan_cxx");
   2815     }
   2816   }
   2817   if (SanArgs.needsDfsanRt())
   2818     StaticRuntimes.push_back("dfsan");
   2819   if (SanArgs.needsLsanRt())
   2820     StaticRuntimes.push_back("lsan");
   2821   if (SanArgs.needsMsanRt()) {
   2822     StaticRuntimes.push_back("msan");
   2823     if (SanArgs.linkCXXRuntimes())
   2824       StaticRuntimes.push_back("msan_cxx");
   2825   }
   2826   if (SanArgs.needsTsanRt()) {
   2827     StaticRuntimes.push_back("tsan");
   2828     if (SanArgs.linkCXXRuntimes())
   2829       StaticRuntimes.push_back("tsan_cxx");
   2830   }
   2831   if (SanArgs.needsUbsanRt()) {
   2832     StaticRuntimes.push_back("ubsan_standalone");
   2833     if (SanArgs.linkCXXRuntimes())
   2834       StaticRuntimes.push_back("ubsan_standalone_cxx");
   2835   }
   2836   if (SanArgs.needsSafeStackRt())
   2837     StaticRuntimes.push_back("safestack");
   2838   if (SanArgs.needsCfiRt())
   2839     StaticRuntimes.push_back("cfi");
   2840   if (SanArgs.needsCfiDiagRt())
   2841     StaticRuntimes.push_back("cfi_diag");
   2842 }
   2843 
   2844 // Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
   2845 // C runtime, etc). Returns true if sanitizer system deps need to be linked in.
   2846 static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
   2847                                  ArgStringList &CmdArgs) {
   2848   SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
   2849       HelperStaticRuntimes;
   2850   collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
   2851                            HelperStaticRuntimes);
   2852   for (auto RT : SharedRuntimes)
   2853     addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
   2854   for (auto RT : HelperStaticRuntimes)
   2855     addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
   2856   bool AddExportDynamic = false;
   2857   for (auto RT : StaticRuntimes) {
   2858     addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
   2859     AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
   2860   }
   2861   // If there is a static runtime with no dynamic list, force all the symbols
   2862   // to be dynamic to be sure we export sanitizer interface functions.
   2863   if (AddExportDynamic)
   2864     CmdArgs.push_back("-export-dynamic");
   2865   return !StaticRuntimes.empty();
   2866 }
   2867 
   2868 static bool areOptimizationsEnabled(const ArgList &Args) {
   2869   // Find the last -O arg and see if it is non-zero.
   2870   if (Arg *A = Args.getLastArg(options::OPT_O_Group))
   2871     return !A->getOption().matches(options::OPT_O0);
   2872   // Defaults to -O0.
   2873   return false;
   2874 }
   2875 
   2876 static bool shouldUseFramePointerForTarget(const ArgList &Args,
   2877                                            const llvm::Triple &Triple) {
   2878   switch (Triple.getArch()) {
   2879   case llvm::Triple::xcore:
   2880   case llvm::Triple::wasm32:
   2881   case llvm::Triple::wasm64:
   2882     // XCore never wants frame pointers, regardless of OS.
   2883     // WebAssembly never wants frame pointers.
   2884     return false;
   2885   default:
   2886     break;
   2887   }
   2888 
   2889   if (Triple.isOSLinux()) {
   2890     switch (Triple.getArch()) {
   2891     // Don't use a frame pointer on linux if optimizing for certain targets.
   2892     case llvm::Triple::mips64:
   2893     case llvm::Triple::mips64el:
   2894     case llvm::Triple::mips:
   2895     case llvm::Triple::mipsel:
   2896     case llvm::Triple::systemz:
   2897     case llvm::Triple::x86:
   2898     case llvm::Triple::x86_64:
   2899       return !areOptimizationsEnabled(Args);
   2900     default:
   2901       return true;
   2902     }
   2903   }
   2904 
   2905   if (Triple.isOSWindows()) {
   2906     switch (Triple.getArch()) {
   2907     case llvm::Triple::x86:
   2908       return !areOptimizationsEnabled(Args);
   2909     case llvm::Triple::arm:
   2910     case llvm::Triple::thumb:
   2911       // Windows on ARM builds with FPO disabled to aid fast stack walking
   2912       return true;
   2913     default:
   2914       // All other supported Windows ISAs use xdata unwind information, so frame
   2915       // pointers are not generally useful.
   2916       return false;
   2917     }
   2918   }
   2919 
   2920   return true;
   2921 }
   2922 
   2923 static bool shouldUseFramePointer(const ArgList &Args,
   2924                                   const llvm::Triple &Triple) {
   2925   if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
   2926                                options::OPT_fomit_frame_pointer))
   2927     return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
   2928   if (Args.hasArg(options::OPT_pg))
   2929     return true;
   2930 
   2931   return shouldUseFramePointerForTarget(Args, Triple);
   2932 }
   2933 
   2934 static bool shouldUseLeafFramePointer(const ArgList &Args,
   2935                                       const llvm::Triple &Triple) {
   2936   if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
   2937                                options::OPT_momit_leaf_frame_pointer))
   2938     return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
   2939   if (Args.hasArg(options::OPT_pg))
   2940     return true;
   2941 
   2942   if (Triple.isPS4CPU())
   2943     return false;
   2944 
   2945   return shouldUseFramePointerForTarget(Args, Triple);
   2946 }
   2947 
   2948 /// Add a CC1 option to specify the debug compilation directory.
   2949 static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
   2950   SmallString<128> cwd;
   2951   if (!llvm::sys::fs::current_path(cwd)) {
   2952     CmdArgs.push_back("-fdebug-compilation-dir");
   2953     CmdArgs.push_back(Args.MakeArgString(cwd));
   2954   }
   2955 }
   2956 
   2957 static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
   2958   Arg *FinalOutput = Args.getLastArg(options::OPT_o);
   2959   if (FinalOutput && Args.hasArg(options::OPT_c)) {
   2960     SmallString<128> T(FinalOutput->getValue());
   2961     llvm::sys::path::replace_extension(T, "dwo");
   2962     return Args.MakeArgString(T);
   2963   } else {
   2964     // Use the compilation dir.
   2965     SmallString<128> T(
   2966         Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
   2967     SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
   2968     llvm::sys::path::replace_extension(F, "dwo");
   2969     T += F;
   2970     return Args.MakeArgString(F);
   2971   }
   2972 }
   2973 
   2974 static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
   2975                            const JobAction &JA, const ArgList &Args,
   2976                            const InputInfo &Output, const char *OutFile) {
   2977   ArgStringList ExtractArgs;
   2978   ExtractArgs.push_back("--extract-dwo");
   2979 
   2980   ArgStringList StripArgs;
   2981   StripArgs.push_back("--strip-dwo");
   2982 
   2983   // Grabbing the output of the earlier compile step.
   2984   StripArgs.push_back(Output.getFilename());
   2985   ExtractArgs.push_back(Output.getFilename());
   2986   ExtractArgs.push_back(OutFile);
   2987 
   2988   const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
   2989   InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
   2990 
   2991   // First extract the dwo sections.
   2992   C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
   2993 
   2994   // Then remove them from the original .o file.
   2995   C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
   2996 }
   2997 
   2998 /// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
   2999 /// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
   3000 static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
   3001   if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
   3002     if (A->getOption().matches(options::OPT_O4) ||
   3003         A->getOption().matches(options::OPT_Ofast))
   3004       return true;
   3005 
   3006     if (A->getOption().matches(options::OPT_O0))
   3007       return false;
   3008 
   3009     assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
   3010 
   3011     // Vectorize -Os.
   3012     StringRef S(A->getValue());
   3013     if (S == "s")
   3014       return true;
   3015 
   3016     // Don't vectorize -Oz, unless it's the slp vectorizer.
   3017     if (S == "z")
   3018       return isSlpVec;
   3019 
   3020     unsigned OptLevel = 0;
   3021     if (S.getAsInteger(10, OptLevel))
   3022       return false;
   3023 
   3024     return OptLevel > 1;
   3025   }
   3026 
   3027   return false;
   3028 }
   3029 
   3030 /// Add -x lang to \p CmdArgs for \p Input.
   3031 static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
   3032                              ArgStringList &CmdArgs) {
   3033   // When using -verify-pch, we don't want to provide the type
   3034   // 'precompiled-header' if it was inferred from the file extension
   3035   if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
   3036     return;
   3037 
   3038   CmdArgs.push_back("-x");
   3039   if (Args.hasArg(options::OPT_rewrite_objc))
   3040     CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
   3041   else
   3042     CmdArgs.push_back(types::getTypeName(Input.getType()));
   3043 }
   3044 
   3045 static VersionTuple getMSCompatibilityVersion(unsigned Version) {
   3046   if (Version < 100)
   3047     return VersionTuple(Version);
   3048 
   3049   if (Version < 10000)
   3050     return VersionTuple(Version / 100, Version % 100);
   3051 
   3052   unsigned Build = 0, Factor = 1;
   3053   for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
   3054     Build = Build + (Version % 10) * Factor;
   3055   return VersionTuple(Version / 100, Version % 100, Build);
   3056 }
   3057 
   3058 // Claim options we don't want to warn if they are unused. We do this for
   3059 // options that build systems might add but are unused when assembling or only
   3060 // running the preprocessor for example.
   3061 static void claimNoWarnArgs(const ArgList &Args) {
   3062   // Don't warn about unused -f(no-)?lto.  This can happen when we're
   3063   // preprocessing, precompiling or assembling.
   3064   Args.ClaimAllArgs(options::OPT_flto_EQ);
   3065   Args.ClaimAllArgs(options::OPT_flto);
   3066   Args.ClaimAllArgs(options::OPT_fno_lto);
   3067 }
   3068 
   3069 static void appendUserToPath(SmallVectorImpl<char> &Result) {
   3070 #ifdef LLVM_ON_UNIX
   3071   const char *Username = getenv("LOGNAME");
   3072 #else
   3073   const char *Username = getenv("USERNAME");
   3074 #endif
   3075   if (Username) {
   3076     // Validate that LoginName can be used in a path, and get its length.
   3077     size_t Len = 0;
   3078     for (const char *P = Username; *P; ++P, ++Len) {
   3079       if (!isAlphanumeric(*P) && *P != '_') {
   3080         Username = nullptr;
   3081         break;
   3082       }
   3083     }
   3084 
   3085     if (Username && Len > 0) {
   3086       Result.append(Username, Username + Len);
   3087       return;
   3088     }
   3089   }
   3090 
   3091 // Fallback to user id.
   3092 #ifdef LLVM_ON_UNIX
   3093   std::string UID = llvm::utostr(getuid());
   3094 #else
   3095   // FIXME: Windows seems to have an 'SID' that might work.
   3096   std::string UID = "9999";
   3097 #endif
   3098   Result.append(UID.begin(), UID.end());
   3099 }
   3100 
   3101 VersionTuple visualstudio::getMSVCVersion(const Driver *D,
   3102                                           const llvm::Triple &Triple,
   3103                                           const llvm::opt::ArgList &Args,
   3104                                           bool IsWindowsMSVC) {
   3105   if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
   3106                    IsWindowsMSVC) ||
   3107       Args.hasArg(options::OPT_fmsc_version) ||
   3108       Args.hasArg(options::OPT_fms_compatibility_version)) {
   3109     const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
   3110     const Arg *MSCompatibilityVersion =
   3111         Args.getLastArg(options::OPT_fms_compatibility_version);
   3112 
   3113     if (MSCVersion && MSCompatibilityVersion) {
   3114       if (D)
   3115         D->Diag(diag::err_drv_argument_not_allowed_with)
   3116             << MSCVersion->getAsString(Args)
   3117             << MSCompatibilityVersion->getAsString(Args);
   3118       return VersionTuple();
   3119     }
   3120 
   3121     if (MSCompatibilityVersion) {
   3122       VersionTuple MSVT;
   3123       if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
   3124         D->Diag(diag::err_drv_invalid_value)
   3125             << MSCompatibilityVersion->getAsString(Args)
   3126             << MSCompatibilityVersion->getValue();
   3127       return MSVT;
   3128     }
   3129 
   3130     if (MSCVersion) {
   3131       unsigned Version = 0;
   3132       if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
   3133         D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
   3134                                              << MSCVersion->getValue();
   3135       return getMSCompatibilityVersion(Version);
   3136     }
   3137 
   3138     unsigned Major, Minor, Micro;
   3139     Triple.getEnvironmentVersion(Major, Minor, Micro);
   3140     if (Major || Minor || Micro)
   3141       return VersionTuple(Major, Minor, Micro);
   3142 
   3143     return VersionTuple(18);
   3144   }
   3145   return VersionTuple();
   3146 }
   3147 
   3148 static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
   3149                                    const InputInfo &Output, const ArgList &Args,
   3150                                    ArgStringList &CmdArgs) {
   3151   auto *ProfileGenerateArg = Args.getLastArg(
   3152       options::OPT_fprofile_instr_generate,
   3153       options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
   3154       options::OPT_fprofile_generate_EQ,
   3155       options::OPT_fno_profile_instr_generate);
   3156   if (ProfileGenerateArg &&
   3157       ProfileGenerateArg->getOption().matches(
   3158           options::OPT_fno_profile_instr_generate))
   3159     ProfileGenerateArg = nullptr;
   3160 
   3161   auto *ProfileUseArg = Args.getLastArg(
   3162       options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
   3163       options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
   3164       options::OPT_fno_profile_instr_use);
   3165   if (ProfileUseArg &&
   3166       ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
   3167     ProfileUseArg = nullptr;
   3168 
   3169   if (ProfileGenerateArg && ProfileUseArg)
   3170     D.Diag(diag::err_drv_argument_not_allowed_with)
   3171         << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
   3172 
   3173   if (ProfileGenerateArg) {
   3174     if (ProfileGenerateArg->getOption().matches(
   3175             options::OPT_fprofile_instr_generate_EQ))
   3176       ProfileGenerateArg->render(Args, CmdArgs);
   3177     else if (ProfileGenerateArg->getOption().matches(
   3178                  options::OPT_fprofile_generate_EQ)) {
   3179       SmallString<128> Path(ProfileGenerateArg->getValue());
   3180       llvm::sys::path::append(Path, "default.profraw");
   3181       CmdArgs.push_back(
   3182           Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
   3183     } else
   3184       Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
   3185   }
   3186 
   3187   if (ProfileUseArg) {
   3188     if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
   3189       ProfileUseArg->render(Args, CmdArgs);
   3190     else if ((ProfileUseArg->getOption().matches(
   3191                   options::OPT_fprofile_use_EQ) ||
   3192               ProfileUseArg->getOption().matches(
   3193                   options::OPT_fprofile_instr_use))) {
   3194       SmallString<128> Path(
   3195           ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
   3196       if (Path.empty() || llvm::sys::fs::is_directory(Path))
   3197         llvm::sys::path::append(Path, "default.profdata");
   3198       CmdArgs.push_back(
   3199           Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
   3200     }
   3201   }
   3202 
   3203   if (Args.hasArg(options::OPT_ftest_coverage) ||
   3204       Args.hasArg(options::OPT_coverage))
   3205     CmdArgs.push_back("-femit-coverage-notes");
   3206   if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
   3207                    false) ||
   3208       Args.hasArg(options::OPT_coverage))
   3209     CmdArgs.push_back("-femit-coverage-data");
   3210 
   3211   if (Args.hasFlag(options::OPT_fcoverage_mapping,
   3212                    options::OPT_fno_coverage_mapping, false) &&
   3213       !ProfileGenerateArg)
   3214     D.Diag(diag::err_drv_argument_only_allowed_with)
   3215         << "-fcoverage-mapping"
   3216         << "-fprofile-instr-generate";
   3217 
   3218   if (Args.hasFlag(options::OPT_fcoverage_mapping,
   3219                    options::OPT_fno_coverage_mapping, false))
   3220     CmdArgs.push_back("-fcoverage-mapping");
   3221 
   3222   if (C.getArgs().hasArg(options::OPT_c) ||
   3223       C.getArgs().hasArg(options::OPT_S)) {
   3224     if (Output.isFilename()) {
   3225       CmdArgs.push_back("-coverage-file");
   3226       SmallString<128> CoverageFilename;
   3227       if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
   3228         CoverageFilename = FinalOutput->getValue();
   3229       } else {
   3230         CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
   3231       }
   3232       if (llvm::sys::path::is_relative(CoverageFilename)) {
   3233         SmallString<128> Pwd;
   3234         if (!llvm::sys::fs::current_path(Pwd)) {
   3235           llvm::sys::path::append(Pwd, CoverageFilename);
   3236           CoverageFilename.swap(Pwd);
   3237         }
   3238       }
   3239       CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
   3240     }
   3241   }
   3242 }
   3243 
   3244 static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
   3245                                 ArgStringList &CmdArgs) {
   3246   if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
   3247                     false) ||
   3248        Args.hasFlag(options::OPT_fprofile_generate,
   3249                     options::OPT_fno_profile_instr_generate, false) ||
   3250        Args.hasFlag(options::OPT_fprofile_generate_EQ,
   3251                     options::OPT_fno_profile_instr_generate, false) ||
   3252        Args.hasFlag(options::OPT_fprofile_instr_generate,
   3253                     options::OPT_fno_profile_instr_generate, false) ||
   3254        Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
   3255                     options::OPT_fno_profile_instr_generate, false) ||
   3256        Args.hasArg(options::OPT_fcreate_profile) ||
   3257        Args.hasArg(options::OPT_coverage)))
   3258     CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
   3259 }
   3260 
   3261 /// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments.  Then,
   3262 /// smooshes them together with platform defaults, to decide whether
   3263 /// this compile should be using PIC mode or not. Returns a tuple of
   3264 /// (RelocationModel, PICLevel, IsPIE).
   3265 static std::tuple<llvm::Reloc::Model, unsigned, bool>
   3266 ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
   3267              const ArgList &Args) {
   3268   // FIXME: why does this code...and so much everywhere else, use both
   3269   // ToolChain.getTriple() and Triple?
   3270   bool PIE = ToolChain.isPIEDefault();
   3271   bool PIC = PIE || ToolChain.isPICDefault();
   3272   // The Darwin default to use PIC does not apply when using -static.
   3273   if (ToolChain.getTriple().isOSDarwin() && Args.hasArg(options::OPT_static))
   3274     PIE = PIC = false;
   3275   bool IsPICLevelTwo = PIC;
   3276 
   3277   bool KernelOrKext =
   3278       Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
   3279 
   3280   // Android-specific defaults for PIC/PIE
   3281   if (ToolChain.getTriple().isAndroid()) {
   3282     switch (ToolChain.getArch()) {
   3283     case llvm::Triple::arm:
   3284     case llvm::Triple::armeb:
   3285     case llvm::Triple::thumb:
   3286     case llvm::Triple::thumbeb:
   3287     case llvm::Triple::aarch64:
   3288     case llvm::Triple::mips:
   3289     case llvm::Triple::mipsel:
   3290     case llvm::Triple::mips64:
   3291     case llvm::Triple::mips64el:
   3292       PIC = true; // "-fpic"
   3293       break;
   3294 
   3295     case llvm::Triple::x86:
   3296     case llvm::Triple::x86_64:
   3297       PIC = true; // "-fPIC"
   3298       IsPICLevelTwo = true;
   3299       break;
   3300 
   3301     default:
   3302       break;
   3303     }
   3304   }
   3305 
   3306   // OpenBSD-specific defaults for PIE
   3307   if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
   3308     switch (ToolChain.getArch()) {
   3309     case llvm::Triple::mips64:
   3310     case llvm::Triple::mips64el:
   3311     case llvm::Triple::sparcel:
   3312     case llvm::Triple::x86:
   3313     case llvm::Triple::x86_64:
   3314       IsPICLevelTwo = false; // "-fpie"
   3315       break;
   3316 
   3317     case llvm::Triple::ppc:
   3318     case llvm::Triple::sparc:
   3319     case llvm::Triple::sparcv9:
   3320       IsPICLevelTwo = true; // "-fPIE"
   3321       break;
   3322 
   3323     default:
   3324       break;
   3325     }
   3326   }
   3327 
   3328   // The last argument relating to either PIC or PIE wins, and no
   3329   // other argument is used. If the last argument is any flavor of the
   3330   // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
   3331   // option implicitly enables PIC at the same level.
   3332   Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
   3333                                     options::OPT_fpic, options::OPT_fno_pic,
   3334                                     options::OPT_fPIE, options::OPT_fno_PIE,
   3335                                     options::OPT_fpie, options::OPT_fno_pie);
   3336   // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
   3337   // is forced, then neither PIC nor PIE flags will have no effect.
   3338   if (!ToolChain.isPICDefaultForced()) {
   3339     if (LastPICArg) {
   3340       Option O = LastPICArg->getOption();
   3341       if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
   3342           O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
   3343         PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
   3344         PIC =
   3345             PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
   3346         IsPICLevelTwo =
   3347             O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
   3348       } else {
   3349         PIE = PIC = false;
   3350         if (Triple.isPS4CPU()) {
   3351           Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
   3352           StringRef Model = ModelArg ? ModelArg->getValue() : "";
   3353           if (Model != "kernel") {
   3354             PIC = true;
   3355             ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
   3356                 << LastPICArg->getSpelling();
   3357           }
   3358         }
   3359       }
   3360     }
   3361   }
   3362 
   3363   // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
   3364   // PIC level would've been set to level 1, force it back to level 2 PIC
   3365   // instead.
   3366   if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
   3367     IsPICLevelTwo |= ToolChain.isPICDefault();
   3368 
   3369   // This kernel flags are a trump-card: they will disable PIC/PIE
   3370   // generation, independent of the argument order.
   3371   if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
   3372                        !Triple.isWatchOS()))
   3373     PIC = PIE = false;
   3374 
   3375   if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
   3376     // This is a very special mode. It trumps the other modes, almost no one
   3377     // uses it, and it isn't even valid on any OS but Darwin.
   3378     if (!ToolChain.getTriple().isOSDarwin())
   3379       ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
   3380           << A->getSpelling() << ToolChain.getTriple().str();
   3381 
   3382     // FIXME: Warn when this flag trumps some other PIC or PIE flag.
   3383 
   3384     // Only a forced PIC mode can cause the actual compile to have PIC defines
   3385     // etc., no flags are sufficient. This behavior was selected to closely
   3386     // match that of llvm-gcc and Apple GCC before that.
   3387     PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
   3388 
   3389     return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
   3390   }
   3391 
   3392   if (PIC)
   3393     return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
   3394 
   3395   return std::make_tuple(llvm::Reloc::Static, 0, false);
   3396 }
   3397 
   3398 static const char *RelocationModelName(llvm::Reloc::Model Model) {
   3399   switch (Model) {
   3400   case llvm::Reloc::Default:
   3401     return nullptr;
   3402   case llvm::Reloc::Static:
   3403     return "static";
   3404   case llvm::Reloc::PIC_:
   3405     return "pic";
   3406   case llvm::Reloc::DynamicNoPIC:
   3407     return "dynamic-no-pic";
   3408   }
   3409   llvm_unreachable("Unknown Reloc::Model kind");
   3410 }
   3411 
   3412 static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
   3413                              ArgStringList &CmdArgs) {
   3414   llvm::Reloc::Model RelocationModel;
   3415   unsigned PICLevel;
   3416   bool IsPIE;
   3417   std::tie(RelocationModel, PICLevel, IsPIE) =
   3418       ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
   3419 
   3420   if (RelocationModel != llvm::Reloc::Static)
   3421     CmdArgs.push_back("-KPIC");
   3422 }
   3423 
   3424 void Clang::ConstructJob(Compilation &C, const JobAction &JA,
   3425                          const InputInfo &Output, const InputInfoList &Inputs,
   3426                          const ArgList &Args, const char *LinkingOutput) const {
   3427   std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
   3428   const llvm::Triple Triple(TripleStr);
   3429 
   3430   bool KernelOrKext =
   3431       Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
   3432   const Driver &D = getToolChain().getDriver();
   3433   ArgStringList CmdArgs;
   3434 
   3435   bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
   3436   bool IsWindowsCygnus =
   3437       getToolChain().getTriple().isWindowsCygwinEnvironment();
   3438   bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
   3439   bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
   3440 
   3441   // Check number of inputs for sanity. We need at least one input.
   3442   assert(Inputs.size() >= 1 && "Must have at least one input.");
   3443   const InputInfo &Input = Inputs[0];
   3444   // CUDA compilation may have multiple inputs (source file + results of
   3445   // device-side compilations). All other jobs are expected to have exactly one
   3446   // input.
   3447   bool IsCuda = types::isCuda(Input.getType());
   3448   assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
   3449 
   3450   // Invoke ourselves in -cc1 mode.
   3451   //
   3452   // FIXME: Implement custom jobs for internal actions.
   3453   CmdArgs.push_back("-cc1");
   3454 
   3455   // Add the "effective" target triple.
   3456   CmdArgs.push_back("-triple");
   3457   CmdArgs.push_back(Args.MakeArgString(TripleStr));
   3458 
   3459   const ToolChain *AuxToolChain = nullptr;
   3460   if (IsCuda) {
   3461     // FIXME: We need a (better) way to pass information about
   3462     // particular compilation pass we're constructing here. For now we
   3463     // can check which toolchain we're using and pick the other one to
   3464     // extract the triple.
   3465     if (&getToolChain() == C.getCudaDeviceToolChain())
   3466       AuxToolChain = C.getCudaHostToolChain();
   3467     else if (&getToolChain() == C.getCudaHostToolChain())
   3468       AuxToolChain = C.getCudaDeviceToolChain();
   3469     else
   3470       llvm_unreachable("Can't figure out CUDA compilation mode.");
   3471     assert(AuxToolChain != nullptr && "No aux toolchain.");
   3472     CmdArgs.push_back("-aux-triple");
   3473     CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
   3474     CmdArgs.push_back("-fcuda-target-overloads");
   3475     CmdArgs.push_back("-fcuda-disable-target-call-checks");
   3476   }
   3477 
   3478   if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
   3479                                Triple.getArch() == llvm::Triple::thumb)) {
   3480     unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
   3481     unsigned Version;
   3482     Triple.getArchName().substr(Offset).getAsInteger(10, Version);
   3483     if (Version < 7)
   3484       D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
   3485                                                 << TripleStr;
   3486   }
   3487 
   3488   // Push all default warning arguments that are specific to
   3489   // the given target.  These come before user provided warning options
   3490   // are provided.
   3491   getToolChain().addClangWarningOptions(CmdArgs);
   3492 
   3493   // Select the appropriate action.
   3494   RewriteKind rewriteKind = RK_None;
   3495 
   3496   if (isa<AnalyzeJobAction>(JA)) {
   3497     assert(JA.getType() == types::TY_Plist && "Invalid output type.");
   3498     CmdArgs.push_back("-analyze");
   3499   } else if (isa<MigrateJobAction>(JA)) {
   3500     CmdArgs.push_back("-migrate");
   3501   } else if (isa<PreprocessJobAction>(JA)) {
   3502     if (Output.getType() == types::TY_Dependencies)
   3503       CmdArgs.push_back("-Eonly");
   3504     else {
   3505       CmdArgs.push_back("-E");
   3506       if (Args.hasArg(options::OPT_rewrite_objc) &&
   3507           !Args.hasArg(options::OPT_g_Group))
   3508         CmdArgs.push_back("-P");
   3509     }
   3510   } else if (isa<AssembleJobAction>(JA)) {
   3511     CmdArgs.push_back("-emit-obj");
   3512 
   3513     CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
   3514 
   3515     // Also ignore explicit -force_cpusubtype_ALL option.
   3516     (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
   3517   } else if (isa<PrecompileJobAction>(JA)) {
   3518     // Use PCH if the user requested it.
   3519     bool UsePCH = D.CCCUsePCH;
   3520 
   3521     if (JA.getType() == types::TY_Nothing)
   3522       CmdArgs.push_back("-fsyntax-only");
   3523     else if (UsePCH)
   3524       CmdArgs.push_back("-emit-pch");
   3525     else
   3526       CmdArgs.push_back("-emit-pth");
   3527   } else if (isa<VerifyPCHJobAction>(JA)) {
   3528     CmdArgs.push_back("-verify-pch");
   3529   } else {
   3530     assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
   3531            "Invalid action for clang tool.");
   3532     if (JA.getType() == types::TY_Nothing) {
   3533       CmdArgs.push_back("-fsyntax-only");
   3534     } else if (JA.getType() == types::TY_LLVM_IR ||
   3535                JA.getType() == types::TY_LTO_IR) {
   3536       CmdArgs.push_back("-emit-llvm");
   3537     } else if (JA.getType() == types::TY_LLVM_BC ||
   3538                JA.getType() == types::TY_LTO_BC) {
   3539       CmdArgs.push_back("-emit-llvm-bc");
   3540     } else if (JA.getType() == types::TY_PP_Asm) {
   3541       CmdArgs.push_back("-S");
   3542     } else if (JA.getType() == types::TY_AST) {
   3543       CmdArgs.push_back("-emit-pch");
   3544     } else if (JA.getType() == types::TY_ModuleFile) {
   3545       CmdArgs.push_back("-module-file-info");
   3546     } else if (JA.getType() == types::TY_RewrittenObjC) {
   3547       CmdArgs.push_back("-rewrite-objc");
   3548       rewriteKind = RK_NonFragile;
   3549     } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
   3550       CmdArgs.push_back("-rewrite-objc");
   3551       rewriteKind = RK_Fragile;
   3552     } else {
   3553       assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
   3554     }
   3555 
   3556     // Preserve use-list order by default when emitting bitcode, so that
   3557     // loading the bitcode up in 'opt' or 'llc' and running passes gives the
   3558     // same result as running passes here.  For LTO, we don't need to preserve
   3559     // the use-list order, since serialization to bitcode is part of the flow.
   3560     if (JA.getType() == types::TY_LLVM_BC)
   3561       CmdArgs.push_back("-emit-llvm-uselists");
   3562 
   3563     if (D.isUsingLTO())
   3564       Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
   3565   }
   3566 
   3567   if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
   3568     if (!types::isLLVMIR(Input.getType()))
   3569       D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
   3570                                                        << "-x ir";
   3571     Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
   3572   }
   3573 
   3574   // We normally speed up the clang process a bit by skipping destructors at
   3575   // exit, but when we're generating diagnostics we can rely on some of the
   3576   // cleanup.
   3577   if (!C.isForDiagnostics())
   3578     CmdArgs.push_back("-disable-free");
   3579 
   3580 // Disable the verification pass in -asserts builds.
   3581 #ifdef NDEBUG
   3582   CmdArgs.push_back("-disable-llvm-verifier");
   3583 #endif
   3584 
   3585   // Set the main file name, so that debug info works even with
   3586   // -save-temps.
   3587   CmdArgs.push_back("-main-file-name");
   3588   CmdArgs.push_back(getBaseInputName(Args, Input));
   3589 
   3590   // Some flags which affect the language (via preprocessor
   3591   // defines).
   3592   if (Args.hasArg(options::OPT_static))
   3593     CmdArgs.push_back("-static-define");
   3594 
   3595   if (isa<AnalyzeJobAction>(JA)) {
   3596     // Enable region store model by default.
   3597     CmdArgs.push_back("-analyzer-store=region");
   3598 
   3599     // Treat blocks as analysis entry points.
   3600     CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
   3601 
   3602     CmdArgs.push_back("-analyzer-eagerly-assume");
   3603 
   3604     // Add default argument set.
   3605     if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
   3606       CmdArgs.push_back("-analyzer-checker=core");
   3607 
   3608       if (!IsWindowsMSVC)
   3609         CmdArgs.push_back("-analyzer-checker=unix");
   3610 
   3611       if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
   3612         CmdArgs.push_back("-analyzer-checker=osx");
   3613 
   3614       CmdArgs.push_back("-analyzer-checker=deadcode");
   3615 
   3616       if (types::isCXX(Input.getType()))
   3617         CmdArgs.push_back("-analyzer-checker=cplusplus");
   3618 
   3619       // Enable the following experimental checkers for testing.
   3620       CmdArgs.push_back(
   3621           "-analyzer-checker=security.insecureAPI.UncheckedReturn");
   3622       CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
   3623       CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
   3624       CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
   3625       CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
   3626       CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
   3627 
   3628       // Default nullability checks.
   3629       CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
   3630       CmdArgs.push_back(
   3631           "-analyzer-checker=nullability.NullReturnedFromNonnull");
   3632     }
   3633 
   3634     // Set the output format. The default is plist, for (lame) historical
   3635     // reasons.
   3636     CmdArgs.push_back("-analyzer-output");
   3637     if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
   3638       CmdArgs.push_back(A->getValue());
   3639     else
   3640       CmdArgs.push_back("plist");
   3641 
   3642     // Disable the presentation of standard compiler warnings when
   3643     // using --analyze.  We only want to show static analyzer diagnostics
   3644     // or frontend errors.
   3645     CmdArgs.push_back("-w");
   3646 
   3647     // Add -Xanalyzer arguments when running as analyzer.
   3648     Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
   3649   }
   3650 
   3651   CheckCodeGenerationOptions(D, Args);
   3652 
   3653   llvm::Reloc::Model RelocationModel;
   3654   unsigned PICLevel;
   3655   bool IsPIE;
   3656   std::tie(RelocationModel, PICLevel, IsPIE) =
   3657       ParsePICArgs(getToolChain(), Triple, Args);
   3658 
   3659   const char *RMName = RelocationModelName(RelocationModel);
   3660   if (RMName) {
   3661     CmdArgs.push_back("-mrelocation-model");
   3662     CmdArgs.push_back(RMName);
   3663   }
   3664   if (PICLevel > 0) {
   3665     CmdArgs.push_back("-pic-level");
   3666     CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
   3667     if (IsPIE) {
   3668       CmdArgs.push_back("-pie-level");
   3669       CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
   3670     }
   3671   }
   3672 
   3673   if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
   3674     CmdArgs.push_back("-meabi");
   3675     CmdArgs.push_back(A->getValue());
   3676   }
   3677 
   3678   CmdArgs.push_back("-mthread-model");
   3679   if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
   3680     CmdArgs.push_back(A->getValue());
   3681   else
   3682     CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
   3683 
   3684   Args.AddLastArg(CmdArgs, options::OPT_fveclib);
   3685 
   3686   if (!Args.hasFlag(options::OPT_fmerge_all_constants,
   3687                     options::OPT_fno_merge_all_constants))
   3688     CmdArgs.push_back("-fno-merge-all-constants");
   3689 
   3690   // LLVM Code Generator Options.
   3691 
   3692   if (Args.hasArg(options::OPT_frewrite_map_file) ||
   3693       Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
   3694     for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
   3695                                       options::OPT_frewrite_map_file_EQ)) {
   3696       CmdArgs.push_back("-frewrite-map-file");
   3697       CmdArgs.push_back(A->getValue());
   3698       A->claim();
   3699     }
   3700   }
   3701 
   3702   if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
   3703     StringRef v = A->getValue();
   3704     CmdArgs.push_back("-mllvm");
   3705     CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
   3706     A->claim();
   3707   }
   3708 
   3709   if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
   3710     CmdArgs.push_back("-mregparm");
   3711     CmdArgs.push_back(A->getValue());
   3712   }
   3713 
   3714   if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
   3715                                options::OPT_freg_struct_return)) {
   3716     if (getToolChain().getArch() != llvm::Triple::x86) {
   3717       D.Diag(diag::err_drv_unsupported_opt_for_target)
   3718           << A->getSpelling() << getToolChain().getTriple().str();
   3719     } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
   3720       CmdArgs.push_back("-fpcc-struct-return");
   3721     } else {
   3722       assert(A->getOption().matches(options::OPT_freg_struct_return));
   3723       CmdArgs.push_back("-freg-struct-return");
   3724     }
   3725   }
   3726 
   3727   if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
   3728     CmdArgs.push_back("-mrtd");
   3729 
   3730   if (shouldUseFramePointer(Args, getToolChain().getTriple()))
   3731     CmdArgs.push_back("-mdisable-fp-elim");
   3732   if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
   3733                     options::OPT_fno_zero_initialized_in_bss))
   3734     CmdArgs.push_back("-mno-zero-initialized-in-bss");
   3735 
   3736   bool OFastEnabled = isOptimizationLevelFast(Args);
   3737   // If -Ofast is the optimization level, then -fstrict-aliasing should be
   3738   // enabled.  This alias option is being used to simplify the hasFlag logic.
   3739   OptSpecifier StrictAliasingAliasOption =
   3740       OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
   3741   // We turn strict aliasing off by default if we're in CL mode, since MSVC
   3742   // doesn't do any TBAA.
   3743   bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
   3744   if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
   3745                     options::OPT_fno_strict_aliasing, TBAAOnByDefault))
   3746     CmdArgs.push_back("-relaxed-aliasing");
   3747   if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
   3748                     options::OPT_fno_struct_path_tbaa))
   3749     CmdArgs.push_back("-no-struct-path-tbaa");
   3750   if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
   3751                    false))
   3752     CmdArgs.push_back("-fstrict-enums");
   3753   if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
   3754                    options::OPT_fno_strict_vtable_pointers,
   3755                    false))
   3756     CmdArgs.push_back("-fstrict-vtable-pointers");
   3757   if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
   3758                     options::OPT_fno_optimize_sibling_calls))
   3759     CmdArgs.push_back("-mdisable-tail-calls");
   3760 
   3761   // Handle segmented stacks.
   3762   if (Args.hasArg(options::OPT_fsplit_stack))
   3763     CmdArgs.push_back("-split-stacks");
   3764 
   3765   // If -Ofast is the optimization level, then -ffast-math should be enabled.
   3766   // This alias option is being used to simplify the getLastArg logic.
   3767   OptSpecifier FastMathAliasOption =
   3768       OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
   3769 
   3770   // Handle various floating point optimization flags, mapping them to the
   3771   // appropriate LLVM code generation flags. The pattern for all of these is to
   3772   // default off the codegen optimizations, and if any flag enables them and no
   3773   // flag disables them after the flag enabling them, enable the codegen
   3774   // optimization. This is complicated by several "umbrella" flags.
   3775   if (Arg *A = Args.getLastArg(
   3776           options::OPT_ffast_math, FastMathAliasOption,
   3777           options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
   3778           options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
   3779           options::OPT_fno_honor_infinities))
   3780     if (A->getOption().getID() != options::OPT_fno_fast_math &&
   3781         A->getOption().getID() != options::OPT_fno_finite_math_only &&
   3782         A->getOption().getID() != options::OPT_fhonor_infinities)
   3783       CmdArgs.push_back("-menable-no-infs");
   3784   if (Arg *A = Args.getLastArg(
   3785           options::OPT_ffast_math, FastMathAliasOption,
   3786           options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
   3787           options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
   3788           options::OPT_fno_honor_nans))
   3789     if (A->getOption().getID() != options::OPT_fno_fast_math &&
   3790         A->getOption().getID() != options::OPT_fno_finite_math_only &&
   3791         A->getOption().getID() != options::OPT_fhonor_nans)
   3792       CmdArgs.push_back("-menable-no-nans");
   3793 
   3794   // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
   3795   bool MathErrno = getToolChain().IsMathErrnoDefault();
   3796   if (Arg *A =
   3797           Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
   3798                           options::OPT_fno_fast_math, options::OPT_fmath_errno,
   3799                           options::OPT_fno_math_errno)) {
   3800     // Turning on -ffast_math (with either flag) removes the need for MathErrno.
   3801     // However, turning *off* -ffast_math merely restores the toolchain default
   3802     // (which may be false).
   3803     if (A->getOption().getID() == options::OPT_fno_math_errno ||
   3804         A->getOption().getID() == options::OPT_ffast_math ||
   3805         A->getOption().getID() == options::OPT_Ofast)
   3806       MathErrno = false;
   3807     else if (A->getOption().getID() == options::OPT_fmath_errno)
   3808       MathErrno = true;
   3809   }
   3810   if (MathErrno)
   3811     CmdArgs.push_back("-fmath-errno");
   3812 
   3813   // There are several flags which require disabling very specific
   3814   // optimizations. Any of these being disabled forces us to turn off the
   3815   // entire set of LLVM optimizations, so collect them through all the flag
   3816   // madness.
   3817   bool AssociativeMath = false;
   3818   if (Arg *A = Args.getLastArg(
   3819           options::OPT_ffast_math, FastMathAliasOption,
   3820           options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
   3821           options::OPT_fno_unsafe_math_optimizations,
   3822           options::OPT_fassociative_math, options::OPT_fno_associative_math))
   3823     if (A->getOption().getID() != options::OPT_fno_fast_math &&
   3824         A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
   3825         A->getOption().getID() != options::OPT_fno_associative_math)
   3826       AssociativeMath = true;
   3827   bool ReciprocalMath = false;
   3828   if (Arg *A = Args.getLastArg(
   3829           options::OPT_ffast_math, FastMathAliasOption,
   3830           options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
   3831           options::OPT_fno_unsafe_math_optimizations,
   3832           options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
   3833     if (A->getOption().getID() != options::OPT_fno_fast_math &&
   3834         A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
   3835         A->getOption().getID() != options::OPT_fno_reciprocal_math)
   3836       ReciprocalMath = true;
   3837   bool SignedZeros = true;
   3838   if (Arg *A = Args.getLastArg(
   3839           options::OPT_ffast_math, FastMathAliasOption,
   3840           options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
   3841           options::OPT_fno_unsafe_math_optimizations,
   3842           options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
   3843     if (A->getOption().getID() != options::OPT_fno_fast_math &&
   3844         A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
   3845         A->getOption().getID() != options::OPT_fsigned_zeros)
   3846       SignedZeros = false;
   3847   bool TrappingMath = true;
   3848   if (Arg *A = Args.getLastArg(
   3849           options::OPT_ffast_math, FastMathAliasOption,
   3850           options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
   3851           options::OPT_fno_unsafe_math_optimizations,
   3852           options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
   3853     if (A->getOption().getID() != options::OPT_fno_fast_math &&
   3854         A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
   3855         A->getOption().getID() != options::OPT_ftrapping_math)
   3856       TrappingMath = false;
   3857   if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
   3858       !TrappingMath)
   3859     CmdArgs.push_back("-menable-unsafe-fp-math");
   3860 
   3861   if (!SignedZeros)
   3862     CmdArgs.push_back("-fno-signed-zeros");
   3863 
   3864   if (ReciprocalMath)
   3865     CmdArgs.push_back("-freciprocal-math");
   3866 
   3867   // Validate and pass through -fp-contract option.
   3868   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
   3869                                options::OPT_fno_fast_math,
   3870                                options::OPT_ffp_contract)) {
   3871     if (A->getOption().getID() == options::OPT_ffp_contract) {
   3872       StringRef Val = A->getValue();
   3873       if (Val == "fast" || Val == "on" || Val == "off") {
   3874         CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
   3875       } else {
   3876         D.Diag(diag::err_drv_unsupported_option_argument)
   3877             << A->getOption().getName() << Val;
   3878       }
   3879     } else if (A->getOption().matches(options::OPT_ffast_math) ||
   3880                (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
   3881       // If fast-math is set then set the fp-contract mode to fast.
   3882       CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
   3883     }
   3884   }
   3885 
   3886   ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
   3887 
   3888   // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
   3889   // and if we find them, tell the frontend to provide the appropriate
   3890   // preprocessor macros. This is distinct from enabling any optimizations as
   3891   // these options induce language changes which must survive serialization
   3892   // and deserialization, etc.
   3893   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
   3894                                options::OPT_fno_fast_math))
   3895     if (!A->getOption().matches(options::OPT_fno_fast_math))
   3896       CmdArgs.push_back("-ffast-math");
   3897   if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
   3898                                options::OPT_fno_fast_math))
   3899     if (A->getOption().matches(options::OPT_ffinite_math_only))
   3900       CmdArgs.push_back("-ffinite-math-only");
   3901 
   3902   // Decide whether to use verbose asm. Verbose assembly is the default on
   3903   // toolchains which have the integrated assembler on by default.
   3904   bool IsIntegratedAssemblerDefault =
   3905       getToolChain().IsIntegratedAssemblerDefault();
   3906   if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
   3907                    IsIntegratedAssemblerDefault) ||
   3908       Args.hasArg(options::OPT_dA))
   3909     CmdArgs.push_back("-masm-verbose");
   3910 
   3911   if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
   3912                     IsIntegratedAssemblerDefault))
   3913     CmdArgs.push_back("-no-integrated-as");
   3914 
   3915   if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
   3916     CmdArgs.push_back("-mdebug-pass");
   3917     CmdArgs.push_back("Structure");
   3918   }
   3919   if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
   3920     CmdArgs.push_back("-mdebug-pass");
   3921     CmdArgs.push_back("Arguments");
   3922   }
   3923 
   3924   // Enable -mconstructor-aliases except on darwin, where we have to
   3925   // work around a linker bug;  see <rdar://problem/7651567>.
   3926   if (!getToolChain().getTriple().isOSDarwin())
   3927     CmdArgs.push_back("-mconstructor-aliases");
   3928 
   3929   // Darwin's kernel doesn't support guard variables; just die if we
   3930   // try to use them.
   3931   if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
   3932     CmdArgs.push_back("-fforbid-guard-variables");
   3933 
   3934   if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
   3935                    false)) {
   3936     CmdArgs.push_back("-mms-bitfields");
   3937   }
   3938 
   3939   // This is a coarse approximation of what llvm-gcc actually does, both
   3940   // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
   3941   // complicated ways.
   3942   bool AsynchronousUnwindTables =
   3943       Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
   3944                    options::OPT_fno_asynchronous_unwind_tables,
   3945                    (getToolChain().IsUnwindTablesDefault() ||
   3946                     getToolChain().getSanitizerArgs().needsUnwindTables()) &&
   3947                        !KernelOrKext);
   3948   if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
   3949                    AsynchronousUnwindTables))
   3950     CmdArgs.push_back("-munwind-tables");
   3951 
   3952   getToolChain().addClangTargetOptions(Args, CmdArgs);
   3953 
   3954   if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
   3955     CmdArgs.push_back("-mlimit-float-precision");
   3956     CmdArgs.push_back(A->getValue());
   3957   }
   3958 
   3959   // FIXME: Handle -mtune=.
   3960   (void)Args.hasArg(options::OPT_mtune_EQ);
   3961 
   3962   if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
   3963     CmdArgs.push_back("-mcode-model");
   3964     CmdArgs.push_back(A->getValue());
   3965   }
   3966 
   3967   // Add the target cpu
   3968   std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
   3969   if (!CPU.empty()) {
   3970     CmdArgs.push_back("-target-cpu");
   3971     CmdArgs.push_back(Args.MakeArgString(CPU));
   3972   }
   3973 
   3974   if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
   3975     CmdArgs.push_back("-mfpmath");
   3976     CmdArgs.push_back(A->getValue());
   3977   }
   3978 
   3979   // Add the target features
   3980   getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
   3981 
   3982   // Add target specific flags.
   3983   switch (getToolChain().getArch()) {
   3984   default:
   3985     break;
   3986 
   3987   case llvm::Triple::arm:
   3988   case llvm::Triple::armeb:
   3989   case llvm::Triple::thumb:
   3990   case llvm::Triple::thumbeb:
   3991     // Use the effective triple, which takes into account the deployment target.
   3992     AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
   3993     break;
   3994 
   3995   case llvm::Triple::aarch64:
   3996   case llvm::Triple::aarch64_be:
   3997     AddAArch64TargetArgs(Args, CmdArgs);
   3998     break;
   3999 
   4000   case llvm::Triple::mips:
   4001   case llvm::Triple::mipsel:
   4002   case llvm::Triple::mips64:
   4003   case llvm::Triple::mips64el:
   4004     AddMIPSTargetArgs(Args, CmdArgs);
   4005     break;
   4006 
   4007   case llvm::Triple::ppc:
   4008   case llvm::Triple::ppc64:
   4009   case llvm::Triple::ppc64le:
   4010     AddPPCTargetArgs(Args, CmdArgs);
   4011     break;
   4012 
   4013   case llvm::Triple::sparc:
   4014   case llvm::Triple::sparcel:
   4015   case llvm::Triple::sparcv9:
   4016     AddSparcTargetArgs(Args, CmdArgs);
   4017     break;
   4018 
   4019   case llvm::Triple::x86:
   4020   case llvm::Triple::x86_64:
   4021     AddX86TargetArgs(Args, CmdArgs);
   4022     break;
   4023 
   4024   case llvm::Triple::hexagon:
   4025     AddHexagonTargetArgs(Args, CmdArgs);
   4026     break;
   4027   }
   4028 
   4029   // The 'g' groups options involve a somewhat intricate sequence of decisions
   4030   // about what to pass from the driver to the frontend, but by the time they
   4031   // reach cc1 they've been factored into three well-defined orthogonal choices:
   4032   //  * what level of debug info to generate
   4033   //  * what dwarf version to write
   4034   //  * what debugger tuning to use
   4035   // This avoids having to monkey around further in cc1 other than to disable
   4036   // codeview if not running in a Windows environment. Perhaps even that
   4037   // decision should be made in the driver as well though.
   4038   unsigned DwarfVersion = 0;
   4039   llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
   4040   // These two are potentially updated by AddClangCLArgs.
   4041   enum CodeGenOptions::DebugInfoKind DebugInfoKind =
   4042       CodeGenOptions::NoDebugInfo;
   4043   bool EmitCodeView = false;
   4044 
   4045   // Add clang-cl arguments.
   4046   if (getToolChain().getDriver().IsCLMode())
   4047     AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
   4048 
   4049   // Pass the linker version in use.
   4050   if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
   4051     CmdArgs.push_back("-target-linker-version");
   4052     CmdArgs.push_back(A->getValue());
   4053   }
   4054 
   4055   if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
   4056     CmdArgs.push_back("-momit-leaf-frame-pointer");
   4057 
   4058   // Explicitly error on some things we know we don't support and can't just
   4059   // ignore.
   4060   types::ID InputType = Input.getType();
   4061   if (!Args.hasArg(options::OPT_fallow_unsupported)) {
   4062     Arg *Unsupported;
   4063     if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
   4064         getToolChain().getArch() == llvm::Triple::x86) {
   4065       if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
   4066           (Unsupported = Args.getLastArg(options::OPT_mkernel)))
   4067         D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
   4068             << Unsupported->getOption().getName();
   4069     }
   4070   }
   4071 
   4072   Args.AddAllArgs(CmdArgs, options::OPT_v);
   4073   Args.AddLastArg(CmdArgs, options::OPT_H);
   4074   if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
   4075     CmdArgs.push_back("-header-include-file");
   4076     CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
   4077                                                : "-");
   4078   }
   4079   Args.AddLastArg(CmdArgs, options::OPT_P);
   4080   Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
   4081 
   4082   if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
   4083     CmdArgs.push_back("-diagnostic-log-file");
   4084     CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
   4085                                                  : "-");
   4086   }
   4087 
   4088   Args.ClaimAllArgs(options::OPT_g_Group);
   4089   Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
   4090   if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
   4091     // If the last option explicitly specified a debug-info level, use it.
   4092     if (A->getOption().matches(options::OPT_gN_Group)) {
   4093       DebugInfoKind = DebugLevelToInfoKind(*A);
   4094       // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
   4095       // But -gsplit-dwarf is not a g_group option, hence we have to check the
   4096       // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
   4097       if (SplitDwarfArg && DebugInfoKind < CodeGenOptions::LimitedDebugInfo &&
   4098           A->getIndex() > SplitDwarfArg->getIndex())
   4099         SplitDwarfArg = nullptr;
   4100     } else
   4101       // For any other 'g' option, use Limited.
   4102       DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
   4103   }
   4104 
   4105   // If a debugger tuning argument appeared, remember it.
   4106   if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
   4107                                options::OPT_ggdbN_Group)) {
   4108     if (A->getOption().matches(options::OPT_glldb))
   4109       DebuggerTuning = llvm::DebuggerKind::LLDB;
   4110     else if (A->getOption().matches(options::OPT_gsce))
   4111       DebuggerTuning = llvm::DebuggerKind::SCE;
   4112     else
   4113       DebuggerTuning = llvm::DebuggerKind::GDB;
   4114   }
   4115 
   4116   // If a -gdwarf argument appeared, remember it.
   4117   if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
   4118                                options::OPT_gdwarf_4))
   4119     DwarfVersion = DwarfVersionNum(A->getSpelling());
   4120 
   4121   // Forward -gcodeview.
   4122   // 'EmitCodeView might have been set by CL-compatibility argument parsing.
   4123   if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
   4124     // DwarfVersion remains at 0 if no explicit choice was made.
   4125     CmdArgs.push_back("-gcodeview");
   4126   } else if (DwarfVersion == 0 &&
   4127              DebugInfoKind != CodeGenOptions::NoDebugInfo) {
   4128     DwarfVersion = getToolChain().GetDefaultDwarfVersion();
   4129   }
   4130 
   4131   // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
   4132   Args.ClaimAllArgs(options::OPT_g_flags_Group);
   4133 
   4134   // PS4 defaults to no column info
   4135   if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
   4136                    /*Default=*/ !IsPS4CPU))
   4137     CmdArgs.push_back("-dwarf-column-info");
   4138 
   4139   // FIXME: Move backend command line options to the module.
   4140   if (Args.hasArg(options::OPT_gmodules)) {
   4141     DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
   4142     CmdArgs.push_back("-dwarf-ext-refs");
   4143     CmdArgs.push_back("-fmodule-format=obj");
   4144   }
   4145 
   4146   // -gsplit-dwarf should turn on -g and enable the backend dwarf
   4147   // splitting and extraction.
   4148   // FIXME: Currently only works on Linux.
   4149   if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
   4150     DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
   4151     CmdArgs.push_back("-backend-option");
   4152     CmdArgs.push_back("-split-dwarf=Enable");
   4153   }
   4154 
   4155   // After we've dealt with all combinations of things that could
   4156   // make DebugInfoKind be other than None or DebugLineTablesOnly,
   4157   // figure out if we need to "upgrade" it to standalone debug info.
   4158   // We parse these two '-f' options whether or not they will be used,
   4159   // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
   4160   bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
   4161                                     options::OPT_fno_standalone_debug,
   4162                                     getToolChain().GetDefaultStandaloneDebug());
   4163   if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
   4164     DebugInfoKind = CodeGenOptions::FullDebugInfo;
   4165   RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
   4166                           DebuggerTuning);
   4167 
   4168   // -ggnu-pubnames turns on gnu style pubnames in the backend.
   4169   if (Args.hasArg(options::OPT_ggnu_pubnames)) {
   4170     CmdArgs.push_back("-backend-option");
   4171     CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
   4172   }
   4173 
   4174   // -gdwarf-aranges turns on the emission of the aranges section in the
   4175   // backend.
   4176   // Always enabled on the PS4.
   4177   if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
   4178     CmdArgs.push_back("-backend-option");
   4179     CmdArgs.push_back("-generate-arange-section");
   4180   }
   4181 
   4182   if (Args.hasFlag(options::OPT_fdebug_types_section,
   4183                    options::OPT_fno_debug_types_section, false)) {
   4184     CmdArgs.push_back("-backend-option");
   4185     CmdArgs.push_back("-generate-type-units");
   4186   }
   4187 
   4188   // CloudABI uses -ffunction-sections and -fdata-sections by default.
   4189   bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
   4190 
   4191   if (Args.hasFlag(options::OPT_ffunction_sections,
   4192                    options::OPT_fno_function_sections, UseSeparateSections)) {
   4193     CmdArgs.push_back("-ffunction-sections");
   4194   }
   4195 
   4196   if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
   4197                    UseSeparateSections)) {
   4198     CmdArgs.push_back("-fdata-sections");
   4199   }
   4200 
   4201   if (!Args.hasFlag(options::OPT_funique_section_names,
   4202                     options::OPT_fno_unique_section_names, true))
   4203     CmdArgs.push_back("-fno-unique-section-names");
   4204 
   4205   Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
   4206 
   4207   addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
   4208 
   4209   // Add runtime flag for PS4 when PGO or Coverage are enabled.
   4210   if (getToolChain().getTriple().isPS4CPU())
   4211     addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
   4212 
   4213   // Pass options for controlling the default header search paths.
   4214   if (Args.hasArg(options::OPT_nostdinc)) {
   4215     CmdArgs.push_back("-nostdsysteminc");
   4216     CmdArgs.push_back("-nobuiltininc");
   4217   } else {
   4218     if (Args.hasArg(options::OPT_nostdlibinc))
   4219       CmdArgs.push_back("-nostdsysteminc");
   4220     Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
   4221     Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
   4222   }
   4223 
   4224   // Pass the path to compiler resource files.
   4225   CmdArgs.push_back("-resource-dir");
   4226   CmdArgs.push_back(D.ResourceDir.c_str());
   4227 
   4228   Args.AddLastArg(CmdArgs, options::OPT_working_directory);
   4229 
   4230   bool ARCMTEnabled = false;
   4231   if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
   4232     if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
   4233                                        options::OPT_ccc_arcmt_modify,
   4234                                        options::OPT_ccc_arcmt_migrate)) {
   4235       ARCMTEnabled = true;
   4236       switch (A->getOption().getID()) {
   4237       default:
   4238         llvm_unreachable("missed a case");
   4239       case options::OPT_ccc_arcmt_check:
   4240         CmdArgs.push_back("-arcmt-check");
   4241         break;
   4242       case options::OPT_ccc_arcmt_modify:
   4243         CmdArgs.push_back("-arcmt-modify");
   4244         break;
   4245       case options::OPT_ccc_arcmt_migrate:
   4246         CmdArgs.push_back("-arcmt-migrate");
   4247         CmdArgs.push_back("-mt-migrate-directory");
   4248         CmdArgs.push_back(A->getValue());
   4249 
   4250         Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
   4251         Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
   4252         break;
   4253       }
   4254     }
   4255   } else {
   4256     Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
   4257     Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
   4258     Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
   4259   }
   4260 
   4261   if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
   4262     if (ARCMTEnabled) {
   4263       D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
   4264                                                       << "-ccc-arcmt-migrate";
   4265     }
   4266     CmdArgs.push_back("-mt-migrate-directory");
   4267     CmdArgs.push_back(A->getValue());
   4268 
   4269     if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
   4270                      options::OPT_objcmt_migrate_subscripting,
   4271                      options::OPT_objcmt_migrate_property)) {
   4272       // None specified, means enable them all.
   4273       CmdArgs.push_back("-objcmt-migrate-literals");
   4274       CmdArgs.push_back("-objcmt-migrate-subscripting");
   4275       CmdArgs.push_back("-objcmt-migrate-property");
   4276     } else {
   4277       Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
   4278       Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
   4279       Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
   4280     }
   4281   } else {
   4282     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
   4283     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
   4284     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
   4285     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
   4286     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
   4287     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
   4288     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
   4289     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
   4290     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
   4291     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
   4292     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
   4293     Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
   4294     Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
   4295     Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
   4296     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
   4297     Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
   4298   }
   4299 
   4300   // Add preprocessing options like -I, -D, etc. if we are using the
   4301   // preprocessor.
   4302   //
   4303   // FIXME: Support -fpreprocessed
   4304   if (types::getPreprocessedType(InputType) != types::TY_INVALID)
   4305     AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
   4306                             AuxToolChain);
   4307 
   4308   // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
   4309   // that "The compiler can only warn and ignore the option if not recognized".
   4310   // When building with ccache, it will pass -D options to clang even on
   4311   // preprocessed inputs and configure concludes that -fPIC is not supported.
   4312   Args.ClaimAllArgs(options::OPT_D);
   4313 
   4314   // Manually translate -O4 to -O3; let clang reject others.
   4315   if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
   4316     if (A->getOption().matches(options::OPT_O4)) {
   4317       CmdArgs.push_back("-O3");
   4318       D.Diag(diag::warn_O4_is_O3);
   4319     } else {
   4320       A->render(Args, CmdArgs);
   4321     }
   4322   }
   4323 
   4324   // Warn about ignored options to clang.
   4325   for (const Arg *A :
   4326        Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
   4327     D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
   4328     A->claim();
   4329   }
   4330 
   4331   claimNoWarnArgs(Args);
   4332 
   4333   Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
   4334   Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
   4335   if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
   4336     CmdArgs.push_back("-pedantic");
   4337   Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
   4338   Args.AddLastArg(CmdArgs, options::OPT_w);
   4339 
   4340   // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
   4341   // (-ansi is equivalent to -std=c89 or -std=c++98).
   4342   //
   4343   // If a std is supplied, only add -trigraphs if it follows the
   4344   // option.
   4345   bool ImplyVCPPCXXVer = false;
   4346   if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
   4347     if (Std->getOption().matches(options::OPT_ansi))
   4348       if (types::isCXX(InputType))
   4349         CmdArgs.push_back("-std=c++98");
   4350       else
   4351         CmdArgs.push_back("-std=c89");
   4352     else
   4353       Std->render(Args, CmdArgs);
   4354 
   4355     // If -f(no-)trigraphs appears after the language standard flag, honor it.
   4356     if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
   4357                                  options::OPT_ftrigraphs,
   4358                                  options::OPT_fno_trigraphs))
   4359       if (A != Std)
   4360         A->render(Args, CmdArgs);
   4361   } else {
   4362     // Honor -std-default.
   4363     //
   4364     // FIXME: Clang doesn't correctly handle -std= when the input language
   4365     // doesn't match. For the time being just ignore this for C++ inputs;
   4366     // eventually we want to do all the standard defaulting here instead of
   4367     // splitting it between the driver and clang -cc1.
   4368     if (!types::isCXX(InputType))
   4369       Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
   4370                                 /*Joined=*/true);
   4371     else if (IsWindowsMSVC)
   4372       ImplyVCPPCXXVer = true;
   4373 
   4374     Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
   4375                     options::OPT_fno_trigraphs);
   4376   }
   4377 
   4378   // GCC's behavior for -Wwrite-strings is a bit strange:
   4379   //  * In C, this "warning flag" changes the types of string literals from
   4380   //    'char[N]' to 'const char[N]', and thus triggers an unrelated warning
   4381   //    for the discarded qualifier.
   4382   //  * In C++, this is just a normal warning flag.
   4383   //
   4384   // Implementing this warning correctly in C is hard, so we follow GCC's
   4385   // behavior for now. FIXME: Directly diagnose uses of a string literal as
   4386   // a non-const char* in C, rather than using this crude hack.
   4387   if (!types::isCXX(InputType)) {
   4388     // FIXME: This should behave just like a warning flag, and thus should also
   4389     // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
   4390     Arg *WriteStrings =
   4391         Args.getLastArg(options::OPT_Wwrite_strings,
   4392                         options::OPT_Wno_write_strings, options::OPT_w);
   4393     if (WriteStrings &&
   4394         WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
   4395       CmdArgs.push_back("-fconst-strings");
   4396   }
   4397 
   4398   // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
   4399   // during C++ compilation, which it is by default. GCC keeps this define even
   4400   // in the presence of '-w', match this behavior bug-for-bug.
   4401   if (types::isCXX(InputType) &&
   4402       Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
   4403                    true)) {
   4404     CmdArgs.push_back("-fdeprecated-macro");
   4405   }
   4406 
   4407   // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
   4408   if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
   4409     if (Asm->getOption().matches(options::OPT_fasm))
   4410       CmdArgs.push_back("-fgnu-keywords");
   4411     else
   4412       CmdArgs.push_back("-fno-gnu-keywords");
   4413   }
   4414 
   4415   if (ShouldDisableDwarfDirectory(Args, getToolChain()))
   4416     CmdArgs.push_back("-fno-dwarf-directory-asm");
   4417 
   4418   if (ShouldDisableAutolink(Args, getToolChain()))
   4419     CmdArgs.push_back("-fno-autolink");
   4420 
   4421   // Add in -fdebug-compilation-dir if necessary.
   4422   addDebugCompDirArg(Args, CmdArgs);
   4423 
   4424   for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
   4425     StringRef Map = A->getValue();
   4426     if (Map.find('=') == StringRef::npos)
   4427       D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
   4428     else
   4429       CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
   4430     A->claim();
   4431   }
   4432 
   4433   if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
   4434                                options::OPT_ftemplate_depth_EQ)) {
   4435     CmdArgs.push_back("-ftemplate-depth");
   4436     CmdArgs.push_back(A->getValue());
   4437   }
   4438 
   4439   if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
   4440     CmdArgs.push_back("-foperator-arrow-depth");
   4441     CmdArgs.push_back(A->getValue());
   4442   }
   4443 
   4444   if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
   4445     CmdArgs.push_back("-fconstexpr-depth");
   4446     CmdArgs.push_back(A->getValue());
   4447   }
   4448 
   4449   if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
   4450     CmdArgs.push_back("-fconstexpr-steps");
   4451     CmdArgs.push_back(A->getValue());
   4452   }
   4453 
   4454   if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
   4455     CmdArgs.push_back("-fbracket-depth");
   4456     CmdArgs.push_back(A->getValue());
   4457   }
   4458 
   4459   if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
   4460                                options::OPT_Wlarge_by_value_copy_def)) {
   4461     if (A->getNumValues()) {
   4462       StringRef bytes = A->getValue();
   4463       CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
   4464     } else
   4465       CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
   4466   }
   4467 
   4468   if (Args.hasArg(options::OPT_relocatable_pch))
   4469     CmdArgs.push_back("-relocatable-pch");
   4470 
   4471   if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
   4472     CmdArgs.push_back("-fconstant-string-class");
   4473     CmdArgs.push_back(A->getValue());
   4474   }
   4475 
   4476   if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
   4477     CmdArgs.push_back("-ftabstop");
   4478     CmdArgs.push_back(A->getValue());
   4479   }
   4480 
   4481   CmdArgs.push_back("-ferror-limit");
   4482   if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
   4483     CmdArgs.push_back(A->getValue());
   4484   else
   4485     CmdArgs.push_back("19");
   4486 
   4487   if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
   4488     CmdArgs.push_back("-fmacro-backtrace-limit");
   4489     CmdArgs.push_back(A->getValue());
   4490   }
   4491 
   4492   if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
   4493     CmdArgs.push_back("-ftemplate-backtrace-limit");
   4494     CmdArgs.push_back(A->getValue());
   4495   }
   4496 
   4497   if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
   4498     CmdArgs.push_back("-fconstexpr-backtrace-limit");
   4499     CmdArgs.push_back(A->getValue());
   4500   }
   4501 
   4502   if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
   4503     CmdArgs.push_back("-fspell-checking-limit");
   4504     CmdArgs.push_back(A->getValue());
   4505   }
   4506 
   4507   // Pass -fmessage-length=.
   4508   CmdArgs.push_back("-fmessage-length");
   4509   if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
   4510     CmdArgs.push_back(A->getValue());
   4511   } else {
   4512     // If -fmessage-length=N was not specified, determine whether this is a
   4513     // terminal and, if so, implicitly define -fmessage-length appropriately.
   4514     unsigned N = llvm::sys::Process::StandardErrColumns();
   4515     CmdArgs.push_back(Args.MakeArgString(Twine(N)));
   4516   }
   4517 
   4518   // -fvisibility= and -fvisibility-ms-compat are of a piece.
   4519   if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
   4520                                      options::OPT_fvisibility_ms_compat)) {
   4521     if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
   4522       CmdArgs.push_back("-fvisibility");
   4523       CmdArgs.push_back(A->getValue());
   4524     } else {
   4525       assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
   4526       CmdArgs.push_back("-fvisibility");
   4527       CmdArgs.push_back("hidden");
   4528       CmdArgs.push_back("-ftype-visibility");
   4529       CmdArgs.push_back("default");
   4530     }
   4531   }
   4532 
   4533   Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
   4534 
   4535   Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
   4536 
   4537   // -fhosted is default.
   4538   if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
   4539       KernelOrKext)
   4540     CmdArgs.push_back("-ffreestanding");
   4541 
   4542   // Forward -f (flag) options which we can pass directly.
   4543   Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
   4544   Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
   4545   Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
   4546   // Emulated TLS is enabled by default on Android, and can be enabled manually
   4547   // with -femulated-tls.
   4548   bool EmulatedTLSDefault = Triple.isAndroid();
   4549   if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
   4550                    EmulatedTLSDefault))
   4551     CmdArgs.push_back("-femulated-tls");
   4552   // AltiVec-like language extensions aren't relevant for assembling.
   4553   if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
   4554     Args.AddLastArg(CmdArgs, options::OPT_faltivec);
   4555     Args.AddLastArg(CmdArgs, options::OPT_fzvector);
   4556   }
   4557   Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
   4558   Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
   4559 
   4560   // Forward flags for OpenMP
   4561   if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
   4562                    options::OPT_fno_openmp, false))
   4563     switch (getOpenMPRuntime(getToolChain(), Args)) {
   4564     case OMPRT_OMP:
   4565     case OMPRT_IOMP5:
   4566       // Clang can generate useful OpenMP code for these two runtime libraries.
   4567       CmdArgs.push_back("-fopenmp");
   4568 
   4569       // If no option regarding the use of TLS in OpenMP codegeneration is
   4570       // given, decide a default based on the target. Otherwise rely on the
   4571       // options and pass the right information to the frontend.
   4572       if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
   4573                         options::OPT_fnoopenmp_use_tls, /*Default=*/true))
   4574         CmdArgs.push_back("-fnoopenmp-use-tls");
   4575       break;
   4576     default:
   4577       // By default, if Clang doesn't know how to generate useful OpenMP code
   4578       // for a specific runtime library, we just don't pass the '-fopenmp' flag
   4579       // down to the actual compilation.
   4580       // FIXME: It would be better to have a mode which *only* omits IR
   4581       // generation based on the OpenMP support so that we get consistent
   4582       // semantic analysis, etc.
   4583       break;
   4584     }
   4585 
   4586   const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
   4587   Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
   4588 
   4589   // Report an error for -faltivec on anything other than PowerPC.
   4590   if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
   4591     const llvm::Triple::ArchType Arch = getToolChain().getArch();
   4592     if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
   4593           Arch == llvm::Triple::ppc64le))
   4594       D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
   4595                                                        << "ppc/ppc64/ppc64le";
   4596   }
   4597 
   4598   // -fzvector is incompatible with -faltivec.
   4599   if (Arg *A = Args.getLastArg(options::OPT_fzvector))
   4600     if (Args.hasArg(options::OPT_faltivec))
   4601       D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
   4602                                                       << "-faltivec";
   4603 
   4604   if (getToolChain().SupportsProfiling())
   4605     Args.AddLastArg(CmdArgs, options::OPT_pg);
   4606 
   4607   // -flax-vector-conversions is default.
   4608   if (!Args.hasFlag(options::OPT_flax_vector_conversions,
   4609                     options::OPT_fno_lax_vector_conversions))
   4610     CmdArgs.push_back("-fno-lax-vector-conversions");
   4611 
   4612   if (Args.getLastArg(options::OPT_fapple_kext) ||
   4613       (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
   4614     CmdArgs.push_back("-fapple-kext");
   4615 
   4616   Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
   4617   Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
   4618   Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
   4619   Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
   4620   Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
   4621 
   4622   if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
   4623     CmdArgs.push_back("-ftrapv-handler");
   4624     CmdArgs.push_back(A->getValue());
   4625   }
   4626 
   4627   Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
   4628 
   4629   // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
   4630   // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
   4631   if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
   4632     if (A->getOption().matches(options::OPT_fwrapv))
   4633       CmdArgs.push_back("-fwrapv");
   4634   } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
   4635                                       options::OPT_fno_strict_overflow)) {
   4636     if (A->getOption().matches(options::OPT_fno_strict_overflow))
   4637       CmdArgs.push_back("-fwrapv");
   4638   }
   4639 
   4640   if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
   4641                                options::OPT_fno_reroll_loops))
   4642     if (A->getOption().matches(options::OPT_freroll_loops))
   4643       CmdArgs.push_back("-freroll-loops");
   4644 
   4645   Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
   4646   Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
   4647                   options::OPT_fno_unroll_loops);
   4648 
   4649   Args.AddLastArg(CmdArgs, options::OPT_pthread);
   4650 
   4651   // -stack-protector=0 is default.
   4652   unsigned StackProtectorLevel = 0;
   4653   if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
   4654     Args.ClaimAllArgs(options::OPT_fno_stack_protector);
   4655     Args.ClaimAllArgs(options::OPT_fstack_protector_all);
   4656     Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
   4657     Args.ClaimAllArgs(options::OPT_fstack_protector);
   4658   } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
   4659                                       options::OPT_fstack_protector_all,
   4660                                       options::OPT_fstack_protector_strong,
   4661                                       options::OPT_fstack_protector)) {
   4662     if (A->getOption().matches(options::OPT_fstack_protector)) {
   4663       StackProtectorLevel = std::max<unsigned>(
   4664           LangOptions::SSPOn,
   4665           getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
   4666     } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
   4667       StackProtectorLevel = LangOptions::SSPStrong;
   4668     else if (A->getOption().matches(options::OPT_fstack_protector_all))
   4669       StackProtectorLevel = LangOptions::SSPReq;
   4670   } else {
   4671     StackProtectorLevel =
   4672         getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
   4673   }
   4674   if (StackProtectorLevel) {
   4675     CmdArgs.push_back("-stack-protector");
   4676     CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
   4677   }
   4678 
   4679   // --param ssp-buffer-size=
   4680   for (const Arg *A : Args.filtered(options::OPT__param)) {
   4681     StringRef Str(A->getValue());
   4682     if (Str.startswith("ssp-buffer-size=")) {
   4683       if (StackProtectorLevel) {
   4684         CmdArgs.push_back("-stack-protector-buffer-size");
   4685         // FIXME: Verify the argument is a valid integer.
   4686         CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
   4687       }
   4688       A->claim();
   4689     }
   4690   }
   4691 
   4692   // Translate -mstackrealign
   4693   if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
   4694                    false))
   4695     CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
   4696 
   4697   if (Args.hasArg(options::OPT_mstack_alignment)) {
   4698     StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
   4699     CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
   4700   }
   4701 
   4702   if (Args.hasArg(options::OPT_mstack_probe_size)) {
   4703     StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
   4704 
   4705     if (!Size.empty())
   4706       CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
   4707     else
   4708       CmdArgs.push_back("-mstack-probe-size=0");
   4709   }
   4710 
   4711   switch (getToolChain().getArch()) {
   4712   case llvm::Triple::aarch64:
   4713   case llvm::Triple::aarch64_be:
   4714   case llvm::Triple::arm:
   4715   case llvm::Triple::armeb:
   4716   case llvm::Triple::thumb:
   4717   case llvm::Triple::thumbeb:
   4718     CmdArgs.push_back("-fallow-half-arguments-and-returns");
   4719     break;
   4720 
   4721   default:
   4722     break;
   4723   }
   4724 
   4725   if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
   4726                                options::OPT_mno_restrict_it)) {
   4727     if (A->getOption().matches(options::OPT_mrestrict_it)) {
   4728       CmdArgs.push_back("-backend-option");
   4729       CmdArgs.push_back("-arm-restrict-it");
   4730     } else {
   4731       CmdArgs.push_back("-backend-option");
   4732       CmdArgs.push_back("-arm-no-restrict-it");
   4733     }
   4734   } else if (Triple.isOSWindows() &&
   4735              (Triple.getArch() == llvm::Triple::arm ||
   4736               Triple.getArch() == llvm::Triple::thumb)) {
   4737     // Windows on ARM expects restricted IT blocks
   4738     CmdArgs.push_back("-backend-option");
   4739     CmdArgs.push_back("-arm-restrict-it");
   4740   }
   4741 
   4742   // Forward -f options with positive and negative forms; we translate
   4743   // these by hand.
   4744   if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
   4745     StringRef fname = A->getValue();
   4746     if (!llvm::sys::fs::exists(fname))
   4747       D.Diag(diag::err_drv_no_such_file) << fname;
   4748     else
   4749       A->render(Args, CmdArgs);
   4750   }
   4751 
   4752   // -fbuiltin is default unless -mkernel is used
   4753   if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
   4754                     !Args.hasArg(options::OPT_mkernel)))
   4755     CmdArgs.push_back("-fno-builtin");
   4756 
   4757   if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
   4758                     options::OPT_fno_assume_sane_operator_new))
   4759     CmdArgs.push_back("-fno-assume-sane-operator-new");
   4760 
   4761   // -fblocks=0 is default.
   4762   if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
   4763                    getToolChain().IsBlocksDefault()) ||
   4764       (Args.hasArg(options::OPT_fgnu_runtime) &&
   4765        Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
   4766        !Args.hasArg(options::OPT_fno_blocks))) {
   4767     CmdArgs.push_back("-fblocks");
   4768 
   4769     if (!Args.hasArg(options::OPT_fgnu_runtime) &&
   4770         !getToolChain().hasBlocksRuntime())
   4771       CmdArgs.push_back("-fblocks-runtime-optional");
   4772   }
   4773 
   4774   // -fmodules enables the use of precompiled modules (off by default).
   4775   // Users can pass -fno-cxx-modules to turn off modules support for
   4776   // C++/Objective-C++ programs.
   4777   bool HaveModules = false;
   4778   if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
   4779     bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
   4780                                      options::OPT_fno_cxx_modules, true);
   4781     if (AllowedInCXX || !types::isCXX(InputType)) {
   4782       CmdArgs.push_back("-fmodules");
   4783       HaveModules = true;
   4784     }
   4785   }
   4786 
   4787   // -fmodule-maps enables implicit reading of module map files. By default,
   4788   // this is enabled if we are using precompiled modules.
   4789   if (Args.hasFlag(options::OPT_fimplicit_module_maps,
   4790                    options::OPT_fno_implicit_module_maps, HaveModules)) {
   4791     CmdArgs.push_back("-fimplicit-module-maps");
   4792   }
   4793 
   4794   // -fmodules-decluse checks that modules used are declared so (off by
   4795   // default).
   4796   if (Args.hasFlag(options::OPT_fmodules_decluse,
   4797                    options::OPT_fno_modules_decluse, false)) {
   4798     CmdArgs.push_back("-fmodules-decluse");
   4799   }
   4800 
   4801   // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
   4802   // all #included headers are part of modules.
   4803   if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
   4804                    options::OPT_fno_modules_strict_decluse, false)) {
   4805     CmdArgs.push_back("-fmodules-strict-decluse");
   4806   }
   4807 
   4808   // -fno-implicit-modules turns off implicitly compiling modules on demand.
   4809   if (!Args.hasFlag(options::OPT_fimplicit_modules,
   4810                     options::OPT_fno_implicit_modules)) {
   4811     CmdArgs.push_back("-fno-implicit-modules");
   4812   }
   4813 
   4814   // -fmodule-name specifies the module that is currently being built (or
   4815   // used for header checking by -fmodule-maps).
   4816   Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
   4817 
   4818   // -fmodule-map-file can be used to specify files containing module
   4819   // definitions.
   4820   Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
   4821 
   4822   // -fmodule-file can be used to specify files containing precompiled modules.
   4823   if (HaveModules)
   4824     Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
   4825   else
   4826     Args.ClaimAllArgs(options::OPT_fmodule_file);
   4827 
   4828   // -fmodule-cache-path specifies where our implicitly-built module files
   4829   // should be written.
   4830   SmallString<128> Path;
   4831   if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
   4832     Path = A->getValue();
   4833   if (HaveModules) {
   4834     if (C.isForDiagnostics()) {
   4835       // When generating crash reports, we want to emit the modules along with
   4836       // the reproduction sources, so we ignore any provided module path.
   4837       Path = Output.getFilename();
   4838       llvm::sys::path::replace_extension(Path, ".cache");
   4839       llvm::sys::path::append(Path, "modules");
   4840     } else if (Path.empty()) {
   4841       // No module path was provided: use the default.
   4842       llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
   4843       llvm::sys::path::append(Path, "org.llvm.clang.");
   4844       appendUserToPath(Path);
   4845       llvm::sys::path::append(Path, "ModuleCache");
   4846     }
   4847     const char Arg[] = "-fmodules-cache-path=";
   4848     Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
   4849     CmdArgs.push_back(Args.MakeArgString(Path));
   4850   }
   4851 
   4852   // When building modules and generating crashdumps, we need to dump a module
   4853   // dependency VFS alongside the output.
   4854   if (HaveModules && C.isForDiagnostics()) {
   4855     SmallString<128> VFSDir(Output.getFilename());
   4856     llvm::sys::path::replace_extension(VFSDir, ".cache");
   4857     // Add the cache directory as a temp so the crash diagnostics pick it up.
   4858     C.addTempFile(Args.MakeArgString(VFSDir));
   4859 
   4860     llvm::sys::path::append(VFSDir, "vfs");
   4861     CmdArgs.push_back("-module-dependency-dir");
   4862     CmdArgs.push_back(Args.MakeArgString(VFSDir));
   4863   }
   4864 
   4865   if (HaveModules)
   4866     Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
   4867 
   4868   // Pass through all -fmodules-ignore-macro arguments.
   4869   Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
   4870   Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
   4871   Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
   4872 
   4873   Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
   4874 
   4875   if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
   4876     if (Args.hasArg(options::OPT_fbuild_session_timestamp))
   4877       D.Diag(diag::err_drv_argument_not_allowed_with)
   4878           << A->getAsString(Args) << "-fbuild-session-timestamp";
   4879 
   4880     llvm::sys::fs::file_status Status;
   4881     if (llvm::sys::fs::status(A->getValue(), Status))
   4882       D.Diag(diag::err_drv_no_such_file) << A->getValue();
   4883     CmdArgs.push_back(Args.MakeArgString(
   4884         "-fbuild-session-timestamp=" +
   4885         Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
   4886   }
   4887 
   4888   if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
   4889     if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
   4890                          options::OPT_fbuild_session_file))
   4891       D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
   4892 
   4893     Args.AddLastArg(CmdArgs,
   4894                     options::OPT_fmodules_validate_once_per_build_session);
   4895   }
   4896 
   4897   Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
   4898 
   4899   // -faccess-control is default.
   4900   if (Args.hasFlag(options::OPT_fno_access_control,
   4901                    options::OPT_faccess_control, false))
   4902     CmdArgs.push_back("-fno-access-control");
   4903 
   4904   // -felide-constructors is the default.
   4905   if (Args.hasFlag(options::OPT_fno_elide_constructors,
   4906                    options::OPT_felide_constructors, false))
   4907     CmdArgs.push_back("-fno-elide-constructors");
   4908 
   4909   ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
   4910 
   4911   if (KernelOrKext || (types::isCXX(InputType) &&
   4912                        (RTTIMode == ToolChain::RM_DisabledExplicitly ||
   4913                         RTTIMode == ToolChain::RM_DisabledImplicitly)))
   4914     CmdArgs.push_back("-fno-rtti");
   4915 
   4916   // -fshort-enums=0 is default for all architectures except Hexagon.
   4917   if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
   4918                    getToolChain().getArch() == llvm::Triple::hexagon))
   4919     CmdArgs.push_back("-fshort-enums");
   4920 
   4921   // -fsigned-char is default.
   4922   if (Arg *A = Args.getLastArg(
   4923           options::OPT_fsigned_char, options::OPT_fno_signed_char,
   4924           options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
   4925     if (A->getOption().matches(options::OPT_funsigned_char) ||
   4926         A->getOption().matches(options::OPT_fno_signed_char)) {
   4927       CmdArgs.push_back("-fno-signed-char");
   4928     }
   4929   } else if (!isSignedCharDefault(getToolChain().getTriple())) {
   4930     CmdArgs.push_back("-fno-signed-char");
   4931   }
   4932 
   4933   // -fuse-cxa-atexit is default.
   4934   if (!Args.hasFlag(
   4935           options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
   4936           !IsWindowsCygnus && !IsWindowsGNU &&
   4937               getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
   4938               getToolChain().getArch() != llvm::Triple::hexagon &&
   4939               getToolChain().getArch() != llvm::Triple::xcore &&
   4940               ((getToolChain().getTriple().getVendor() !=
   4941                 llvm::Triple::MipsTechnologies) ||
   4942                getToolChain().getTriple().hasEnvironment())) ||
   4943       KernelOrKext)
   4944     CmdArgs.push_back("-fno-use-cxa-atexit");
   4945 
   4946   // -fms-extensions=0 is default.
   4947   if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
   4948                    IsWindowsMSVC))
   4949     CmdArgs.push_back("-fms-extensions");
   4950 
   4951   // -fno-use-line-directives is default.
   4952   if (Args.hasFlag(options::OPT_fuse_line_directives,
   4953                    options::OPT_fno_use_line_directives, false))
   4954     CmdArgs.push_back("-fuse-line-directives");
   4955 
   4956   // -fms-compatibility=0 is default.
   4957   if (Args.hasFlag(options::OPT_fms_compatibility,
   4958                    options::OPT_fno_ms_compatibility,
   4959                    (IsWindowsMSVC &&
   4960                     Args.hasFlag(options::OPT_fms_extensions,
   4961                                  options::OPT_fno_ms_extensions, true))))
   4962     CmdArgs.push_back("-fms-compatibility");
   4963 
   4964   // -fms-compatibility-version=18.00 is default.
   4965   VersionTuple MSVT = visualstudio::getMSVCVersion(
   4966       &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
   4967   if (!MSVT.empty())
   4968     CmdArgs.push_back(
   4969         Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
   4970 
   4971   bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
   4972   if (ImplyVCPPCXXVer) {
   4973     if (IsMSVC2015Compatible)
   4974       CmdArgs.push_back("-std=c++14");
   4975     else
   4976       CmdArgs.push_back("-std=c++11");
   4977   }
   4978 
   4979   // -fno-borland-extensions is default.
   4980   if (Args.hasFlag(options::OPT_fborland_extensions,
   4981                    options::OPT_fno_borland_extensions, false))
   4982     CmdArgs.push_back("-fborland-extensions");
   4983 
   4984   // -fno-declspec is default, except for PS4.
   4985   if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
   4986                    getToolChain().getTriple().isPS4()))
   4987     CmdArgs.push_back("-fdeclspec");
   4988   else if (Args.hasArg(options::OPT_fno_declspec))
   4989     CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
   4990 
   4991   // -fthreadsafe-static is default, except for MSVC compatibility versions less
   4992   // than 19.
   4993   if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
   4994                     options::OPT_fno_threadsafe_statics,
   4995                     !IsWindowsMSVC || IsMSVC2015Compatible))
   4996     CmdArgs.push_back("-fno-threadsafe-statics");
   4997 
   4998   // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
   4999   // needs it.
   5000   if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
   5001                    options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
   5002     CmdArgs.push_back("-fdelayed-template-parsing");
   5003 
   5004   // -fgnu-keywords default varies depending on language; only pass if
   5005   // specified.
   5006   if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
   5007                                options::OPT_fno_gnu_keywords))
   5008     A->render(Args, CmdArgs);
   5009 
   5010   if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
   5011                    false))
   5012     CmdArgs.push_back("-fgnu89-inline");
   5013 
   5014   if (Args.hasArg(options::OPT_fno_inline))
   5015     CmdArgs.push_back("-fno-inline");
   5016 
   5017   if (Args.hasArg(options::OPT_fno_inline_functions))
   5018     CmdArgs.push_back("-fno-inline-functions");
   5019 
   5020   ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
   5021 
   5022   // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
   5023   // legacy is the default. Except for deployment taget of 10.5,
   5024   // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
   5025   // gets ignored silently.
   5026   if (objcRuntime.isNonFragile()) {
   5027     if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
   5028                       options::OPT_fno_objc_legacy_dispatch,
   5029                       objcRuntime.isLegacyDispatchDefaultForArch(
   5030                           getToolChain().getArch()))) {
   5031       if (getToolChain().UseObjCMixedDispatch())
   5032         CmdArgs.push_back("-fobjc-dispatch-method=mixed");
   5033       else
   5034         CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
   5035     }
   5036   }
   5037 
   5038   // When ObjectiveC legacy runtime is in effect on MacOSX,
   5039   // turn on the option to do Array/Dictionary subscripting
   5040   // by default.
   5041   if (getToolChain().getArch() == llvm::Triple::x86 &&
   5042       getToolChain().getTriple().isMacOSX() &&
   5043       !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
   5044       objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
   5045       objcRuntime.isNeXTFamily())
   5046     CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
   5047 
   5048   // -fencode-extended-block-signature=1 is default.
   5049   if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
   5050     CmdArgs.push_back("-fencode-extended-block-signature");
   5051   }
   5052 
   5053   // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
   5054   // NOTE: This logic is duplicated in ToolChains.cpp.
   5055   bool ARC = isObjCAutoRefCount(Args);
   5056   if (ARC) {
   5057     getToolChain().CheckObjCARC();
   5058 
   5059     CmdArgs.push_back("-fobjc-arc");
   5060 
   5061     // FIXME: It seems like this entire block, and several around it should be
   5062     // wrapped in isObjC, but for now we just use it here as this is where it
   5063     // was being used previously.
   5064     if (types::isCXX(InputType) && types::isObjC(InputType)) {
   5065       if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
   5066         CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
   5067       else
   5068         CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
   5069     }
   5070 
   5071     // Allow the user to enable full exceptions code emission.
   5072     // We define off for Objective-CC, on for Objective-C++.
   5073     if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
   5074                      options::OPT_fno_objc_arc_exceptions,
   5075                      /*default*/ types::isCXX(InputType)))
   5076       CmdArgs.push_back("-fobjc-arc-exceptions");
   5077 
   5078   }
   5079 
   5080   // -fobjc-infer-related-result-type is the default, except in the Objective-C
   5081   // rewriter.
   5082   if (rewriteKind != RK_None)
   5083     CmdArgs.push_back("-fno-objc-infer-related-result-type");
   5084 
   5085   // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
   5086   // takes precedence.
   5087   const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
   5088   if (!GCArg)
   5089     GCArg = Args.getLastArg(options::OPT_fobjc_gc);
   5090   if (GCArg) {
   5091     if (ARC) {
   5092       D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
   5093     } else if (getToolChain().SupportsObjCGC()) {
   5094       GCArg->render(Args, CmdArgs);
   5095     } else {
   5096       // FIXME: We should move this to a hard error.
   5097       D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
   5098     }
   5099   }
   5100 
   5101   // Pass down -fobjc-weak or -fno-objc-weak if present.
   5102   if (types::isObjC(InputType)) {
   5103     auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
   5104                                    options::OPT_fno_objc_weak);
   5105     if (!WeakArg) {
   5106       // nothing to do
   5107     } else if (GCArg) {
   5108       if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
   5109         D.Diag(diag::err_objc_weak_with_gc);
   5110     } else if (!objcRuntime.allowsWeak()) {
   5111       if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
   5112         D.Diag(diag::err_objc_weak_unsupported);
   5113     } else {
   5114       WeakArg->render(Args, CmdArgs);
   5115     }
   5116   }
   5117 
   5118   if (Args.hasFlag(options::OPT_fapplication_extension,
   5119                    options::OPT_fno_application_extension, false))
   5120     CmdArgs.push_back("-fapplication-extension");
   5121 
   5122   // Handle GCC-style exception args.
   5123   if (!C.getDriver().IsCLMode())
   5124     addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
   5125                      CmdArgs);
   5126 
   5127   if (getToolChain().UseSjLjExceptions(Args))
   5128     CmdArgs.push_back("-fsjlj-exceptions");
   5129 
   5130   // C++ "sane" operator new.
   5131   if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
   5132                     options::OPT_fno_assume_sane_operator_new))
   5133     CmdArgs.push_back("-fno-assume-sane-operator-new");
   5134 
   5135   // -fsized-deallocation is off by default, as it is an ABI-breaking change for
   5136   // most platforms.
   5137   if (Args.hasFlag(options::OPT_fsized_deallocation,
   5138                    options::OPT_fno_sized_deallocation, false))
   5139     CmdArgs.push_back("-fsized-deallocation");
   5140 
   5141   // -fconstant-cfstrings is default, and may be subject to argument translation
   5142   // on Darwin.
   5143   if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
   5144                     options::OPT_fno_constant_cfstrings) ||
   5145       !Args.hasFlag(options::OPT_mconstant_cfstrings,
   5146                     options::OPT_mno_constant_cfstrings))
   5147     CmdArgs.push_back("-fno-constant-cfstrings");
   5148 
   5149   // -fshort-wchar default varies depending on platform; only
   5150   // pass if specified.
   5151   if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
   5152                                options::OPT_fno_short_wchar))
   5153     A->render(Args, CmdArgs);
   5154 
   5155   // -fno-pascal-strings is default, only pass non-default.
   5156   if (Args.hasFlag(options::OPT_fpascal_strings,
   5157                    options::OPT_fno_pascal_strings, false))
   5158     CmdArgs.push_back("-fpascal-strings");
   5159 
   5160   // Honor -fpack-struct= and -fpack-struct, if given. Note that
   5161   // -fno-pack-struct doesn't apply to -fpack-struct=.
   5162   if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
   5163     std::string PackStructStr = "-fpack-struct=";
   5164     PackStructStr += A->getValue();
   5165     CmdArgs.push_back(Args.MakeArgString(PackStructStr));
   5166   } else if (Args.hasFlag(options::OPT_fpack_struct,
   5167                           options::OPT_fno_pack_struct, false)) {
   5168     CmdArgs.push_back("-fpack-struct=1");
   5169   }
   5170 
   5171   // Handle -fmax-type-align=N and -fno-type-align
   5172   bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
   5173   if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
   5174     if (!SkipMaxTypeAlign) {
   5175       std::string MaxTypeAlignStr = "-fmax-type-align=";
   5176       MaxTypeAlignStr += A->getValue();
   5177       CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
   5178     }
   5179   } else if (getToolChain().getTriple().isOSDarwin()) {
   5180     if (!SkipMaxTypeAlign) {
   5181       std::string MaxTypeAlignStr = "-fmax-type-align=16";
   5182       CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
   5183     }
   5184   }
   5185 
   5186   // -fcommon is the default unless compiling kernel code or the target says so
   5187   bool NoCommonDefault =
   5188       KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
   5189   if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
   5190                     !NoCommonDefault))
   5191     CmdArgs.push_back("-fno-common");
   5192 
   5193   // -fsigned-bitfields is default, and clang doesn't yet support
   5194   // -funsigned-bitfields.
   5195   if (!Args.hasFlag(options::OPT_fsigned_bitfields,
   5196                     options::OPT_funsigned_bitfields))
   5197     D.Diag(diag::warn_drv_clang_unsupported)
   5198         << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
   5199 
   5200   // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
   5201   if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
   5202     D.Diag(diag::err_drv_clang_unsupported)
   5203         << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
   5204 
   5205   // -finput_charset=UTF-8 is default. Reject others
   5206   if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
   5207     StringRef value = inputCharset->getValue();
   5208     if (value != "UTF-8")
   5209       D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
   5210                                           << value;
   5211   }
   5212 
   5213   // -fexec_charset=UTF-8 is default. Reject others
   5214   if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
   5215     StringRef value = execCharset->getValue();
   5216     if (value != "UTF-8")
   5217       D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
   5218                                           << value;
   5219   }
   5220 
   5221   // -fcaret-diagnostics is default.
   5222   if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
   5223                     options::OPT_fno_caret_diagnostics, true))
   5224     CmdArgs.push_back("-fno-caret-diagnostics");
   5225 
   5226   // -fdiagnostics-fixit-info is default, only pass non-default.
   5227   if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
   5228                     options::OPT_fno_diagnostics_fixit_info))
   5229     CmdArgs.push_back("-fno-diagnostics-fixit-info");
   5230 
   5231   // Enable -fdiagnostics-show-option by default.
   5232   if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
   5233                    options::OPT_fno_diagnostics_show_option))
   5234     CmdArgs.push_back("-fdiagnostics-show-option");
   5235 
   5236   if (const Arg *A =
   5237           Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
   5238     CmdArgs.push_back("-fdiagnostics-show-category");
   5239     CmdArgs.push_back(A->getValue());
   5240   }
   5241 
   5242   if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
   5243     CmdArgs.push_back("-fdiagnostics-format");
   5244     CmdArgs.push_back(A->getValue());
   5245   }
   5246 
   5247   if (Arg *A = Args.getLastArg(
   5248           options::OPT_fdiagnostics_show_note_include_stack,
   5249           options::OPT_fno_diagnostics_show_note_include_stack)) {
   5250     if (A->getOption().matches(
   5251             options::OPT_fdiagnostics_show_note_include_stack))
   5252       CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
   5253     else
   5254       CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
   5255   }
   5256 
   5257   // Color diagnostics are the default, unless the terminal doesn't support
   5258   // them.
   5259   // Support both clang's -f[no-]color-diagnostics and gcc's
   5260   // -f[no-]diagnostics-colors[=never|always|auto].
   5261   enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
   5262   for (const auto &Arg : Args) {
   5263     const Option &O = Arg->getOption();
   5264     if (!O.matches(options::OPT_fcolor_diagnostics) &&
   5265         !O.matches(options::OPT_fdiagnostics_color) &&
   5266         !O.matches(options::OPT_fno_color_diagnostics) &&
   5267         !O.matches(options::OPT_fno_diagnostics_color) &&
   5268         !O.matches(options::OPT_fdiagnostics_color_EQ))
   5269       continue;
   5270 
   5271     Arg->claim();
   5272     if (O.matches(options::OPT_fcolor_diagnostics) ||
   5273         O.matches(options::OPT_fdiagnostics_color)) {
   5274       ShowColors = Colors_On;
   5275     } else if (O.matches(options::OPT_fno_color_diagnostics) ||
   5276                O.matches(options::OPT_fno_diagnostics_color)) {
   5277       ShowColors = Colors_Off;
   5278     } else {
   5279       assert(O.matches(options::OPT_fdiagnostics_color_EQ));
   5280       StringRef value(Arg->getValue());
   5281       if (value == "always")
   5282         ShowColors = Colors_On;
   5283       else if (value == "never")
   5284         ShowColors = Colors_Off;
   5285       else if (value == "auto")
   5286         ShowColors = Colors_Auto;
   5287       else
   5288         getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
   5289             << ("-fdiagnostics-color=" + value).str();
   5290     }
   5291   }
   5292   if (ShowColors == Colors_On ||
   5293       (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
   5294     CmdArgs.push_back("-fcolor-diagnostics");
   5295 
   5296   if (Args.hasArg(options::OPT_fansi_escape_codes))
   5297     CmdArgs.push_back("-fansi-escape-codes");
   5298 
   5299   if (!Args.hasFlag(options::OPT_fshow_source_location,
   5300                     options::OPT_fno_show_source_location))
   5301     CmdArgs.push_back("-fno-show-source-location");
   5302 
   5303   if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
   5304                     true))
   5305     CmdArgs.push_back("-fno-show-column");
   5306 
   5307   if (!Args.hasFlag(options::OPT_fspell_checking,
   5308                     options::OPT_fno_spell_checking))
   5309     CmdArgs.push_back("-fno-spell-checking");
   5310 
   5311   // -fno-asm-blocks is default.
   5312   if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
   5313                    false))
   5314     CmdArgs.push_back("-fasm-blocks");
   5315 
   5316   // -fgnu-inline-asm is default.
   5317   if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
   5318                     options::OPT_fno_gnu_inline_asm, true))
   5319     CmdArgs.push_back("-fno-gnu-inline-asm");
   5320 
   5321   // Enable vectorization per default according to the optimization level
   5322   // selected. For optimization levels that want vectorization we use the alias
   5323   // option to simplify the hasFlag logic.
   5324   bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
   5325   OptSpecifier VectorizeAliasOption =
   5326       EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
   5327   if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
   5328                    options::OPT_fno_vectorize, EnableVec))
   5329     CmdArgs.push_back("-vectorize-loops");
   5330 
   5331   // -fslp-vectorize is enabled based on the optimization level selected.
   5332   bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
   5333   OptSpecifier SLPVectAliasOption =
   5334       EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
   5335   if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
   5336                    options::OPT_fno_slp_vectorize, EnableSLPVec))
   5337     CmdArgs.push_back("-vectorize-slp");
   5338 
   5339   // -fno-slp-vectorize-aggressive is default.
   5340   if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
   5341                    options::OPT_fno_slp_vectorize_aggressive, false))
   5342     CmdArgs.push_back("-vectorize-slp-aggressive");
   5343 
   5344   if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
   5345     A->render(Args, CmdArgs);
   5346 
   5347   // -fdollars-in-identifiers default varies depending on platform and
   5348   // language; only pass if specified.
   5349   if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
   5350                                options::OPT_fno_dollars_in_identifiers)) {
   5351     if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
   5352       CmdArgs.push_back("-fdollars-in-identifiers");
   5353     else
   5354       CmdArgs.push_back("-fno-dollars-in-identifiers");
   5355   }
   5356 
   5357   // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
   5358   // practical purposes.
   5359   if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
   5360                                options::OPT_fno_unit_at_a_time)) {
   5361     if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
   5362       D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
   5363   }
   5364 
   5365   if (Args.hasFlag(options::OPT_fapple_pragma_pack,
   5366                    options::OPT_fno_apple_pragma_pack, false))
   5367     CmdArgs.push_back("-fapple-pragma-pack");
   5368 
   5369   // le32-specific flags:
   5370   //  -fno-math-builtin: clang should not convert math builtins to intrinsics
   5371   //                     by default.
   5372   if (getToolChain().getArch() == llvm::Triple::le32) {
   5373     CmdArgs.push_back("-fno-math-builtin");
   5374   }
   5375 
   5376 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
   5377 //
   5378 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
   5379 #if 0
   5380   if (getToolChain().getTriple().isOSDarwin() &&
   5381       (getToolChain().getArch() == llvm::Triple::arm ||
   5382        getToolChain().getArch() == llvm::Triple::thumb)) {
   5383     if (!Args.hasArg(options::OPT_fbuiltin_strcat))
   5384       CmdArgs.push_back("-fno-builtin-strcat");
   5385     if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
   5386       CmdArgs.push_back("-fno-builtin-strcpy");
   5387   }
   5388 #endif
   5389 
   5390   // Enable rewrite includes if the user's asked for it or if we're generating
   5391   // diagnostics.
   5392   // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
   5393   // nice to enable this when doing a crashdump for modules as well.
   5394   if (Args.hasFlag(options::OPT_frewrite_includes,
   5395                    options::OPT_fno_rewrite_includes, false) ||
   5396       (C.isForDiagnostics() && !HaveModules))
   5397     CmdArgs.push_back("-frewrite-includes");
   5398 
   5399   // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
   5400   if (Arg *A = Args.getLastArg(options::OPT_traditional,
   5401                                options::OPT_traditional_cpp)) {
   5402     if (isa<PreprocessJobAction>(JA))
   5403       CmdArgs.push_back("-traditional-cpp");
   5404     else
   5405       D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
   5406   }
   5407 
   5408   Args.AddLastArg(CmdArgs, options::OPT_dM);
   5409   Args.AddLastArg(CmdArgs, options::OPT_dD);
   5410 
   5411   // Handle serialized diagnostics.
   5412   if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
   5413     CmdArgs.push_back("-serialize-diagnostic-file");
   5414     CmdArgs.push_back(Args.MakeArgString(A->getValue()));
   5415   }
   5416 
   5417   if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
   5418     CmdArgs.push_back("-fretain-comments-from-system-headers");
   5419 
   5420   // Forward -fcomment-block-commands to -cc1.
   5421   Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
   5422   // Forward -fparse-all-comments to -cc1.
   5423   Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
   5424 
   5425   // Turn -fplugin=name.so into -load name.so
   5426   for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
   5427     CmdArgs.push_back("-load");
   5428     CmdArgs.push_back(A->getValue());
   5429     A->claim();
   5430   }
   5431 
   5432   // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
   5433   // parser.
   5434   Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
   5435   for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
   5436     A->claim();
   5437 
   5438     // We translate this by hand to the -cc1 argument, since nightly test uses
   5439     // it and developers have been trained to spell it with -mllvm.
   5440     if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
   5441       CmdArgs.push_back("-disable-llvm-optzns");
   5442     } else
   5443       A->render(Args, CmdArgs);
   5444   }
   5445 
   5446   // With -save-temps, we want to save the unoptimized bitcode output from the
   5447   // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
   5448   // by the frontend.
   5449   if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
   5450     CmdArgs.push_back("-disable-llvm-passes");
   5451 
   5452   if (Output.getType() == types::TY_Dependencies) {
   5453     // Handled with other dependency code.
   5454   } else if (Output.isFilename()) {
   5455     CmdArgs.push_back("-o");
   5456     CmdArgs.push_back(Output.getFilename());
   5457   } else {
   5458     assert(Output.isNothing() && "Invalid output.");
   5459   }
   5460 
   5461   addDashXForInput(Args, Input, CmdArgs);
   5462 
   5463   if (Input.isFilename())
   5464     CmdArgs.push_back(Input.getFilename());
   5465   else
   5466     Input.getInputArg().renderAsInput(Args, CmdArgs);
   5467 
   5468   Args.AddAllArgs(CmdArgs, options::OPT_undef);
   5469 
   5470   const char *Exec = getToolChain().getDriver().getClangProgramPath();
   5471 
   5472   // Optionally embed the -cc1 level arguments into the debug info, for build
   5473   // analysis.
   5474   if (getToolChain().UseDwarfDebugFlags()) {
   5475     ArgStringList OriginalArgs;
   5476     for (const auto &Arg : Args)
   5477       Arg->render(Args, OriginalArgs);
   5478 
   5479     SmallString<256> Flags;
   5480     Flags += Exec;
   5481     for (const char *OriginalArg : OriginalArgs) {
   5482       SmallString<128> EscapedArg;
   5483       EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
   5484       Flags += " ";
   5485       Flags += EscapedArg;
   5486     }
   5487     CmdArgs.push_back("-dwarf-debug-flags");
   5488     CmdArgs.push_back(Args.MakeArgString(Flags));
   5489   }
   5490 
   5491   // Add the split debug info name to the command lines here so we
   5492   // can propagate it to the backend.
   5493   bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
   5494                     (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
   5495                      isa<BackendJobAction>(JA));
   5496   const char *SplitDwarfOut;
   5497   if (SplitDwarf) {
   5498     CmdArgs.push_back("-split-dwarf-file");
   5499     SplitDwarfOut = SplitDebugName(Args, Input);
   5500     CmdArgs.push_back(SplitDwarfOut);
   5501   }
   5502 
   5503   // Host-side cuda compilation receives device-side outputs as Inputs[1...].
   5504   // Include them with -fcuda-include-gpubinary.
   5505   if (IsCuda && Inputs.size() > 1)
   5506     for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
   5507       CmdArgs.push_back("-fcuda-include-gpubinary");
   5508       CmdArgs.push_back(I->getFilename());
   5509     }
   5510 
   5511   // Finally add the compile command to the compilation.
   5512   if (Args.hasArg(options::OPT__SLASH_fallback) &&
   5513       Output.getType() == types::TY_Object &&
   5514       (InputType == types::TY_C || InputType == types::TY_CXX)) {
   5515     auto CLCommand =
   5516         getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
   5517     C.addCommand(llvm::make_unique<FallbackCommand>(
   5518         JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
   5519   } else {
   5520     C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   5521   }
   5522 
   5523   // Handle the debug info splitting at object creation time if we're
   5524   // creating an object.
   5525   // TODO: Currently only works on linux with newer objcopy.
   5526   if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
   5527     SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
   5528 
   5529   if (Arg *A = Args.getLastArg(options::OPT_pg))
   5530     if (Args.hasArg(options::OPT_fomit_frame_pointer))
   5531       D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
   5532                                                       << A->getAsString(Args);
   5533 
   5534   // Claim some arguments which clang supports automatically.
   5535 
   5536   // -fpch-preprocess is used with gcc to add a special marker in the output to
   5537   // include the PCH file. Clang's PTH solution is completely transparent, so we
   5538   // do not need to deal with it at all.
   5539   Args.ClaimAllArgs(options::OPT_fpch_preprocess);
   5540 
   5541   // Claim some arguments which clang doesn't support, but we don't
   5542   // care to warn the user about.
   5543   Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
   5544   Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
   5545 
   5546   // Disable warnings for clang -E -emit-llvm foo.c
   5547   Args.ClaimAllArgs(options::OPT_emit_llvm);
   5548 }
   5549 
   5550 /// Add options related to the Objective-C runtime/ABI.
   5551 ///
   5552 /// Returns true if the runtime is non-fragile.
   5553 ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
   5554                                       ArgStringList &cmdArgs,
   5555                                       RewriteKind rewriteKind) const {
   5556   // Look for the controlling runtime option.
   5557   Arg *runtimeArg =
   5558       args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
   5559                       options::OPT_fobjc_runtime_EQ);
   5560 
   5561   // Just forward -fobjc-runtime= to the frontend.  This supercedes
   5562   // options about fragility.
   5563   if (runtimeArg &&
   5564       runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
   5565     ObjCRuntime runtime;
   5566     StringRef value = runtimeArg->getValue();
   5567     if (runtime.tryParse(value)) {
   5568       getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
   5569           << value;
   5570     }
   5571 
   5572     runtimeArg->render(args, cmdArgs);
   5573     return runtime;
   5574   }
   5575 
   5576   // Otherwise, we'll need the ABI "version".  Version numbers are
   5577   // slightly confusing for historical reasons:
   5578   //   1 - Traditional "fragile" ABI
   5579   //   2 - Non-fragile ABI, version 1
   5580   //   3 - Non-fragile ABI, version 2
   5581   unsigned objcABIVersion = 1;
   5582   // If -fobjc-abi-version= is present, use that to set the version.
   5583   if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
   5584     StringRef value = abiArg->getValue();
   5585     if (value == "1")
   5586       objcABIVersion = 1;
   5587     else if (value == "2")
   5588       objcABIVersion = 2;
   5589     else if (value == "3")
   5590       objcABIVersion = 3;
   5591     else
   5592       getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
   5593   } else {
   5594     // Otherwise, determine if we are using the non-fragile ABI.
   5595     bool nonFragileABIIsDefault =
   5596         (rewriteKind == RK_NonFragile ||
   5597          (rewriteKind == RK_None &&
   5598           getToolChain().IsObjCNonFragileABIDefault()));
   5599     if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
   5600                      options::OPT_fno_objc_nonfragile_abi,
   5601                      nonFragileABIIsDefault)) {
   5602 // Determine the non-fragile ABI version to use.
   5603 #ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
   5604       unsigned nonFragileABIVersion = 1;
   5605 #else
   5606       unsigned nonFragileABIVersion = 2;
   5607 #endif
   5608 
   5609       if (Arg *abiArg =
   5610               args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
   5611         StringRef value = abiArg->getValue();
   5612         if (value == "1")
   5613           nonFragileABIVersion = 1;
   5614         else if (value == "2")
   5615           nonFragileABIVersion = 2;
   5616         else
   5617           getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
   5618               << value;
   5619       }
   5620 
   5621       objcABIVersion = 1 + nonFragileABIVersion;
   5622     } else {
   5623       objcABIVersion = 1;
   5624     }
   5625   }
   5626 
   5627   // We don't actually care about the ABI version other than whether
   5628   // it's non-fragile.
   5629   bool isNonFragile = objcABIVersion != 1;
   5630 
   5631   // If we have no runtime argument, ask the toolchain for its default runtime.
   5632   // However, the rewriter only really supports the Mac runtime, so assume that.
   5633   ObjCRuntime runtime;
   5634   if (!runtimeArg) {
   5635     switch (rewriteKind) {
   5636     case RK_None:
   5637       runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
   5638       break;
   5639     case RK_Fragile:
   5640       runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
   5641       break;
   5642     case RK_NonFragile:
   5643       runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
   5644       break;
   5645     }
   5646 
   5647     // -fnext-runtime
   5648   } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
   5649     // On Darwin, make this use the default behavior for the toolchain.
   5650     if (getToolChain().getTriple().isOSDarwin()) {
   5651       runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
   5652 
   5653       // Otherwise, build for a generic macosx port.
   5654     } else {
   5655       runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
   5656     }
   5657 
   5658     // -fgnu-runtime
   5659   } else {
   5660     assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
   5661     // Legacy behaviour is to target the gnustep runtime if we are i
   5662     // non-fragile mode or the GCC runtime in fragile mode.
   5663     if (isNonFragile)
   5664       runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
   5665     else
   5666       runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
   5667   }
   5668 
   5669   cmdArgs.push_back(
   5670       args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
   5671   return runtime;
   5672 }
   5673 
   5674 static bool maybeConsumeDash(const std::string &EH, size_t &I) {
   5675   bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
   5676   I += HaveDash;
   5677   return !HaveDash;
   5678 }
   5679 
   5680 namespace {
   5681 struct EHFlags {
   5682   EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
   5683   bool Synch;
   5684   bool Asynch;
   5685   bool NoExceptC;
   5686 };
   5687 } // end anonymous namespace
   5688 
   5689 /// /EH controls whether to run destructor cleanups when exceptions are
   5690 /// thrown.  There are three modifiers:
   5691 /// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
   5692 /// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
   5693 ///      The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
   5694 /// - c: Assume that extern "C" functions are implicitly noexcept.  This
   5695 ///      modifier is an optimization, so we ignore it for now.
   5696 /// The default is /EHs-c-, meaning cleanups are disabled.
   5697 static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
   5698   EHFlags EH;
   5699 
   5700   std::vector<std::string> EHArgs =
   5701       Args.getAllArgValues(options::OPT__SLASH_EH);
   5702   for (auto EHVal : EHArgs) {
   5703     for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
   5704       switch (EHVal[I]) {
   5705       case 'a':
   5706         EH.Asynch = maybeConsumeDash(EHVal, I);
   5707         continue;
   5708       case 'c':
   5709         EH.NoExceptC = maybeConsumeDash(EHVal, I);
   5710         continue;
   5711       case 's':
   5712         EH.Synch = maybeConsumeDash(EHVal, I);
   5713         continue;
   5714       default:
   5715         break;
   5716       }
   5717       D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
   5718       break;
   5719     }
   5720   }
   5721 
   5722   return EH;
   5723 }
   5724 
   5725 void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
   5726                            enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
   5727                            bool *EmitCodeView) const {
   5728   unsigned RTOptionID = options::OPT__SLASH_MT;
   5729 
   5730   if (Args.hasArg(options::OPT__SLASH_LDd))
   5731     // The /LDd option implies /MTd. The dependent lib part can be overridden,
   5732     // but defining _DEBUG is sticky.
   5733     RTOptionID = options::OPT__SLASH_MTd;
   5734 
   5735   if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
   5736     RTOptionID = A->getOption().getID();
   5737 
   5738   StringRef FlagForCRT;
   5739   switch (RTOptionID) {
   5740   case options::OPT__SLASH_MD:
   5741     if (Args.hasArg(options::OPT__SLASH_LDd))
   5742       CmdArgs.push_back("-D_DEBUG");
   5743     CmdArgs.push_back("-D_MT");
   5744     CmdArgs.push_back("-D_DLL");
   5745     FlagForCRT = "--dependent-lib=msvcrt";
   5746     break;
   5747   case options::OPT__SLASH_MDd:
   5748     CmdArgs.push_back("-D_DEBUG");
   5749     CmdArgs.push_back("-D_MT");
   5750     CmdArgs.push_back("-D_DLL");
   5751     FlagForCRT = "--dependent-lib=msvcrtd";
   5752     break;
   5753   case options::OPT__SLASH_MT:
   5754     if (Args.hasArg(options::OPT__SLASH_LDd))
   5755       CmdArgs.push_back("-D_DEBUG");
   5756     CmdArgs.push_back("-D_MT");
   5757     FlagForCRT = "--dependent-lib=libcmt";
   5758     break;
   5759   case options::OPT__SLASH_MTd:
   5760     CmdArgs.push_back("-D_DEBUG");
   5761     CmdArgs.push_back("-D_MT");
   5762     FlagForCRT = "--dependent-lib=libcmtd";
   5763     break;
   5764   default:
   5765     llvm_unreachable("Unexpected option ID.");
   5766   }
   5767 
   5768   if (Args.hasArg(options::OPT__SLASH_Zl)) {
   5769     CmdArgs.push_back("-D_VC_NODEFAULTLIB");
   5770   } else {
   5771     CmdArgs.push_back(FlagForCRT.data());
   5772 
   5773     // This provides POSIX compatibility (maps 'open' to '_open'), which most
   5774     // users want.  The /Za flag to cl.exe turns this off, but it's not
   5775     // implemented in clang.
   5776     CmdArgs.push_back("--dependent-lib=oldnames");
   5777   }
   5778 
   5779   // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
   5780   // would produce interleaved output, so ignore /showIncludes in such cases.
   5781   if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
   5782     if (Arg *A = Args.getLastArg(options::OPT_show_includes))
   5783       A->render(Args, CmdArgs);
   5784 
   5785   // This controls whether or not we emit RTTI data for polymorphic types.
   5786   if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
   5787                    /*default=*/false))
   5788     CmdArgs.push_back("-fno-rtti-data");
   5789 
   5790   // Emit CodeView if -Z7 is present.
   5791   *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
   5792   bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
   5793   // If we are emitting CV but not DWARF, don't build information that LLVM
   5794   // can't yet process.
   5795   if (*EmitCodeView && !EmitDwarf)
   5796     *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
   5797   if (*EmitCodeView)
   5798     CmdArgs.push_back("-gcodeview");
   5799 
   5800   const Driver &D = getToolChain().getDriver();
   5801   EHFlags EH = parseClangCLEHFlags(D, Args);
   5802   // FIXME: Do something with NoExceptC.
   5803   if (EH.Synch || EH.Asynch) {
   5804     CmdArgs.push_back("-fcxx-exceptions");
   5805     CmdArgs.push_back("-fexceptions");
   5806   }
   5807 
   5808   // /EP should expand to -E -P.
   5809   if (Args.hasArg(options::OPT__SLASH_EP)) {
   5810     CmdArgs.push_back("-E");
   5811     CmdArgs.push_back("-P");
   5812   }
   5813 
   5814   unsigned VolatileOptionID;
   5815   if (getToolChain().getArch() == llvm::Triple::x86_64 ||
   5816       getToolChain().getArch() == llvm::Triple::x86)
   5817     VolatileOptionID = options::OPT__SLASH_volatile_ms;
   5818   else
   5819     VolatileOptionID = options::OPT__SLASH_volatile_iso;
   5820 
   5821   if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
   5822     VolatileOptionID = A->getOption().getID();
   5823 
   5824   if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
   5825     CmdArgs.push_back("-fms-volatile");
   5826 
   5827   Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
   5828   Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
   5829   if (MostGeneralArg && BestCaseArg)
   5830     D.Diag(clang::diag::err_drv_argument_not_allowed_with)
   5831         << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
   5832 
   5833   if (MostGeneralArg) {
   5834     Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
   5835     Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
   5836     Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
   5837 
   5838     Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
   5839     Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
   5840     if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
   5841       D.Diag(clang::diag::err_drv_argument_not_allowed_with)
   5842           << FirstConflict->getAsString(Args)
   5843           << SecondConflict->getAsString(Args);
   5844 
   5845     if (SingleArg)
   5846       CmdArgs.push_back("-fms-memptr-rep=single");
   5847     else if (MultipleArg)
   5848       CmdArgs.push_back("-fms-memptr-rep=multiple");
   5849     else
   5850       CmdArgs.push_back("-fms-memptr-rep=virtual");
   5851   }
   5852 
   5853   if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
   5854     A->render(Args, CmdArgs);
   5855 
   5856   if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
   5857     CmdArgs.push_back("-fdiagnostics-format");
   5858     if (Args.hasArg(options::OPT__SLASH_fallback))
   5859       CmdArgs.push_back("msvc-fallback");
   5860     else
   5861       CmdArgs.push_back("msvc");
   5862   }
   5863 }
   5864 
   5865 visualstudio::Compiler *Clang::getCLFallback() const {
   5866   if (!CLFallback)
   5867     CLFallback.reset(new visualstudio::Compiler(getToolChain()));
   5868   return CLFallback.get();
   5869 }
   5870 
   5871 void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
   5872                                 ArgStringList &CmdArgs) const {
   5873   StringRef CPUName;
   5874   StringRef ABIName;
   5875   const llvm::Triple &Triple = getToolChain().getTriple();
   5876   mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
   5877 
   5878   CmdArgs.push_back("-target-abi");
   5879   CmdArgs.push_back(ABIName.data());
   5880 }
   5881 
   5882 void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
   5883                            const InputInfo &Output, const InputInfoList &Inputs,
   5884                            const ArgList &Args,
   5885                            const char *LinkingOutput) const {
   5886   ArgStringList CmdArgs;
   5887 
   5888   assert(Inputs.size() == 1 && "Unexpected number of inputs.");
   5889   const InputInfo &Input = Inputs[0];
   5890 
   5891   std::string TripleStr =
   5892       getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
   5893   const llvm::Triple Triple(TripleStr);
   5894 
   5895   // Don't warn about "clang -w -c foo.s"
   5896   Args.ClaimAllArgs(options::OPT_w);
   5897   // and "clang -emit-llvm -c foo.s"
   5898   Args.ClaimAllArgs(options::OPT_emit_llvm);
   5899 
   5900   claimNoWarnArgs(Args);
   5901 
   5902   // Invoke ourselves in -cc1as mode.
   5903   //
   5904   // FIXME: Implement custom jobs for internal actions.
   5905   CmdArgs.push_back("-cc1as");
   5906 
   5907   // Add the "effective" target triple.
   5908   CmdArgs.push_back("-triple");
   5909   CmdArgs.push_back(Args.MakeArgString(TripleStr));
   5910 
   5911   // Set the output mode, we currently only expect to be used as a real
   5912   // assembler.
   5913   CmdArgs.push_back("-filetype");
   5914   CmdArgs.push_back("obj");
   5915 
   5916   // Set the main file name, so that debug info works even with
   5917   // -save-temps or preprocessed assembly.
   5918   CmdArgs.push_back("-main-file-name");
   5919   CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
   5920 
   5921   // Add the target cpu
   5922   std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
   5923   if (!CPU.empty()) {
   5924     CmdArgs.push_back("-target-cpu");
   5925     CmdArgs.push_back(Args.MakeArgString(CPU));
   5926   }
   5927 
   5928   // Add the target features
   5929   getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
   5930 
   5931   // Ignore explicit -force_cpusubtype_ALL option.
   5932   (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
   5933 
   5934   // Pass along any -I options so we get proper .include search paths.
   5935   Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
   5936 
   5937   // Determine the original source input.
   5938   const Action *SourceAction = &JA;
   5939   while (SourceAction->getKind() != Action::InputClass) {
   5940     assert(!SourceAction->getInputs().empty() && "unexpected root action!");
   5941     SourceAction = SourceAction->getInputs()[0];
   5942   }
   5943 
   5944   // Forward -g and handle debug info related flags, assuming we are dealing
   5945   // with an actual assembly file.
   5946   if (SourceAction->getType() == types::TY_Asm ||
   5947       SourceAction->getType() == types::TY_PP_Asm) {
   5948     bool WantDebug = false;
   5949     unsigned DwarfVersion = 0;
   5950     Args.ClaimAllArgs(options::OPT_g_Group);
   5951     if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
   5952       WantDebug = !A->getOption().matches(options::OPT_g0) &&
   5953         !A->getOption().matches(options::OPT_ggdb0);
   5954       if (WantDebug)
   5955         DwarfVersion = DwarfVersionNum(A->getSpelling());
   5956     }
   5957     if (DwarfVersion == 0)
   5958       DwarfVersion = getToolChain().GetDefaultDwarfVersion();
   5959     RenderDebugEnablingArgs(Args, CmdArgs,
   5960                             (WantDebug ? CodeGenOptions::LimitedDebugInfo
   5961                                        : CodeGenOptions::NoDebugInfo),
   5962                             DwarfVersion, llvm::DebuggerKind::Default);
   5963 
   5964     // Add the -fdebug-compilation-dir flag if needed.
   5965     addDebugCompDirArg(Args, CmdArgs);
   5966 
   5967     // Set the AT_producer to the clang version when using the integrated
   5968     // assembler on assembly source files.
   5969     CmdArgs.push_back("-dwarf-debug-producer");
   5970     CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
   5971 
   5972     // And pass along -I options
   5973     Args.AddAllArgs(CmdArgs, options::OPT_I);
   5974   }
   5975 
   5976   // Handle -fPIC et al -- the relocation-model affects the assembler
   5977   // for some targets.
   5978   llvm::Reloc::Model RelocationModel;
   5979   unsigned PICLevel;
   5980   bool IsPIE;
   5981   std::tie(RelocationModel, PICLevel, IsPIE) =
   5982       ParsePICArgs(getToolChain(), Triple, Args);
   5983 
   5984   const char *RMName = RelocationModelName(RelocationModel);
   5985   if (RMName) {
   5986     CmdArgs.push_back("-mrelocation-model");
   5987     CmdArgs.push_back(RMName);
   5988   }
   5989 
   5990   // Optionally embed the -cc1as level arguments into the debug info, for build
   5991   // analysis.
   5992   if (getToolChain().UseDwarfDebugFlags()) {
   5993     ArgStringList OriginalArgs;
   5994     for (const auto &Arg : Args)
   5995       Arg->render(Args, OriginalArgs);
   5996 
   5997     SmallString<256> Flags;
   5998     const char *Exec = getToolChain().getDriver().getClangProgramPath();
   5999     Flags += Exec;
   6000     for (const char *OriginalArg : OriginalArgs) {
   6001       SmallString<128> EscapedArg;
   6002       EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
   6003       Flags += " ";
   6004       Flags += EscapedArg;
   6005     }
   6006     CmdArgs.push_back("-dwarf-debug-flags");
   6007     CmdArgs.push_back(Args.MakeArgString(Flags));
   6008   }
   6009 
   6010   // FIXME: Add -static support, once we have it.
   6011 
   6012   // Add target specific flags.
   6013   switch (getToolChain().getArch()) {
   6014   default:
   6015     break;
   6016 
   6017   case llvm::Triple::mips:
   6018   case llvm::Triple::mipsel:
   6019   case llvm::Triple::mips64:
   6020   case llvm::Triple::mips64el:
   6021     AddMIPSTargetArgs(Args, CmdArgs);
   6022     break;
   6023   }
   6024 
   6025   // Consume all the warning flags. Usually this would be handled more
   6026   // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
   6027   // doesn't handle that so rather than warning about unused flags that are
   6028   // actually used, we'll lie by omission instead.
   6029   // FIXME: Stop lying and consume only the appropriate driver flags
   6030   for (const Arg *A : Args.filtered(options::OPT_W_Group))
   6031     A->claim();
   6032 
   6033   CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
   6034                                     getToolChain().getDriver());
   6035 
   6036   Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
   6037 
   6038   assert(Output.isFilename() && "Unexpected lipo output.");
   6039   CmdArgs.push_back("-o");
   6040   CmdArgs.push_back(Output.getFilename());
   6041 
   6042   assert(Input.isFilename() && "Invalid input.");
   6043   CmdArgs.push_back(Input.getFilename());
   6044 
   6045   const char *Exec = getToolChain().getDriver().getClangProgramPath();
   6046   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   6047 
   6048   // Handle the debug info splitting at object creation time if we're
   6049   // creating an object.
   6050   // TODO: Currently only works on linux with newer objcopy.
   6051   if (Args.hasArg(options::OPT_gsplit_dwarf) &&
   6052       getToolChain().getTriple().isOSLinux())
   6053     SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
   6054                    SplitDebugName(Args, Input));
   6055 }
   6056 
   6057 void GnuTool::anchor() {}
   6058 
   6059 void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
   6060                                const InputInfo &Output,
   6061                                const InputInfoList &Inputs, const ArgList &Args,
   6062                                const char *LinkingOutput) const {
   6063   const Driver &D = getToolChain().getDriver();
   6064   ArgStringList CmdArgs;
   6065 
   6066   for (const auto &A : Args) {
   6067     if (forwardToGCC(A->getOption())) {
   6068       // Don't forward any -g arguments to assembly steps.
   6069       if (isa<AssembleJobAction>(JA) &&
   6070           A->getOption().matches(options::OPT_g_Group))
   6071         continue;
   6072 
   6073       // Don't forward any -W arguments to assembly and link steps.
   6074       if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
   6075           A->getOption().matches(options::OPT_W_Group))
   6076         continue;
   6077 
   6078       // It is unfortunate that we have to claim here, as this means
   6079       // we will basically never report anything interesting for
   6080       // platforms using a generic gcc, even if we are just using gcc
   6081       // to get to the assembler.
   6082       A->claim();
   6083       A->render(Args, CmdArgs);
   6084     }
   6085   }
   6086 
   6087   RenderExtraToolArgs(JA, CmdArgs);
   6088 
   6089   // If using a driver driver, force the arch.
   6090   if (getToolChain().getTriple().isOSDarwin()) {
   6091     CmdArgs.push_back("-arch");
   6092     CmdArgs.push_back(
   6093         Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
   6094   }
   6095 
   6096   // Try to force gcc to match the tool chain we want, if we recognize
   6097   // the arch.
   6098   //
   6099   // FIXME: The triple class should directly provide the information we want
   6100   // here.
   6101   switch (getToolChain().getArch()) {
   6102   default:
   6103     break;
   6104   case llvm::Triple::x86:
   6105   case llvm::Triple::ppc:
   6106     CmdArgs.push_back("-m32");
   6107     break;
   6108   case llvm::Triple::x86_64:
   6109   case llvm::Triple::ppc64:
   6110   case llvm::Triple::ppc64le:
   6111     CmdArgs.push_back("-m64");
   6112     break;
   6113   case llvm::Triple::sparcel:
   6114     CmdArgs.push_back("-EL");
   6115     break;
   6116   }
   6117 
   6118   if (Output.isFilename()) {
   6119     CmdArgs.push_back("-o");
   6120     CmdArgs.push_back(Output.getFilename());
   6121   } else {
   6122     assert(Output.isNothing() && "Unexpected output");
   6123     CmdArgs.push_back("-fsyntax-only");
   6124   }
   6125 
   6126   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
   6127 
   6128   // Only pass -x if gcc will understand it; otherwise hope gcc
   6129   // understands the suffix correctly. The main use case this would go
   6130   // wrong in is for linker inputs if they happened to have an odd
   6131   // suffix; really the only way to get this to happen is a command
   6132   // like '-x foobar a.c' which will treat a.c like a linker input.
   6133   //
   6134   // FIXME: For the linker case specifically, can we safely convert
   6135   // inputs into '-Wl,' options?
   6136   for (const auto &II : Inputs) {
   6137     // Don't try to pass LLVM or AST inputs to a generic gcc.
   6138     if (types::isLLVMIR(II.getType()))
   6139       D.Diag(diag::err_drv_no_linker_llvm_support)
   6140           << getToolChain().getTripleString();
   6141     else if (II.getType() == types::TY_AST)
   6142       D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
   6143     else if (II.getType() == types::TY_ModuleFile)
   6144       D.Diag(diag::err_drv_no_module_support)
   6145           << getToolChain().getTripleString();
   6146 
   6147     if (types::canTypeBeUserSpecified(II.getType())) {
   6148       CmdArgs.push_back("-x");
   6149       CmdArgs.push_back(types::getTypeName(II.getType()));
   6150     }
   6151 
   6152     if (II.isFilename())
   6153       CmdArgs.push_back(II.getFilename());
   6154     else {
   6155       const Arg &A = II.getInputArg();
   6156 
   6157       // Reverse translate some rewritten options.
   6158       if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
   6159         CmdArgs.push_back("-lstdc++");
   6160         continue;
   6161       }
   6162 
   6163       // Don't render as input, we need gcc to do the translations.
   6164       A.render(Args, CmdArgs);
   6165     }
   6166   }
   6167 
   6168   const std::string customGCCName = D.getCCCGenericGCCName();
   6169   const char *GCCName;
   6170   if (!customGCCName.empty())
   6171     GCCName = customGCCName.c_str();
   6172   else if (D.CCCIsCXX()) {
   6173     GCCName = "g++";
   6174   } else
   6175     GCCName = "gcc";
   6176 
   6177   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
   6178   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   6179 }
   6180 
   6181 void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
   6182                                             ArgStringList &CmdArgs) const {
   6183   CmdArgs.push_back("-E");
   6184 }
   6185 
   6186 void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
   6187                                         ArgStringList &CmdArgs) const {
   6188   const Driver &D = getToolChain().getDriver();
   6189 
   6190   switch (JA.getType()) {
   6191   // If -flto, etc. are present then make sure not to force assembly output.
   6192   case types::TY_LLVM_IR:
   6193   case types::TY_LTO_IR:
   6194   case types::TY_LLVM_BC:
   6195   case types::TY_LTO_BC:
   6196     CmdArgs.push_back("-c");
   6197     break;
   6198   case types::TY_PP_Asm:
   6199     CmdArgs.push_back("-S");
   6200     break;
   6201   case types::TY_Nothing:
   6202     CmdArgs.push_back("-fsyntax-only");
   6203     break;
   6204   default:
   6205     D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
   6206   }
   6207 }
   6208 
   6209 void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
   6210                                       ArgStringList &CmdArgs) const {
   6211   // The types are (hopefully) good enough.
   6212 }
   6213 
   6214 // Hexagon tools start.
   6215 void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
   6216                                              ArgStringList &CmdArgs) const {
   6217 }
   6218 
   6219 void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
   6220                                       const InputInfo &Output,
   6221                                       const InputInfoList &Inputs,
   6222                                       const ArgList &Args,
   6223                                       const char *LinkingOutput) const {
   6224   claimNoWarnArgs(Args);
   6225 
   6226   auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
   6227   const Driver &D = HTC.getDriver();
   6228   ArgStringList CmdArgs;
   6229 
   6230   std::string MArchString = "-march=hexagon";
   6231   CmdArgs.push_back(Args.MakeArgString(MArchString));
   6232 
   6233   RenderExtraToolArgs(JA, CmdArgs);
   6234 
   6235   std::string AsName = "hexagon-llvm-mc";
   6236   std::string MCpuString = "-mcpu=hexagon" +
   6237         toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
   6238   CmdArgs.push_back("-filetype=obj");
   6239   CmdArgs.push_back(Args.MakeArgString(MCpuString));
   6240 
   6241   if (Output.isFilename()) {
   6242     CmdArgs.push_back("-o");
   6243     CmdArgs.push_back(Output.getFilename());
   6244   } else {
   6245     assert(Output.isNothing() && "Unexpected output");
   6246     CmdArgs.push_back("-fsyntax-only");
   6247   }
   6248 
   6249   if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
   6250     std::string N = llvm::utostr(G.getValue());
   6251     CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
   6252   }
   6253 
   6254   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
   6255 
   6256   // Only pass -x if gcc will understand it; otherwise hope gcc
   6257   // understands the suffix correctly. The main use case this would go
   6258   // wrong in is for linker inputs if they happened to have an odd
   6259   // suffix; really the only way to get this to happen is a command
   6260   // like '-x foobar a.c' which will treat a.c like a linker input.
   6261   //
   6262   // FIXME: For the linker case specifically, can we safely convert
   6263   // inputs into '-Wl,' options?
   6264   for (const auto &II : Inputs) {
   6265     // Don't try to pass LLVM or AST inputs to a generic gcc.
   6266     if (types::isLLVMIR(II.getType()))
   6267       D.Diag(clang::diag::err_drv_no_linker_llvm_support)
   6268           << HTC.getTripleString();
   6269     else if (II.getType() == types::TY_AST)
   6270       D.Diag(clang::diag::err_drv_no_ast_support)
   6271           << HTC.getTripleString();
   6272     else if (II.getType() == types::TY_ModuleFile)
   6273       D.Diag(diag::err_drv_no_module_support)
   6274           << HTC.getTripleString();
   6275 
   6276     if (II.isFilename())
   6277       CmdArgs.push_back(II.getFilename());
   6278     else
   6279       // Don't render as input, we need gcc to do the translations.
   6280       // FIXME: What is this?
   6281       II.getInputArg().render(Args, CmdArgs);
   6282   }
   6283 
   6284   auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
   6285   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   6286 }
   6287 
   6288 void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
   6289                                           ArgStringList &CmdArgs) const {
   6290 }
   6291 
   6292 static void
   6293 constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
   6294                          const toolchains::HexagonToolChain &HTC,
   6295                          const InputInfo &Output, const InputInfoList &Inputs,
   6296                          const ArgList &Args, ArgStringList &CmdArgs,
   6297                          const char *LinkingOutput) {
   6298 
   6299   const Driver &D = HTC.getDriver();
   6300 
   6301   //----------------------------------------------------------------------------
   6302   //
   6303   //----------------------------------------------------------------------------
   6304   bool IsStatic = Args.hasArg(options::OPT_static);
   6305   bool IsShared = Args.hasArg(options::OPT_shared);
   6306   bool IsPIE = Args.hasArg(options::OPT_pie);
   6307   bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
   6308   bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
   6309   bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
   6310   bool UseG0 = false;
   6311   bool UseShared = IsShared && !IsStatic;
   6312 
   6313   //----------------------------------------------------------------------------
   6314   // Silence warnings for various options
   6315   //----------------------------------------------------------------------------
   6316   Args.ClaimAllArgs(options::OPT_g_Group);
   6317   Args.ClaimAllArgs(options::OPT_emit_llvm);
   6318   Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
   6319                                      // handled somewhere else.
   6320   Args.ClaimAllArgs(options::OPT_static_libgcc);
   6321 
   6322   //----------------------------------------------------------------------------
   6323   //
   6324   //----------------------------------------------------------------------------
   6325   if (Args.hasArg(options::OPT_s))
   6326     CmdArgs.push_back("-s");
   6327 
   6328   if (Args.hasArg(options::OPT_r))
   6329     CmdArgs.push_back("-r");
   6330 
   6331   for (const auto &Opt : HTC.ExtraOpts)
   6332     CmdArgs.push_back(Opt.c_str());
   6333 
   6334   CmdArgs.push_back("-march=hexagon");
   6335   std::string CpuVer =
   6336         toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
   6337   std::string MCpuString = "-mcpu=hexagon" + CpuVer;
   6338   CmdArgs.push_back(Args.MakeArgString(MCpuString));
   6339 
   6340   if (IsShared) {
   6341     CmdArgs.push_back("-shared");
   6342     // The following should be the default, but doing as hexagon-gcc does.
   6343     CmdArgs.push_back("-call_shared");
   6344   }
   6345 
   6346   if (IsStatic)
   6347     CmdArgs.push_back("-static");
   6348 
   6349   if (IsPIE && !IsShared)
   6350     CmdArgs.push_back("-pie");
   6351 
   6352   if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
   6353     std::string N = llvm::utostr(G.getValue());
   6354     CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
   6355     UseG0 = G.getValue() == 0;
   6356   }
   6357 
   6358   //----------------------------------------------------------------------------
   6359   //
   6360   //----------------------------------------------------------------------------
   6361   CmdArgs.push_back("-o");
   6362   CmdArgs.push_back(Output.getFilename());
   6363 
   6364   //----------------------------------------------------------------------------
   6365   // moslib
   6366   //----------------------------------------------------------------------------
   6367   std::vector<std::string> OsLibs;
   6368   bool HasStandalone = false;
   6369 
   6370   for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
   6371     A->claim();
   6372     OsLibs.emplace_back(A->getValue());
   6373     HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
   6374   }
   6375   if (OsLibs.empty()) {
   6376     OsLibs.push_back("standalone");
   6377     HasStandalone = true;
   6378   }
   6379 
   6380   //----------------------------------------------------------------------------
   6381   // Start Files
   6382   //----------------------------------------------------------------------------
   6383   const std::string MCpuSuffix = "/" + CpuVer;
   6384   const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
   6385   const std::string RootDir =
   6386       HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
   6387   const std::string StartSubDir =
   6388       "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
   6389 
   6390   auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
   6391                       const char *Name) -> std::string {
   6392     std::string RelName = SubDir + Name;
   6393     std::string P = HTC.GetFilePath(RelName.c_str());
   6394     if (llvm::sys::fs::exists(P))
   6395       return P;
   6396     return RootDir + RelName;
   6397   };
   6398 
   6399   if (IncStdLib && IncStartFiles) {
   6400     if (!IsShared) {
   6401       if (HasStandalone) {
   6402         std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
   6403         CmdArgs.push_back(Args.MakeArgString(Crt0SA));
   6404       }
   6405       std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
   6406       CmdArgs.push_back(Args.MakeArgString(Crt0));
   6407     }
   6408     std::string Init = UseShared
   6409           ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
   6410           : Find(RootDir, StartSubDir, "/init.o");
   6411     CmdArgs.push_back(Args.MakeArgString(Init));
   6412   }
   6413 
   6414   //----------------------------------------------------------------------------
   6415   // Library Search Paths
   6416   //----------------------------------------------------------------------------
   6417   const ToolChain::path_list &LibPaths = HTC.getFilePaths();
   6418   for (const auto &LibPath : LibPaths)
   6419     CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
   6420 
   6421   //----------------------------------------------------------------------------
   6422   //
   6423   //----------------------------------------------------------------------------
   6424   Args.AddAllArgs(CmdArgs,
   6425                   {options::OPT_T_Group, options::OPT_e, options::OPT_s,
   6426                    options::OPT_t, options::OPT_u_Group});
   6427 
   6428   AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
   6429 
   6430   //----------------------------------------------------------------------------
   6431   // Libraries
   6432   //----------------------------------------------------------------------------
   6433   if (IncStdLib && IncDefLibs) {
   6434     if (D.CCCIsCXX()) {
   6435       HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
   6436       CmdArgs.push_back("-lm");
   6437     }
   6438 
   6439     CmdArgs.push_back("--start-group");
   6440 
   6441     if (!IsShared) {
   6442       for (const std::string &Lib : OsLibs)
   6443         CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
   6444       CmdArgs.push_back("-lc");
   6445     }
   6446     CmdArgs.push_back("-lgcc");
   6447 
   6448     CmdArgs.push_back("--end-group");
   6449   }
   6450 
   6451   //----------------------------------------------------------------------------
   6452   // End files
   6453   //----------------------------------------------------------------------------
   6454   if (IncStdLib && IncStartFiles) {
   6455     std::string Fini = UseShared
   6456           ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
   6457           : Find(RootDir, StartSubDir, "/fini.o");
   6458     CmdArgs.push_back(Args.MakeArgString(Fini));
   6459   }
   6460 }
   6461 
   6462 void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   6463                                    const InputInfo &Output,
   6464                                    const InputInfoList &Inputs,
   6465                                    const ArgList &Args,
   6466                                    const char *LinkingOutput) const {
   6467   auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
   6468 
   6469   ArgStringList CmdArgs;
   6470   constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
   6471                            LinkingOutput);
   6472 
   6473   std::string Linker = HTC.GetProgramPath("hexagon-link");
   6474   C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
   6475                                           CmdArgs, Inputs));
   6476 }
   6477 // Hexagon tools end.
   6478 
   6479 void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   6480                                   const InputInfo &Output,
   6481                                   const InputInfoList &Inputs,
   6482                                   const ArgList &Args,
   6483                                   const char *LinkingOutput) const {
   6484 
   6485   std::string Linker = getToolChain().GetProgramPath(getShortName());
   6486   ArgStringList CmdArgs;
   6487   CmdArgs.push_back("-flavor");
   6488   CmdArgs.push_back("old-gnu");
   6489   CmdArgs.push_back("-target");
   6490   CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
   6491   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   6492   CmdArgs.push_back("-o");
   6493   CmdArgs.push_back(Output.getFilename());
   6494   C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
   6495                                           CmdArgs, Inputs));
   6496 }
   6497 // AMDGPU tools end.
   6498 
   6499 wasm::Linker::Linker(const ToolChain &TC)
   6500   : GnuTool("wasm::Linker", "lld", TC) {}
   6501 
   6502 bool wasm::Linker::isLinkJob() const {
   6503   return true;
   6504 }
   6505 
   6506 bool wasm::Linker::hasIntegratedCPP() const {
   6507   return false;
   6508 }
   6509 
   6510 void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   6511                                 const InputInfo &Output,
   6512                                 const InputInfoList &Inputs,
   6513                                 const ArgList &Args,
   6514                                 const char *LinkingOutput) const {
   6515   const char *Linker = Args.MakeArgString(getToolChain().GetLinkerPath());
   6516   ArgStringList CmdArgs;
   6517   CmdArgs.push_back("-flavor");
   6518   CmdArgs.push_back("ld");
   6519   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   6520   CmdArgs.push_back("-o");
   6521   CmdArgs.push_back(Output.getFilename());
   6522   C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
   6523 }
   6524 
   6525 const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
   6526   std::string MArch;
   6527   if (!Arch.empty())
   6528     MArch = Arch;
   6529   else
   6530     MArch = Triple.getArchName();
   6531   MArch = StringRef(MArch).split("+").first.lower();
   6532 
   6533   // Handle -march=native.
   6534   if (MArch == "native") {
   6535     std::string CPU = llvm::sys::getHostCPUName();
   6536     if (CPU != "generic") {
   6537       // Translate the native cpu into the architecture suffix for that CPU.
   6538       StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
   6539       // If there is no valid architecture suffix for this CPU we don't know how
   6540       // to handle it, so return no architecture.
   6541       if (Suffix.empty())
   6542         MArch = "";
   6543       else
   6544         MArch = std::string("arm") + Suffix.str();
   6545     }
   6546   }
   6547 
   6548   return MArch;
   6549 }
   6550 
   6551 /// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
   6552 StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
   6553   std::string MArch = getARMArch(Arch, Triple);
   6554   // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
   6555   // here means an -march=native that we can't handle, so instead return no CPU.
   6556   if (MArch.empty())
   6557     return StringRef();
   6558 
   6559   // We need to return an empty string here on invalid MArch values as the
   6560   // various places that call this function can't cope with a null result.
   6561   return Triple.getARMCPUForArch(MArch);
   6562 }
   6563 
   6564 /// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
   6565 std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
   6566                                  const llvm::Triple &Triple) {
   6567   // FIXME: Warn on inconsistent use of -mcpu and -march.
   6568   // If we have -mcpu=, use that.
   6569   if (!CPU.empty()) {
   6570     std::string MCPU = StringRef(CPU).split("+").first.lower();
   6571     // Handle -mcpu=native.
   6572     if (MCPU == "native")
   6573       return llvm::sys::getHostCPUName();
   6574     else
   6575       return MCPU;
   6576   }
   6577 
   6578   return getARMCPUForMArch(Arch, Triple);
   6579 }
   6580 
   6581 /// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
   6582 /// CPU  (or Arch, if CPU is generic).
   6583 // FIXME: This is redundant with -mcpu, why does LLVM use this.
   6584 StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
   6585                                        const llvm::Triple &Triple) {
   6586   unsigned ArchKind;
   6587   if (CPU == "generic") {
   6588     std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
   6589     ArchKind = llvm::ARM::parseArch(ARMArch);
   6590     if (ArchKind == llvm::ARM::AK_INVALID)
   6591       // In case of generic Arch, i.e. "arm",
   6592       // extract arch from default cpu of the Triple
   6593       ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
   6594   } else {
   6595     // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
   6596     // armv7k triple if it's actually been specified via "-arch armv7k".
   6597     ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
   6598                           ? (unsigned)llvm::ARM::AK_ARMV7K
   6599                           : llvm::ARM::parseCPUArch(CPU);
   6600   }
   6601   if (ArchKind == llvm::ARM::AK_INVALID)
   6602     return "";
   6603   return llvm::ARM::getSubArch(ArchKind);
   6604 }
   6605 
   6606 void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
   6607                             const llvm::Triple &Triple) {
   6608   if (Args.hasArg(options::OPT_r))
   6609     return;
   6610 
   6611   // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
   6612   // to generate BE-8 executables.
   6613   if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
   6614     CmdArgs.push_back("--be8");
   6615 }
   6616 
   6617 mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
   6618   // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
   6619   // was first introduced in Release 3. However, other compilers have
   6620   // traditionally allowed it for Release 2 so we should do the same.
   6621   return (NanEncoding)llvm::StringSwitch<int>(CPU)
   6622       .Case("mips1", NanLegacy)
   6623       .Case("mips2", NanLegacy)
   6624       .Case("mips3", NanLegacy)
   6625       .Case("mips4", NanLegacy)
   6626       .Case("mips5", NanLegacy)
   6627       .Case("mips32", NanLegacy)
   6628       .Case("mips32r2", NanLegacy | Nan2008)
   6629       .Case("mips32r3", NanLegacy | Nan2008)
   6630       .Case("mips32r5", NanLegacy | Nan2008)
   6631       .Case("mips32r6", Nan2008)
   6632       .Case("mips64", NanLegacy)
   6633       .Case("mips64r2", NanLegacy | Nan2008)
   6634       .Case("mips64r3", NanLegacy | Nan2008)
   6635       .Case("mips64r5", NanLegacy | Nan2008)
   6636       .Case("mips64r6", Nan2008)
   6637       .Default(NanLegacy);
   6638 }
   6639 
   6640 bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
   6641   Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
   6642   return A && (A->getValue() == StringRef(Value));
   6643 }
   6644 
   6645 bool mips::isUCLibc(const ArgList &Args) {
   6646   Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
   6647   return A && A->getOption().matches(options::OPT_muclibc);
   6648 }
   6649 
   6650 bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
   6651   if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
   6652     return llvm::StringSwitch<bool>(NaNArg->getValue())
   6653         .Case("2008", true)
   6654         .Case("legacy", false)
   6655         .Default(false);
   6656 
   6657   // NaN2008 is the default for MIPS32r6/MIPS64r6.
   6658   return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
   6659       .Cases("mips32r6", "mips64r6", true)
   6660       .Default(false);
   6661 
   6662   return false;
   6663 }
   6664 
   6665 bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
   6666                          StringRef ABIName, mips::FloatABI FloatABI) {
   6667   if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
   6668       Triple.getVendor() != llvm::Triple::MipsTechnologies)
   6669     return false;
   6670 
   6671   if (ABIName != "32")
   6672     return false;
   6673 
   6674   // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
   6675   // present.
   6676   if (FloatABI == mips::FloatABI::Soft)
   6677     return false;
   6678 
   6679   return llvm::StringSwitch<bool>(CPUName)
   6680       .Cases("mips2", "mips3", "mips4", "mips5", true)
   6681       .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
   6682       .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
   6683       .Default(false);
   6684 }
   6685 
   6686 bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
   6687                          StringRef CPUName, StringRef ABIName,
   6688                          mips::FloatABI FloatABI) {
   6689   bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
   6690 
   6691   // FPXX shouldn't be used if -msingle-float is present.
   6692   if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
   6693                                options::OPT_mdouble_float))
   6694     if (A->getOption().matches(options::OPT_msingle_float))
   6695       UseFPXX = false;
   6696 
   6697   return UseFPXX;
   6698 }
   6699 
   6700 llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
   6701   // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
   6702   // archs which Darwin doesn't use.
   6703 
   6704   // The matching this routine does is fairly pointless, since it is neither the
   6705   // complete architecture list, nor a reasonable subset. The problem is that
   6706   // historically the driver driver accepts this and also ties its -march=
   6707   // handling to the architecture name, so we need to be careful before removing
   6708   // support for it.
   6709 
   6710   // This code must be kept in sync with Clang's Darwin specific argument
   6711   // translation.
   6712 
   6713   return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
   6714       .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
   6715       .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
   6716       .Case("ppc64", llvm::Triple::ppc64)
   6717       .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
   6718       .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
   6719              llvm::Triple::x86)
   6720       .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
   6721       // This is derived from the driver driver.
   6722       .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
   6723       .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
   6724       .Cases("armv7s", "xscale", llvm::Triple::arm)
   6725       .Case("arm64", llvm::Triple::aarch64)
   6726       .Case("r600", llvm::Triple::r600)
   6727       .Case("amdgcn", llvm::Triple::amdgcn)
   6728       .Case("nvptx", llvm::Triple::nvptx)
   6729       .Case("nvptx64", llvm::Triple::nvptx64)
   6730       .Case("amdil", llvm::Triple::amdil)
   6731       .Case("spir", llvm::Triple::spir)
   6732       .Default(llvm::Triple::UnknownArch);
   6733 }
   6734 
   6735 void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
   6736   const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
   6737   T.setArch(Arch);
   6738 
   6739   if (Str == "x86_64h")
   6740     T.setArchName(Str);
   6741   else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
   6742     T.setOS(llvm::Triple::UnknownOS);
   6743     T.setObjectFormat(llvm::Triple::MachO);
   6744   }
   6745 }
   6746 
   6747 const char *Clang::getBaseInputName(const ArgList &Args,
   6748                                     const InputInfo &Input) {
   6749   return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
   6750 }
   6751 
   6752 const char *Clang::getBaseInputStem(const ArgList &Args,
   6753                                     const InputInfoList &Inputs) {
   6754   const char *Str = getBaseInputName(Args, Inputs[0]);
   6755 
   6756   if (const char *End = strrchr(Str, '.'))
   6757     return Args.MakeArgString(std::string(Str, End));
   6758 
   6759   return Str;
   6760 }
   6761 
   6762 const char *Clang::getDependencyFileName(const ArgList &Args,
   6763                                          const InputInfoList &Inputs) {
   6764   // FIXME: Think about this more.
   6765   std::string Res;
   6766 
   6767   if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
   6768     std::string Str(OutputOpt->getValue());
   6769     Res = Str.substr(0, Str.rfind('.'));
   6770   } else {
   6771     Res = getBaseInputStem(Args, Inputs);
   6772   }
   6773   return Args.MakeArgString(Res + ".d");
   6774 }
   6775 
   6776 void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   6777                                     const InputInfo &Output,
   6778                                     const InputInfoList &Inputs,
   6779                                     const ArgList &Args,
   6780                                     const char *LinkingOutput) const {
   6781   const ToolChain &ToolChain = getToolChain();
   6782   const Driver &D = ToolChain.getDriver();
   6783   ArgStringList CmdArgs;
   6784 
   6785   // Silence warning for "clang -g foo.o -o foo"
   6786   Args.ClaimAllArgs(options::OPT_g_Group);
   6787   // and "clang -emit-llvm foo.o -o foo"
   6788   Args.ClaimAllArgs(options::OPT_emit_llvm);
   6789   // and for "clang -w foo.o -o foo". Other warning options are already
   6790   // handled somewhere else.
   6791   Args.ClaimAllArgs(options::OPT_w);
   6792 
   6793   if (!D.SysRoot.empty())
   6794     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   6795 
   6796   // CloudABI only supports static linkage.
   6797   CmdArgs.push_back("-Bstatic");
   6798   CmdArgs.push_back("--eh-frame-hdr");
   6799   CmdArgs.push_back("--gc-sections");
   6800 
   6801   if (Output.isFilename()) {
   6802     CmdArgs.push_back("-o");
   6803     CmdArgs.push_back(Output.getFilename());
   6804   } else {
   6805     assert(Output.isNothing() && "Invalid output.");
   6806   }
   6807 
   6808   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   6809     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
   6810     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
   6811   }
   6812 
   6813   Args.AddAllArgs(CmdArgs, options::OPT_L);
   6814   ToolChain.AddFilePathLibArgs(Args, CmdArgs);
   6815   Args.AddAllArgs(CmdArgs,
   6816                   {options::OPT_T_Group, options::OPT_e, options::OPT_s,
   6817                    options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
   6818 
   6819   if (D.isUsingLTO())
   6820     AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
   6821 
   6822   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
   6823 
   6824   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
   6825     if (D.CCCIsCXX())
   6826       ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
   6827     CmdArgs.push_back("-lc");
   6828     CmdArgs.push_back("-lcompiler_rt");
   6829   }
   6830 
   6831   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
   6832     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
   6833 
   6834   const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
   6835   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   6836 }
   6837 
   6838 void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
   6839                                      const InputInfo &Output,
   6840                                      const InputInfoList &Inputs,
   6841                                      const ArgList &Args,
   6842                                      const char *LinkingOutput) const {
   6843   ArgStringList CmdArgs;
   6844 
   6845   assert(Inputs.size() == 1 && "Unexpected number of inputs.");
   6846   const InputInfo &Input = Inputs[0];
   6847 
   6848   // Determine the original source input.
   6849   const Action *SourceAction = &JA;
   6850   while (SourceAction->getKind() != Action::InputClass) {
   6851     assert(!SourceAction->getInputs().empty() && "unexpected root action!");
   6852     SourceAction = SourceAction->getInputs()[0];
   6853   }
   6854 
   6855   // If -fno-integrated-as is used add -Q to the darwin assember driver to make
   6856   // sure it runs its system assembler not clang's integrated assembler.
   6857   // Applicable to darwin11+ and Xcode 4+.  darwin<10 lacked integrated-as.
   6858   // FIXME: at run-time detect assembler capabilities or rely on version
   6859   // information forwarded by -target-assembler-version.
   6860   if (Args.hasArg(options::OPT_fno_integrated_as)) {
   6861     const llvm::Triple &T(getToolChain().getTriple());
   6862     if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
   6863       CmdArgs.push_back("-Q");
   6864   }
   6865 
   6866   // Forward -g, assuming we are dealing with an actual assembly file.
   6867   if (SourceAction->getType() == types::TY_Asm ||
   6868       SourceAction->getType() == types::TY_PP_Asm) {
   6869     if (Args.hasArg(options::OPT_gstabs))
   6870       CmdArgs.push_back("--gstabs");
   6871     else if (Args.hasArg(options::OPT_g_Group))
   6872       CmdArgs.push_back("-g");
   6873   }
   6874 
   6875   // Derived from asm spec.
   6876   AddMachOArch(Args, CmdArgs);
   6877 
   6878   // Use -force_cpusubtype_ALL on x86 by default.
   6879   if (getToolChain().getArch() == llvm::Triple::x86 ||
   6880       getToolChain().getArch() == llvm::Triple::x86_64 ||
   6881       Args.hasArg(options::OPT_force__cpusubtype__ALL))
   6882     CmdArgs.push_back("-force_cpusubtype_ALL");
   6883 
   6884   if (getToolChain().getArch() != llvm::Triple::x86_64 &&
   6885       (((Args.hasArg(options::OPT_mkernel) ||
   6886          Args.hasArg(options::OPT_fapple_kext)) &&
   6887         getMachOToolChain().isKernelStatic()) ||
   6888        Args.hasArg(options::OPT_static)))
   6889     CmdArgs.push_back("-static");
   6890 
   6891   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
   6892 
   6893   assert(Output.isFilename() && "Unexpected lipo output.");
   6894   CmdArgs.push_back("-o");
   6895   CmdArgs.push_back(Output.getFilename());
   6896 
   6897   assert(Input.isFilename() && "Invalid input.");
   6898   CmdArgs.push_back(Input.getFilename());
   6899 
   6900   // asm_final spec is empty.
   6901 
   6902   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
   6903   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   6904 }
   6905 
   6906 void darwin::MachOTool::anchor() {}
   6907 
   6908 void darwin::MachOTool::AddMachOArch(const ArgList &Args,
   6909                                      ArgStringList &CmdArgs) const {
   6910   StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
   6911 
   6912   // Derived from darwin_arch spec.
   6913   CmdArgs.push_back("-arch");
   6914   CmdArgs.push_back(Args.MakeArgString(ArchName));
   6915 
   6916   // FIXME: Is this needed anymore?
   6917   if (ArchName == "arm")
   6918     CmdArgs.push_back("-force_cpusubtype_ALL");
   6919 }
   6920 
   6921 bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
   6922   // We only need to generate a temp path for LTO if we aren't compiling object
   6923   // files. When compiling source files, we run 'dsymutil' after linking. We
   6924   // don't run 'dsymutil' when compiling object files.
   6925   for (const auto &Input : Inputs)
   6926     if (Input.getType() != types::TY_Object)
   6927       return true;
   6928 
   6929   return false;
   6930 }
   6931 
   6932 void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
   6933                                  ArgStringList &CmdArgs,
   6934                                  const InputInfoList &Inputs) const {
   6935   const Driver &D = getToolChain().getDriver();
   6936   const toolchains::MachO &MachOTC = getMachOToolChain();
   6937 
   6938   unsigned Version[3] = {0, 0, 0};
   6939   if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
   6940     bool HadExtra;
   6941     if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
   6942                                    Version[2], HadExtra) ||
   6943         HadExtra)
   6944       D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
   6945   }
   6946 
   6947   // Newer linkers support -demangle. Pass it if supported and not disabled by
   6948   // the user.
   6949   if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
   6950     CmdArgs.push_back("-demangle");
   6951 
   6952   if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
   6953     CmdArgs.push_back("-export_dynamic");
   6954 
   6955   // If we are using App Extension restrictions, pass a flag to the linker
   6956   // telling it that the compiled code has been audited.
   6957   if (Args.hasFlag(options::OPT_fapplication_extension,
   6958                    options::OPT_fno_application_extension, false))
   6959     CmdArgs.push_back("-application_extension");
   6960 
   6961   if (D.isUsingLTO()) {
   6962     // If we are using LTO, then automatically create a temporary file path for
   6963     // the linker to use, so that it's lifetime will extend past a possible
   6964     // dsymutil step.
   6965     if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
   6966       const char *TmpPath = C.getArgs().MakeArgString(
   6967           D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
   6968       C.addTempFile(TmpPath);
   6969       CmdArgs.push_back("-object_path_lto");
   6970       CmdArgs.push_back(TmpPath);
   6971     }
   6972 
   6973     // Use -lto_library option to specify the libLTO.dylib path. Try to find
   6974     // it in clang installed libraries. If not found, the option is not used
   6975     // and 'ld' will use its default mechanism to search for libLTO.dylib.
   6976     if (Version[0] >= 133) {
   6977       // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
   6978       StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
   6979       SmallString<128> LibLTOPath(P);
   6980       llvm::sys::path::append(LibLTOPath, "lib");
   6981       llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
   6982       if (llvm::sys::fs::exists(LibLTOPath)) {
   6983         CmdArgs.push_back("-lto_library");
   6984         CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
   6985       } else {
   6986         D.Diag(diag::warn_drv_lto_libpath);
   6987       }
   6988     }
   6989   }
   6990 
   6991   // Derived from the "link" spec.
   6992   Args.AddAllArgs(CmdArgs, options::OPT_static);
   6993   if (!Args.hasArg(options::OPT_static))
   6994     CmdArgs.push_back("-dynamic");
   6995   if (Args.hasArg(options::OPT_fgnu_runtime)) {
   6996     // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
   6997     // here. How do we wish to handle such things?
   6998   }
   6999 
   7000   if (!Args.hasArg(options::OPT_dynamiclib)) {
   7001     AddMachOArch(Args, CmdArgs);
   7002     // FIXME: Why do this only on this path?
   7003     Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
   7004 
   7005     Args.AddLastArg(CmdArgs, options::OPT_bundle);
   7006     Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
   7007     Args.AddAllArgs(CmdArgs, options::OPT_client__name);
   7008 
   7009     Arg *A;
   7010     if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
   7011         (A = Args.getLastArg(options::OPT_current__version)) ||
   7012         (A = Args.getLastArg(options::OPT_install__name)))
   7013       D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
   7014                                                        << "-dynamiclib";
   7015 
   7016     Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
   7017     Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
   7018     Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
   7019   } else {
   7020     CmdArgs.push_back("-dylib");
   7021 
   7022     Arg *A;
   7023     if ((A = Args.getLastArg(options::OPT_bundle)) ||
   7024         (A = Args.getLastArg(options::OPT_bundle__loader)) ||
   7025         (A = Args.getLastArg(options::OPT_client__name)) ||
   7026         (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
   7027         (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
   7028         (A = Args.getLastArg(options::OPT_private__bundle)))
   7029       D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
   7030                                                       << "-dynamiclib";
   7031 
   7032     Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
   7033                               "-dylib_compatibility_version");
   7034     Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
   7035                               "-dylib_current_version");
   7036 
   7037     AddMachOArch(Args, CmdArgs);
   7038 
   7039     Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
   7040                               "-dylib_install_name");
   7041   }
   7042 
   7043   Args.AddLastArg(CmdArgs, options::OPT_all__load);
   7044   Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
   7045   Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
   7046   if (MachOTC.isTargetIOSBased())
   7047     Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
   7048   Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
   7049   Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
   7050   Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
   7051   Args.AddLastArg(CmdArgs, options::OPT_dynamic);
   7052   Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
   7053   Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
   7054   Args.AddAllArgs(CmdArgs, options::OPT_force__load);
   7055   Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
   7056   Args.AddAllArgs(CmdArgs, options::OPT_image__base);
   7057   Args.AddAllArgs(CmdArgs, options::OPT_init);
   7058 
   7059   // Add the deployment target.
   7060   MachOTC.addMinVersionArgs(Args, CmdArgs);
   7061 
   7062   Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
   7063   Args.AddLastArg(CmdArgs, options::OPT_multi__module);
   7064   Args.AddLastArg(CmdArgs, options::OPT_single__module);
   7065   Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
   7066   Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
   7067 
   7068   if (const Arg *A =
   7069           Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
   7070                           options::OPT_fno_pie, options::OPT_fno_PIE)) {
   7071     if (A->getOption().matches(options::OPT_fpie) ||
   7072         A->getOption().matches(options::OPT_fPIE))
   7073       CmdArgs.push_back("-pie");
   7074     else
   7075       CmdArgs.push_back("-no_pie");
   7076   }
   7077 
   7078   Args.AddLastArg(CmdArgs, options::OPT_prebind);
   7079   Args.AddLastArg(CmdArgs, options::OPT_noprebind);
   7080   Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
   7081   Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
   7082   Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
   7083   Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
   7084   Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
   7085   Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
   7086   Args.AddAllArgs(CmdArgs, options::OPT_segprot);
   7087   Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
   7088   Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
   7089   Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
   7090   Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
   7091   Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
   7092   Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
   7093   Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
   7094 
   7095   // Give --sysroot= preference, over the Apple specific behavior to also use
   7096   // --isysroot as the syslibroot.
   7097   StringRef sysroot = C.getSysRoot();
   7098   if (sysroot != "") {
   7099     CmdArgs.push_back("-syslibroot");
   7100     CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
   7101   } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
   7102     CmdArgs.push_back("-syslibroot");
   7103     CmdArgs.push_back(A->getValue());
   7104   }
   7105 
   7106   Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
   7107   Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
   7108   Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
   7109   Args.AddAllArgs(CmdArgs, options::OPT_undefined);
   7110   Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
   7111   Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
   7112   Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
   7113   Args.AddAllArgs(CmdArgs, options::OPT_y);
   7114   Args.AddLastArg(CmdArgs, options::OPT_w);
   7115   Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
   7116   Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
   7117   Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
   7118   Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
   7119   Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
   7120   Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
   7121   Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
   7122   Args.AddLastArg(CmdArgs, options::OPT_whyload);
   7123   Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
   7124   Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
   7125   Args.AddLastArg(CmdArgs, options::OPT_dylinker);
   7126   Args.AddLastArg(CmdArgs, options::OPT_Mach);
   7127 }
   7128 
   7129 void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   7130                                   const InputInfo &Output,
   7131                                   const InputInfoList &Inputs,
   7132                                   const ArgList &Args,
   7133                                   const char *LinkingOutput) const {
   7134   assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
   7135 
   7136   // If the number of arguments surpasses the system limits, we will encode the
   7137   // input files in a separate file, shortening the command line. To this end,
   7138   // build a list of input file names that can be passed via a file with the
   7139   // -filelist linker option.
   7140   llvm::opt::ArgStringList InputFileList;
   7141 
   7142   // The logic here is derived from gcc's behavior; most of which
   7143   // comes from specs (starting with link_command). Consult gcc for
   7144   // more information.
   7145   ArgStringList CmdArgs;
   7146 
   7147   /// Hack(tm) to ignore linking errors when we are doing ARC migration.
   7148   if (Args.hasArg(options::OPT_ccc_arcmt_check,
   7149                   options::OPT_ccc_arcmt_migrate)) {
   7150     for (const auto &Arg : Args)
   7151       Arg->claim();
   7152     const char *Exec =
   7153         Args.MakeArgString(getToolChain().GetProgramPath("touch"));
   7154     CmdArgs.push_back(Output.getFilename());
   7155     C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
   7156     return;
   7157   }
   7158 
   7159   // I'm not sure why this particular decomposition exists in gcc, but
   7160   // we follow suite for ease of comparison.
   7161   AddLinkArgs(C, Args, CmdArgs, Inputs);
   7162 
   7163   // It seems that the 'e' option is completely ignored for dynamic executables
   7164   // (the default), and with static executables, the last one wins, as expected.
   7165   Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
   7166                             options::OPT_Z_Flag, options::OPT_u_Group,
   7167                             options::OPT_e, options::OPT_r});
   7168 
   7169   // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
   7170   // members of static archive libraries which implement Objective-C classes or
   7171   // categories.
   7172   if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
   7173     CmdArgs.push_back("-ObjC");
   7174 
   7175   CmdArgs.push_back("-o");
   7176   CmdArgs.push_back(Output.getFilename());
   7177 
   7178   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
   7179     getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
   7180 
   7181   // SafeStack requires its own runtime libraries
   7182   // These libraries should be linked first, to make sure the
   7183   // __safestack_init constructor executes before everything else
   7184   if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
   7185     getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
   7186                                           "libclang_rt.safestack_osx.a",
   7187                                           /*AlwaysLink=*/true);
   7188   }
   7189 
   7190   Args.AddAllArgs(CmdArgs, options::OPT_L);
   7191 
   7192   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   7193   // Build the input file for -filelist (list of linker input files) in case we
   7194   // need it later
   7195   for (const auto &II : Inputs) {
   7196     if (!II.isFilename()) {
   7197       // This is a linker input argument.
   7198       // We cannot mix input arguments and file names in a -filelist input, thus
   7199       // we prematurely stop our list (remaining files shall be passed as
   7200       // arguments).
   7201       if (InputFileList.size() > 0)
   7202         break;
   7203 
   7204       continue;
   7205     }
   7206 
   7207     InputFileList.push_back(II.getFilename());
   7208   }
   7209 
   7210   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
   7211     addOpenMPRuntime(CmdArgs, getToolChain(), Args);
   7212 
   7213   if (isObjCRuntimeLinked(Args) &&
   7214       !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
   7215     // We use arclite library for both ARC and subscripting support.
   7216     getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
   7217 
   7218     CmdArgs.push_back("-framework");
   7219     CmdArgs.push_back("Foundation");
   7220     // Link libobj.
   7221     CmdArgs.push_back("-lobjc");
   7222   }
   7223 
   7224   if (LinkingOutput) {
   7225     CmdArgs.push_back("-arch_multiple");
   7226     CmdArgs.push_back("-final_output");
   7227     CmdArgs.push_back(LinkingOutput);
   7228   }
   7229 
   7230   if (Args.hasArg(options::OPT_fnested_functions))
   7231     CmdArgs.push_back("-allow_stack_execute");
   7232 
   7233   getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
   7234 
   7235   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
   7236     if (getToolChain().getDriver().CCCIsCXX())
   7237       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   7238 
   7239     // link_ssp spec is empty.
   7240 
   7241     // Let the tool chain choose which runtime library to link.
   7242     getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
   7243   }
   7244 
   7245   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   7246     // endfile_spec is empty.
   7247   }
   7248 
   7249   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   7250   Args.AddAllArgs(CmdArgs, options::OPT_F);
   7251 
   7252   // -iframework should be forwarded as -F.
   7253   for (const Arg *A : Args.filtered(options::OPT_iframework))
   7254     CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
   7255 
   7256   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
   7257     if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
   7258       if (A->getValue() == StringRef("Accelerate")) {
   7259         CmdArgs.push_back("-framework");
   7260         CmdArgs.push_back("Accelerate");
   7261       }
   7262     }
   7263   }
   7264 
   7265   const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
   7266   std::unique_ptr<Command> Cmd =
   7267       llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
   7268   Cmd->setInputFileList(std::move(InputFileList));
   7269   C.addCommand(std::move(Cmd));
   7270 }
   7271 
   7272 void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
   7273                                 const InputInfo &Output,
   7274                                 const InputInfoList &Inputs,
   7275                                 const ArgList &Args,
   7276                                 const char *LinkingOutput) const {
   7277   ArgStringList CmdArgs;
   7278 
   7279   CmdArgs.push_back("-create");
   7280   assert(Output.isFilename() && "Unexpected lipo output.");
   7281 
   7282   CmdArgs.push_back("-output");
   7283   CmdArgs.push_back(Output.getFilename());
   7284 
   7285   for (const auto &II : Inputs) {
   7286     assert(II.isFilename() && "Unexpected lipo input.");
   7287     CmdArgs.push_back(II.getFilename());
   7288   }
   7289 
   7290   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
   7291   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   7292 }
   7293 
   7294 void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
   7295                                     const InputInfo &Output,
   7296                                     const InputInfoList &Inputs,
   7297                                     const ArgList &Args,
   7298                                     const char *LinkingOutput) const {
   7299   ArgStringList CmdArgs;
   7300 
   7301   CmdArgs.push_back("-o");
   7302   CmdArgs.push_back(Output.getFilename());
   7303 
   7304   assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
   7305   const InputInfo &Input = Inputs[0];
   7306   assert(Input.isFilename() && "Unexpected dsymutil input.");
   7307   CmdArgs.push_back(Input.getFilename());
   7308 
   7309   const char *Exec =
   7310       Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
   7311   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   7312 }
   7313 
   7314 void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
   7315                                        const InputInfo &Output,
   7316                                        const InputInfoList &Inputs,
   7317                                        const ArgList &Args,
   7318                                        const char *LinkingOutput) const {
   7319   ArgStringList CmdArgs;
   7320   CmdArgs.push_back("--verify");
   7321   CmdArgs.push_back("--debug-info");
   7322   CmdArgs.push_back("--eh-frame");
   7323   CmdArgs.push_back("--quiet");
   7324 
   7325   assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
   7326   const InputInfo &Input = Inputs[0];
   7327   assert(Input.isFilename() && "Unexpected verify input");
   7328 
   7329   // Grabbing the output of the earlier dsymutil run.
   7330   CmdArgs.push_back(Input.getFilename());
   7331 
   7332   const char *Exec =
   7333       Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
   7334   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   7335 }
   7336 
   7337 void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
   7338                                       const InputInfo &Output,
   7339                                       const InputInfoList &Inputs,
   7340                                       const ArgList &Args,
   7341                                       const char *LinkingOutput) const {
   7342   claimNoWarnArgs(Args);
   7343   ArgStringList CmdArgs;
   7344 
   7345   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
   7346 
   7347   CmdArgs.push_back("-o");
   7348   CmdArgs.push_back(Output.getFilename());
   7349 
   7350   for (const auto &II : Inputs)
   7351     CmdArgs.push_back(II.getFilename());
   7352 
   7353   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
   7354   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   7355 }
   7356 
   7357 void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   7358                                    const InputInfo &Output,
   7359                                    const InputInfoList &Inputs,
   7360                                    const ArgList &Args,
   7361                                    const char *LinkingOutput) const {
   7362   ArgStringList CmdArgs;
   7363 
   7364   // Demangle C++ names in errors
   7365   CmdArgs.push_back("-C");
   7366 
   7367   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
   7368     CmdArgs.push_back("-e");
   7369     CmdArgs.push_back("_start");
   7370   }
   7371 
   7372   if (Args.hasArg(options::OPT_static)) {
   7373     CmdArgs.push_back("-Bstatic");
   7374     CmdArgs.push_back("-dn");
   7375   } else {
   7376     CmdArgs.push_back("-Bdynamic");
   7377     if (Args.hasArg(options::OPT_shared)) {
   7378       CmdArgs.push_back("-shared");
   7379     } else {
   7380       CmdArgs.push_back("--dynamic-linker");
   7381       CmdArgs.push_back(
   7382           Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
   7383     }
   7384   }
   7385 
   7386   if (Output.isFilename()) {
   7387     CmdArgs.push_back("-o");
   7388     CmdArgs.push_back(Output.getFilename());
   7389   } else {
   7390     assert(Output.isNothing() && "Invalid output.");
   7391   }
   7392 
   7393   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   7394     if (!Args.hasArg(options::OPT_shared))
   7395       CmdArgs.push_back(
   7396           Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
   7397 
   7398     CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
   7399     CmdArgs.push_back(
   7400         Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
   7401     CmdArgs.push_back(
   7402         Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
   7403   }
   7404 
   7405   getToolChain().AddFilePathLibArgs(Args, CmdArgs);
   7406 
   7407   Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
   7408                             options::OPT_e, options::OPT_r});
   7409 
   7410   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   7411 
   7412   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
   7413     if (getToolChain().getDriver().CCCIsCXX())
   7414       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   7415     CmdArgs.push_back("-lgcc_s");
   7416     CmdArgs.push_back("-lc");
   7417     if (!Args.hasArg(options::OPT_shared)) {
   7418       CmdArgs.push_back("-lgcc");
   7419       CmdArgs.push_back("-lm");
   7420     }
   7421   }
   7422 
   7423   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   7424     CmdArgs.push_back(
   7425         Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
   7426   }
   7427   CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
   7428 
   7429   getToolChain().addProfileRTLibs(Args, CmdArgs);
   7430 
   7431   const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
   7432   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   7433 }
   7434 
   7435 void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
   7436                                       const InputInfo &Output,
   7437                                       const InputInfoList &Inputs,
   7438                                       const ArgList &Args,
   7439                                       const char *LinkingOutput) const {
   7440   claimNoWarnArgs(Args);
   7441   ArgStringList CmdArgs;
   7442 
   7443   switch (getToolChain().getArch()) {
   7444   case llvm::Triple::x86:
   7445     // When building 32-bit code on OpenBSD/amd64, we have to explicitly
   7446     // instruct as in the base system to assemble 32-bit code.
   7447     CmdArgs.push_back("--32");
   7448     break;
   7449 
   7450   case llvm::Triple::ppc:
   7451     CmdArgs.push_back("-mppc");
   7452     CmdArgs.push_back("-many");
   7453     break;
   7454 
   7455   case llvm::Triple::sparc:
   7456   case llvm::Triple::sparcel: {
   7457     CmdArgs.push_back("-32");
   7458     std::string CPU = getCPUName(Args, getToolChain().getTriple());
   7459     CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
   7460     AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
   7461     break;
   7462   }
   7463 
   7464   case llvm::Triple::sparcv9: {
   7465     CmdArgs.push_back("-64");
   7466     std::string CPU = getCPUName(Args, getToolChain().getTriple());
   7467     CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
   7468     AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
   7469     break;
   7470   }
   7471 
   7472   case llvm::Triple::mips64:
   7473   case llvm::Triple::mips64el: {
   7474     StringRef CPUName;
   7475     StringRef ABIName;
   7476     mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
   7477 
   7478     CmdArgs.push_back("-mabi");
   7479     CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
   7480 
   7481     if (getToolChain().getArch() == llvm::Triple::mips64)
   7482       CmdArgs.push_back("-EB");
   7483     else
   7484       CmdArgs.push_back("-EL");
   7485 
   7486     AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
   7487     break;
   7488   }
   7489 
   7490   default:
   7491     break;
   7492   }
   7493 
   7494   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
   7495 
   7496   CmdArgs.push_back("-o");
   7497   CmdArgs.push_back(Output.getFilename());
   7498 
   7499   for (const auto &II : Inputs)
   7500     CmdArgs.push_back(II.getFilename());
   7501 
   7502   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
   7503   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   7504 }
   7505 
   7506 void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   7507                                    const InputInfo &Output,
   7508                                    const InputInfoList &Inputs,
   7509                                    const ArgList &Args,
   7510                                    const char *LinkingOutput) const {
   7511   const Driver &D = getToolChain().getDriver();
   7512   ArgStringList CmdArgs;
   7513 
   7514   // Silence warning for "clang -g foo.o -o foo"
   7515   Args.ClaimAllArgs(options::OPT_g_Group);
   7516   // and "clang -emit-llvm foo.o -o foo"
   7517   Args.ClaimAllArgs(options::OPT_emit_llvm);
   7518   // and for "clang -w foo.o -o foo". Other warning options are already
   7519   // handled somewhere else.
   7520   Args.ClaimAllArgs(options::OPT_w);
   7521 
   7522   if (getToolChain().getArch() == llvm::Triple::mips64)
   7523     CmdArgs.push_back("-EB");
   7524   else if (getToolChain().getArch() == llvm::Triple::mips64el)
   7525     CmdArgs.push_back("-EL");
   7526 
   7527   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
   7528     CmdArgs.push_back("-e");
   7529     CmdArgs.push_back("__start");
   7530   }
   7531 
   7532   if (Args.hasArg(options::OPT_static)) {
   7533     CmdArgs.push_back("-Bstatic");
   7534   } else {
   7535     if (Args.hasArg(options::OPT_rdynamic))
   7536       CmdArgs.push_back("-export-dynamic");
   7537     CmdArgs.push_back("--eh-frame-hdr");
   7538     CmdArgs.push_back("-Bdynamic");
   7539     if (Args.hasArg(options::OPT_shared)) {
   7540       CmdArgs.push_back("-shared");
   7541     } else {
   7542       CmdArgs.push_back("-dynamic-linker");
   7543       CmdArgs.push_back("/usr/libexec/ld.so");
   7544     }
   7545   }
   7546 
   7547   if (Args.hasArg(options::OPT_nopie))
   7548     CmdArgs.push_back("-nopie");
   7549 
   7550   if (Output.isFilename()) {
   7551     CmdArgs.push_back("-o");
   7552     CmdArgs.push_back(Output.getFilename());
   7553   } else {
   7554     assert(Output.isNothing() && "Invalid output.");
   7555   }
   7556 
   7557   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   7558     if (!Args.hasArg(options::OPT_shared)) {
   7559       if (Args.hasArg(options::OPT_pg))
   7560         CmdArgs.push_back(
   7561             Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
   7562       else
   7563         CmdArgs.push_back(
   7564             Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
   7565       CmdArgs.push_back(
   7566           Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
   7567     } else {
   7568       CmdArgs.push_back(
   7569           Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
   7570     }
   7571   }
   7572 
   7573   std::string Triple = getToolChain().getTripleString();
   7574   if (Triple.substr(0, 6) == "x86_64")
   7575     Triple.replace(0, 6, "amd64");
   7576   CmdArgs.push_back(
   7577       Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
   7578 
   7579   Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
   7580                             options::OPT_e, options::OPT_s, options::OPT_t,
   7581                             options::OPT_Z_Flag, options::OPT_r});
   7582 
   7583   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   7584 
   7585   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
   7586     if (D.CCCIsCXX()) {
   7587       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   7588       if (Args.hasArg(options::OPT_pg))
   7589         CmdArgs.push_back("-lm_p");
   7590       else
   7591         CmdArgs.push_back("-lm");
   7592     }
   7593 
   7594     // FIXME: For some reason GCC passes -lgcc before adding
   7595     // the default system libraries. Just mimic this for now.
   7596     CmdArgs.push_back("-lgcc");
   7597 
   7598     if (Args.hasArg(options::OPT_pthread)) {
   7599       if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
   7600         CmdArgs.push_back("-lpthread_p");
   7601       else
   7602         CmdArgs.push_back("-lpthread");
   7603     }
   7604 
   7605     if (!Args.hasArg(options::OPT_shared)) {
   7606       if (Args.hasArg(options::OPT_pg))
   7607         CmdArgs.push_back("-lc_p");
   7608       else
   7609         CmdArgs.push_back("-lc");
   7610     }
   7611 
   7612     CmdArgs.push_back("-lgcc");
   7613   }
   7614 
   7615   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   7616     if (!Args.hasArg(options::OPT_shared))
   7617       CmdArgs.push_back(
   7618           Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
   7619     else
   7620       CmdArgs.push_back(
   7621           Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
   7622   }
   7623 
   7624   const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
   7625   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   7626 }
   7627 
   7628 void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
   7629                                      const InputInfo &Output,
   7630                                      const InputInfoList &Inputs,
   7631                                      const ArgList &Args,
   7632                                      const char *LinkingOutput) const {
   7633   claimNoWarnArgs(Args);
   7634   ArgStringList CmdArgs;
   7635 
   7636   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
   7637 
   7638   CmdArgs.push_back("-o");
   7639   CmdArgs.push_back(Output.getFilename());
   7640 
   7641   for (const auto &II : Inputs)
   7642     CmdArgs.push_back(II.getFilename());
   7643 
   7644   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
   7645   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   7646 }
   7647 
   7648 void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   7649                                   const InputInfo &Output,
   7650                                   const InputInfoList &Inputs,
   7651                                   const ArgList &Args,
   7652                                   const char *LinkingOutput) const {
   7653   const Driver &D = getToolChain().getDriver();
   7654   ArgStringList CmdArgs;
   7655 
   7656   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
   7657     CmdArgs.push_back("-e");
   7658     CmdArgs.push_back("__start");
   7659   }
   7660 
   7661   if (Args.hasArg(options::OPT_static)) {
   7662     CmdArgs.push_back("-Bstatic");
   7663   } else {
   7664     if (Args.hasArg(options::OPT_rdynamic))
   7665       CmdArgs.push_back("-export-dynamic");
   7666     CmdArgs.push_back("--eh-frame-hdr");
   7667     CmdArgs.push_back("-Bdynamic");
   7668     if (Args.hasArg(options::OPT_shared)) {
   7669       CmdArgs.push_back("-shared");
   7670     } else {
   7671       CmdArgs.push_back("-dynamic-linker");
   7672       CmdArgs.push_back("/usr/libexec/ld.so");
   7673     }
   7674   }
   7675 
   7676   if (Output.isFilename()) {
   7677     CmdArgs.push_back("-o");
   7678     CmdArgs.push_back(Output.getFilename());
   7679   } else {
   7680     assert(Output.isNothing() && "Invalid output.");
   7681   }
   7682 
   7683   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   7684     if (!Args.hasArg(options::OPT_shared)) {
   7685       if (Args.hasArg(options::OPT_pg))
   7686         CmdArgs.push_back(
   7687             Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
   7688       else
   7689         CmdArgs.push_back(
   7690             Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
   7691       CmdArgs.push_back(
   7692           Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
   7693     } else {
   7694       CmdArgs.push_back(
   7695           Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
   7696     }
   7697   }
   7698 
   7699   Args.AddAllArgs(CmdArgs,
   7700                   {options::OPT_L, options::OPT_T_Group, options::OPT_e});
   7701 
   7702   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   7703 
   7704   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
   7705     if (D.CCCIsCXX()) {
   7706       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   7707       if (Args.hasArg(options::OPT_pg))
   7708         CmdArgs.push_back("-lm_p");
   7709       else
   7710         CmdArgs.push_back("-lm");
   7711     }
   7712 
   7713     if (Args.hasArg(options::OPT_pthread)) {
   7714       if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
   7715         CmdArgs.push_back("-lpthread_p");
   7716       else
   7717         CmdArgs.push_back("-lpthread");
   7718     }
   7719 
   7720     if (!Args.hasArg(options::OPT_shared)) {
   7721       if (Args.hasArg(options::OPT_pg))
   7722         CmdArgs.push_back("-lc_p");
   7723       else
   7724         CmdArgs.push_back("-lc");
   7725     }
   7726 
   7727     StringRef MyArch;
   7728     switch (getToolChain().getArch()) {
   7729     case llvm::Triple::arm:
   7730       MyArch = "arm";
   7731       break;
   7732     case llvm::Triple::x86:
   7733       MyArch = "i386";
   7734       break;
   7735     case llvm::Triple::x86_64:
   7736       MyArch = "amd64";
   7737       break;
   7738     default:
   7739       llvm_unreachable("Unsupported architecture");
   7740     }
   7741     CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
   7742   }
   7743 
   7744   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   7745     if (!Args.hasArg(options::OPT_shared))
   7746       CmdArgs.push_back(
   7747           Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
   7748     else
   7749       CmdArgs.push_back(
   7750           Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
   7751   }
   7752 
   7753   const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
   7754   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   7755 }
   7756 
   7757 void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
   7758                                       const InputInfo &Output,
   7759                                       const InputInfoList &Inputs,
   7760                                       const ArgList &Args,
   7761                                       const char *LinkingOutput) const {
   7762   claimNoWarnArgs(Args);
   7763   ArgStringList CmdArgs;
   7764 
   7765   // When building 32-bit code on FreeBSD/amd64, we have to explicitly
   7766   // instruct as in the base system to assemble 32-bit code.
   7767   switch (getToolChain().getArch()) {
   7768   default:
   7769     break;
   7770   case llvm::Triple::x86:
   7771     CmdArgs.push_back("--32");
   7772     break;
   7773   case llvm::Triple::ppc:
   7774     CmdArgs.push_back("-a32");
   7775     break;
   7776   case llvm::Triple::mips:
   7777   case llvm::Triple::mipsel:
   7778   case llvm::Triple::mips64:
   7779   case llvm::Triple::mips64el: {
   7780     StringRef CPUName;
   7781     StringRef ABIName;
   7782     mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
   7783 
   7784     CmdArgs.push_back("-march");
   7785     CmdArgs.push_back(CPUName.data());
   7786 
   7787     CmdArgs.push_back("-mabi");
   7788     CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
   7789 
   7790     if (getToolChain().getArch() == llvm::Triple::mips ||
   7791         getToolChain().getArch() == llvm::Triple::mips64)
   7792       CmdArgs.push_back("-EB");
   7793     else
   7794       CmdArgs.push_back("-EL");
   7795 
   7796     AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
   7797     break;
   7798   }
   7799   case llvm::Triple::arm:
   7800   case llvm::Triple::armeb:
   7801   case llvm::Triple::thumb:
   7802   case llvm::Triple::thumbeb: {
   7803     arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
   7804 
   7805     if (ABI == arm::FloatABI::Hard)
   7806       CmdArgs.push_back("-mfpu=vfp");
   7807     else
   7808       CmdArgs.push_back("-mfpu=softvfp");
   7809 
   7810     switch (getToolChain().getTriple().getEnvironment()) {
   7811     case llvm::Triple::GNUEABIHF:
   7812     case llvm::Triple::GNUEABI:
   7813     case llvm::Triple::EABI:
   7814       CmdArgs.push_back("-meabi=5");
   7815       break;
   7816 
   7817     default:
   7818       CmdArgs.push_back("-matpcs");
   7819     }
   7820     break;
   7821   }
   7822   case llvm::Triple::sparc:
   7823   case llvm::Triple::sparcel:
   7824   case llvm::Triple::sparcv9: {
   7825     std::string CPU = getCPUName(Args, getToolChain().getTriple());
   7826     CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
   7827     AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
   7828     break;
   7829   }
   7830   }
   7831 
   7832   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
   7833 
   7834   CmdArgs.push_back("-o");
   7835   CmdArgs.push_back(Output.getFilename());
   7836 
   7837   for (const auto &II : Inputs)
   7838     CmdArgs.push_back(II.getFilename());
   7839 
   7840   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
   7841   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   7842 }
   7843 
   7844 void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   7845                                    const InputInfo &Output,
   7846                                    const InputInfoList &Inputs,
   7847                                    const ArgList &Args,
   7848                                    const char *LinkingOutput) const {
   7849   const toolchains::FreeBSD &ToolChain =
   7850       static_cast<const toolchains::FreeBSD &>(getToolChain());
   7851   const Driver &D = ToolChain.getDriver();
   7852   const llvm::Triple::ArchType Arch = ToolChain.getArch();
   7853   const bool IsPIE =
   7854       !Args.hasArg(options::OPT_shared) &&
   7855       (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
   7856   ArgStringList CmdArgs;
   7857 
   7858   // Silence warning for "clang -g foo.o -o foo"
   7859   Args.ClaimAllArgs(options::OPT_g_Group);
   7860   // and "clang -emit-llvm foo.o -o foo"
   7861   Args.ClaimAllArgs(options::OPT_emit_llvm);
   7862   // and for "clang -w foo.o -o foo". Other warning options are already
   7863   // handled somewhere else.
   7864   Args.ClaimAllArgs(options::OPT_w);
   7865 
   7866   if (!D.SysRoot.empty())
   7867     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   7868 
   7869   if (IsPIE)
   7870     CmdArgs.push_back("-pie");
   7871 
   7872   if (Args.hasArg(options::OPT_static)) {
   7873     CmdArgs.push_back("-Bstatic");
   7874   } else {
   7875     if (Args.hasArg(options::OPT_rdynamic))
   7876       CmdArgs.push_back("-export-dynamic");
   7877     CmdArgs.push_back("--eh-frame-hdr");
   7878     if (Args.hasArg(options::OPT_shared)) {
   7879       CmdArgs.push_back("-Bshareable");
   7880     } else {
   7881       CmdArgs.push_back("-dynamic-linker");
   7882       CmdArgs.push_back("/libexec/ld-elf.so.1");
   7883     }
   7884     if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
   7885       if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
   7886           Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
   7887         CmdArgs.push_back("--hash-style=both");
   7888       }
   7889     }
   7890     CmdArgs.push_back("--enable-new-dtags");
   7891   }
   7892 
   7893   // When building 32-bit code on FreeBSD/amd64, we have to explicitly
   7894   // instruct ld in the base system to link 32-bit code.
   7895   if (Arch == llvm::Triple::x86) {
   7896     CmdArgs.push_back("-m");
   7897     CmdArgs.push_back("elf_i386_fbsd");
   7898   }
   7899 
   7900   if (Arch == llvm::Triple::ppc) {
   7901     CmdArgs.push_back("-m");
   7902     CmdArgs.push_back("elf32ppc_fbsd");
   7903   }
   7904 
   7905   if (Output.isFilename()) {
   7906     CmdArgs.push_back("-o");
   7907     CmdArgs.push_back(Output.getFilename());
   7908   } else {
   7909     assert(Output.isNothing() && "Invalid output.");
   7910   }
   7911 
   7912   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   7913     const char *crt1 = nullptr;
   7914     if (!Args.hasArg(options::OPT_shared)) {
   7915       if (Args.hasArg(options::OPT_pg))
   7916         crt1 = "gcrt1.o";
   7917       else if (IsPIE)
   7918         crt1 = "Scrt1.o";
   7919       else
   7920         crt1 = "crt1.o";
   7921     }
   7922     if (crt1)
   7923       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
   7924 
   7925     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
   7926 
   7927     const char *crtbegin = nullptr;
   7928     if (Args.hasArg(options::OPT_static))
   7929       crtbegin = "crtbeginT.o";
   7930     else if (Args.hasArg(options::OPT_shared) || IsPIE)
   7931       crtbegin = "crtbeginS.o";
   7932     else
   7933       crtbegin = "crtbegin.o";
   7934 
   7935     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
   7936   }
   7937 
   7938   Args.AddAllArgs(CmdArgs, options::OPT_L);
   7939   ToolChain.AddFilePathLibArgs(Args, CmdArgs);
   7940   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   7941   Args.AddAllArgs(CmdArgs, options::OPT_e);
   7942   Args.AddAllArgs(CmdArgs, options::OPT_s);
   7943   Args.AddAllArgs(CmdArgs, options::OPT_t);
   7944   Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
   7945   Args.AddAllArgs(CmdArgs, options::OPT_r);
   7946 
   7947   if (D.isUsingLTO())
   7948     AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
   7949 
   7950   bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
   7951   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
   7952 
   7953   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
   7954     addOpenMPRuntime(CmdArgs, ToolChain, Args);
   7955     if (D.CCCIsCXX()) {
   7956       ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
   7957       if (Args.hasArg(options::OPT_pg))
   7958         CmdArgs.push_back("-lm_p");
   7959       else
   7960         CmdArgs.push_back("-lm");
   7961     }
   7962     if (NeedsSanitizerDeps)
   7963       linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
   7964     // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
   7965     // the default system libraries. Just mimic this for now.
   7966     if (Args.hasArg(options::OPT_pg))
   7967       CmdArgs.push_back("-lgcc_p");
   7968     else
   7969       CmdArgs.push_back("-lgcc");
   7970     if (Args.hasArg(options::OPT_static)) {
   7971       CmdArgs.push_back("-lgcc_eh");
   7972     } else if (Args.hasArg(options::OPT_pg)) {
   7973       CmdArgs.push_back("-lgcc_eh_p");
   7974     } else {
   7975       CmdArgs.push_back("--as-needed");
   7976       CmdArgs.push_back("-lgcc_s");
   7977       CmdArgs.push_back("--no-as-needed");
   7978     }
   7979 
   7980     if (Args.hasArg(options::OPT_pthread)) {
   7981       if (Args.hasArg(options::OPT_pg))
   7982         CmdArgs.push_back("-lpthread_p");
   7983       else
   7984         CmdArgs.push_back("-lpthread");
   7985     }
   7986 
   7987     if (Args.hasArg(options::OPT_pg)) {
   7988       if (Args.hasArg(options::OPT_shared))
   7989         CmdArgs.push_back("-lc");
   7990       else
   7991         CmdArgs.push_back("-lc_p");
   7992       CmdArgs.push_back("-lgcc_p");
   7993     } else {
   7994       CmdArgs.push_back("-lc");
   7995       CmdArgs.push_back("-lgcc");
   7996     }
   7997 
   7998     if (Args.hasArg(options::OPT_static)) {
   7999       CmdArgs.push_back("-lgcc_eh");
   8000     } else if (Args.hasArg(options::OPT_pg)) {
   8001       CmdArgs.push_back("-lgcc_eh_p");
   8002     } else {
   8003       CmdArgs.push_back("--as-needed");
   8004       CmdArgs.push_back("-lgcc_s");
   8005       CmdArgs.push_back("--no-as-needed");
   8006     }
   8007   }
   8008 
   8009   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   8010     if (Args.hasArg(options::OPT_shared) || IsPIE)
   8011       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
   8012     else
   8013       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
   8014     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
   8015   }
   8016 
   8017   ToolChain.addProfileRTLibs(Args, CmdArgs);
   8018 
   8019   const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
   8020   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   8021 }
   8022 
   8023 void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
   8024                                      const InputInfo &Output,
   8025                                      const InputInfoList &Inputs,
   8026                                      const ArgList &Args,
   8027                                      const char *LinkingOutput) const {
   8028   claimNoWarnArgs(Args);
   8029   ArgStringList CmdArgs;
   8030 
   8031   // GNU as needs different flags for creating the correct output format
   8032   // on architectures with different ABIs or optional feature sets.
   8033   switch (getToolChain().getArch()) {
   8034   case llvm::Triple::x86:
   8035     CmdArgs.push_back("--32");
   8036     break;
   8037   case llvm::Triple::arm:
   8038   case llvm::Triple::armeb:
   8039   case llvm::Triple::thumb:
   8040   case llvm::Triple::thumbeb: {
   8041     StringRef MArch, MCPU;
   8042     getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
   8043     std::string Arch =
   8044         arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
   8045     CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
   8046     break;
   8047   }
   8048 
   8049   case llvm::Triple::mips:
   8050   case llvm::Triple::mipsel:
   8051   case llvm::Triple::mips64:
   8052   case llvm::Triple::mips64el: {
   8053     StringRef CPUName;
   8054     StringRef ABIName;
   8055     mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
   8056 
   8057     CmdArgs.push_back("-march");
   8058     CmdArgs.push_back(CPUName.data());
   8059 
   8060     CmdArgs.push_back("-mabi");
   8061     CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
   8062 
   8063     if (getToolChain().getArch() == llvm::Triple::mips ||
   8064         getToolChain().getArch() == llvm::Triple::mips64)
   8065       CmdArgs.push_back("-EB");
   8066     else
   8067       CmdArgs.push_back("-EL");
   8068 
   8069     AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
   8070     break;
   8071   }
   8072 
   8073   case llvm::Triple::sparc:
   8074   case llvm::Triple::sparcel: {
   8075     CmdArgs.push_back("-32");
   8076     std::string CPU = getCPUName(Args, getToolChain().getTriple());
   8077     CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
   8078     AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
   8079     break;
   8080   }
   8081 
   8082   case llvm::Triple::sparcv9: {
   8083     CmdArgs.push_back("-64");
   8084     std::string CPU = getCPUName(Args, getToolChain().getTriple());
   8085     CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
   8086     AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
   8087     break;
   8088   }
   8089 
   8090   default:
   8091     break;
   8092   }
   8093 
   8094   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
   8095 
   8096   CmdArgs.push_back("-o");
   8097   CmdArgs.push_back(Output.getFilename());
   8098 
   8099   for (const auto &II : Inputs)
   8100     CmdArgs.push_back(II.getFilename());
   8101 
   8102   const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
   8103   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   8104 }
   8105 
   8106 void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   8107                                   const InputInfo &Output,
   8108                                   const InputInfoList &Inputs,
   8109                                   const ArgList &Args,
   8110                                   const char *LinkingOutput) const {
   8111   const Driver &D = getToolChain().getDriver();
   8112   ArgStringList CmdArgs;
   8113 
   8114   if (!D.SysRoot.empty())
   8115     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   8116 
   8117   CmdArgs.push_back("--eh-frame-hdr");
   8118   if (Args.hasArg(options::OPT_static)) {
   8119     CmdArgs.push_back("-Bstatic");
   8120   } else {
   8121     if (Args.hasArg(options::OPT_rdynamic))
   8122       CmdArgs.push_back("-export-dynamic");
   8123     if (Args.hasArg(options::OPT_shared)) {
   8124       CmdArgs.push_back("-Bshareable");
   8125     } else {
   8126       CmdArgs.push_back("-dynamic-linker");
   8127       CmdArgs.push_back("/libexec/ld.elf_so");
   8128     }
   8129   }
   8130 
   8131   // Many NetBSD architectures support more than one ABI.
   8132   // Determine the correct emulation for ld.
   8133   switch (getToolChain().getArch()) {
   8134   case llvm::Triple::x86:
   8135     CmdArgs.push_back("-m");
   8136     CmdArgs.push_back("elf_i386");
   8137     break;
   8138   case llvm::Triple::arm:
   8139   case llvm::Triple::thumb:
   8140     CmdArgs.push_back("-m");
   8141     switch (getToolChain().getTriple().getEnvironment()) {
   8142     case llvm::Triple::EABI:
   8143     case llvm::Triple::GNUEABI:
   8144       CmdArgs.push_back("armelf_nbsd_eabi");
   8145       break;
   8146     case llvm::Triple::EABIHF:
   8147     case llvm::Triple::GNUEABIHF:
   8148       CmdArgs.push_back("armelf_nbsd_eabihf");
   8149       break;
   8150     default:
   8151       CmdArgs.push_back("armelf_nbsd");
   8152       break;
   8153     }
   8154     break;
   8155   case llvm::Triple::armeb:
   8156   case llvm::Triple::thumbeb:
   8157     arm::appendEBLinkFlags(
   8158         Args, CmdArgs,
   8159         llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
   8160     CmdArgs.push_back("-m");
   8161     switch (getToolChain().getTriple().getEnvironment()) {
   8162     case llvm::Triple::EABI:
   8163     case llvm::Triple::GNUEABI:
   8164       CmdArgs.push_back("armelfb_nbsd_eabi");
   8165       break;
   8166     case llvm::Triple::EABIHF:
   8167     case llvm::Triple::GNUEABIHF:
   8168       CmdArgs.push_back("armelfb_nbsd_eabihf");
   8169       break;
   8170     default:
   8171       CmdArgs.push_back("armelfb_nbsd");
   8172       break;
   8173     }
   8174     break;
   8175   case llvm::Triple::mips64:
   8176   case llvm::Triple::mips64el:
   8177     if (mips::hasMipsAbiArg(Args, "32")) {
   8178       CmdArgs.push_back("-m");
   8179       if (getToolChain().getArch() == llvm::Triple::mips64)
   8180         CmdArgs.push_back("elf32btsmip");
   8181       else
   8182         CmdArgs.push_back("elf32ltsmip");
   8183     } else if (mips::hasMipsAbiArg(Args, "64")) {
   8184       CmdArgs.push_back("-m");
   8185       if (getToolChain().getArch() == llvm::Triple::mips64)
   8186         CmdArgs.push_back("elf64btsmip");
   8187       else
   8188         CmdArgs.push_back("elf64ltsmip");
   8189     }
   8190     break;
   8191   case llvm::Triple::ppc:
   8192     CmdArgs.push_back("-m");
   8193     CmdArgs.push_back("elf32ppc_nbsd");
   8194     break;
   8195 
   8196   case llvm::Triple::ppc64:
   8197   case llvm::Triple::ppc64le:
   8198     CmdArgs.push_back("-m");
   8199     CmdArgs.push_back("elf64ppc");
   8200     break;
   8201 
   8202   case llvm::Triple::sparc:
   8203     CmdArgs.push_back("-m");
   8204     CmdArgs.push_back("elf32_sparc");
   8205     break;
   8206 
   8207   case llvm::Triple::sparcv9:
   8208     CmdArgs.push_back("-m");
   8209     CmdArgs.push_back("elf64_sparc");
   8210     break;
   8211 
   8212   default:
   8213     break;
   8214   }
   8215 
   8216   if (Output.isFilename()) {
   8217     CmdArgs.push_back("-o");
   8218     CmdArgs.push_back(Output.getFilename());
   8219   } else {
   8220     assert(Output.isNothing() && "Invalid output.");
   8221   }
   8222 
   8223   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   8224     if (!Args.hasArg(options::OPT_shared)) {
   8225       CmdArgs.push_back(
   8226           Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
   8227       CmdArgs.push_back(
   8228           Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
   8229       CmdArgs.push_back(
   8230           Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
   8231     } else {
   8232       CmdArgs.push_back(
   8233           Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
   8234       CmdArgs.push_back(
   8235           Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
   8236     }
   8237   }
   8238 
   8239   Args.AddAllArgs(CmdArgs, options::OPT_L);
   8240   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   8241   Args.AddAllArgs(CmdArgs, options::OPT_e);
   8242   Args.AddAllArgs(CmdArgs, options::OPT_s);
   8243   Args.AddAllArgs(CmdArgs, options::OPT_t);
   8244   Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
   8245   Args.AddAllArgs(CmdArgs, options::OPT_r);
   8246 
   8247   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   8248 
   8249   unsigned Major, Minor, Micro;
   8250   getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
   8251   bool useLibgcc = true;
   8252   if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
   8253     switch (getToolChain().getArch()) {
   8254     case llvm::Triple::aarch64:
   8255     case llvm::Triple::arm:
   8256     case llvm::Triple::armeb:
   8257     case llvm::Triple::thumb:
   8258     case llvm::Triple::thumbeb:
   8259     case llvm::Triple::ppc:
   8260     case llvm::Triple::ppc64:
   8261     case llvm::Triple::ppc64le:
   8262     case llvm::Triple::x86:
   8263     case llvm::Triple::x86_64:
   8264       useLibgcc = false;
   8265       break;
   8266     default:
   8267       break;
   8268     }
   8269   }
   8270 
   8271   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
   8272     addOpenMPRuntime(CmdArgs, getToolChain(), Args);
   8273     if (D.CCCIsCXX()) {
   8274       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   8275       CmdArgs.push_back("-lm");
   8276     }
   8277     if (Args.hasArg(options::OPT_pthread))
   8278       CmdArgs.push_back("-lpthread");
   8279     CmdArgs.push_back("-lc");
   8280 
   8281     if (useLibgcc) {
   8282       if (Args.hasArg(options::OPT_static)) {
   8283         // libgcc_eh depends on libc, so resolve as much as possible,
   8284         // pull in any new requirements from libc and then get the rest
   8285         // of libgcc.
   8286         CmdArgs.push_back("-lgcc_eh");
   8287         CmdArgs.push_back("-lc");
   8288         CmdArgs.push_back("-lgcc");
   8289       } else {
   8290         CmdArgs.push_back("-lgcc");
   8291         CmdArgs.push_back("--as-needed");
   8292         CmdArgs.push_back("-lgcc_s");
   8293         CmdArgs.push_back("--no-as-needed");
   8294       }
   8295     }
   8296   }
   8297 
   8298   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   8299     if (!Args.hasArg(options::OPT_shared))
   8300       CmdArgs.push_back(
   8301           Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
   8302     else
   8303       CmdArgs.push_back(
   8304           Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
   8305     CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
   8306   }
   8307 
   8308   getToolChain().addProfileRTLibs(Args, CmdArgs);
   8309 
   8310   const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
   8311   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   8312 }
   8313 
   8314 void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
   8315                                        const InputInfo &Output,
   8316                                        const InputInfoList &Inputs,
   8317                                        const ArgList &Args,
   8318                                        const char *LinkingOutput) const {
   8319   claimNoWarnArgs(Args);
   8320 
   8321   std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
   8322   llvm::Triple Triple = llvm::Triple(TripleStr);
   8323 
   8324   ArgStringList CmdArgs;
   8325 
   8326   llvm::Reloc::Model RelocationModel;
   8327   unsigned PICLevel;
   8328   bool IsPIE;
   8329   std::tie(RelocationModel, PICLevel, IsPIE) =
   8330       ParsePICArgs(getToolChain(), Triple, Args);
   8331 
   8332   switch (getToolChain().getArch()) {
   8333   default:
   8334     break;
   8335   // Add --32/--64 to make sure we get the format we want.
   8336   // This is incomplete
   8337   case llvm::Triple::x86:
   8338     CmdArgs.push_back("--32");
   8339     break;
   8340   case llvm::Triple::x86_64:
   8341     if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
   8342       CmdArgs.push_back("--x32");
   8343     else
   8344       CmdArgs.push_back("--64");
   8345     break;
   8346   case llvm::Triple::ppc:
   8347     CmdArgs.push_back("-a32");
   8348     CmdArgs.push_back("-mppc");
   8349     CmdArgs.push_back("-many");
   8350     break;
   8351   case llvm::Triple::ppc64:
   8352     CmdArgs.push_back("-a64");
   8353     CmdArgs.push_back("-mppc64");
   8354     CmdArgs.push_back("-many");
   8355     break;
   8356   case llvm::Triple::ppc64le:
   8357     CmdArgs.push_back("-a64");
   8358     CmdArgs.push_back("-mppc64");
   8359     CmdArgs.push_back("-many");
   8360     CmdArgs.push_back("-mlittle-endian");
   8361     break;
   8362   case llvm::Triple::sparc:
   8363   case llvm::Triple::sparcel: {
   8364     CmdArgs.push_back("-32");
   8365     std::string CPU = getCPUName(Args, getToolChain().getTriple());
   8366     CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
   8367     AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
   8368     break;
   8369   }
   8370   case llvm::Triple::sparcv9: {
   8371     CmdArgs.push_back("-64");
   8372     std::string CPU = getCPUName(Args, getToolChain().getTriple());
   8373     CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
   8374     AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
   8375     break;
   8376   }
   8377   case llvm::Triple::arm:
   8378   case llvm::Triple::armeb:
   8379   case llvm::Triple::thumb:
   8380   case llvm::Triple::thumbeb: {
   8381     const llvm::Triple &Triple2 = getToolChain().getTriple();
   8382     switch (Triple2.getSubArch()) {
   8383     case llvm::Triple::ARMSubArch_v7:
   8384       CmdArgs.push_back("-mfpu=neon");
   8385       break;
   8386     case llvm::Triple::ARMSubArch_v8:
   8387       CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
   8388       break;
   8389     default:
   8390       break;
   8391     }
   8392 
   8393     switch (arm::getARMFloatABI(getToolChain(), Args)) {
   8394     case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
   8395     case arm::FloatABI::Soft:
   8396       CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
   8397       break;
   8398     case arm::FloatABI::SoftFP:
   8399       CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
   8400       break;
   8401     case arm::FloatABI::Hard:
   8402       CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
   8403       break;
   8404     }
   8405 
   8406     Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
   8407 
   8408     // FIXME: remove krait check when GNU tools support krait cpu
   8409     // for now replace it with -mcpu=cortex-a15 to avoid a lower
   8410     // march from being picked in the absence of a cpu flag.
   8411     Arg *A;
   8412     if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
   8413         StringRef(A->getValue()).lower() == "krait")
   8414       CmdArgs.push_back("-mcpu=cortex-a15");
   8415     else
   8416       Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
   8417     Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
   8418     break;
   8419   }
   8420   case llvm::Triple::mips:
   8421   case llvm::Triple::mipsel:
   8422   case llvm::Triple::mips64:
   8423   case llvm::Triple::mips64el: {
   8424     StringRef CPUName;
   8425     StringRef ABIName;
   8426     mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
   8427     ABIName = getGnuCompatibleMipsABIName(ABIName);
   8428 
   8429     CmdArgs.push_back("-march");
   8430     CmdArgs.push_back(CPUName.data());
   8431 
   8432     CmdArgs.push_back("-mabi");
   8433     CmdArgs.push_back(ABIName.data());
   8434 
   8435     // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
   8436     // or -mshared (not implemented) is in effect.
   8437     if (RelocationModel == llvm::Reloc::Static)
   8438       CmdArgs.push_back("-mno-shared");
   8439 
   8440     // LLVM doesn't support -mplt yet and acts as if it is always given.
   8441     // However, -mplt has no effect with the N64 ABI.
   8442     CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
   8443 
   8444     if (getToolChain().getArch() == llvm::Triple::mips ||
   8445         getToolChain().getArch() == llvm::Triple::mips64)
   8446       CmdArgs.push_back("-EB");
   8447     else
   8448       CmdArgs.push_back("-EL");
   8449 
   8450     if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
   8451       if (StringRef(A->getValue()) == "2008")
   8452         CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
   8453     }
   8454 
   8455     // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
   8456     if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
   8457                                  options::OPT_mfp64)) {
   8458       A->claim();
   8459       A->render(Args, CmdArgs);
   8460     } else if (mips::shouldUseFPXX(
   8461                    Args, getToolChain().getTriple(), CPUName, ABIName,
   8462                    getMipsFloatABI(getToolChain().getDriver(), Args)))
   8463       CmdArgs.push_back("-mfpxx");
   8464 
   8465     // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
   8466     // -mno-mips16 is actually -no-mips16.
   8467     if (Arg *A =
   8468             Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
   8469       if (A->getOption().matches(options::OPT_mips16)) {
   8470         A->claim();
   8471         A->render(Args, CmdArgs);
   8472       } else {
   8473         A->claim();
   8474         CmdArgs.push_back("-no-mips16");
   8475       }
   8476     }
   8477 
   8478     Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
   8479                     options::OPT_mno_micromips);
   8480     Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
   8481     Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
   8482 
   8483     if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
   8484       // Do not use AddLastArg because not all versions of MIPS assembler
   8485       // support -mmsa / -mno-msa options.
   8486       if (A->getOption().matches(options::OPT_mmsa))
   8487         CmdArgs.push_back(Args.MakeArgString("-mmsa"));
   8488     }
   8489 
   8490     Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
   8491                     options::OPT_msoft_float);
   8492 
   8493     Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
   8494                     options::OPT_msingle_float);
   8495 
   8496     Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
   8497                     options::OPT_mno_odd_spreg);
   8498 
   8499     AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
   8500     break;
   8501   }
   8502   case llvm::Triple::systemz: {
   8503     // Always pass an -march option, since our default of z10 is later
   8504     // than the GNU assembler's default.
   8505     StringRef CPUName = getSystemZTargetCPU(Args);
   8506     CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
   8507     break;
   8508   }
   8509   }
   8510 
   8511   Args.AddAllArgs(CmdArgs, options::OPT_I);
   8512   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
   8513 
   8514   CmdArgs.push_back("-o");
   8515   CmdArgs.push_back(Output.getFilename());
   8516 
   8517   for (const auto &II : Inputs)
   8518     CmdArgs.push_back(II.getFilename());
   8519 
   8520   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
   8521   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   8522 
   8523   // Handle the debug info splitting at object creation time if we're
   8524   // creating an object.
   8525   // TODO: Currently only works on linux with newer objcopy.
   8526   if (Args.hasArg(options::OPT_gsplit_dwarf) &&
   8527       getToolChain().getTriple().isOSLinux())
   8528     SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
   8529                    SplitDebugName(Args, Inputs[0]));
   8530 }
   8531 
   8532 static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
   8533                       ArgStringList &CmdArgs, const ArgList &Args) {
   8534   bool isAndroid = Triple.isAndroid();
   8535   bool isCygMing = Triple.isOSCygMing();
   8536   bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
   8537                       Args.hasArg(options::OPT_static);
   8538   if (!D.CCCIsCXX())
   8539     CmdArgs.push_back("-lgcc");
   8540 
   8541   if (StaticLibgcc || isAndroid) {
   8542     if (D.CCCIsCXX())
   8543       CmdArgs.push_back("-lgcc");
   8544   } else {
   8545     if (!D.CCCIsCXX() && !isCygMing)
   8546       CmdArgs.push_back("--as-needed");
   8547     CmdArgs.push_back("-lgcc_s");
   8548     if (!D.CCCIsCXX() && !isCygMing)
   8549       CmdArgs.push_back("--no-as-needed");
   8550   }
   8551 
   8552   if (StaticLibgcc && !isAndroid)
   8553     CmdArgs.push_back("-lgcc_eh");
   8554   else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
   8555     CmdArgs.push_back("-lgcc");
   8556 
   8557   // According to Android ABI, we have to link with libdl if we are
   8558   // linking with non-static libgcc.
   8559   //
   8560   // NOTE: This fixes a link error on Android MIPS as well.  The non-static
   8561   // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
   8562   if (isAndroid && !StaticLibgcc)
   8563     CmdArgs.push_back("-ldl");
   8564 }
   8565 
   8566 static std::string getLinuxDynamicLinker(const ArgList &Args,
   8567                                          const toolchains::Linux &ToolChain) {
   8568   const llvm::Triple::ArchType Arch = ToolChain.getArch();
   8569 
   8570   if (ToolChain.getTriple().isAndroid()) {
   8571     if (ToolChain.getTriple().isArch64Bit())
   8572       return "/system/bin/linker64";
   8573     else
   8574       return "/system/bin/linker";
   8575   } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
   8576              Arch == llvm::Triple::sparcel)
   8577     return "/lib/ld-linux.so.2";
   8578   else if (Arch == llvm::Triple::aarch64)
   8579     return "/lib/ld-linux-aarch64.so.1";
   8580   else if (Arch == llvm::Triple::aarch64_be)
   8581     return "/lib/ld-linux-aarch64_be.so.1";
   8582   else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
   8583     if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
   8584         arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
   8585       return "/lib/ld-linux-armhf.so.3";
   8586     else
   8587       return "/lib/ld-linux.so.3";
   8588   } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
   8589     // TODO: check which dynamic linker name.
   8590     if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
   8591         arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
   8592       return "/lib/ld-linux-armhf.so.3";
   8593     else
   8594       return "/lib/ld-linux.so.3";
   8595   } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
   8596              Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
   8597     std::string LibDir =
   8598         "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
   8599     StringRef LibName;
   8600     bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
   8601     if (mips::isUCLibc(Args))
   8602       LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
   8603     else if (!ToolChain.getTriple().hasEnvironment()) {
   8604       bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
   8605                 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
   8606       LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
   8607     } else
   8608       LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
   8609 
   8610     return (LibDir + "/" + LibName).str();
   8611   } else if (Arch == llvm::Triple::ppc)
   8612     return "/lib/ld.so.1";
   8613   else if (Arch == llvm::Triple::ppc64) {
   8614     if (ppc::hasPPCAbiArg(Args, "elfv2"))
   8615       return "/lib64/ld64.so.2";
   8616     return "/lib64/ld64.so.1";
   8617   } else if (Arch == llvm::Triple::ppc64le) {
   8618     if (ppc::hasPPCAbiArg(Args, "elfv1"))
   8619       return "/lib64/ld64.so.1";
   8620     return "/lib64/ld64.so.2";
   8621   } else if (Arch == llvm::Triple::systemz)
   8622     return "/lib/ld64.so.1";
   8623   else if (Arch == llvm::Triple::sparcv9)
   8624     return "/lib64/ld-linux.so.2";
   8625   else if (Arch == llvm::Triple::x86_64 &&
   8626            ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
   8627     return "/libx32/ld-linux-x32.so.2";
   8628   else
   8629     return "/lib64/ld-linux-x86-64.so.2";
   8630 }
   8631 
   8632 static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
   8633                            ArgStringList &CmdArgs, const ArgList &Args) {
   8634   // Make use of compiler-rt if --rtlib option is used
   8635   ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
   8636 
   8637   switch (RLT) {
   8638   case ToolChain::RLT_CompilerRT:
   8639     switch (TC.getTriple().getOS()) {
   8640     default:
   8641       llvm_unreachable("unsupported OS");
   8642     case llvm::Triple::Win32:
   8643     case llvm::Triple::Linux:
   8644       addClangRT(TC, Args, CmdArgs);
   8645       break;
   8646     }
   8647     break;
   8648   case ToolChain::RLT_Libgcc:
   8649     AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
   8650     break;
   8651   }
   8652 }
   8653 
   8654 static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
   8655   switch (T.getArch()) {
   8656   case llvm::Triple::x86:
   8657     return "elf_i386";
   8658   case llvm::Triple::aarch64:
   8659     return "aarch64linux";
   8660   case llvm::Triple::aarch64_be:
   8661     return "aarch64_be_linux";
   8662   case llvm::Triple::arm:
   8663   case llvm::Triple::thumb:
   8664     return "armelf_linux_eabi";
   8665   case llvm::Triple::armeb:
   8666   case llvm::Triple::thumbeb:
   8667     return "armebelf_linux_eabi"; /* TODO: check which NAME.  */
   8668   case llvm::Triple::ppc:
   8669     return "elf32ppclinux";
   8670   case llvm::Triple::ppc64:
   8671     return "elf64ppc";
   8672   case llvm::Triple::ppc64le:
   8673     return "elf64lppc";
   8674   case llvm::Triple::sparc:
   8675   case llvm::Triple::sparcel:
   8676     return "elf32_sparc";
   8677   case llvm::Triple::sparcv9:
   8678     return "elf64_sparc";
   8679   case llvm::Triple::mips:
   8680     return "elf32btsmip";
   8681   case llvm::Triple::mipsel:
   8682     return "elf32ltsmip";
   8683   case llvm::Triple::mips64:
   8684     if (mips::hasMipsAbiArg(Args, "n32"))
   8685       return "elf32btsmipn32";
   8686     return "elf64btsmip";
   8687   case llvm::Triple::mips64el:
   8688     if (mips::hasMipsAbiArg(Args, "n32"))
   8689       return "elf32ltsmipn32";
   8690     return "elf64ltsmip";
   8691   case llvm::Triple::systemz:
   8692     return "elf64_s390";
   8693   case llvm::Triple::x86_64:
   8694     if (T.getEnvironment() == llvm::Triple::GNUX32)
   8695       return "elf32_x86_64";
   8696     return "elf_x86_64";
   8697   default:
   8698     llvm_unreachable("Unexpected arch");
   8699   }
   8700 }
   8701 
   8702 void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   8703                                     const InputInfo &Output,
   8704                                     const InputInfoList &Inputs,
   8705                                     const ArgList &Args,
   8706                                     const char *LinkingOutput) const {
   8707   const toolchains::Linux &ToolChain =
   8708       static_cast<const toolchains::Linux &>(getToolChain());
   8709   const Driver &D = ToolChain.getDriver();
   8710 
   8711   std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
   8712   llvm::Triple Triple = llvm::Triple(TripleStr);
   8713 
   8714   const llvm::Triple::ArchType Arch = ToolChain.getArch();
   8715   const bool isAndroid = ToolChain.getTriple().isAndroid();
   8716   const bool IsPIE =
   8717       !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
   8718       (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
   8719   const bool HasCRTBeginEndFiles =
   8720       ToolChain.getTriple().hasEnvironment() ||
   8721       (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
   8722 
   8723   ArgStringList CmdArgs;
   8724 
   8725   // Silence warning for "clang -g foo.o -o foo"
   8726   Args.ClaimAllArgs(options::OPT_g_Group);
   8727   // and "clang -emit-llvm foo.o -o foo"
   8728   Args.ClaimAllArgs(options::OPT_emit_llvm);
   8729   // and for "clang -w foo.o -o foo". Other warning options are already
   8730   // handled somewhere else.
   8731   Args.ClaimAllArgs(options::OPT_w);
   8732 
   8733   const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
   8734   if (llvm::sys::path::filename(Exec) == "lld") {
   8735     CmdArgs.push_back("-flavor");
   8736     CmdArgs.push_back("old-gnu");
   8737     CmdArgs.push_back("-target");
   8738     CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
   8739   }
   8740 
   8741   if (!D.SysRoot.empty())
   8742     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   8743 
   8744   if (IsPIE)
   8745     CmdArgs.push_back("-pie");
   8746 
   8747   if (Args.hasArg(options::OPT_rdynamic))
   8748     CmdArgs.push_back("-export-dynamic");
   8749 
   8750   if (Args.hasArg(options::OPT_s))
   8751     CmdArgs.push_back("-s");
   8752 
   8753   if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
   8754     arm::appendEBLinkFlags(Args, CmdArgs, Triple);
   8755 
   8756   for (const auto &Opt : ToolChain.ExtraOpts)
   8757     CmdArgs.push_back(Opt.c_str());
   8758 
   8759   if (!Args.hasArg(options::OPT_static)) {
   8760     CmdArgs.push_back("--eh-frame-hdr");
   8761   }
   8762 
   8763   CmdArgs.push_back("-m");
   8764   CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
   8765 
   8766   if (Args.hasArg(options::OPT_static)) {
   8767     if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
   8768         Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
   8769       CmdArgs.push_back("-Bstatic");
   8770     else
   8771       CmdArgs.push_back("-static");
   8772   } else if (Args.hasArg(options::OPT_shared)) {
   8773     CmdArgs.push_back("-shared");
   8774   }
   8775 
   8776   if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
   8777       Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
   8778       (!Args.hasArg(options::OPT_static) &&
   8779        !Args.hasArg(options::OPT_shared))) {
   8780     CmdArgs.push_back("-dynamic-linker");
   8781     CmdArgs.push_back(Args.MakeArgString(
   8782         D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
   8783   }
   8784 
   8785   CmdArgs.push_back("-o");
   8786   CmdArgs.push_back(Output.getFilename());
   8787 
   8788   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   8789     if (!isAndroid) {
   8790       const char *crt1 = nullptr;
   8791       if (!Args.hasArg(options::OPT_shared)) {
   8792         if (Args.hasArg(options::OPT_pg))
   8793           crt1 = "gcrt1.o";
   8794         else if (IsPIE)
   8795           crt1 = "Scrt1.o";
   8796         else
   8797           crt1 = "crt1.o";
   8798       }
   8799       if (crt1)
   8800         CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
   8801 
   8802       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
   8803     }
   8804 
   8805     const char *crtbegin;
   8806     if (Args.hasArg(options::OPT_static))
   8807       crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
   8808     else if (Args.hasArg(options::OPT_shared))
   8809       crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
   8810     else if (IsPIE)
   8811       crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
   8812     else
   8813       crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
   8814 
   8815     if (HasCRTBeginEndFiles)
   8816       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
   8817 
   8818     // Add crtfastmath.o if available and fast math is enabled.
   8819     ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
   8820   }
   8821 
   8822   Args.AddAllArgs(CmdArgs, options::OPT_L);
   8823   Args.AddAllArgs(CmdArgs, options::OPT_u);
   8824 
   8825   ToolChain.AddFilePathLibArgs(Args, CmdArgs);
   8826 
   8827   if (D.isUsingLTO())
   8828     AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
   8829 
   8830   if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
   8831     CmdArgs.push_back("--no-demangle");
   8832 
   8833   bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
   8834   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
   8835   // The profile runtime also needs access to system libraries.
   8836   getToolChain().addProfileRTLibs(Args, CmdArgs);
   8837 
   8838   if (D.CCCIsCXX() &&
   8839       !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
   8840     bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
   8841                                !Args.hasArg(options::OPT_static);
   8842     if (OnlyLibstdcxxStatic)
   8843       CmdArgs.push_back("-Bstatic");
   8844     ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
   8845     if (OnlyLibstdcxxStatic)
   8846       CmdArgs.push_back("-Bdynamic");
   8847     CmdArgs.push_back("-lm");
   8848   }
   8849   // Silence warnings when linking C code with a C++ '-stdlib' argument.
   8850   Args.ClaimAllArgs(options::OPT_stdlib_EQ);
   8851 
   8852   if (!Args.hasArg(options::OPT_nostdlib)) {
   8853     if (!Args.hasArg(options::OPT_nodefaultlibs)) {
   8854       if (Args.hasArg(options::OPT_static))
   8855         CmdArgs.push_back("--start-group");
   8856 
   8857       if (NeedsSanitizerDeps)
   8858         linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
   8859 
   8860       bool WantPthread = Args.hasArg(options::OPT_pthread) ||
   8861                          Args.hasArg(options::OPT_pthreads);
   8862 
   8863       if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
   8864                        options::OPT_fno_openmp, false)) {
   8865         // OpenMP runtimes implies pthreads when using the GNU toolchain.
   8866         // FIXME: Does this really make sense for all GNU toolchains?
   8867         WantPthread = true;
   8868 
   8869         // Also link the particular OpenMP runtimes.
   8870         switch (getOpenMPRuntime(ToolChain, Args)) {
   8871         case OMPRT_OMP:
   8872           CmdArgs.push_back("-lomp");
   8873           break;
   8874         case OMPRT_GOMP:
   8875           CmdArgs.push_back("-lgomp");
   8876 
   8877           // FIXME: Exclude this for platforms with libgomp that don't require
   8878           // librt. Most modern Linux platforms require it, but some may not.
   8879           CmdArgs.push_back("-lrt");
   8880           break;
   8881         case OMPRT_IOMP5:
   8882           CmdArgs.push_back("-liomp5");
   8883           break;
   8884         case OMPRT_Unknown:
   8885           // Already diagnosed.
   8886           break;
   8887         }
   8888       }
   8889 
   8890       AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
   8891 
   8892       if (WantPthread && !isAndroid)
   8893         CmdArgs.push_back("-lpthread");
   8894 
   8895       CmdArgs.push_back("-lc");
   8896 
   8897       if (Args.hasArg(options::OPT_static))
   8898         CmdArgs.push_back("--end-group");
   8899       else
   8900         AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
   8901     }
   8902 
   8903     if (!Args.hasArg(options::OPT_nostartfiles)) {
   8904       const char *crtend;
   8905       if (Args.hasArg(options::OPT_shared))
   8906         crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
   8907       else if (IsPIE)
   8908         crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
   8909       else
   8910         crtend = isAndroid ? "crtend_android.o" : "crtend.o";
   8911 
   8912       if (HasCRTBeginEndFiles)
   8913         CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
   8914       if (!isAndroid)
   8915         CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
   8916     }
   8917   }
   8918 
   8919   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   8920 }
   8921 
   8922 // NaCl ARM assembly (inline or standalone) can be written with a set of macros
   8923 // for the various SFI requirements like register masking. The assembly tool
   8924 // inserts the file containing the macros as an input into all the assembly
   8925 // jobs.
   8926 void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
   8927                                            const InputInfo &Output,
   8928                                            const InputInfoList &Inputs,
   8929                                            const ArgList &Args,
   8930                                            const char *LinkingOutput) const {
   8931   const toolchains::NaClToolChain &ToolChain =
   8932       static_cast<const toolchains::NaClToolChain &>(getToolChain());
   8933   InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
   8934                        "nacl-arm-macros.s");
   8935   InputInfoList NewInputs;
   8936   NewInputs.push_back(NaClMacros);
   8937   NewInputs.append(Inputs.begin(), Inputs.end());
   8938   gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
   8939                                     LinkingOutput);
   8940 }
   8941 
   8942 // This is quite similar to gnutools::Linker::ConstructJob with changes that
   8943 // we use static by default, do not yet support sanitizers or LTO, and a few
   8944 // others. Eventually we can support more of that and hopefully migrate back
   8945 // to gnutools::Linker.
   8946 void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   8947                                      const InputInfo &Output,
   8948                                      const InputInfoList &Inputs,
   8949                                      const ArgList &Args,
   8950                                      const char *LinkingOutput) const {
   8951 
   8952   const toolchains::NaClToolChain &ToolChain =
   8953       static_cast<const toolchains::NaClToolChain &>(getToolChain());
   8954   const Driver &D = ToolChain.getDriver();
   8955   const llvm::Triple::ArchType Arch = ToolChain.getArch();
   8956   const bool IsStatic =
   8957       !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
   8958 
   8959   ArgStringList CmdArgs;
   8960 
   8961   // Silence warning for "clang -g foo.o -o foo"
   8962   Args.ClaimAllArgs(options::OPT_g_Group);
   8963   // and "clang -emit-llvm foo.o -o foo"
   8964   Args.ClaimAllArgs(options::OPT_emit_llvm);
   8965   // and for "clang -w foo.o -o foo". Other warning options are already
   8966   // handled somewhere else.
   8967   Args.ClaimAllArgs(options::OPT_w);
   8968 
   8969   if (!D.SysRoot.empty())
   8970     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   8971 
   8972   if (Args.hasArg(options::OPT_rdynamic))
   8973     CmdArgs.push_back("-export-dynamic");
   8974 
   8975   if (Args.hasArg(options::OPT_s))
   8976     CmdArgs.push_back("-s");
   8977 
   8978   // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
   8979   // from there is --build-id, which we do want.
   8980   CmdArgs.push_back("--build-id");
   8981 
   8982   if (!IsStatic)
   8983     CmdArgs.push_back("--eh-frame-hdr");
   8984 
   8985   CmdArgs.push_back("-m");
   8986   if (Arch == llvm::Triple::x86)
   8987     CmdArgs.push_back("elf_i386_nacl");
   8988   else if (Arch == llvm::Triple::arm)
   8989     CmdArgs.push_back("armelf_nacl");
   8990   else if (Arch == llvm::Triple::x86_64)
   8991     CmdArgs.push_back("elf_x86_64_nacl");
   8992   else if (Arch == llvm::Triple::mipsel)
   8993     CmdArgs.push_back("mipselelf_nacl");
   8994   else
   8995     D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
   8996                                               << "Native Client";
   8997 
   8998   if (IsStatic)
   8999     CmdArgs.push_back("-static");
   9000   else if (Args.hasArg(options::OPT_shared))
   9001     CmdArgs.push_back("-shared");
   9002 
   9003   CmdArgs.push_back("-o");
   9004   CmdArgs.push_back(Output.getFilename());
   9005   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   9006     if (!Args.hasArg(options::OPT_shared))
   9007       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
   9008     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
   9009 
   9010     const char *crtbegin;
   9011     if (IsStatic)
   9012       crtbegin = "crtbeginT.o";
   9013     else if (Args.hasArg(options::OPT_shared))
   9014       crtbegin = "crtbeginS.o";
   9015     else
   9016       crtbegin = "crtbegin.o";
   9017     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
   9018   }
   9019 
   9020   Args.AddAllArgs(CmdArgs, options::OPT_L);
   9021   Args.AddAllArgs(CmdArgs, options::OPT_u);
   9022 
   9023   ToolChain.AddFilePathLibArgs(Args, CmdArgs);
   9024 
   9025   if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
   9026     CmdArgs.push_back("--no-demangle");
   9027 
   9028   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
   9029 
   9030   if (D.CCCIsCXX() &&
   9031       !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
   9032     bool OnlyLibstdcxxStatic =
   9033         Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
   9034     if (OnlyLibstdcxxStatic)
   9035       CmdArgs.push_back("-Bstatic");
   9036     ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
   9037     if (OnlyLibstdcxxStatic)
   9038       CmdArgs.push_back("-Bdynamic");
   9039     CmdArgs.push_back("-lm");
   9040   }
   9041 
   9042   if (!Args.hasArg(options::OPT_nostdlib)) {
   9043     if (!Args.hasArg(options::OPT_nodefaultlibs)) {
   9044       // Always use groups, since it has no effect on dynamic libraries.
   9045       CmdArgs.push_back("--start-group");
   9046       CmdArgs.push_back("-lc");
   9047       // NaCl's libc++ currently requires libpthread, so just always include it
   9048       // in the group for C++.
   9049       if (Args.hasArg(options::OPT_pthread) ||
   9050           Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
   9051         // Gold, used by Mips, handles nested groups differently than ld, and
   9052         // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
   9053         // which is not a desired behaviour here.
   9054         // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
   9055         if (getToolChain().getArch() == llvm::Triple::mipsel)
   9056           CmdArgs.push_back("-lnacl");
   9057 
   9058         CmdArgs.push_back("-lpthread");
   9059       }
   9060 
   9061       CmdArgs.push_back("-lgcc");
   9062       CmdArgs.push_back("--as-needed");
   9063       if (IsStatic)
   9064         CmdArgs.push_back("-lgcc_eh");
   9065       else
   9066         CmdArgs.push_back("-lgcc_s");
   9067       CmdArgs.push_back("--no-as-needed");
   9068 
   9069       // Mips needs to create and use pnacl_legacy library that contains
   9070       // definitions from bitcode/pnaclmm.c and definitions for
   9071       // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
   9072       if (getToolChain().getArch() == llvm::Triple::mipsel)
   9073         CmdArgs.push_back("-lpnacl_legacy");
   9074 
   9075       CmdArgs.push_back("--end-group");
   9076     }
   9077 
   9078     if (!Args.hasArg(options::OPT_nostartfiles)) {
   9079       const char *crtend;
   9080       if (Args.hasArg(options::OPT_shared))
   9081         crtend = "crtendS.o";
   9082       else
   9083         crtend = "crtend.o";
   9084 
   9085       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
   9086       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
   9087     }
   9088   }
   9089 
   9090   const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
   9091   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   9092 }
   9093 
   9094 void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
   9095                                     const InputInfo &Output,
   9096                                     const InputInfoList &Inputs,
   9097                                     const ArgList &Args,
   9098                                     const char *LinkingOutput) const {
   9099   claimNoWarnArgs(Args);
   9100   ArgStringList CmdArgs;
   9101 
   9102   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
   9103 
   9104   CmdArgs.push_back("-o");
   9105   CmdArgs.push_back(Output.getFilename());
   9106 
   9107   for (const auto &II : Inputs)
   9108     CmdArgs.push_back(II.getFilename());
   9109 
   9110   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
   9111   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   9112 }
   9113 
   9114 void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   9115                                  const InputInfo &Output,
   9116                                  const InputInfoList &Inputs,
   9117                                  const ArgList &Args,
   9118                                  const char *LinkingOutput) const {
   9119   const Driver &D = getToolChain().getDriver();
   9120   ArgStringList CmdArgs;
   9121 
   9122   if (Output.isFilename()) {
   9123     CmdArgs.push_back("-o");
   9124     CmdArgs.push_back(Output.getFilename());
   9125   } else {
   9126     assert(Output.isNothing() && "Invalid output.");
   9127   }
   9128 
   9129   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   9130     CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
   9131     CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
   9132     CmdArgs.push_back(
   9133         Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
   9134     CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
   9135   }
   9136 
   9137   Args.AddAllArgs(CmdArgs,
   9138                   {options::OPT_L, options::OPT_T_Group, options::OPT_e});
   9139 
   9140   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   9141 
   9142   getToolChain().addProfileRTLibs(Args, CmdArgs);
   9143 
   9144   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
   9145     if (D.CCCIsCXX()) {
   9146       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   9147       CmdArgs.push_back("-lm");
   9148     }
   9149   }
   9150 
   9151   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   9152     if (Args.hasArg(options::OPT_pthread))
   9153       CmdArgs.push_back("-lpthread");
   9154     CmdArgs.push_back("-lc");
   9155     CmdArgs.push_back("-lCompilerRT-Generic");
   9156     CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
   9157     CmdArgs.push_back(
   9158         Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
   9159   }
   9160 
   9161   const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
   9162   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   9163 }
   9164 
   9165 /// DragonFly Tools
   9166 
   9167 // For now, DragonFly Assemble does just about the same as for
   9168 // FreeBSD, but this may change soon.
   9169 void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
   9170                                         const InputInfo &Output,
   9171                                         const InputInfoList &Inputs,
   9172                                         const ArgList &Args,
   9173                                         const char *LinkingOutput) const {
   9174   claimNoWarnArgs(Args);
   9175   ArgStringList CmdArgs;
   9176 
   9177   // When building 32-bit code on DragonFly/pc64, we have to explicitly
   9178   // instruct as in the base system to assemble 32-bit code.
   9179   if (getToolChain().getArch() == llvm::Triple::x86)
   9180     CmdArgs.push_back("--32");
   9181 
   9182   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
   9183 
   9184   CmdArgs.push_back("-o");
   9185   CmdArgs.push_back(Output.getFilename());
   9186 
   9187   for (const auto &II : Inputs)
   9188     CmdArgs.push_back(II.getFilename());
   9189 
   9190   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
   9191   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   9192 }
   9193 
   9194 void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   9195                                      const InputInfo &Output,
   9196                                      const InputInfoList &Inputs,
   9197                                      const ArgList &Args,
   9198                                      const char *LinkingOutput) const {
   9199   const Driver &D = getToolChain().getDriver();
   9200   ArgStringList CmdArgs;
   9201   bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
   9202 
   9203   if (!D.SysRoot.empty())
   9204     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   9205 
   9206   CmdArgs.push_back("--eh-frame-hdr");
   9207   if (Args.hasArg(options::OPT_static)) {
   9208     CmdArgs.push_back("-Bstatic");
   9209   } else {
   9210     if (Args.hasArg(options::OPT_rdynamic))
   9211       CmdArgs.push_back("-export-dynamic");
   9212     if (Args.hasArg(options::OPT_shared))
   9213       CmdArgs.push_back("-Bshareable");
   9214     else {
   9215       CmdArgs.push_back("-dynamic-linker");
   9216       CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
   9217     }
   9218     CmdArgs.push_back("--hash-style=both");
   9219   }
   9220 
   9221   // When building 32-bit code on DragonFly/pc64, we have to explicitly
   9222   // instruct ld in the base system to link 32-bit code.
   9223   if (getToolChain().getArch() == llvm::Triple::x86) {
   9224     CmdArgs.push_back("-m");
   9225     CmdArgs.push_back("elf_i386");
   9226   }
   9227 
   9228   if (Output.isFilename()) {
   9229     CmdArgs.push_back("-o");
   9230     CmdArgs.push_back(Output.getFilename());
   9231   } else {
   9232     assert(Output.isNothing() && "Invalid output.");
   9233   }
   9234 
   9235   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   9236     if (!Args.hasArg(options::OPT_shared)) {
   9237       if (Args.hasArg(options::OPT_pg))
   9238         CmdArgs.push_back(
   9239             Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
   9240       else {
   9241         if (Args.hasArg(options::OPT_pie))
   9242           CmdArgs.push_back(
   9243               Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
   9244         else
   9245           CmdArgs.push_back(
   9246               Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
   9247       }
   9248     }
   9249     CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
   9250     if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
   9251       CmdArgs.push_back(
   9252           Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
   9253     else
   9254       CmdArgs.push_back(
   9255           Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
   9256   }
   9257 
   9258   Args.AddAllArgs(CmdArgs,
   9259                   {options::OPT_L, options::OPT_T_Group, options::OPT_e});
   9260 
   9261   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   9262 
   9263   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
   9264     // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
   9265     //         rpaths
   9266     if (UseGCC47)
   9267       CmdArgs.push_back("-L/usr/lib/gcc47");
   9268     else
   9269       CmdArgs.push_back("-L/usr/lib/gcc44");
   9270 
   9271     if (!Args.hasArg(options::OPT_static)) {
   9272       if (UseGCC47) {
   9273         CmdArgs.push_back("-rpath");
   9274         CmdArgs.push_back("/usr/lib/gcc47");
   9275       } else {
   9276         CmdArgs.push_back("-rpath");
   9277         CmdArgs.push_back("/usr/lib/gcc44");
   9278       }
   9279     }
   9280 
   9281     if (D.CCCIsCXX()) {
   9282       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   9283       CmdArgs.push_back("-lm");
   9284     }
   9285 
   9286     if (Args.hasArg(options::OPT_pthread))
   9287       CmdArgs.push_back("-lpthread");
   9288 
   9289     if (!Args.hasArg(options::OPT_nolibc)) {
   9290       CmdArgs.push_back("-lc");
   9291     }
   9292 
   9293     if (UseGCC47) {
   9294       if (Args.hasArg(options::OPT_static) ||
   9295           Args.hasArg(options::OPT_static_libgcc)) {
   9296         CmdArgs.push_back("-lgcc");
   9297         CmdArgs.push_back("-lgcc_eh");
   9298       } else {
   9299         if (Args.hasArg(options::OPT_shared_libgcc)) {
   9300           CmdArgs.push_back("-lgcc_pic");
   9301           if (!Args.hasArg(options::OPT_shared))
   9302             CmdArgs.push_back("-lgcc");
   9303         } else {
   9304           CmdArgs.push_back("-lgcc");
   9305           CmdArgs.push_back("--as-needed");
   9306           CmdArgs.push_back("-lgcc_pic");
   9307           CmdArgs.push_back("--no-as-needed");
   9308         }
   9309       }
   9310     } else {
   9311       if (Args.hasArg(options::OPT_shared)) {
   9312         CmdArgs.push_back("-lgcc_pic");
   9313       } else {
   9314         CmdArgs.push_back("-lgcc");
   9315       }
   9316     }
   9317   }
   9318 
   9319   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   9320     if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
   9321       CmdArgs.push_back(
   9322           Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
   9323     else
   9324       CmdArgs.push_back(
   9325           Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
   9326     CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
   9327   }
   9328 
   9329   getToolChain().addProfileRTLibs(Args, CmdArgs);
   9330 
   9331   const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
   9332   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   9333 }
   9334 
   9335 // Try to find Exe from a Visual Studio distribution.  This first tries to find
   9336 // an installed copy of Visual Studio and, failing that, looks in the PATH,
   9337 // making sure that whatever executable that's found is not a same-named exe
   9338 // from clang itself to prevent clang from falling back to itself.
   9339 static std::string FindVisualStudioExecutable(const ToolChain &TC,
   9340                                               const char *Exe,
   9341                                               const char *ClangProgramPath) {
   9342   const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
   9343   std::string visualStudioBinDir;
   9344   if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
   9345                                          visualStudioBinDir)) {
   9346     SmallString<128> FilePath(visualStudioBinDir);
   9347     llvm::sys::path::append(FilePath, Exe);
   9348     if (llvm::sys::fs::can_execute(FilePath.c_str()))
   9349       return FilePath.str();
   9350   }
   9351 
   9352   return Exe;
   9353 }
   9354 
   9355 void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   9356                                         const InputInfo &Output,
   9357                                         const InputInfoList &Inputs,
   9358                                         const ArgList &Args,
   9359                                         const char *LinkingOutput) const {
   9360   ArgStringList CmdArgs;
   9361   const ToolChain &TC = getToolChain();
   9362 
   9363   assert((Output.isFilename() || Output.isNothing()) && "invalid output");
   9364   if (Output.isFilename())
   9365     CmdArgs.push_back(
   9366         Args.MakeArgString(std::string("-out:") + Output.getFilename()));
   9367 
   9368   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
   9369       !C.getDriver().IsCLMode())
   9370     CmdArgs.push_back("-defaultlib:libcmt");
   9371 
   9372   if (!llvm::sys::Process::GetEnv("LIB")) {
   9373     // If the VC environment hasn't been configured (perhaps because the user
   9374     // did not run vcvarsall), try to build a consistent link environment.  If
   9375     // the environment variable is set however, assume the user knows what
   9376     // they're doing.
   9377     std::string VisualStudioDir;
   9378     const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
   9379     if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
   9380       SmallString<128> LibDir(VisualStudioDir);
   9381       llvm::sys::path::append(LibDir, "VC", "lib");
   9382       switch (MSVC.getArch()) {
   9383       case llvm::Triple::x86:
   9384         // x86 just puts the libraries directly in lib
   9385         break;
   9386       case llvm::Triple::x86_64:
   9387         llvm::sys::path::append(LibDir, "amd64");
   9388         break;
   9389       case llvm::Triple::arm:
   9390         llvm::sys::path::append(LibDir, "arm");
   9391         break;
   9392       default:
   9393         break;
   9394       }
   9395       CmdArgs.push_back(
   9396           Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
   9397 
   9398       if (MSVC.useUniversalCRT(VisualStudioDir)) {
   9399         std::string UniversalCRTLibPath;
   9400         if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
   9401           CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
   9402                                                UniversalCRTLibPath.c_str()));
   9403       }
   9404     }
   9405 
   9406     std::string WindowsSdkLibPath;
   9407     if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
   9408       CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
   9409                                            WindowsSdkLibPath.c_str()));
   9410   }
   9411 
   9412   CmdArgs.push_back("-nologo");
   9413 
   9414   if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
   9415     CmdArgs.push_back("-debug");
   9416 
   9417   bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
   9418                          options::OPT_shared);
   9419   if (DLL) {
   9420     CmdArgs.push_back(Args.MakeArgString("-dll"));
   9421 
   9422     SmallString<128> ImplibName(Output.getFilename());
   9423     llvm::sys::path::replace_extension(ImplibName, "lib");
   9424     CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
   9425   }
   9426 
   9427   if (TC.getSanitizerArgs().needsAsanRt()) {
   9428     CmdArgs.push_back(Args.MakeArgString("-debug"));
   9429     CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
   9430     if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
   9431       for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
   9432         CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
   9433       // Make sure the dynamic runtime thunk is not optimized out at link time
   9434       // to ensure proper SEH handling.
   9435       CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
   9436     } else if (DLL) {
   9437       CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
   9438     } else {
   9439       for (const auto &Lib : {"asan", "asan_cxx"})
   9440         CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
   9441     }
   9442   }
   9443 
   9444   Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
   9445 
   9446   if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
   9447                    options::OPT_fno_openmp, false)) {
   9448     CmdArgs.push_back("-nodefaultlib:vcomp.lib");
   9449     CmdArgs.push_back("-nodefaultlib:vcompd.lib");
   9450     CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
   9451                                          TC.getDriver().Dir + "/../lib"));
   9452     switch (getOpenMPRuntime(getToolChain(), Args)) {
   9453     case OMPRT_OMP:
   9454       CmdArgs.push_back("-defaultlib:libomp.lib");
   9455       break;
   9456     case OMPRT_IOMP5:
   9457       CmdArgs.push_back("-defaultlib:libiomp5md.lib");
   9458       break;
   9459     case OMPRT_GOMP:
   9460       break;
   9461     case OMPRT_Unknown:
   9462       // Already diagnosed.
   9463       break;
   9464     }
   9465   }
   9466 
   9467   // Add filenames, libraries, and other linker inputs.
   9468   for (const auto &Input : Inputs) {
   9469     if (Input.isFilename()) {
   9470       CmdArgs.push_back(Input.getFilename());
   9471       continue;
   9472     }
   9473 
   9474     const Arg &A = Input.getInputArg();
   9475 
   9476     // Render -l options differently for the MSVC linker.
   9477     if (A.getOption().matches(options::OPT_l)) {
   9478       StringRef Lib = A.getValue();
   9479       const char *LinkLibArg;
   9480       if (Lib.endswith(".lib"))
   9481         LinkLibArg = Args.MakeArgString(Lib);
   9482       else
   9483         LinkLibArg = Args.MakeArgString(Lib + ".lib");
   9484       CmdArgs.push_back(LinkLibArg);
   9485       continue;
   9486     }
   9487 
   9488     // Otherwise, this is some other kind of linker input option like -Wl, -z,
   9489     // or -L. Render it, even if MSVC doesn't understand it.
   9490     A.renderAsInput(Args, CmdArgs);
   9491   }
   9492 
   9493   // We need to special case some linker paths.  In the case of lld, we need to
   9494   // translate 'lld' into 'lld-link', and in the case of the regular msvc
   9495   // linker, we need to use a special search algorithm.
   9496   llvm::SmallString<128> linkPath;
   9497   StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
   9498   if (Linker.equals_lower("lld"))
   9499     Linker = "lld-link";
   9500 
   9501   if (Linker.equals_lower("link")) {
   9502     // If we're using the MSVC linker, it's not sufficient to just use link
   9503     // from the program PATH, because other environments like GnuWin32 install
   9504     // their own link.exe which may come first.
   9505     linkPath = FindVisualStudioExecutable(TC, "link.exe",
   9506                                           C.getDriver().getClangProgramPath());
   9507   } else {
   9508     linkPath = Linker;
   9509     llvm::sys::path::replace_extension(linkPath, "exe");
   9510     linkPath = TC.GetProgramPath(linkPath.c_str());
   9511   }
   9512 
   9513   const char *Exec = Args.MakeArgString(linkPath);
   9514   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   9515 }
   9516 
   9517 void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
   9518                                           const InputInfo &Output,
   9519                                           const InputInfoList &Inputs,
   9520                                           const ArgList &Args,
   9521                                           const char *LinkingOutput) const {
   9522   C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
   9523 }
   9524 
   9525 std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
   9526     Compilation &C, const JobAction &JA, const InputInfo &Output,
   9527     const InputInfoList &Inputs, const ArgList &Args,
   9528     const char *LinkingOutput) const {
   9529   ArgStringList CmdArgs;
   9530   CmdArgs.push_back("/nologo");
   9531   CmdArgs.push_back("/c");  // Compile only.
   9532   CmdArgs.push_back("/W0"); // No warnings.
   9533 
   9534   // The goal is to be able to invoke this tool correctly based on
   9535   // any flag accepted by clang-cl.
   9536 
   9537   // These are spelled the same way in clang and cl.exe,.
   9538   Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
   9539 
   9540   // Optimization level.
   9541   if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
   9542     CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
   9543                                                                       : "/Oi-");
   9544   if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
   9545     if (A->getOption().getID() == options::OPT_O0) {
   9546       CmdArgs.push_back("/Od");
   9547     } else {
   9548       CmdArgs.push_back("/Og");
   9549 
   9550       StringRef OptLevel = A->getValue();
   9551       if (OptLevel == "s" || OptLevel == "z")
   9552         CmdArgs.push_back("/Os");
   9553       else
   9554         CmdArgs.push_back("/Ot");
   9555 
   9556       CmdArgs.push_back("/Ob2");
   9557     }
   9558   }
   9559   if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
   9560                                options::OPT_fno_omit_frame_pointer))
   9561     CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
   9562                           ? "/Oy"
   9563                           : "/Oy-");
   9564   if (!Args.hasArg(options::OPT_fwritable_strings))
   9565     CmdArgs.push_back("/GF");
   9566 
   9567   // Flags for which clang-cl has an alias.
   9568   // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
   9569 
   9570   if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
   9571                    /*default=*/false))
   9572     CmdArgs.push_back("/GR-");
   9573   if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
   9574                                options::OPT_fno_function_sections))
   9575     CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
   9576                           ? "/Gy"
   9577                           : "/Gy-");
   9578   if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
   9579                                options::OPT_fno_data_sections))
   9580     CmdArgs.push_back(
   9581         A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
   9582   if (Args.hasArg(options::OPT_fsyntax_only))
   9583     CmdArgs.push_back("/Zs");
   9584   if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
   9585                   options::OPT__SLASH_Z7))
   9586     CmdArgs.push_back("/Z7");
   9587 
   9588   std::vector<std::string> Includes =
   9589       Args.getAllArgValues(options::OPT_include);
   9590   for (const auto &Include : Includes)
   9591     CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
   9592 
   9593   // Flags that can simply be passed through.
   9594   Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
   9595   Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
   9596   Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
   9597   Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
   9598 
   9599   // The order of these flags is relevant, so pick the last one.
   9600   if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
   9601                                options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
   9602     A->render(Args, CmdArgs);
   9603 
   9604   // Input filename.
   9605   assert(Inputs.size() == 1);
   9606   const InputInfo &II = Inputs[0];
   9607   assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
   9608   CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
   9609   if (II.isFilename())
   9610     CmdArgs.push_back(II.getFilename());
   9611   else
   9612     II.getInputArg().renderAsInput(Args, CmdArgs);
   9613 
   9614   // Output filename.
   9615   assert(Output.getType() == types::TY_Object);
   9616   const char *Fo =
   9617       Args.MakeArgString(std::string("/Fo") + Output.getFilename());
   9618   CmdArgs.push_back(Fo);
   9619 
   9620   const Driver &D = getToolChain().getDriver();
   9621   std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
   9622                                                 D.getClangProgramPath());
   9623   return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
   9624                                     CmdArgs, Inputs);
   9625 }
   9626 
   9627 /// MinGW Tools
   9628 void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
   9629                                     const InputInfo &Output,
   9630                                     const InputInfoList &Inputs,
   9631                                     const ArgList &Args,
   9632                                     const char *LinkingOutput) const {
   9633   claimNoWarnArgs(Args);
   9634   ArgStringList CmdArgs;
   9635 
   9636   if (getToolChain().getArch() == llvm::Triple::x86) {
   9637     CmdArgs.push_back("--32");
   9638   } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
   9639     CmdArgs.push_back("--64");
   9640   }
   9641 
   9642   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
   9643 
   9644   CmdArgs.push_back("-o");
   9645   CmdArgs.push_back(Output.getFilename());
   9646 
   9647   for (const auto &II : Inputs)
   9648     CmdArgs.push_back(II.getFilename());
   9649 
   9650   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
   9651   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   9652 
   9653   if (Args.hasArg(options::OPT_gsplit_dwarf))
   9654     SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
   9655                    SplitDebugName(Args, Inputs[0]));
   9656 }
   9657 
   9658 void MinGW::Linker::AddLibGCC(const ArgList &Args,
   9659                               ArgStringList &CmdArgs) const {
   9660   if (Args.hasArg(options::OPT_mthreads))
   9661     CmdArgs.push_back("-lmingwthrd");
   9662   CmdArgs.push_back("-lmingw32");
   9663 
   9664   // Make use of compiler-rt if --rtlib option is used
   9665   ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
   9666   if (RLT == ToolChain::RLT_Libgcc) {
   9667     bool Static = Args.hasArg(options::OPT_static_libgcc) ||
   9668                   Args.hasArg(options::OPT_static);
   9669     bool Shared = Args.hasArg(options::OPT_shared);
   9670     bool CXX = getToolChain().getDriver().CCCIsCXX();
   9671 
   9672     if (Static || (!CXX && !Shared)) {
   9673       CmdArgs.push_back("-lgcc");
   9674       CmdArgs.push_back("-lgcc_eh");
   9675     } else {
   9676       CmdArgs.push_back("-lgcc_s");
   9677       CmdArgs.push_back("-lgcc");
   9678     }
   9679   } else {
   9680     AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
   9681   }
   9682 
   9683   CmdArgs.push_back("-lmoldname");
   9684   CmdArgs.push_back("-lmingwex");
   9685   CmdArgs.push_back("-lmsvcrt");
   9686 }
   9687 
   9688 void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   9689                                  const InputInfo &Output,
   9690                                  const InputInfoList &Inputs,
   9691                                  const ArgList &Args,
   9692                                  const char *LinkingOutput) const {
   9693   const ToolChain &TC = getToolChain();
   9694   const Driver &D = TC.getDriver();
   9695   // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
   9696 
   9697   ArgStringList CmdArgs;
   9698 
   9699   // Silence warning for "clang -g foo.o -o foo"
   9700   Args.ClaimAllArgs(options::OPT_g_Group);
   9701   // and "clang -emit-llvm foo.o -o foo"
   9702   Args.ClaimAllArgs(options::OPT_emit_llvm);
   9703   // and for "clang -w foo.o -o foo". Other warning options are already
   9704   // handled somewhere else.
   9705   Args.ClaimAllArgs(options::OPT_w);
   9706 
   9707   StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
   9708   if (LinkerName.equals_lower("lld")) {
   9709     CmdArgs.push_back("-flavor");
   9710     CmdArgs.push_back("gnu");
   9711   } else if (!LinkerName.equals_lower("ld")) {
   9712     D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
   9713   }
   9714 
   9715   if (!D.SysRoot.empty())
   9716     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   9717 
   9718   if (Args.hasArg(options::OPT_s))
   9719     CmdArgs.push_back("-s");
   9720 
   9721   CmdArgs.push_back("-m");
   9722   if (TC.getArch() == llvm::Triple::x86)
   9723     CmdArgs.push_back("i386pe");
   9724   if (TC.getArch() == llvm::Triple::x86_64)
   9725     CmdArgs.push_back("i386pep");
   9726   if (TC.getArch() == llvm::Triple::arm)
   9727     CmdArgs.push_back("thumb2pe");
   9728 
   9729   if (Args.hasArg(options::OPT_mwindows)) {
   9730     CmdArgs.push_back("--subsystem");
   9731     CmdArgs.push_back("windows");
   9732   } else if (Args.hasArg(options::OPT_mconsole)) {
   9733     CmdArgs.push_back("--subsystem");
   9734     CmdArgs.push_back("console");
   9735   }
   9736 
   9737   if (Args.hasArg(options::OPT_static))
   9738     CmdArgs.push_back("-Bstatic");
   9739   else {
   9740     if (Args.hasArg(options::OPT_mdll))
   9741       CmdArgs.push_back("--dll");
   9742     else if (Args.hasArg(options::OPT_shared))
   9743       CmdArgs.push_back("--shared");
   9744     CmdArgs.push_back("-Bdynamic");
   9745     if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
   9746       CmdArgs.push_back("-e");
   9747       if (TC.getArch() == llvm::Triple::x86)
   9748         CmdArgs.push_back("_DllMainCRTStartup@12");
   9749       else
   9750         CmdArgs.push_back("DllMainCRTStartup");
   9751       CmdArgs.push_back("--enable-auto-image-base");
   9752     }
   9753   }
   9754 
   9755   CmdArgs.push_back("-o");
   9756   CmdArgs.push_back(Output.getFilename());
   9757 
   9758   Args.AddAllArgs(CmdArgs, options::OPT_e);
   9759   // FIXME: add -N, -n flags
   9760   Args.AddLastArg(CmdArgs, options::OPT_r);
   9761   Args.AddLastArg(CmdArgs, options::OPT_s);
   9762   Args.AddLastArg(CmdArgs, options::OPT_t);
   9763   Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
   9764   Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
   9765 
   9766   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   9767     if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
   9768       CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
   9769     } else {
   9770       if (Args.hasArg(options::OPT_municode))
   9771         CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
   9772       else
   9773         CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
   9774     }
   9775     if (Args.hasArg(options::OPT_pg))
   9776       CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
   9777     CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
   9778   }
   9779 
   9780   Args.AddAllArgs(CmdArgs, options::OPT_L);
   9781   TC.AddFilePathLibArgs(Args, CmdArgs);
   9782   AddLinkerInputs(TC, Inputs, Args, CmdArgs);
   9783 
   9784   // TODO: Add ASan stuff here
   9785 
   9786   // TODO: Add profile stuff here
   9787 
   9788   if (D.CCCIsCXX() &&
   9789       !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
   9790     bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
   9791                                !Args.hasArg(options::OPT_static);
   9792     if (OnlyLibstdcxxStatic)
   9793       CmdArgs.push_back("-Bstatic");
   9794     TC.AddCXXStdlibLibArgs(Args, CmdArgs);
   9795     if (OnlyLibstdcxxStatic)
   9796       CmdArgs.push_back("-Bdynamic");
   9797   }
   9798 
   9799   if (!Args.hasArg(options::OPT_nostdlib)) {
   9800     if (!Args.hasArg(options::OPT_nodefaultlibs)) {
   9801       if (Args.hasArg(options::OPT_static))
   9802         CmdArgs.push_back("--start-group");
   9803 
   9804       if (Args.hasArg(options::OPT_fstack_protector) ||
   9805           Args.hasArg(options::OPT_fstack_protector_strong) ||
   9806           Args.hasArg(options::OPT_fstack_protector_all)) {
   9807         CmdArgs.push_back("-lssp_nonshared");
   9808         CmdArgs.push_back("-lssp");
   9809       }
   9810       if (Args.hasArg(options::OPT_fopenmp))
   9811         CmdArgs.push_back("-lgomp");
   9812 
   9813       AddLibGCC(Args, CmdArgs);
   9814 
   9815       if (Args.hasArg(options::OPT_pg))
   9816         CmdArgs.push_back("-lgmon");
   9817 
   9818       if (Args.hasArg(options::OPT_pthread))
   9819         CmdArgs.push_back("-lpthread");
   9820 
   9821       // add system libraries
   9822       if (Args.hasArg(options::OPT_mwindows)) {
   9823         CmdArgs.push_back("-lgdi32");
   9824         CmdArgs.push_back("-lcomdlg32");
   9825       }
   9826       CmdArgs.push_back("-ladvapi32");
   9827       CmdArgs.push_back("-lshell32");
   9828       CmdArgs.push_back("-luser32");
   9829       CmdArgs.push_back("-lkernel32");
   9830 
   9831       if (Args.hasArg(options::OPT_static))
   9832         CmdArgs.push_back("--end-group");
   9833       else if (!LinkerName.equals_lower("lld"))
   9834         AddLibGCC(Args, CmdArgs);
   9835     }
   9836 
   9837     if (!Args.hasArg(options::OPT_nostartfiles)) {
   9838       // Add crtfastmath.o if available and fast math is enabled.
   9839       TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
   9840 
   9841       CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
   9842     }
   9843   }
   9844   const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
   9845   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   9846 }
   9847 
   9848 /// XCore Tools
   9849 // We pass assemble and link construction to the xcc tool.
   9850 
   9851 void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
   9852                                     const InputInfo &Output,
   9853                                     const InputInfoList &Inputs,
   9854                                     const ArgList &Args,
   9855                                     const char *LinkingOutput) const {
   9856   claimNoWarnArgs(Args);
   9857   ArgStringList CmdArgs;
   9858 
   9859   CmdArgs.push_back("-o");
   9860   CmdArgs.push_back(Output.getFilename());
   9861 
   9862   CmdArgs.push_back("-c");
   9863 
   9864   if (Args.hasArg(options::OPT_v))
   9865     CmdArgs.push_back("-v");
   9866 
   9867   if (Arg *A = Args.getLastArg(options::OPT_g_Group))
   9868     if (!A->getOption().matches(options::OPT_g0))
   9869       CmdArgs.push_back("-g");
   9870 
   9871   if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
   9872                    false))
   9873     CmdArgs.push_back("-fverbose-asm");
   9874 
   9875   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
   9876 
   9877   for (const auto &II : Inputs)
   9878     CmdArgs.push_back(II.getFilename());
   9879 
   9880   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
   9881   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   9882 }
   9883 
   9884 void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   9885                                  const InputInfo &Output,
   9886                                  const InputInfoList &Inputs,
   9887                                  const ArgList &Args,
   9888                                  const char *LinkingOutput) const {
   9889   ArgStringList CmdArgs;
   9890 
   9891   if (Output.isFilename()) {
   9892     CmdArgs.push_back("-o");
   9893     CmdArgs.push_back(Output.getFilename());
   9894   } else {
   9895     assert(Output.isNothing() && "Invalid output.");
   9896   }
   9897 
   9898   if (Args.hasArg(options::OPT_v))
   9899     CmdArgs.push_back("-v");
   9900 
   9901   // Pass -fexceptions through to the linker if it was present.
   9902   if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
   9903                    false))
   9904     CmdArgs.push_back("-fexceptions");
   9905 
   9906   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   9907 
   9908   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
   9909   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   9910 }
   9911 
   9912 void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
   9913                                            const InputInfo &Output,
   9914                                            const InputInfoList &Inputs,
   9915                                            const ArgList &Args,
   9916                                            const char *LinkingOutput) const {
   9917   claimNoWarnArgs(Args);
   9918   const auto &TC =
   9919       static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
   9920   ArgStringList CmdArgs;
   9921   const char *Exec;
   9922 
   9923   switch (TC.getArch()) {
   9924   default:
   9925     llvm_unreachable("unsupported architecture");
   9926   case llvm::Triple::arm:
   9927   case llvm::Triple::thumb:
   9928     break;
   9929   case llvm::Triple::x86:
   9930     CmdArgs.push_back("--32");
   9931     break;
   9932   case llvm::Triple::x86_64:
   9933     CmdArgs.push_back("--64");
   9934     break;
   9935   }
   9936 
   9937   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
   9938 
   9939   CmdArgs.push_back("-o");
   9940   CmdArgs.push_back(Output.getFilename());
   9941 
   9942   for (const auto &Input : Inputs)
   9943     CmdArgs.push_back(Input.getFilename());
   9944 
   9945   const std::string Assembler = TC.GetProgramPath("as");
   9946   Exec = Args.MakeArgString(Assembler);
   9947 
   9948   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   9949 }
   9950 
   9951 void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   9952                                         const InputInfo &Output,
   9953                                         const InputInfoList &Inputs,
   9954                                         const ArgList &Args,
   9955                                         const char *LinkingOutput) const {
   9956   const auto &TC =
   9957       static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
   9958   const llvm::Triple &T = TC.getTriple();
   9959   const Driver &D = TC.getDriver();
   9960   SmallString<128> EntryPoint;
   9961   ArgStringList CmdArgs;
   9962   const char *Exec;
   9963 
   9964   // Silence warning for "clang -g foo.o -o foo"
   9965   Args.ClaimAllArgs(options::OPT_g_Group);
   9966   // and "clang -emit-llvm foo.o -o foo"
   9967   Args.ClaimAllArgs(options::OPT_emit_llvm);
   9968   // and for "clang -w foo.o -o foo"
   9969   Args.ClaimAllArgs(options::OPT_w);
   9970   // Other warning options are already handled somewhere else.
   9971 
   9972   if (!D.SysRoot.empty())
   9973     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   9974 
   9975   if (Args.hasArg(options::OPT_pie))
   9976     CmdArgs.push_back("-pie");
   9977   if (Args.hasArg(options::OPT_rdynamic))
   9978     CmdArgs.push_back("-export-dynamic");
   9979   if (Args.hasArg(options::OPT_s))
   9980     CmdArgs.push_back("--strip-all");
   9981 
   9982   CmdArgs.push_back("-m");
   9983   switch (TC.getArch()) {
   9984   default:
   9985     llvm_unreachable("unsupported architecture");
   9986   case llvm::Triple::arm:
   9987   case llvm::Triple::thumb:
   9988     // FIXME: this is incorrect for WinCE
   9989     CmdArgs.push_back("thumb2pe");
   9990     break;
   9991   case llvm::Triple::x86:
   9992     CmdArgs.push_back("i386pe");
   9993     EntryPoint.append("_");
   9994     break;
   9995   case llvm::Triple::x86_64:
   9996     CmdArgs.push_back("i386pep");
   9997     break;
   9998   }
   9999 
   10000   if (Args.hasArg(options::OPT_shared)) {
   10001     switch (T.getArch()) {
   10002     default:
   10003       llvm_unreachable("unsupported architecture");
   10004     case llvm::Triple::arm:
   10005     case llvm::Triple::thumb:
   10006     case llvm::Triple::x86_64:
   10007       EntryPoint.append("_DllMainCRTStartup");
   10008       break;
   10009     case llvm::Triple::x86:
   10010       EntryPoint.append("_DllMainCRTStartup@12");
   10011       break;
   10012     }
   10013 
   10014     CmdArgs.push_back("-shared");
   10015     CmdArgs.push_back("-Bdynamic");
   10016 
   10017     CmdArgs.push_back("--enable-auto-image-base");
   10018 
   10019     CmdArgs.push_back("--entry");
   10020     CmdArgs.push_back(Args.MakeArgString(EntryPoint));
   10021   } else {
   10022     EntryPoint.append("mainCRTStartup");
   10023 
   10024     CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
   10025                                                        : "-Bdynamic");
   10026 
   10027     if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   10028       CmdArgs.push_back("--entry");
   10029       CmdArgs.push_back(Args.MakeArgString(EntryPoint));
   10030     }
   10031 
   10032     // FIXME: handle subsystem
   10033   }
   10034 
   10035   // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
   10036   CmdArgs.push_back("--allow-multiple-definition");
   10037 
   10038   CmdArgs.push_back("-o");
   10039   CmdArgs.push_back(Output.getFilename());
   10040 
   10041   if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
   10042     SmallString<261> ImpLib(Output.getFilename());
   10043     llvm::sys::path::replace_extension(ImpLib, ".lib");
   10044 
   10045     CmdArgs.push_back("--out-implib");
   10046     CmdArgs.push_back(Args.MakeArgString(ImpLib));
   10047   }
   10048 
   10049   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   10050     const std::string CRTPath(D.SysRoot + "/usr/lib/");
   10051     const char *CRTBegin;
   10052 
   10053     CRTBegin =
   10054         Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
   10055     CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
   10056   }
   10057 
   10058   Args.AddAllArgs(CmdArgs, options::OPT_L);
   10059   TC.AddFilePathLibArgs(Args, CmdArgs);
   10060   AddLinkerInputs(TC, Inputs, Args, CmdArgs);
   10061 
   10062   if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
   10063       !Args.hasArg(options::OPT_nodefaultlibs)) {
   10064     bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
   10065                      !Args.hasArg(options::OPT_static);
   10066     if (StaticCXX)
   10067       CmdArgs.push_back("-Bstatic");
   10068     TC.AddCXXStdlibLibArgs(Args, CmdArgs);
   10069     if (StaticCXX)
   10070       CmdArgs.push_back("-Bdynamic");
   10071   }
   10072 
   10073   if (!Args.hasArg(options::OPT_nostdlib)) {
   10074     if (!Args.hasArg(options::OPT_nodefaultlibs)) {
   10075       // TODO handle /MT[d] /MD[d]
   10076       CmdArgs.push_back("-lmsvcrt");
   10077       AddRunTimeLibs(TC, D, CmdArgs, Args);
   10078     }
   10079   }
   10080 
   10081   if (TC.getSanitizerArgs().needsAsanRt()) {
   10082     // TODO handle /MT[d] /MD[d]
   10083     if (Args.hasArg(options::OPT_shared)) {
   10084       CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
   10085     } else {
   10086       for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
   10087         CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
   10088         // Make sure the dynamic runtime thunk is not optimized out at link time
   10089         // to ensure proper SEH handling.
   10090         CmdArgs.push_back(Args.MakeArgString("--undefined"));
   10091         CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
   10092                                                  ? "___asan_seh_interceptor"
   10093                                                  : "__asan_seh_interceptor"));
   10094     }
   10095   }
   10096 
   10097   Exec = Args.MakeArgString(TC.GetLinkerPath());
   10098 
   10099   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   10100 }
   10101 
   10102 void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
   10103                                           const InputInfo &Output,
   10104                                           const InputInfoList &Inputs,
   10105                                           const ArgList &Args,
   10106                                           const char *LinkingOutput) const {
   10107   ArgStringList CmdArgs;
   10108   assert(Inputs.size() == 1);
   10109   const InputInfo &II = Inputs[0];
   10110   assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
   10111          II.getType() == types::TY_PP_CXX);
   10112 
   10113   if (JA.getKind() == Action::PreprocessJobClass) {
   10114     Args.ClaimAllArgs();
   10115     CmdArgs.push_back("-E");
   10116   } else {
   10117     assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
   10118     CmdArgs.push_back("-S");
   10119     CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
   10120   }
   10121   CmdArgs.push_back("-mcpu=myriad2");
   10122   CmdArgs.push_back("-DMYRIAD2");
   10123 
   10124   // Append all -I, -iquote, -isystem paths, defines/undefines,
   10125   // 'f' flags, optimize flags, and warning options.
   10126   // These are spelled the same way in clang and moviCompile.
   10127   Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
   10128                             options::OPT_std_EQ, options::OPT_D, options::OPT_U,
   10129                             options::OPT_f_Group, options::OPT_f_clang_Group,
   10130                             options::OPT_g_Group, options::OPT_M_Group,
   10131                             options::OPT_O_Group, options::OPT_W_Group});
   10132 
   10133   // If we're producing a dependency file, and assembly is the final action,
   10134   // then the name of the target in the dependency file should be the '.o'
   10135   // file, not the '.s' file produced by this step. For example, instead of
   10136   //  /tmp/mumble.s: mumble.c .../someheader.h
   10137   // the filename on the lefthand side should be "mumble.o"
   10138   if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
   10139       C.getActions().size() == 1 &&
   10140       C.getActions()[0]->getKind() == Action::AssembleJobClass) {
   10141     Arg *A = Args.getLastArg(options::OPT_o);
   10142     if (A) {
   10143       CmdArgs.push_back("-MT");
   10144       CmdArgs.push_back(Args.MakeArgString(A->getValue()));
   10145     }
   10146   }
   10147 
   10148   CmdArgs.push_back(II.getFilename());
   10149   CmdArgs.push_back("-o");
   10150   CmdArgs.push_back(Output.getFilename());
   10151 
   10152   std::string Exec =
   10153       Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
   10154   C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
   10155                                           CmdArgs, Inputs));
   10156 }
   10157 
   10158 void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
   10159                                            const InputInfo &Output,
   10160                                            const InputInfoList &Inputs,
   10161                                            const ArgList &Args,
   10162                                            const char *LinkingOutput) const {
   10163   ArgStringList CmdArgs;
   10164 
   10165   assert(Inputs.size() == 1);
   10166   const InputInfo &II = Inputs[0];
   10167   assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
   10168   assert(Output.getType() == types::TY_Object);
   10169 
   10170   CmdArgs.push_back("-no6thSlotCompression");
   10171   CmdArgs.push_back("-cv:myriad2"); // Chip Version
   10172   CmdArgs.push_back("-noSPrefixing");
   10173   CmdArgs.push_back("-a"); // Mystery option.
   10174   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
   10175   for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
   10176     A->claim();
   10177     CmdArgs.push_back(
   10178         Args.MakeArgString(std::string("-i:") + A->getValue(0)));
   10179   }
   10180   CmdArgs.push_back("-elf"); // Output format.
   10181   CmdArgs.push_back(II.getFilename());
   10182   CmdArgs.push_back(
   10183       Args.MakeArgString(std::string("-o:") + Output.getFilename()));
   10184 
   10185   std::string Exec =
   10186       Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
   10187   C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
   10188                                           CmdArgs, Inputs));
   10189 }
   10190 
   10191 void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   10192                                          const InputInfo &Output,
   10193                                          const InputInfoList &Inputs,
   10194                                          const ArgList &Args,
   10195                                          const char *LinkingOutput) const {
   10196   const auto &TC =
   10197       static_cast<const toolchains::MyriadToolChain &>(getToolChain());
   10198   const llvm::Triple &T = TC.getTriple();
   10199   ArgStringList CmdArgs;
   10200   bool UseStartfiles =
   10201       !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
   10202   bool UseDefaultLibs =
   10203       !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
   10204 
   10205   if (T.getArch() == llvm::Triple::sparc)
   10206     CmdArgs.push_back("-EB");
   10207   else // SHAVE assumes little-endian, and sparcel is expressly so.
   10208     CmdArgs.push_back("-EL");
   10209 
   10210   // The remaining logic is mostly like gnutools::Linker::ConstructJob,
   10211   // but we never pass through a --sysroot option and various other bits.
   10212   // For example, there are no sanitizers (yet) nor gold linker.
   10213 
   10214   // Eat some arguments that may be present but have no effect.
   10215   Args.ClaimAllArgs(options::OPT_g_Group);
   10216   Args.ClaimAllArgs(options::OPT_w);
   10217   Args.ClaimAllArgs(options::OPT_static_libgcc);
   10218 
   10219   if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
   10220     CmdArgs.push_back("-s");
   10221 
   10222   CmdArgs.push_back("-o");
   10223   CmdArgs.push_back(Output.getFilename());
   10224 
   10225   if (UseStartfiles) {
   10226     // If you want startfiles, it means you want the builtin crti and crtbegin,
   10227     // but not crt0. Myriad link commands provide their own crt0.o as needed.
   10228     CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
   10229     CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
   10230   }
   10231 
   10232   Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
   10233                             options::OPT_e, options::OPT_s, options::OPT_t,
   10234                             options::OPT_Z_Flag, options::OPT_r});
   10235 
   10236   TC.AddFilePathLibArgs(Args, CmdArgs);
   10237 
   10238   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   10239 
   10240   if (UseDefaultLibs) {
   10241     if (C.getDriver().CCCIsCXX())
   10242       CmdArgs.push_back("-lstdc++");
   10243     if (T.getOS() == llvm::Triple::RTEMS) {
   10244       CmdArgs.push_back("--start-group");
   10245       CmdArgs.push_back("-lc");
   10246       // You must provide your own "-L" option to enable finding these.
   10247       CmdArgs.push_back("-lrtemscpu");
   10248       CmdArgs.push_back("-lrtemsbsp");
   10249       CmdArgs.push_back("--end-group");
   10250     } else {
   10251       CmdArgs.push_back("-lc");
   10252     }
   10253     CmdArgs.push_back("-lgcc");
   10254   }
   10255   if (UseStartfiles) {
   10256     CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
   10257     CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
   10258   }
   10259 
   10260   std::string Exec =
   10261       Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
   10262   C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
   10263                                           CmdArgs, Inputs));
   10264 }
   10265 
   10266 void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   10267                                     const InputInfo &Output,
   10268                                     const InputInfoList &Inputs,
   10269                                     const ArgList &Args,
   10270                                     const char *LinkingOutput) const {
   10271   claimNoWarnArgs(Args);
   10272   ArgStringList CmdArgs;
   10273 
   10274   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
   10275 
   10276   CmdArgs.push_back("-o");
   10277   CmdArgs.push_back(Output.getFilename());
   10278 
   10279   assert(Inputs.size() == 1 && "Unexpected number of inputs.");
   10280   const InputInfo &Input = Inputs[0];
   10281   assert(Input.isFilename() && "Invalid input.");
   10282   CmdArgs.push_back(Input.getFilename());
   10283 
   10284   const char *Exec =
   10285       Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
   10286   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   10287 }
   10288 
   10289 static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
   10290   const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
   10291   if (SanArgs.needsUbsanRt()) {
   10292     CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
   10293   }
   10294   if (SanArgs.needsAsanRt()) {
   10295     CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
   10296   }
   10297 }
   10298 
   10299 static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
   10300                                 const JobAction &JA, const InputInfo &Output,
   10301                                 const InputInfoList &Inputs,
   10302                                 const ArgList &Args,
   10303                                 const char *LinkingOutput) {
   10304   const toolchains::FreeBSD &ToolChain =
   10305       static_cast<const toolchains::FreeBSD &>(T.getToolChain());
   10306   const Driver &D = ToolChain.getDriver();
   10307   ArgStringList CmdArgs;
   10308 
   10309   // Silence warning for "clang -g foo.o -o foo"
   10310   Args.ClaimAllArgs(options::OPT_g_Group);
   10311   // and "clang -emit-llvm foo.o -o foo"
   10312   Args.ClaimAllArgs(options::OPT_emit_llvm);
   10313   // and for "clang -w foo.o -o foo". Other warning options are already
   10314   // handled somewhere else.
   10315   Args.ClaimAllArgs(options::OPT_w);
   10316 
   10317   if (!D.SysRoot.empty())
   10318     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   10319 
   10320   if (Args.hasArg(options::OPT_pie))
   10321     CmdArgs.push_back("-pie");
   10322 
   10323   if (Args.hasArg(options::OPT_rdynamic))
   10324     CmdArgs.push_back("-export-dynamic");
   10325   if (Args.hasArg(options::OPT_shared))
   10326     CmdArgs.push_back("--oformat=so");
   10327 
   10328   if (Output.isFilename()) {
   10329     CmdArgs.push_back("-o");
   10330     CmdArgs.push_back(Output.getFilename());
   10331   } else {
   10332     assert(Output.isNothing() && "Invalid output.");
   10333   }
   10334 
   10335   AddPS4SanitizerArgs(ToolChain, CmdArgs);
   10336 
   10337   Args.AddAllArgs(CmdArgs, options::OPT_L);
   10338   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   10339   Args.AddAllArgs(CmdArgs, options::OPT_e);
   10340   Args.AddAllArgs(CmdArgs, options::OPT_s);
   10341   Args.AddAllArgs(CmdArgs, options::OPT_t);
   10342   Args.AddAllArgs(CmdArgs, options::OPT_r);
   10343 
   10344   if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
   10345     CmdArgs.push_back("--no-demangle");
   10346 
   10347   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
   10348 
   10349   if (Args.hasArg(options::OPT_pthread)) {
   10350     CmdArgs.push_back("-lpthread");
   10351   }
   10352 
   10353   const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
   10354 
   10355   C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
   10356 }
   10357 
   10358 static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
   10359                                  const JobAction &JA, const InputInfo &Output,
   10360                                  const InputInfoList &Inputs,
   10361                                  const ArgList &Args,
   10362                                  const char *LinkingOutput) {
   10363   const toolchains::FreeBSD &ToolChain =
   10364       static_cast<const toolchains::FreeBSD &>(T.getToolChain());
   10365   const Driver &D = ToolChain.getDriver();
   10366   ArgStringList CmdArgs;
   10367 
   10368   // Silence warning for "clang -g foo.o -o foo"
   10369   Args.ClaimAllArgs(options::OPT_g_Group);
   10370   // and "clang -emit-llvm foo.o -o foo"
   10371   Args.ClaimAllArgs(options::OPT_emit_llvm);
   10372   // and for "clang -w foo.o -o foo". Other warning options are already
   10373   // handled somewhere else.
   10374   Args.ClaimAllArgs(options::OPT_w);
   10375 
   10376   if (!D.SysRoot.empty())
   10377     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   10378 
   10379   if (Args.hasArg(options::OPT_pie))
   10380     CmdArgs.push_back("-pie");
   10381 
   10382   if (Args.hasArg(options::OPT_static)) {
   10383     CmdArgs.push_back("-Bstatic");
   10384   } else {
   10385     if (Args.hasArg(options::OPT_rdynamic))
   10386       CmdArgs.push_back("-export-dynamic");
   10387     CmdArgs.push_back("--eh-frame-hdr");
   10388     if (Args.hasArg(options::OPT_shared)) {
   10389       CmdArgs.push_back("-Bshareable");
   10390     } else {
   10391       CmdArgs.push_back("-dynamic-linker");
   10392       CmdArgs.push_back("/libexec/ld-elf.so.1");
   10393     }
   10394     CmdArgs.push_back("--enable-new-dtags");
   10395   }
   10396 
   10397   if (Output.isFilename()) {
   10398     CmdArgs.push_back("-o");
   10399     CmdArgs.push_back(Output.getFilename());
   10400   } else {
   10401     assert(Output.isNothing() && "Invalid output.");
   10402   }
   10403 
   10404   AddPS4SanitizerArgs(ToolChain, CmdArgs);
   10405 
   10406   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   10407     const char *crt1 = nullptr;
   10408     if (!Args.hasArg(options::OPT_shared)) {
   10409       if (Args.hasArg(options::OPT_pg))
   10410         crt1 = "gcrt1.o";
   10411       else if (Args.hasArg(options::OPT_pie))
   10412         crt1 = "Scrt1.o";
   10413       else
   10414         crt1 = "crt1.o";
   10415     }
   10416     if (crt1)
   10417       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
   10418 
   10419     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
   10420 
   10421     const char *crtbegin = nullptr;
   10422     if (Args.hasArg(options::OPT_static))
   10423       crtbegin = "crtbeginT.o";
   10424     else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
   10425       crtbegin = "crtbeginS.o";
   10426     else
   10427       crtbegin = "crtbegin.o";
   10428 
   10429     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
   10430   }
   10431 
   10432   Args.AddAllArgs(CmdArgs, options::OPT_L);
   10433   ToolChain.AddFilePathLibArgs(Args, CmdArgs);
   10434   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   10435   Args.AddAllArgs(CmdArgs, options::OPT_e);
   10436   Args.AddAllArgs(CmdArgs, options::OPT_s);
   10437   Args.AddAllArgs(CmdArgs, options::OPT_t);
   10438   Args.AddAllArgs(CmdArgs, options::OPT_r);
   10439 
   10440   if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
   10441     CmdArgs.push_back("--no-demangle");
   10442 
   10443   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
   10444 
   10445   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
   10446     // For PS4, we always want to pass libm, libstdc++ and libkernel
   10447     // libraries for both C and C++ compilations.
   10448     CmdArgs.push_back("-lkernel");
   10449     if (D.CCCIsCXX()) {
   10450       ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
   10451       if (Args.hasArg(options::OPT_pg))
   10452         CmdArgs.push_back("-lm_p");
   10453       else
   10454         CmdArgs.push_back("-lm");
   10455     }
   10456     // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
   10457     // the default system libraries. Just mimic this for now.
   10458     if (Args.hasArg(options::OPT_pg))
   10459       CmdArgs.push_back("-lgcc_p");
   10460     else
   10461       CmdArgs.push_back("-lcompiler_rt");
   10462     if (Args.hasArg(options::OPT_static)) {
   10463       CmdArgs.push_back("-lstdc++");
   10464     } else if (Args.hasArg(options::OPT_pg)) {
   10465       CmdArgs.push_back("-lgcc_eh_p");
   10466     } else {
   10467       CmdArgs.push_back("--as-needed");
   10468       CmdArgs.push_back("-lstdc++");
   10469       CmdArgs.push_back("--no-as-needed");
   10470     }
   10471 
   10472     if (Args.hasArg(options::OPT_pthread)) {
   10473       if (Args.hasArg(options::OPT_pg))
   10474         CmdArgs.push_back("-lpthread_p");
   10475       else
   10476         CmdArgs.push_back("-lpthread");
   10477     }
   10478 
   10479     if (Args.hasArg(options::OPT_pg)) {
   10480       if (Args.hasArg(options::OPT_shared))
   10481         CmdArgs.push_back("-lc");
   10482       else {
   10483         if (Args.hasArg(options::OPT_static)) {
   10484           CmdArgs.push_back("--start-group");
   10485           CmdArgs.push_back("-lc_p");
   10486           CmdArgs.push_back("-lpthread_p");
   10487           CmdArgs.push_back("--end-group");
   10488         } else {
   10489           CmdArgs.push_back("-lc_p");
   10490         }
   10491       }
   10492       CmdArgs.push_back("-lgcc_p");
   10493     } else {
   10494       if (Args.hasArg(options::OPT_static)) {
   10495         CmdArgs.push_back("--start-group");
   10496         CmdArgs.push_back("-lc");
   10497         CmdArgs.push_back("-lpthread");
   10498         CmdArgs.push_back("--end-group");
   10499       } else {
   10500         CmdArgs.push_back("-lc");
   10501       }
   10502       CmdArgs.push_back("-lcompiler_rt");
   10503     }
   10504 
   10505     if (Args.hasArg(options::OPT_static)) {
   10506       CmdArgs.push_back("-lstdc++");
   10507     } else if (Args.hasArg(options::OPT_pg)) {
   10508       CmdArgs.push_back("-lgcc_eh_p");
   10509     } else {
   10510       CmdArgs.push_back("--as-needed");
   10511       CmdArgs.push_back("-lstdc++");
   10512       CmdArgs.push_back("--no-as-needed");
   10513     }
   10514   }
   10515 
   10516   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
   10517     if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
   10518       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
   10519     else
   10520       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
   10521     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
   10522   }
   10523 
   10524   const char *Exec =
   10525 #ifdef LLVM_ON_WIN32
   10526       Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
   10527 #else
   10528       Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
   10529 #endif
   10530 
   10531   C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
   10532 }
   10533 
   10534 void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
   10535                                 const InputInfo &Output,
   10536                                 const InputInfoList &Inputs,
   10537                                 const ArgList &Args,
   10538                                 const char *LinkingOutput) const {
   10539   const toolchains::FreeBSD &ToolChain =
   10540       static_cast<const toolchains::FreeBSD &>(getToolChain());
   10541   const Driver &D = ToolChain.getDriver();
   10542   bool PS4Linker;
   10543   StringRef LinkerOptName;
   10544   if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
   10545     LinkerOptName = A->getValue();
   10546     if (LinkerOptName != "ps4" && LinkerOptName != "gold")
   10547       D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
   10548   }
   10549 
   10550   if (LinkerOptName == "gold")
   10551     PS4Linker = false;
   10552   else if (LinkerOptName == "ps4")
   10553     PS4Linker = true;
   10554   else
   10555     PS4Linker = !Args.hasArg(options::OPT_shared);
   10556 
   10557   if (PS4Linker)
   10558     ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
   10559   else
   10560     ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
   10561 }
   10562