Home | History | Annotate | Download | only in Driver
      1 //===--- Tools.cpp - Tools Implementations --------------------------------===//
      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 "SanitizerArgs.h"
     13 #include "ToolChains.h"
     14 #include "clang/Basic/ObjCRuntime.h"
     15 #include "clang/Basic/Version.h"
     16 #include "clang/Driver/Action.h"
     17 #include "clang/Driver/Compilation.h"
     18 #include "clang/Driver/Driver.h"
     19 #include "clang/Driver/DriverDiagnostic.h"
     20 #include "clang/Driver/Job.h"
     21 #include "clang/Driver/Options.h"
     22 #include "clang/Driver/ToolChain.h"
     23 #include "clang/Driver/Util.h"
     24 #include "llvm/ADT/SmallString.h"
     25 #include "llvm/ADT/StringSwitch.h"
     26 #include "llvm/ADT/Twine.h"
     27 #include "llvm/Option/Arg.h"
     28 #include "llvm/Option/ArgList.h"
     29 #include "llvm/Option/Option.h"
     30 #include "llvm/Support/ErrorHandling.h"
     31 #include "llvm/Support/FileSystem.h"
     32 #include "llvm/Support/Format.h"
     33 #include "llvm/Support/Host.h"
     34 #include "llvm/Support/Program.h"
     35 #include "llvm/Support/Process.h"
     36 #include "llvm/Support/raw_ostream.h"
     37 #include <sys/stat.h>
     38 
     39 using namespace clang::driver;
     40 using namespace clang::driver::tools;
     41 using namespace clang;
     42 using namespace llvm::opt;
     43 
     44 /// CheckPreprocessingOptions - Perform some validation of preprocessing
     45 /// arguments that is shared with gcc.
     46 static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
     47   if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
     48     if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP())
     49       D.Diag(diag::err_drv_argument_only_allowed_with)
     50         << A->getAsString(Args) << "-E";
     51 }
     52 
     53 /// CheckCodeGenerationOptions - Perform some validation of code generation
     54 /// arguments that is shared with gcc.
     55 static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
     56   // In gcc, only ARM checks this, but it seems reasonable to check universally.
     57   if (Args.hasArg(options::OPT_static))
     58     if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
     59                                        options::OPT_mdynamic_no_pic))
     60       D.Diag(diag::err_drv_argument_not_allowed_with)
     61         << A->getAsString(Args) << "-static";
     62 }
     63 
     64 // Quote target names for inclusion in GNU Make dependency files.
     65 // Only the characters '$', '#', ' ', '\t' are quoted.
     66 static void QuoteTarget(StringRef Target,
     67                         SmallVectorImpl<char> &Res) {
     68   for (unsigned i = 0, e = Target.size(); i != e; ++i) {
     69     switch (Target[i]) {
     70     case ' ':
     71     case '\t':
     72       // Escape the preceding backslashes
     73       for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
     74         Res.push_back('\\');
     75 
     76       // Escape the space/tab
     77       Res.push_back('\\');
     78       break;
     79     case '$':
     80       Res.push_back('$');
     81       break;
     82     case '#':
     83       Res.push_back('\\');
     84       break;
     85     default:
     86       break;
     87     }
     88 
     89     Res.push_back(Target[i]);
     90   }
     91 }
     92 
     93 static void addDirectoryList(const ArgList &Args,
     94                              ArgStringList &CmdArgs,
     95                              const char *ArgName,
     96                              const char *EnvVar) {
     97   const char *DirList = ::getenv(EnvVar);
     98   bool CombinedArg = false;
     99 
    100   if (!DirList)
    101     return; // Nothing to do.
    102 
    103   StringRef Name(ArgName);
    104   if (Name.equals("-I") || Name.equals("-L"))
    105     CombinedArg = true;
    106 
    107   StringRef Dirs(DirList);
    108   if (Dirs.empty()) // Empty string should not add '.'.
    109     return;
    110 
    111   StringRef::size_type Delim;
    112   while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
    113     if (Delim == 0) { // Leading colon.
    114       if (CombinedArg) {
    115         CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
    116       } else {
    117         CmdArgs.push_back(ArgName);
    118         CmdArgs.push_back(".");
    119       }
    120     } else {
    121       if (CombinedArg) {
    122         CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
    123       } else {
    124         CmdArgs.push_back(ArgName);
    125         CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
    126       }
    127     }
    128     Dirs = Dirs.substr(Delim + 1);
    129   }
    130 
    131   if (Dirs.empty()) { // Trailing colon.
    132     if (CombinedArg) {
    133       CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
    134     } else {
    135       CmdArgs.push_back(ArgName);
    136       CmdArgs.push_back(".");
    137     }
    138   } else { // Add the last path.
    139     if (CombinedArg) {
    140       CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
    141     } else {
    142       CmdArgs.push_back(ArgName);
    143       CmdArgs.push_back(Args.MakeArgString(Dirs));
    144     }
    145   }
    146 }
    147 
    148 static void AddLinkerInputs(const ToolChain &TC,
    149                             const InputInfoList &Inputs, const ArgList &Args,
    150                             ArgStringList &CmdArgs) {
    151   const Driver &D = TC.getDriver();
    152 
    153   // Add extra linker input arguments which are not treated as inputs
    154   // (constructed via -Xarch_).
    155   Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
    156 
    157   for (InputInfoList::const_iterator
    158          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
    159     const InputInfo &II = *it;
    160 
    161     if (!TC.HasNativeLLVMSupport()) {
    162       // Don't try to pass LLVM inputs unless we have native support.
    163       if (II.getType() == types::TY_LLVM_IR ||
    164           II.getType() == types::TY_LTO_IR ||
    165           II.getType() == types::TY_LLVM_BC ||
    166           II.getType() == types::TY_LTO_BC)
    167         D.Diag(diag::err_drv_no_linker_llvm_support)
    168           << TC.getTripleString();
    169     }
    170 
    171     // Add filenames immediately.
    172     if (II.isFilename()) {
    173       CmdArgs.push_back(II.getFilename());
    174       continue;
    175     }
    176 
    177     // Otherwise, this is a linker input argument.
    178     const Arg &A = II.getInputArg();
    179 
    180     // Handle reserved library options.
    181     if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
    182       TC.AddCXXStdlibLibArgs(Args, CmdArgs);
    183     } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
    184       TC.AddCCKextLibArgs(Args, CmdArgs);
    185     } else
    186       A.renderAsInput(Args, CmdArgs);
    187   }
    188 
    189   // LIBRARY_PATH - included following the user specified library paths.
    190   addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
    191 }
    192 
    193 /// \brief Determine whether Objective-C automated reference counting is
    194 /// enabled.
    195 static bool isObjCAutoRefCount(const ArgList &Args) {
    196   return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
    197 }
    198 
    199 /// \brief Determine whether we are linking the ObjC runtime.
    200 static bool isObjCRuntimeLinked(const ArgList &Args) {
    201   if (isObjCAutoRefCount(Args)) {
    202     Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
    203     return true;
    204   }
    205   return Args.hasArg(options::OPT_fobjc_link_runtime);
    206 }
    207 
    208 static void addProfileRT(const ToolChain &TC, const ArgList &Args,
    209                          ArgStringList &CmdArgs,
    210                          llvm::Triple Triple) {
    211   if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
    212         Args.hasArg(options::OPT_fprofile_generate) ||
    213         Args.hasArg(options::OPT_fcreate_profile) ||
    214         Args.hasArg(options::OPT_coverage)))
    215     return;
    216 
    217   // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
    218   // the link line. We cannot do the same thing because unlike gcov there is a
    219   // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
    220   // not supported by old linkers.
    221   std::string ProfileRT =
    222     std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
    223 
    224   CmdArgs.push_back(Args.MakeArgString(ProfileRT));
    225 }
    226 
    227 static bool forwardToGCC(const Option &O) {
    228   // Don't forward inputs from the original command line.  They are added from
    229   // InputInfoList.
    230   return O.getKind() != Option::InputClass &&
    231          !O.hasFlag(options::DriverOption) &&
    232          !O.hasFlag(options::LinkerInput);
    233 }
    234 
    235 void Clang::AddPreprocessingOptions(Compilation &C,
    236                                     const JobAction &JA,
    237                                     const Driver &D,
    238                                     const ArgList &Args,
    239                                     ArgStringList &CmdArgs,
    240                                     const InputInfo &Output,
    241                                     const InputInfoList &Inputs) const {
    242   Arg *A;
    243 
    244   CheckPreprocessingOptions(D, Args);
    245 
    246   Args.AddLastArg(CmdArgs, options::OPT_C);
    247   Args.AddLastArg(CmdArgs, options::OPT_CC);
    248 
    249   // Handle dependency file generation.
    250   if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
    251       (A = Args.getLastArg(options::OPT_MD)) ||
    252       (A = Args.getLastArg(options::OPT_MMD))) {
    253     // Determine the output location.
    254     const char *DepFile;
    255     if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
    256       DepFile = MF->getValue();
    257       C.addFailureResultFile(DepFile, &JA);
    258     } else if (Output.getType() == types::TY_Dependencies) {
    259       DepFile = Output.getFilename();
    260     } else if (A->getOption().matches(options::OPT_M) ||
    261                A->getOption().matches(options::OPT_MM)) {
    262       DepFile = "-";
    263     } else {
    264       DepFile = getDependencyFileName(Args, Inputs);
    265       C.addFailureResultFile(DepFile, &JA);
    266     }
    267     CmdArgs.push_back("-dependency-file");
    268     CmdArgs.push_back(DepFile);
    269 
    270     // Add a default target if one wasn't specified.
    271     if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
    272       const char *DepTarget;
    273 
    274       // If user provided -o, that is the dependency target, except
    275       // when we are only generating a dependency file.
    276       Arg *OutputOpt = Args.getLastArg(options::OPT_o);
    277       if (OutputOpt && Output.getType() != types::TY_Dependencies) {
    278         DepTarget = OutputOpt->getValue();
    279       } else {
    280         // Otherwise derive from the base input.
    281         //
    282         // FIXME: This should use the computed output file location.
    283         SmallString<128> P(Inputs[0].getBaseInput());
    284         llvm::sys::path::replace_extension(P, "o");
    285         DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
    286       }
    287 
    288       CmdArgs.push_back("-MT");
    289       SmallString<128> Quoted;
    290       QuoteTarget(DepTarget, Quoted);
    291       CmdArgs.push_back(Args.MakeArgString(Quoted));
    292     }
    293 
    294     if (A->getOption().matches(options::OPT_M) ||
    295         A->getOption().matches(options::OPT_MD))
    296       CmdArgs.push_back("-sys-header-deps");
    297   }
    298 
    299   if (Args.hasArg(options::OPT_MG)) {
    300     if (!A || A->getOption().matches(options::OPT_MD) ||
    301               A->getOption().matches(options::OPT_MMD))
    302       D.Diag(diag::err_drv_mg_requires_m_or_mm);
    303     CmdArgs.push_back("-MG");
    304   }
    305 
    306   Args.AddLastArg(CmdArgs, options::OPT_MP);
    307 
    308   // Convert all -MQ <target> args to -MT <quoted target>
    309   for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
    310                                              options::OPT_MQ),
    311          ie = Args.filtered_end(); it != ie; ++it) {
    312     const Arg *A = *it;
    313     A->claim();
    314 
    315     if (A->getOption().matches(options::OPT_MQ)) {
    316       CmdArgs.push_back("-MT");
    317       SmallString<128> Quoted;
    318       QuoteTarget(A->getValue(), Quoted);
    319       CmdArgs.push_back(Args.MakeArgString(Quoted));
    320 
    321     // -MT flag - no change
    322     } else {
    323       A->render(Args, CmdArgs);
    324     }
    325   }
    326 
    327   // Add -i* options, and automatically translate to
    328   // -include-pch/-include-pth for transparent PCH support. It's
    329   // wonky, but we include looking for .gch so we can support seamless
    330   // replacement into a build system already set up to be generating
    331   // .gch files.
    332   bool RenderedImplicitInclude = false;
    333   for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
    334          ie = Args.filtered_end(); it != ie; ++it) {
    335     const Arg *A = it;
    336 
    337     if (A->getOption().matches(options::OPT_include)) {
    338       bool IsFirstImplicitInclude = !RenderedImplicitInclude;
    339       RenderedImplicitInclude = true;
    340 
    341       // Use PCH if the user requested it.
    342       bool UsePCH = D.CCCUsePCH;
    343 
    344       bool FoundPTH = false;
    345       bool FoundPCH = false;
    346       SmallString<128> P(A->getValue());
    347       // We want the files to have a name like foo.h.pch. Add a dummy extension
    348       // so that replace_extension does the right thing.
    349       P += ".dummy";
    350       if (UsePCH) {
    351         llvm::sys::path::replace_extension(P, "pch");
    352         if (llvm::sys::fs::exists(P.str()))
    353           FoundPCH = true;
    354       }
    355 
    356       if (!FoundPCH) {
    357         llvm::sys::path::replace_extension(P, "pth");
    358         if (llvm::sys::fs::exists(P.str()))
    359           FoundPTH = true;
    360       }
    361 
    362       if (!FoundPCH && !FoundPTH) {
    363         llvm::sys::path::replace_extension(P, "gch");
    364         if (llvm::sys::fs::exists(P.str())) {
    365           FoundPCH = UsePCH;
    366           FoundPTH = !UsePCH;
    367         }
    368       }
    369 
    370       if (FoundPCH || FoundPTH) {
    371         if (IsFirstImplicitInclude) {
    372           A->claim();
    373           if (UsePCH)
    374             CmdArgs.push_back("-include-pch");
    375           else
    376             CmdArgs.push_back("-include-pth");
    377           CmdArgs.push_back(Args.MakeArgString(P.str()));
    378           continue;
    379         } else {
    380           // Ignore the PCH if not first on command line and emit warning.
    381           D.Diag(diag::warn_drv_pch_not_first_include)
    382               << P.str() << A->getAsString(Args);
    383         }
    384       }
    385     }
    386 
    387     // Not translated, render as usual.
    388     A->claim();
    389     A->render(Args, CmdArgs);
    390   }
    391 
    392   Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
    393   Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
    394                   options::OPT_index_header_map);
    395 
    396   // Add -Wp, and -Xassembler if using the preprocessor.
    397 
    398   // FIXME: There is a very unfortunate problem here, some troubled
    399   // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
    400   // really support that we would have to parse and then translate
    401   // those options. :(
    402   Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
    403                        options::OPT_Xpreprocessor);
    404 
    405   // -I- is a deprecated GCC feature, reject it.
    406   if (Arg *A = Args.getLastArg(options::OPT_I_))
    407     D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
    408 
    409   // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
    410   // -isysroot to the CC1 invocation.
    411   StringRef sysroot = C.getSysRoot();
    412   if (sysroot != "") {
    413     if (!Args.hasArg(options::OPT_isysroot)) {
    414       CmdArgs.push_back("-isysroot");
    415       CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
    416     }
    417   }
    418 
    419   // Parse additional include paths from environment variables.
    420   // FIXME: We should probably sink the logic for handling these from the
    421   // frontend into the driver. It will allow deleting 4 otherwise unused flags.
    422   // CPATH - included following the user specified includes (but prior to
    423   // builtin and standard includes).
    424   addDirectoryList(Args, CmdArgs, "-I", "CPATH");
    425   // C_INCLUDE_PATH - system includes enabled when compiling C.
    426   addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
    427   // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
    428   addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
    429   // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
    430   addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
    431   // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
    432   addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
    433 
    434   // Add C++ include arguments, if needed.
    435   if (types::isCXX(Inputs[0].getType()))
    436     getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
    437 
    438   // Add system include arguments.
    439   getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
    440 }
    441 
    442 /// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
    443 /// CPU.
    444 //
    445 // FIXME: This is redundant with -mcpu, why does LLVM use this.
    446 // FIXME: tblgen this, or kill it!
    447 static const char *getLLVMArchSuffixForARM(StringRef CPU) {
    448   return llvm::StringSwitch<const char *>(CPU)
    449     .Case("strongarm", "v4")
    450     .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
    451     .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
    452     .Cases("arm920", "arm920t", "arm922t", "v4t")
    453     .Cases("arm940t", "ep9312","v4t")
    454     .Cases("arm10tdmi",  "arm1020t", "v5")
    455     .Cases("arm9e",  "arm926ej-s",  "arm946e-s", "v5e")
    456     .Cases("arm966e-s",  "arm968e-s",  "arm10e", "v5e")
    457     .Cases("arm1020e",  "arm1022e",  "xscale", "iwmmxt", "v5e")
    458     .Cases("arm1136j-s",  "arm1136jf-s",  "arm1176jz-s", "v6")
    459     .Cases("arm1176jzf-s",  "mpcorenovfp",  "mpcore", "v6")
    460     .Cases("arm1156t2-s",  "arm1156t2f-s", "v6t2")
    461     .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
    462     .Cases("cortex-a9", "cortex-a15", "v7")
    463     .Case("cortex-r5", "v7r")
    464     .Case("cortex-m0", "v6m")
    465     .Case("cortex-m3", "v7m")
    466     .Case("cortex-m4", "v7em")
    467     .Case("cortex-a9-mp", "v7f")
    468     .Case("swift", "v7s")
    469     .Default("");
    470 }
    471 
    472 /// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
    473 //
    474 // FIXME: tblgen this.
    475 static std::string getARMTargetCPU(const ArgList &Args,
    476                                    const llvm::Triple &Triple) {
    477   // FIXME: Warn on inconsistent use of -mcpu and -march.
    478 
    479   // If we have -mcpu=, use that.
    480   if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
    481     StringRef MCPU = A->getValue();
    482     // Handle -mcpu=native.
    483     if (MCPU == "native")
    484       return llvm::sys::getHostCPUName();
    485     else
    486       return MCPU;
    487   }
    488 
    489   StringRef MArch;
    490   if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
    491     // Otherwise, if we have -march= choose the base CPU for that arch.
    492     MArch = A->getValue();
    493   } else {
    494     // Otherwise, use the Arch from the triple.
    495     MArch = Triple.getArchName();
    496   }
    497 
    498   // Handle -march=native.
    499   std::string NativeMArch;
    500   if (MArch == "native") {
    501     std::string CPU = llvm::sys::getHostCPUName();
    502     if (CPU != "generic") {
    503       // Translate the native cpu into the architecture. The switch below will
    504       // then chose the minimum cpu for that arch.
    505       NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
    506       MArch = NativeMArch;
    507     }
    508   }
    509 
    510   return llvm::StringSwitch<const char *>(MArch)
    511     .Cases("armv2", "armv2a","arm2")
    512     .Case("armv3", "arm6")
    513     .Case("armv3m", "arm7m")
    514     .Case("armv4", "strongarm")
    515     .Case("armv4t", "arm7tdmi")
    516     .Cases("armv5", "armv5t", "arm10tdmi")
    517     .Cases("armv5e", "armv5te", "arm1022e")
    518     .Case("armv5tej", "arm926ej-s")
    519     .Cases("armv6", "armv6k", "arm1136jf-s")
    520     .Case("armv6j", "arm1136j-s")
    521     .Cases("armv6z", "armv6zk", "arm1176jzf-s")
    522     .Case("armv6t2", "arm1156t2-s")
    523     .Cases("armv6m", "armv6-m", "cortex-m0")
    524     .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
    525     .Cases("armv7em", "armv7e-m", "cortex-m4")
    526     .Cases("armv7f", "armv7-f", "cortex-a9-mp")
    527     .Cases("armv7s", "armv7-s", "swift")
    528     .Cases("armv7r", "armv7-r", "cortex-r4")
    529     .Cases("armv7m", "armv7-m", "cortex-m3")
    530     .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
    531     .Case("ep9312", "ep9312")
    532     .Case("iwmmxt", "iwmmxt")
    533     .Case("xscale", "xscale")
    534     // If all else failed, return the most base CPU with thumb interworking
    535     // supported by LLVM.
    536     .Default("arm7tdmi");
    537 }
    538 
    539 // FIXME: Move to target hook.
    540 static bool isSignedCharDefault(const llvm::Triple &Triple) {
    541   switch (Triple.getArch()) {
    542   default:
    543     return true;
    544 
    545   case llvm::Triple::aarch64:
    546   case llvm::Triple::arm:
    547   case llvm::Triple::ppc:
    548   case llvm::Triple::ppc64:
    549     if (Triple.isOSDarwin())
    550       return true;
    551     return false;
    552 
    553   case llvm::Triple::ppc64le:
    554   case llvm::Triple::systemz:
    555     return false;
    556   }
    557 }
    558 
    559 // Handle -mfpu=.
    560 //
    561 // FIXME: Centralize feature selection, defaulting shouldn't be also in the
    562 // frontend target.
    563 static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
    564                        ArgStringList &CmdArgs) {
    565   StringRef FPU = A->getValue();
    566 
    567   // Set the target features based on the FPU.
    568   if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
    569     // Disable any default FPU support.
    570     CmdArgs.push_back("-target-feature");
    571     CmdArgs.push_back("-vfp2");
    572     CmdArgs.push_back("-target-feature");
    573     CmdArgs.push_back("-vfp3");
    574     CmdArgs.push_back("-target-feature");
    575     CmdArgs.push_back("-neon");
    576   } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
    577     CmdArgs.push_back("-target-feature");
    578     CmdArgs.push_back("+vfp3");
    579     CmdArgs.push_back("-target-feature");
    580     CmdArgs.push_back("+d16");
    581     CmdArgs.push_back("-target-feature");
    582     CmdArgs.push_back("-neon");
    583   } else if (FPU == "vfp") {
    584     CmdArgs.push_back("-target-feature");
    585     CmdArgs.push_back("+vfp2");
    586     CmdArgs.push_back("-target-feature");
    587     CmdArgs.push_back("-neon");
    588   } else if (FPU == "vfp3" || FPU == "vfpv3") {
    589     CmdArgs.push_back("-target-feature");
    590     CmdArgs.push_back("+vfp3");
    591     CmdArgs.push_back("-target-feature");
    592     CmdArgs.push_back("-neon");
    593   } else if (FPU == "fp-armv8") {
    594     CmdArgs.push_back("-target-feature");
    595     CmdArgs.push_back("+v8fp");
    596   } else if (FPU == "neon-fp-armv8") {
    597     CmdArgs.push_back("-target-feature");
    598     CmdArgs.push_back("+v8fp");
    599     CmdArgs.push_back("-target-feature");
    600     CmdArgs.push_back("+neon");
    601   } else if (FPU == "neon") {
    602     CmdArgs.push_back("-target-feature");
    603     CmdArgs.push_back("+neon");
    604   } else
    605     D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
    606 }
    607 
    608 // Handle -mfpmath=.
    609 static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
    610                           ArgStringList &CmdArgs, StringRef CPU) {
    611   StringRef FPMath = A->getValue();
    612 
    613   // Set the target features based on the FPMath.
    614   if (FPMath == "neon") {
    615     CmdArgs.push_back("-target-feature");
    616     CmdArgs.push_back("+neonfp");
    617 
    618     if (CPU != "cortex-a5" && CPU != "cortex-a7" &&
    619         CPU != "cortex-a8" && CPU != "cortex-a9" &&
    620         CPU != "cortex-a9-mp" && CPU != "cortex-a15")
    621       D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
    622 
    623   } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
    624              FPMath == "vfp4") {
    625     CmdArgs.push_back("-target-feature");
    626     CmdArgs.push_back("-neonfp");
    627 
    628     // FIXME: Add warnings when disabling a feature not present for a given CPU.
    629   } else
    630     D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
    631 }
    632 
    633 // Select the float ABI as determined by -msoft-float, -mhard-float, and
    634 // -mfloat-abi=.
    635 static StringRef getARMFloatABI(const Driver &D,
    636                                 const ArgList &Args,
    637                                 const llvm::Triple &Triple) {
    638   StringRef FloatABI;
    639   if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
    640                                options::OPT_mhard_float,
    641                                options::OPT_mfloat_abi_EQ)) {
    642     if (A->getOption().matches(options::OPT_msoft_float))
    643       FloatABI = "soft";
    644     else if (A->getOption().matches(options::OPT_mhard_float))
    645       FloatABI = "hard";
    646     else {
    647       FloatABI = A->getValue();
    648       if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
    649         D.Diag(diag::err_drv_invalid_mfloat_abi)
    650           << A->getAsString(Args);
    651         FloatABI = "soft";
    652       }
    653     }
    654   }
    655 
    656   // If unspecified, choose the default based on the platform.
    657   if (FloatABI.empty()) {
    658     switch (Triple.getOS()) {
    659     case llvm::Triple::Darwin:
    660     case llvm::Triple::MacOSX:
    661     case llvm::Triple::IOS: {
    662       // Darwin defaults to "softfp" for v6 and v7.
    663       //
    664       // FIXME: Factor out an ARM class so we can cache the arch somewhere.
    665       std::string ArchName =
    666         getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
    667       if (StringRef(ArchName).startswith("v6") ||
    668           StringRef(ArchName).startswith("v7"))
    669         FloatABI = "softfp";
    670       else
    671         FloatABI = "soft";
    672       break;
    673     }
    674 
    675     case llvm::Triple::FreeBSD:
    676       // FreeBSD defaults to soft float
    677       FloatABI = "soft";
    678       break;
    679 
    680     default:
    681       switch(Triple.getEnvironment()) {
    682       case llvm::Triple::GNUEABIHF:
    683         FloatABI = "hard";
    684         break;
    685       case llvm::Triple::GNUEABI:
    686         FloatABI = "softfp";
    687         break;
    688       case llvm::Triple::EABI:
    689         // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
    690         FloatABI = "softfp";
    691         break;
    692       case llvm::Triple::Android: {
    693         std::string ArchName =
    694           getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
    695         if (StringRef(ArchName).startswith("v7"))
    696           FloatABI = "softfp";
    697         else
    698           FloatABI = "soft";
    699         break;
    700       }
    701       default:
    702         // Assume "soft", but warn the user we are guessing.
    703         FloatABI = "soft";
    704         D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
    705         break;
    706       }
    707     }
    708   }
    709 
    710   return FloatABI;
    711 }
    712 
    713 
    714 void Clang::AddARMTargetArgs(const ArgList &Args,
    715                              ArgStringList &CmdArgs,
    716                              bool KernelOrKext) const {
    717   const Driver &D = getToolChain().getDriver();
    718   // Get the effective triple, which takes into account the deployment target.
    719   std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
    720   llvm::Triple Triple(TripleStr);
    721   std::string CPUName = getARMTargetCPU(Args, Triple);
    722 
    723   // Select the ABI to use.
    724   //
    725   // FIXME: Support -meabi.
    726   const char *ABIName = 0;
    727   if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
    728     ABIName = A->getValue();
    729   } else if (Triple.isOSDarwin()) {
    730     // The backend is hardwired to assume AAPCS for M-class processors, ensure
    731     // the frontend matches that.
    732     if (StringRef(CPUName).startswith("cortex-m")) {
    733       ABIName = "aapcs";
    734     } else {
    735       ABIName = "apcs-gnu";
    736     }
    737   } else {
    738     // Select the default based on the platform.
    739     switch(Triple.getEnvironment()) {
    740     case llvm::Triple::Android:
    741     case llvm::Triple::GNUEABI:
    742     case llvm::Triple::GNUEABIHF:
    743       ABIName = "aapcs-linux";
    744       break;
    745     case llvm::Triple::EABI:
    746       ABIName = "aapcs";
    747       break;
    748     default:
    749       ABIName = "apcs-gnu";
    750     }
    751   }
    752   CmdArgs.push_back("-target-abi");
    753   CmdArgs.push_back(ABIName);
    754 
    755   // Set the CPU based on -march= and -mcpu=.
    756   CmdArgs.push_back("-target-cpu");
    757   CmdArgs.push_back(Args.MakeArgString(CPUName));
    758 
    759   // Determine floating point ABI from the options & target defaults.
    760   StringRef FloatABI = getARMFloatABI(D, Args, Triple);
    761   if (FloatABI == "soft") {
    762     // Floating point operations and argument passing are soft.
    763     //
    764     // FIXME: This changes CPP defines, we need -target-soft-float.
    765     CmdArgs.push_back("-msoft-float");
    766     CmdArgs.push_back("-mfloat-abi");
    767     CmdArgs.push_back("soft");
    768   } else if (FloatABI == "softfp") {
    769     // Floating point operations are hard, but argument passing is soft.
    770     CmdArgs.push_back("-mfloat-abi");
    771     CmdArgs.push_back("soft");
    772   } else {
    773     // Floating point operations and argument passing are hard.
    774     assert(FloatABI == "hard" && "Invalid float abi!");
    775     CmdArgs.push_back("-mfloat-abi");
    776     CmdArgs.push_back("hard");
    777   }
    778 
    779   // Set appropriate target features for floating point mode.
    780   //
    781   // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
    782   // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
    783   // stripped out by the ARM target.
    784 
    785   // Use software floating point operations?
    786   if (FloatABI == "soft") {
    787     CmdArgs.push_back("-target-feature");
    788     CmdArgs.push_back("+soft-float");
    789   }
    790 
    791   // Use software floating point argument passing?
    792   if (FloatABI != "hard") {
    793     CmdArgs.push_back("-target-feature");
    794     CmdArgs.push_back("+soft-float-abi");
    795   }
    796 
    797   // Honor -mfpu=.
    798   if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
    799     addFPUArgs(D, A, Args, CmdArgs);
    800 
    801   // Honor -mfpmath=.
    802   if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
    803     addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
    804 
    805   // Setting -msoft-float effectively disables NEON because of the GCC
    806   // implementation, although the same isn't true of VFP or VFP3.
    807   if (FloatABI == "soft") {
    808     CmdArgs.push_back("-target-feature");
    809     CmdArgs.push_back("-neon");
    810   }
    811 
    812   // Kernel code has more strict alignment requirements.
    813   if (KernelOrKext) {
    814     if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
    815       CmdArgs.push_back("-backend-option");
    816       CmdArgs.push_back("-arm-long-calls");
    817     }
    818 
    819     CmdArgs.push_back("-backend-option");
    820     CmdArgs.push_back("-arm-strict-align");
    821 
    822     // The kext linker doesn't know how to deal with movw/movt.
    823     CmdArgs.push_back("-backend-option");
    824     CmdArgs.push_back("-arm-darwin-use-movt=0");
    825   }
    826 
    827   // Setting -mno-global-merge disables the codegen global merge pass. Setting
    828   // -mglobal-merge has no effect as the pass is enabled by default.
    829   if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
    830                                options::OPT_mno_global_merge)) {
    831     if (A->getOption().matches(options::OPT_mno_global_merge))
    832       CmdArgs.push_back("-mno-global-merge");
    833   }
    834 
    835   if (!Args.hasFlag(options::OPT_mimplicit_float,
    836                     options::OPT_mno_implicit_float,
    837                     true))
    838     CmdArgs.push_back("-no-implicit-float");
    839 }
    840 
    841 // Translate MIPS CPU name alias option to CPU name.
    842 static StringRef getMipsCPUFromAlias(const Arg &A) {
    843   if (A.getOption().matches(options::OPT_mips32))
    844     return "mips32";
    845   if (A.getOption().matches(options::OPT_mips32r2))
    846     return "mips32r2";
    847   if (A.getOption().matches(options::OPT_mips64))
    848     return "mips64";
    849   if (A.getOption().matches(options::OPT_mips64r2))
    850     return "mips64r2";
    851   llvm_unreachable("Unexpected option");
    852   return "";
    853 }
    854 
    855 // Get CPU and ABI names. They are not independent
    856 // so we have to calculate them together.
    857 static void getMipsCPUAndABI(const ArgList &Args,
    858                              const ToolChain &TC,
    859                              StringRef &CPUName,
    860                              StringRef &ABIName) {
    861   const char *DefMips32CPU = "mips32";
    862   const char *DefMips64CPU = "mips64";
    863 
    864   if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
    865                                options::OPT_mcpu_EQ,
    866                                options::OPT_mips_CPUs_Group)) {
    867     if (A->getOption().matches(options::OPT_mips_CPUs_Group))
    868       CPUName = getMipsCPUFromAlias(*A);
    869     else
    870       CPUName = A->getValue();
    871   }
    872 
    873   if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
    874     ABIName = A->getValue();
    875     // Convert a GNU style Mips ABI name to the name
    876     // accepted by LLVM Mips backend.
    877     ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
    878       .Case("32", "o32")
    879       .Case("64", "n64")
    880       .Default(ABIName);
    881   }
    882 
    883   // Setup default CPU and ABI names.
    884   if (CPUName.empty() && ABIName.empty()) {
    885     switch (TC.getArch()) {
    886     default:
    887       llvm_unreachable("Unexpected triple arch name");
    888     case llvm::Triple::mips:
    889     case llvm::Triple::mipsel:
    890       CPUName = DefMips32CPU;
    891       break;
    892     case llvm::Triple::mips64:
    893     case llvm::Triple::mips64el:
    894       CPUName = DefMips64CPU;
    895       break;
    896     }
    897   }
    898 
    899   if (!ABIName.empty()) {
    900     // Deduce CPU name from ABI name.
    901     CPUName = llvm::StringSwitch<const char *>(ABIName)
    902       .Cases("32", "o32", "eabi", DefMips32CPU)
    903       .Cases("n32", "n64", "64", DefMips64CPU)
    904       .Default("");
    905   }
    906   else if (!CPUName.empty()) {
    907     // Deduce ABI name from CPU name.
    908     ABIName = llvm::StringSwitch<const char *>(CPUName)
    909       .Cases("mips32", "mips32r2", "o32")
    910       .Cases("mips64", "mips64r2", "n64")
    911       .Default("");
    912   }
    913 
    914   // FIXME: Warn on inconsistent cpu and abi usage.
    915 }
    916 
    917 // Convert ABI name to the GNU tools acceptable variant.
    918 static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
    919   return llvm::StringSwitch<llvm::StringRef>(ABI)
    920     .Case("o32", "32")
    921     .Case("n64", "64")
    922     .Default(ABI);
    923 }
    924 
    925 // Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
    926 // and -mfloat-abi=.
    927 static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
    928   StringRef FloatABI;
    929   if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
    930                                options::OPT_mhard_float,
    931                                options::OPT_mfloat_abi_EQ)) {
    932     if (A->getOption().matches(options::OPT_msoft_float))
    933       FloatABI = "soft";
    934     else if (A->getOption().matches(options::OPT_mhard_float))
    935       FloatABI = "hard";
    936     else {
    937       FloatABI = A->getValue();
    938       if (FloatABI != "soft" && FloatABI != "hard") {
    939         D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
    940         FloatABI = "hard";
    941       }
    942     }
    943   }
    944 
    945   // If unspecified, choose the default based on the platform.
    946   if (FloatABI.empty()) {
    947     // Assume "hard", because it's a default value used by gcc.
    948     // When we start to recognize specific target MIPS processors,
    949     // we will be able to select the default more correctly.
    950     FloatABI = "hard";
    951   }
    952 
    953   return FloatABI;
    954 }
    955 
    956 static void AddTargetFeature(const ArgList &Args,
    957                              ArgStringList &CmdArgs,
    958                              OptSpecifier OnOpt,
    959                              OptSpecifier OffOpt,
    960                              StringRef FeatureName) {
    961   if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
    962     CmdArgs.push_back("-target-feature");
    963     if (A->getOption().matches(OnOpt))
    964       CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
    965     else
    966       CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
    967   }
    968 }
    969 
    970 void Clang::AddMIPSTargetArgs(const ArgList &Args,
    971                               ArgStringList &CmdArgs) const {
    972   const Driver &D = getToolChain().getDriver();
    973   StringRef CPUName;
    974   StringRef ABIName;
    975   getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
    976 
    977   CmdArgs.push_back("-target-cpu");
    978   CmdArgs.push_back(CPUName.data());
    979 
    980   CmdArgs.push_back("-target-abi");
    981   CmdArgs.push_back(ABIName.data());
    982 
    983   StringRef FloatABI = getMipsFloatABI(D, Args);
    984 
    985   bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
    986 
    987   if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
    988     // Floating point operations and argument passing are soft.
    989     CmdArgs.push_back("-msoft-float");
    990     CmdArgs.push_back("-mfloat-abi");
    991     CmdArgs.push_back("soft");
    992 
    993     // FIXME: Note, this is a hack. We need to pass the selected float
    994     // mode to the MipsTargetInfoBase to define appropriate macros there.
    995     // Now it is the only method.
    996     CmdArgs.push_back("-target-feature");
    997     CmdArgs.push_back("+soft-float");
    998 
    999     if (FloatABI == "hard" && IsMips16) {
   1000       CmdArgs.push_back("-mllvm");
   1001       CmdArgs.push_back("-mips16-hard-float");
   1002     }
   1003   }
   1004   else {
   1005     // Floating point operations and argument passing are hard.
   1006     assert(FloatABI == "hard" && "Invalid float abi!");
   1007     CmdArgs.push_back("-mfloat-abi");
   1008     CmdArgs.push_back("hard");
   1009   }
   1010 
   1011   AddTargetFeature(Args, CmdArgs,
   1012                    options::OPT_msingle_float, options::OPT_mdouble_float,
   1013                    "single-float");
   1014   AddTargetFeature(Args, CmdArgs,
   1015                    options::OPT_mips16, options::OPT_mno_mips16,
   1016                    "mips16");
   1017   AddTargetFeature(Args, CmdArgs,
   1018                    options::OPT_mmicromips, options::OPT_mno_micromips,
   1019                    "micromips");
   1020   AddTargetFeature(Args, CmdArgs,
   1021                    options::OPT_mdsp, options::OPT_mno_dsp,
   1022                    "dsp");
   1023   AddTargetFeature(Args, CmdArgs,
   1024                    options::OPT_mdspr2, options::OPT_mno_dspr2,
   1025                    "dspr2");
   1026 
   1027   if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
   1028     if (A->getOption().matches(options::OPT_mxgot)) {
   1029       CmdArgs.push_back("-mllvm");
   1030       CmdArgs.push_back("-mxgot");
   1031     }
   1032   }
   1033 
   1034   if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
   1035                                options::OPT_mno_ldc1_sdc1)) {
   1036     if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
   1037       CmdArgs.push_back("-mllvm");
   1038       CmdArgs.push_back("-mno-ldc1-sdc1");
   1039     }
   1040   }
   1041 
   1042   if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
   1043                                options::OPT_mno_check_zero_division)) {
   1044     if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
   1045       CmdArgs.push_back("-mllvm");
   1046       CmdArgs.push_back("-mno-check-zero-division");
   1047     }
   1048   }
   1049 
   1050   if (Arg *A = Args.getLastArg(options::OPT_G)) {
   1051     StringRef v = A->getValue();
   1052     CmdArgs.push_back("-mllvm");
   1053     CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
   1054     A->claim();
   1055   }
   1056 }
   1057 
   1058 /// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
   1059 static std::string getPPCTargetCPU(const ArgList &Args) {
   1060   if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
   1061     StringRef CPUName = A->getValue();
   1062 
   1063     if (CPUName == "native") {
   1064       std::string CPU = llvm::sys::getHostCPUName();
   1065       if (!CPU.empty() && CPU != "generic")
   1066         return CPU;
   1067       else
   1068         return "";
   1069     }
   1070 
   1071     return llvm::StringSwitch<const char *>(CPUName)
   1072       .Case("common", "generic")
   1073       .Case("440", "440")
   1074       .Case("440fp", "440")
   1075       .Case("450", "450")
   1076       .Case("601", "601")
   1077       .Case("602", "602")
   1078       .Case("603", "603")
   1079       .Case("603e", "603e")
   1080       .Case("603ev", "603ev")
   1081       .Case("604", "604")
   1082       .Case("604e", "604e")
   1083       .Case("620", "620")
   1084       .Case("630", "pwr3")
   1085       .Case("G3", "g3")
   1086       .Case("7400", "7400")
   1087       .Case("G4", "g4")
   1088       .Case("7450", "7450")
   1089       .Case("G4+", "g4+")
   1090       .Case("750", "750")
   1091       .Case("970", "970")
   1092       .Case("G5", "g5")
   1093       .Case("a2", "a2")
   1094       .Case("a2q", "a2q")
   1095       .Case("e500mc", "e500mc")
   1096       .Case("e5500", "e5500")
   1097       .Case("power3", "pwr3")
   1098       .Case("power4", "pwr4")
   1099       .Case("power5", "pwr5")
   1100       .Case("power5x", "pwr5x")
   1101       .Case("power6", "pwr6")
   1102       .Case("power6x", "pwr6x")
   1103       .Case("power7", "pwr7")
   1104       .Case("pwr3", "pwr3")
   1105       .Case("pwr4", "pwr4")
   1106       .Case("pwr5", "pwr5")
   1107       .Case("pwr5x", "pwr5x")
   1108       .Case("pwr6", "pwr6")
   1109       .Case("pwr6x", "pwr6x")
   1110       .Case("pwr7", "pwr7")
   1111       .Case("powerpc", "ppc")
   1112       .Case("powerpc64", "ppc64")
   1113       .Case("powerpc64le", "ppc64le")
   1114       .Default("");
   1115   }
   1116 
   1117   return "";
   1118 }
   1119 
   1120 void Clang::AddPPCTargetArgs(const ArgList &Args,
   1121                              ArgStringList &CmdArgs) const {
   1122   std::string TargetCPUName = getPPCTargetCPU(Args);
   1123 
   1124   // LLVM may default to generating code for the native CPU,
   1125   // but, like gcc, we default to a more generic option for
   1126   // each architecture. (except on Darwin)
   1127   llvm::Triple Triple = getToolChain().getTriple();
   1128   if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
   1129     if (Triple.getArch() == llvm::Triple::ppc64)
   1130       TargetCPUName = "ppc64";
   1131     else if (Triple.getArch() == llvm::Triple::ppc64le)
   1132       TargetCPUName = "ppc64le";
   1133     else
   1134       TargetCPUName = "ppc";
   1135   }
   1136 
   1137   if (!TargetCPUName.empty()) {
   1138     CmdArgs.push_back("-target-cpu");
   1139     CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
   1140   }
   1141 
   1142   // Allow override of the Altivec feature.
   1143   AddTargetFeature(Args, CmdArgs,
   1144                    options::OPT_faltivec, options::OPT_fno_altivec,
   1145                    "altivec");
   1146 
   1147   AddTargetFeature(Args, CmdArgs,
   1148                    options::OPT_mfprnd, options::OPT_mno_fprnd,
   1149                    "fprnd");
   1150 
   1151   // Note that gcc calls this mfcrf and LLVM calls this mfocrf.
   1152   AddTargetFeature(Args, CmdArgs,
   1153                    options::OPT_mmfcrf, options::OPT_mno_mfcrf,
   1154                    "mfocrf");
   1155 
   1156   AddTargetFeature(Args, CmdArgs,
   1157                    options::OPT_mpopcntd, options::OPT_mno_popcntd,
   1158                    "popcntd");
   1159 
   1160   // It is really only possible to turn qpx off because turning qpx on is tied
   1161   // to using the a2q CPU.
   1162   if (Args.hasFlag(options::OPT_mno_qpx, options::OPT_mqpx, false)) {
   1163     CmdArgs.push_back("-target-feature");
   1164     CmdArgs.push_back("-qpx");
   1165   }
   1166 }
   1167 
   1168 /// Get the (LLVM) name of the R600 gpu we are targeting.
   1169 static std::string getR600TargetGPU(const ArgList &Args) {
   1170   if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
   1171     std::string GPUName = A->getValue();
   1172     return llvm::StringSwitch<const char *>(GPUName)
   1173       .Cases("rv630", "rv635", "r600")
   1174       .Cases("rv610", "rv620", "rs780", "rs880")
   1175       .Case("rv740", "rv770")
   1176       .Case("palm", "cedar")
   1177       .Cases("sumo", "sumo2", "sumo")
   1178       .Case("hemlock", "cypress")
   1179       .Case("aruba", "cayman")
   1180       .Default(GPUName.c_str());
   1181   }
   1182   return "";
   1183 }
   1184 
   1185 void Clang::AddR600TargetArgs(const ArgList &Args,
   1186                               ArgStringList &CmdArgs) const {
   1187   std::string TargetGPUName = getR600TargetGPU(Args);
   1188   CmdArgs.push_back("-target-cpu");
   1189   CmdArgs.push_back(Args.MakeArgString(TargetGPUName.c_str()));
   1190 }
   1191 
   1192 void Clang::AddSparcTargetArgs(const ArgList &Args,
   1193                              ArgStringList &CmdArgs) const {
   1194   const Driver &D = getToolChain().getDriver();
   1195 
   1196   if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
   1197     CmdArgs.push_back("-target-cpu");
   1198     CmdArgs.push_back(A->getValue());
   1199   }
   1200 
   1201   // Select the float ABI as determined by -msoft-float, -mhard-float, and
   1202   StringRef FloatABI;
   1203   if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
   1204                                options::OPT_mhard_float)) {
   1205     if (A->getOption().matches(options::OPT_msoft_float))
   1206       FloatABI = "soft";
   1207     else if (A->getOption().matches(options::OPT_mhard_float))
   1208       FloatABI = "hard";
   1209   }
   1210 
   1211   // If unspecified, choose the default based on the platform.
   1212   if (FloatABI.empty()) {
   1213     // Assume "soft", but warn the user we are guessing.
   1214     FloatABI = "soft";
   1215     D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
   1216   }
   1217 
   1218   if (FloatABI == "soft") {
   1219     // Floating point operations and argument passing are soft.
   1220     //
   1221     // FIXME: This changes CPP defines, we need -target-soft-float.
   1222     CmdArgs.push_back("-msoft-float");
   1223     CmdArgs.push_back("-target-feature");
   1224     CmdArgs.push_back("+soft-float");
   1225   } else {
   1226     assert(FloatABI == "hard" && "Invalid float abi!");
   1227     CmdArgs.push_back("-mhard-float");
   1228   }
   1229 }
   1230 
   1231 static const char *getSystemZTargetCPU(const ArgList &Args) {
   1232   if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
   1233     return A->getValue();
   1234   return "z10";
   1235 }
   1236 
   1237 void Clang::AddSystemZTargetArgs(const ArgList &Args,
   1238                                  ArgStringList &CmdArgs) const {
   1239   const char *CPUName = getSystemZTargetCPU(Args);
   1240   CmdArgs.push_back("-target-cpu");
   1241   CmdArgs.push_back(CPUName);
   1242 }
   1243 
   1244 static const char *getX86TargetCPU(const ArgList &Args,
   1245                                    const llvm::Triple &Triple) {
   1246   if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
   1247     if (StringRef(A->getValue()) != "native")
   1248       return A->getValue();
   1249 
   1250     // FIXME: Reject attempts to use -march=native unless the target matches
   1251     // the host.
   1252     //
   1253     // FIXME: We should also incorporate the detected target features for use
   1254     // with -native.
   1255     std::string CPU = llvm::sys::getHostCPUName();
   1256     if (!CPU.empty() && CPU != "generic")
   1257       return Args.MakeArgString(CPU);
   1258   }
   1259 
   1260   // Select the default CPU if none was given (or detection failed).
   1261 
   1262   if (Triple.getArch() != llvm::Triple::x86_64 &&
   1263       Triple.getArch() != llvm::Triple::x86)
   1264     return 0; // This routine is only handling x86 targets.
   1265 
   1266   bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
   1267 
   1268   // FIXME: Need target hooks.
   1269   if (Triple.isOSDarwin())
   1270     return Is64Bit ? "core2" : "yonah";
   1271 
   1272   // Everything else goes to x86-64 in 64-bit mode.
   1273   if (Is64Bit)
   1274     return "x86-64";
   1275 
   1276   if (Triple.getOSName().startswith("haiku"))
   1277     return "i586";
   1278   if (Triple.getOSName().startswith("openbsd"))
   1279     return "i486";
   1280   if (Triple.getOSName().startswith("bitrig"))
   1281     return "i686";
   1282   if (Triple.getOSName().startswith("freebsd"))
   1283     return "i486";
   1284   if (Triple.getOSName().startswith("netbsd"))
   1285     return "i486";
   1286   // All x86 devices running Android have core2 as their common
   1287   // denominator. This makes a better choice than pentium4.
   1288   if (Triple.getEnvironment() == llvm::Triple::Android)
   1289     return "core2";
   1290 
   1291   // Fallback to p4.
   1292   return "pentium4";
   1293 }
   1294 
   1295 void Clang::AddX86TargetArgs(const ArgList &Args,
   1296                              ArgStringList &CmdArgs) const {
   1297   if (!Args.hasFlag(options::OPT_mred_zone,
   1298                     options::OPT_mno_red_zone,
   1299                     true) ||
   1300       Args.hasArg(options::OPT_mkernel) ||
   1301       Args.hasArg(options::OPT_fapple_kext))
   1302     CmdArgs.push_back("-disable-red-zone");
   1303 
   1304   // Default to avoid implicit floating-point for kernel/kext code, but allow
   1305   // that to be overridden with -mno-soft-float.
   1306   bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
   1307                           Args.hasArg(options::OPT_fapple_kext));
   1308   if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
   1309                                options::OPT_mno_soft_float,
   1310                                options::OPT_mimplicit_float,
   1311                                options::OPT_mno_implicit_float)) {
   1312     const Option &O = A->getOption();
   1313     NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
   1314                        O.matches(options::OPT_msoft_float));
   1315   }
   1316   if (NoImplicitFloat)
   1317     CmdArgs.push_back("-no-implicit-float");
   1318 
   1319   if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
   1320     CmdArgs.push_back("-target-cpu");
   1321     CmdArgs.push_back(CPUName);
   1322   }
   1323 
   1324   // The required algorithm here is slightly strange: the options are applied
   1325   // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
   1326   // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
   1327   // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
   1328   // former correctly, but not the latter; handle directly-overridden
   1329   // attributes here.
   1330   llvm::StringMap<unsigned> PrevFeature;
   1331   std::vector<const char*> Features;
   1332   for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
   1333          ie = Args.filtered_end(); it != ie; ++it) {
   1334     StringRef Name = (*it)->getOption().getName();
   1335     (*it)->claim();
   1336 
   1337     // Skip over "-m".
   1338     assert(Name.startswith("m") && "Invalid feature name.");
   1339     Name = Name.substr(1);
   1340 
   1341     bool IsNegative = Name.startswith("no-");
   1342     if (IsNegative)
   1343       Name = Name.substr(3);
   1344 
   1345     unsigned& Prev = PrevFeature[Name];
   1346     if (Prev)
   1347       Features[Prev - 1] = 0;
   1348     Prev = Features.size() + 1;
   1349     Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
   1350   }
   1351   for (unsigned i = 0; i < Features.size(); i++) {
   1352     if (Features[i]) {
   1353       CmdArgs.push_back("-target-feature");
   1354       CmdArgs.push_back(Features[i]);
   1355     }
   1356   }
   1357 }
   1358 
   1359 static inline bool HasPICArg(const ArgList &Args) {
   1360   return Args.hasArg(options::OPT_fPIC)
   1361     || Args.hasArg(options::OPT_fpic);
   1362 }
   1363 
   1364 static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
   1365   return Args.getLastArg(options::OPT_G,
   1366                          options::OPT_G_EQ,
   1367                          options::OPT_msmall_data_threshold_EQ);
   1368 }
   1369 
   1370 static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
   1371   std::string value;
   1372   if (HasPICArg(Args))
   1373     value = "0";
   1374   else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
   1375     value = A->getValue();
   1376     A->claim();
   1377   }
   1378   return value;
   1379 }
   1380 
   1381 void Clang::AddHexagonTargetArgs(const ArgList &Args,
   1382                                  ArgStringList &CmdArgs) const {
   1383   llvm::Triple Triple = getToolChain().getTriple();
   1384 
   1385   CmdArgs.push_back("-target-cpu");
   1386   CmdArgs.push_back(Args.MakeArgString(
   1387                       "hexagon"
   1388                       + toolchains::Hexagon_TC::GetTargetCPU(Args)));
   1389   CmdArgs.push_back("-fno-signed-char");
   1390   CmdArgs.push_back("-mqdsp6-compat");
   1391   CmdArgs.push_back("-Wreturn-type");
   1392 
   1393   std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
   1394   if (!SmallDataThreshold.empty()) {
   1395     CmdArgs.push_back ("-mllvm");
   1396     CmdArgs.push_back(Args.MakeArgString(
   1397                         "-hexagon-small-data-threshold=" + SmallDataThreshold));
   1398   }
   1399 
   1400   if (!Args.hasArg(options::OPT_fno_short_enums))
   1401     CmdArgs.push_back("-fshort-enums");
   1402   if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
   1403     CmdArgs.push_back ("-mllvm");
   1404     CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
   1405   }
   1406   CmdArgs.push_back ("-mllvm");
   1407   CmdArgs.push_back ("-machine-sink-split=0");
   1408 }
   1409 
   1410 void Clang::AddAArch64TargetArgs(const ArgList &Args,
   1411                                  ArgStringList &CmdArgs) const {
   1412   const Driver &D = getToolChain().getDriver();
   1413   // Honor -mfpu=.
   1414   if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
   1415     addFPUArgs(D, A, Args, CmdArgs);
   1416 }
   1417 
   1418 static bool
   1419 shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
   1420                                           const llvm::Triple &Triple) {
   1421   // We use the zero-cost exception tables for Objective-C if the non-fragile
   1422   // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
   1423   // later.
   1424   if (runtime.isNonFragile())
   1425     return true;
   1426 
   1427   if (!Triple.isOSDarwin())
   1428     return false;
   1429 
   1430   return (!Triple.isMacOSXVersionLT(10,5) &&
   1431           (Triple.getArch() == llvm::Triple::x86_64 ||
   1432            Triple.getArch() == llvm::Triple::arm));
   1433 }
   1434 
   1435 /// addExceptionArgs - Adds exception related arguments to the driver command
   1436 /// arguments. There's a master flag, -fexceptions and also language specific
   1437 /// flags to enable/disable C++ and Objective-C exceptions.
   1438 /// This makes it possible to for example disable C++ exceptions but enable
   1439 /// Objective-C exceptions.
   1440 static void addExceptionArgs(const ArgList &Args, types::ID InputType,
   1441                              const llvm::Triple &Triple,
   1442                              bool KernelOrKext,
   1443                              const ObjCRuntime &objcRuntime,
   1444                              ArgStringList &CmdArgs) {
   1445   if (KernelOrKext) {
   1446     // -mkernel and -fapple-kext imply no exceptions, so claim exception related
   1447     // arguments now to avoid warnings about unused arguments.
   1448     Args.ClaimAllArgs(options::OPT_fexceptions);
   1449     Args.ClaimAllArgs(options::OPT_fno_exceptions);
   1450     Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
   1451     Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
   1452     Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
   1453     Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
   1454     return;
   1455   }
   1456 
   1457   // Exceptions are enabled by default.
   1458   bool ExceptionsEnabled = true;
   1459 
   1460   // This keeps track of whether exceptions were explicitly turned on or off.
   1461   bool DidHaveExplicitExceptionFlag = false;
   1462 
   1463   if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
   1464                                options::OPT_fno_exceptions)) {
   1465     if (A->getOption().matches(options::OPT_fexceptions))
   1466       ExceptionsEnabled = true;
   1467     else
   1468       ExceptionsEnabled = false;
   1469 
   1470     DidHaveExplicitExceptionFlag = true;
   1471   }
   1472 
   1473   bool ShouldUseExceptionTables = false;
   1474 
   1475   // Exception tables and cleanups can be enabled with -fexceptions even if the
   1476   // language itself doesn't support exceptions.
   1477   if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
   1478     ShouldUseExceptionTables = true;
   1479 
   1480   // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
   1481   // is not necessarily sensible, but follows GCC.
   1482   if (types::isObjC(InputType) &&
   1483       Args.hasFlag(options::OPT_fobjc_exceptions,
   1484                    options::OPT_fno_objc_exceptions,
   1485                    true)) {
   1486     CmdArgs.push_back("-fobjc-exceptions");
   1487 
   1488     ShouldUseExceptionTables |=
   1489       shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
   1490   }
   1491 
   1492   if (types::isCXX(InputType)) {
   1493     bool CXXExceptionsEnabled = ExceptionsEnabled;
   1494 
   1495     if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
   1496                                  options::OPT_fno_cxx_exceptions,
   1497                                  options::OPT_fexceptions,
   1498                                  options::OPT_fno_exceptions)) {
   1499       if (A->getOption().matches(options::OPT_fcxx_exceptions))
   1500         CXXExceptionsEnabled = true;
   1501       else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
   1502         CXXExceptionsEnabled = false;
   1503     }
   1504 
   1505     if (CXXExceptionsEnabled) {
   1506       CmdArgs.push_back("-fcxx-exceptions");
   1507 
   1508       ShouldUseExceptionTables = true;
   1509     }
   1510   }
   1511 
   1512   if (ShouldUseExceptionTables)
   1513     CmdArgs.push_back("-fexceptions");
   1514 }
   1515 
   1516 static bool ShouldDisableAutolink(const ArgList &Args,
   1517                              const ToolChain &TC) {
   1518   bool Default = true;
   1519   if (TC.getTriple().isOSDarwin()) {
   1520     // The native darwin assembler doesn't support the linker_option directives,
   1521     // so we disable them if we think the .s file will be passed to it.
   1522     Default = TC.useIntegratedAs();
   1523   }
   1524   return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
   1525                        Default);
   1526 }
   1527 
   1528 static bool ShouldDisableCFI(const ArgList &Args,
   1529                              const ToolChain &TC) {
   1530   bool Default = true;
   1531   if (TC.getTriple().isOSDarwin()) {
   1532     // The native darwin assembler doesn't support cfi directives, so
   1533     // we disable them if we think the .s file will be passed to it.
   1534     Default = TC.useIntegratedAs();
   1535   }
   1536   return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
   1537                        options::OPT_fno_dwarf2_cfi_asm,
   1538                        Default);
   1539 }
   1540 
   1541 static bool ShouldDisableDwarfDirectory(const ArgList &Args,
   1542                                         const ToolChain &TC) {
   1543   bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
   1544                                         options::OPT_fno_dwarf_directory_asm,
   1545                                         TC.useIntegratedAs());
   1546   return !UseDwarfDirectory;
   1547 }
   1548 
   1549 /// \brief Check whether the given input tree contains any compilation actions.
   1550 static bool ContainsCompileAction(const Action *A) {
   1551   if (isa<CompileJobAction>(A))
   1552     return true;
   1553 
   1554   for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
   1555     if (ContainsCompileAction(*it))
   1556       return true;
   1557 
   1558   return false;
   1559 }
   1560 
   1561 /// \brief Check if -relax-all should be passed to the internal assembler.
   1562 /// This is done by default when compiling non-assembler source with -O0.
   1563 static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
   1564   bool RelaxDefault = true;
   1565 
   1566   if (Arg *A = Args.getLastArg(options::OPT_O_Group))
   1567     RelaxDefault = A->getOption().matches(options::OPT_O0);
   1568 
   1569   if (RelaxDefault) {
   1570     RelaxDefault = false;
   1571     for (ActionList::const_iterator it = C.getActions().begin(),
   1572            ie = C.getActions().end(); it != ie; ++it) {
   1573       if (ContainsCompileAction(*it)) {
   1574         RelaxDefault = true;
   1575         break;
   1576       }
   1577     }
   1578   }
   1579 
   1580   return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
   1581     RelaxDefault);
   1582 }
   1583 
   1584 static void CollectArgsForIntegratedAssembler(Compilation &C,
   1585                                               const ArgList &Args,
   1586                                               ArgStringList &CmdArgs,
   1587                                               const Driver &D) {
   1588     if (UseRelaxAll(C, Args))
   1589       CmdArgs.push_back("-mrelax-all");
   1590 
   1591     // When using an integrated assembler, translate -Wa, and -Xassembler
   1592     // options.
   1593     for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
   1594                                                options::OPT_Xassembler),
   1595            ie = Args.filtered_end(); it != ie; ++it) {
   1596       const Arg *A = *it;
   1597       A->claim();
   1598 
   1599       for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
   1600         StringRef Value = A->getValue(i);
   1601 
   1602         if (Value == "-force_cpusubtype_ALL") {
   1603           // Do nothing, this is the default and we don't support anything else.
   1604         } else if (Value == "-L") {
   1605           CmdArgs.push_back("-msave-temp-labels");
   1606         } else if (Value == "--fatal-warnings") {
   1607           CmdArgs.push_back("-mllvm");
   1608           CmdArgs.push_back("-fatal-assembler-warnings");
   1609         } else if (Value == "--noexecstack") {
   1610           CmdArgs.push_back("-mnoexecstack");
   1611         } else {
   1612           D.Diag(diag::err_drv_unsupported_option_argument)
   1613             << A->getOption().getName() << Value;
   1614         }
   1615       }
   1616     }
   1617 }
   1618 
   1619 SanitizerArgs::SanitizerArgs(const ToolChain &TC, const ArgList &Args)
   1620     : Kind(0), BlacklistFile(""), MsanTrackOrigins(false),
   1621       AsanZeroBaseShadow(false) {
   1622   unsigned AllKinds = 0;  // All kinds of sanitizers that were turned on
   1623                           // at least once (possibly, disabled further).
   1624   const Driver &D = TC.getDriver();
   1625   for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
   1626     unsigned Add, Remove;
   1627     if (!parse(D, Args, *I, Add, Remove, true))
   1628       continue;
   1629     (*I)->claim();
   1630     Kind |= Add;
   1631     Kind &= ~Remove;
   1632     AllKinds |= Add;
   1633   }
   1634 
   1635   UbsanTrapOnError =
   1636     Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
   1637     Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
   1638                  options::OPT_fno_sanitize_undefined_trap_on_error, false);
   1639 
   1640   if (Args.hasArg(options::OPT_fcatch_undefined_behavior) &&
   1641       !Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
   1642                     options::OPT_fno_sanitize_undefined_trap_on_error, true)) {
   1643     D.Diag(diag::err_drv_argument_not_allowed_with)
   1644       << "-fcatch-undefined-behavior"
   1645       << "-fno-sanitize-undefined-trap-on-error";
   1646   }
   1647 
   1648   // Warn about undefined sanitizer options that require runtime support.
   1649   if (UbsanTrapOnError && notAllowedWithTrap()) {
   1650     if (Args.hasArg(options::OPT_fcatch_undefined_behavior))
   1651       D.Diag(diag::err_drv_argument_not_allowed_with)
   1652         << lastArgumentForKind(D, Args, NotAllowedWithTrap)
   1653         << "-fcatch-undefined-behavior";
   1654     else if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
   1655                           options::OPT_fno_sanitize_undefined_trap_on_error,
   1656                           false))
   1657       D.Diag(diag::err_drv_argument_not_allowed_with)
   1658         << lastArgumentForKind(D, Args, NotAllowedWithTrap)
   1659         << "-fsanitize-undefined-trap-on-error";
   1660   }
   1661 
   1662   // Only one runtime library can be used at once.
   1663   bool NeedsAsan = needsAsanRt();
   1664   bool NeedsTsan = needsTsanRt();
   1665   bool NeedsMsan = needsMsanRt();
   1666   bool NeedsLsan = needsLeakDetection();
   1667   if (NeedsAsan && NeedsTsan)
   1668     D.Diag(diag::err_drv_argument_not_allowed_with)
   1669       << lastArgumentForKind(D, Args, NeedsAsanRt)
   1670       << lastArgumentForKind(D, Args, NeedsTsanRt);
   1671   if (NeedsAsan && NeedsMsan)
   1672     D.Diag(diag::err_drv_argument_not_allowed_with)
   1673       << lastArgumentForKind(D, Args, NeedsAsanRt)
   1674       << lastArgumentForKind(D, Args, NeedsMsanRt);
   1675   if (NeedsTsan && NeedsMsan)
   1676     D.Diag(diag::err_drv_argument_not_allowed_with)
   1677       << lastArgumentForKind(D, Args, NeedsTsanRt)
   1678       << lastArgumentForKind(D, Args, NeedsMsanRt);
   1679   if (NeedsLsan && NeedsTsan)
   1680     D.Diag(diag::err_drv_argument_not_allowed_with)
   1681       << lastArgumentForKind(D, Args, NeedsLeakDetection)
   1682       << lastArgumentForKind(D, Args, NeedsTsanRt);
   1683   if (NeedsLsan && NeedsMsan)
   1684     D.Diag(diag::err_drv_argument_not_allowed_with)
   1685       << lastArgumentForKind(D, Args, NeedsLeakDetection)
   1686       << lastArgumentForKind(D, Args, NeedsMsanRt);
   1687   // FIXME: Currenly -fsanitize=leak is silently ignored in the presence of
   1688   // -fsanitize=address. Perhaps it should print an error, or perhaps
   1689   // -f(-no)sanitize=leak should change whether leak detection is enabled by
   1690   // default in ASan?
   1691 
   1692   // If -fsanitize contains extra features of ASan, it should also
   1693   // explicitly contain -fsanitize=address (probably, turned off later in the
   1694   // command line).
   1695   if ((Kind & AddressFull) != 0 && (AllKinds & Address) == 0)
   1696     D.Diag(diag::warn_drv_unused_sanitizer)
   1697      << lastArgumentForKind(D, Args, AddressFull)
   1698      << "-fsanitize=address";
   1699 
   1700   // Parse -f(no-)sanitize-blacklist options.
   1701   if (Arg *BLArg = Args.getLastArg(options::OPT_fsanitize_blacklist,
   1702                                    options::OPT_fno_sanitize_blacklist)) {
   1703     if (BLArg->getOption().matches(options::OPT_fsanitize_blacklist)) {
   1704       std::string BLPath = BLArg->getValue();
   1705       if (llvm::sys::fs::exists(BLPath))
   1706         BlacklistFile = BLPath;
   1707       else
   1708         D.Diag(diag::err_drv_no_such_file) << BLPath;
   1709     }
   1710   } else {
   1711     // If no -fsanitize-blacklist option is specified, try to look up for
   1712     // blacklist in the resource directory.
   1713     std::string BLPath;
   1714     if (getDefaultBlacklistForKind(D, Kind, BLPath) &&
   1715         llvm::sys::fs::exists(BLPath))
   1716       BlacklistFile = BLPath;
   1717   }
   1718 
   1719   // Parse -f(no-)sanitize-memory-track-origins options.
   1720   if (NeedsMsan)
   1721     MsanTrackOrigins =
   1722       Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
   1723                    options::OPT_fno_sanitize_memory_track_origins,
   1724                    /* Default */false);
   1725 
   1726   // Parse -f(no-)sanitize-address-zero-base-shadow options.
   1727   if (NeedsAsan) {
   1728     bool IsAndroid = (TC.getTriple().getEnvironment() == llvm::Triple::Android);
   1729     bool ZeroBaseShadowDefault = IsAndroid;
   1730     AsanZeroBaseShadow =
   1731         Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow,
   1732                      options::OPT_fno_sanitize_address_zero_base_shadow,
   1733                      ZeroBaseShadowDefault);
   1734     // Zero-base shadow is a requirement on Android.
   1735     if (IsAndroid && !AsanZeroBaseShadow) {
   1736       D.Diag(diag::err_drv_argument_not_allowed_with)
   1737           << "-fno-sanitize-address-zero-base-shadow"
   1738           << lastArgumentForKind(D, Args, Address);
   1739     }
   1740   }
   1741 }
   1742 
   1743 static void addProfileRTLinux(
   1744     const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
   1745   if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
   1746         Args.hasArg(options::OPT_fprofile_generate) ||
   1747         Args.hasArg(options::OPT_fcreate_profile) ||
   1748         Args.hasArg(options::OPT_coverage)))
   1749     return;
   1750 
   1751   // The profile runtime is located in the Linux library directory and has name
   1752   // "libclang_rt.profile-<ArchName>.a".
   1753   SmallString<128> LibProfile(TC.getDriver().ResourceDir);
   1754   llvm::sys::path::append(
   1755       LibProfile, "lib", "linux",
   1756       Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
   1757 
   1758   CmdArgs.push_back(Args.MakeArgString(LibProfile));
   1759 }
   1760 
   1761 static void addSanitizerRTLinkFlagsLinux(
   1762     const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
   1763     const StringRef Sanitizer, bool BeforeLibStdCXX,
   1764     bool ExportSymbols = true) {
   1765   // Sanitizer runtime is located in the Linux library directory and
   1766   // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
   1767   SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
   1768   llvm::sys::path::append(
   1769       LibSanitizer, "lib", "linux",
   1770       (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
   1771 
   1772   // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
   1773   // etc.) so that the linker picks custom versions of the global 'operator
   1774   // new' and 'operator delete' symbols. We take the extreme (but simple)
   1775   // strategy of inserting it at the front of the link command. It also
   1776   // needs to be forced to end up in the executable, so wrap it in
   1777   // whole-archive.
   1778   SmallVector<const char *, 3> LibSanitizerArgs;
   1779   LibSanitizerArgs.push_back("-whole-archive");
   1780   LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
   1781   LibSanitizerArgs.push_back("-no-whole-archive");
   1782 
   1783   CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
   1784                  LibSanitizerArgs.begin(), LibSanitizerArgs.end());
   1785 
   1786   CmdArgs.push_back("-lpthread");
   1787   CmdArgs.push_back("-lrt");
   1788   CmdArgs.push_back("-ldl");
   1789 
   1790   // If possible, use a dynamic symbols file to export the symbols from the
   1791   // runtime library. If we can't do so, use -export-dynamic instead to export
   1792   // all symbols from the binary.
   1793   if (ExportSymbols) {
   1794     if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
   1795       CmdArgs.push_back(
   1796           Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
   1797     else
   1798       CmdArgs.push_back("-export-dynamic");
   1799   }
   1800 }
   1801 
   1802 /// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
   1803 /// This needs to be called before we add the C run-time (malloc, etc).
   1804 static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
   1805                            ArgStringList &CmdArgs) {
   1806   if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
   1807     SmallString<128> LibAsan(TC.getDriver().ResourceDir);
   1808     llvm::sys::path::append(LibAsan, "lib", "linux",
   1809         (Twine("libclang_rt.asan-") +
   1810             TC.getArchName() + "-android.so"));
   1811     CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
   1812   } else {
   1813     if (!Args.hasArg(options::OPT_shared))
   1814       addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
   1815   }
   1816 }
   1817 
   1818 /// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
   1819 /// This needs to be called before we add the C run-time (malloc, etc).
   1820 static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
   1821                            ArgStringList &CmdArgs) {
   1822   if (!Args.hasArg(options::OPT_shared))
   1823     addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
   1824 }
   1825 
   1826 /// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
   1827 /// This needs to be called before we add the C run-time (malloc, etc).
   1828 static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
   1829                            ArgStringList &CmdArgs) {
   1830   if (!Args.hasArg(options::OPT_shared))
   1831     addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
   1832 }
   1833 
   1834 /// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
   1835 /// This needs to be called before we add the C run-time (malloc, etc).
   1836 static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
   1837                            ArgStringList &CmdArgs) {
   1838   if (!Args.hasArg(options::OPT_shared))
   1839     addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
   1840 }
   1841 
   1842 /// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
   1843 /// (Linux).
   1844 static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
   1845                             ArgStringList &CmdArgs, bool IsCXX,
   1846                             bool HasOtherSanitizerRt) {
   1847   if (Args.hasArg(options::OPT_shared))
   1848     return;
   1849 
   1850   // Need a copy of sanitizer_common. This could come from another sanitizer
   1851   // runtime; if we're not including one, include our own copy.
   1852   if (!HasOtherSanitizerRt)
   1853     addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
   1854 
   1855   addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
   1856 
   1857   // Only include the bits of the runtime which need a C++ ABI library if
   1858   // we're linking in C++ mode.
   1859   if (IsCXX)
   1860     addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
   1861 }
   1862 
   1863 static bool shouldUseFramePointer(const ArgList &Args,
   1864                                   const llvm::Triple &Triple) {
   1865   if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
   1866                                options::OPT_fomit_frame_pointer))
   1867     return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
   1868 
   1869   // Don't use a frame pointer on linux x86, x86_64 and z if optimizing.
   1870   if ((Triple.getArch() == llvm::Triple::x86_64 ||
   1871        Triple.getArch() == llvm::Triple::x86 ||
   1872        Triple.getArch() == llvm::Triple::systemz) &&
   1873       Triple.getOS() == llvm::Triple::Linux) {
   1874     if (Arg *A = Args.getLastArg(options::OPT_O_Group))
   1875       if (!A->getOption().matches(options::OPT_O0))
   1876         return false;
   1877   }
   1878 
   1879   return true;
   1880 }
   1881 
   1882 static bool shouldUseLeafFramePointer(const ArgList &Args,
   1883                                       const llvm::Triple &Triple) {
   1884   if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
   1885                                options::OPT_momit_leaf_frame_pointer))
   1886     return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
   1887 
   1888   // Don't use a leaf frame pointer on linux x86, x86_64 and z if optimizing.
   1889   if ((Triple.getArch() == llvm::Triple::x86_64 ||
   1890        Triple.getArch() == llvm::Triple::x86 ||
   1891        Triple.getArch() == llvm::Triple::systemz) &&
   1892       Triple.getOS() == llvm::Triple::Linux) {
   1893     if (Arg *A = Args.getLastArg(options::OPT_O_Group))
   1894       if (!A->getOption().matches(options::OPT_O0))
   1895         return false;
   1896   }
   1897 
   1898   return true;
   1899 }
   1900 
   1901 /// If the PWD environment variable is set, add a CC1 option to specify the
   1902 /// debug compilation directory.
   1903 static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
   1904   const char *pwd = ::getenv("PWD");
   1905   if (!pwd)
   1906     return;
   1907 
   1908   llvm::sys::fs::file_status PWDStatus, DotStatus;
   1909   if (llvm::sys::path::is_absolute(pwd) &&
   1910       !llvm::sys::fs::status(pwd, PWDStatus) &&
   1911       !llvm::sys::fs::status(".", DotStatus) &&
   1912       PWDStatus.getUniqueID() == DotStatus.getUniqueID()) {
   1913     CmdArgs.push_back("-fdebug-compilation-dir");
   1914     CmdArgs.push_back(Args.MakeArgString(pwd));
   1915     return;
   1916   }
   1917 
   1918   // Fall back to using getcwd.
   1919   SmallString<128> cwd;
   1920   if (!llvm::sys::fs::current_path(cwd)) {
   1921     CmdArgs.push_back("-fdebug-compilation-dir");
   1922     CmdArgs.push_back(Args.MakeArgString(cwd));
   1923   }
   1924 }
   1925 
   1926 static const char *SplitDebugName(const ArgList &Args,
   1927                                   const InputInfoList &Inputs) {
   1928   Arg *FinalOutput = Args.getLastArg(options::OPT_o);
   1929   if (FinalOutput && Args.hasArg(options::OPT_c)) {
   1930     SmallString<128> T(FinalOutput->getValue());
   1931     llvm::sys::path::replace_extension(T, "dwo");
   1932     return Args.MakeArgString(T);
   1933   } else {
   1934     // Use the compilation dir.
   1935     SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
   1936     SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
   1937     llvm::sys::path::replace_extension(F, "dwo");
   1938     T += F;
   1939     return Args.MakeArgString(F);
   1940   }
   1941 }
   1942 
   1943 static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
   1944                            const Tool &T, const JobAction &JA,
   1945                            const ArgList &Args, const InputInfo &Output,
   1946                            const char *OutFile) {
   1947   ArgStringList ExtractArgs;
   1948   ExtractArgs.push_back("--extract-dwo");
   1949 
   1950   ArgStringList StripArgs;
   1951   StripArgs.push_back("--strip-dwo");
   1952 
   1953   // Grabbing the output of the earlier compile step.
   1954   StripArgs.push_back(Output.getFilename());
   1955   ExtractArgs.push_back(Output.getFilename());
   1956   ExtractArgs.push_back(OutFile);
   1957 
   1958   const char *Exec =
   1959     Args.MakeArgString(TC.GetProgramPath("objcopy"));
   1960 
   1961   // First extract the dwo sections.
   1962   C.addCommand(new Command(JA, T, Exec, ExtractArgs));
   1963 
   1964   // Then remove them from the original .o file.
   1965   C.addCommand(new Command(JA, T, Exec, StripArgs));
   1966 }
   1967 
   1968 static bool isOptimizationLevelFast(const ArgList &Args) {
   1969   if (Arg *A = Args.getLastArg(options::OPT_O_Group))
   1970     if (A->getOption().matches(options::OPT_Ofast))
   1971       return true;
   1972   return false;
   1973 }
   1974 
   1975 void Clang::ConstructJob(Compilation &C, const JobAction &JA,
   1976                          const InputInfo &Output,
   1977                          const InputInfoList &Inputs,
   1978                          const ArgList &Args,
   1979                          const char *LinkingOutput) const {
   1980   bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
   1981                                   options::OPT_fapple_kext);
   1982   const Driver &D = getToolChain().getDriver();
   1983   ArgStringList CmdArgs;
   1984 
   1985   assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
   1986 
   1987   // Invoke ourselves in -cc1 mode.
   1988   //
   1989   // FIXME: Implement custom jobs for internal actions.
   1990   CmdArgs.push_back("-cc1");
   1991 
   1992   // Add the "effective" target triple.
   1993   CmdArgs.push_back("-triple");
   1994   std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
   1995   CmdArgs.push_back(Args.MakeArgString(TripleStr));
   1996 
   1997   // Select the appropriate action.
   1998   RewriteKind rewriteKind = RK_None;
   1999 
   2000   if (isa<AnalyzeJobAction>(JA)) {
   2001     assert(JA.getType() == types::TY_Plist && "Invalid output type.");
   2002     CmdArgs.push_back("-analyze");
   2003   } else if (isa<MigrateJobAction>(JA)) {
   2004     CmdArgs.push_back("-migrate");
   2005   } else if (isa<PreprocessJobAction>(JA)) {
   2006     if (Output.getType() == types::TY_Dependencies)
   2007       CmdArgs.push_back("-Eonly");
   2008     else {
   2009       CmdArgs.push_back("-E");
   2010       if (Args.hasArg(options::OPT_rewrite_objc) &&
   2011           !Args.hasArg(options::OPT_g_Group))
   2012         CmdArgs.push_back("-P");
   2013     }
   2014   } else if (isa<AssembleJobAction>(JA)) {
   2015     CmdArgs.push_back("-emit-obj");
   2016 
   2017     CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
   2018 
   2019     // Also ignore explicit -force_cpusubtype_ALL option.
   2020     (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
   2021   } else if (isa<PrecompileJobAction>(JA)) {
   2022     // Use PCH if the user requested it.
   2023     bool UsePCH = D.CCCUsePCH;
   2024 
   2025     if (JA.getType() == types::TY_Nothing)
   2026       CmdArgs.push_back("-fsyntax-only");
   2027     else if (UsePCH)
   2028       CmdArgs.push_back("-emit-pch");
   2029     else
   2030       CmdArgs.push_back("-emit-pth");
   2031   } else {
   2032     assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
   2033 
   2034     if (JA.getType() == types::TY_Nothing) {
   2035       CmdArgs.push_back("-fsyntax-only");
   2036     } else if (JA.getType() == types::TY_LLVM_IR ||
   2037                JA.getType() == types::TY_LTO_IR) {
   2038       CmdArgs.push_back("-emit-llvm");
   2039     } else if (JA.getType() == types::TY_LLVM_BC ||
   2040                JA.getType() == types::TY_LTO_BC) {
   2041       CmdArgs.push_back("-emit-llvm-bc");
   2042     } else if (JA.getType() == types::TY_PP_Asm) {
   2043       CmdArgs.push_back("-S");
   2044     } else if (JA.getType() == types::TY_AST) {
   2045       CmdArgs.push_back("-emit-pch");
   2046     } else if (JA.getType() == types::TY_ModuleFile) {
   2047       CmdArgs.push_back("-module-file-info");
   2048     } else if (JA.getType() == types::TY_RewrittenObjC) {
   2049       CmdArgs.push_back("-rewrite-objc");
   2050       rewriteKind = RK_NonFragile;
   2051     } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
   2052       CmdArgs.push_back("-rewrite-objc");
   2053       rewriteKind = RK_Fragile;
   2054     } else {
   2055       assert(JA.getType() == types::TY_PP_Asm &&
   2056              "Unexpected output type!");
   2057     }
   2058   }
   2059 
   2060   // The make clang go fast button.
   2061   CmdArgs.push_back("-disable-free");
   2062 
   2063   // Disable the verification pass in -asserts builds.
   2064 #ifdef NDEBUG
   2065   CmdArgs.push_back("-disable-llvm-verifier");
   2066 #endif
   2067 
   2068   // Set the main file name, so that debug info works even with
   2069   // -save-temps.
   2070   CmdArgs.push_back("-main-file-name");
   2071   CmdArgs.push_back(getBaseInputName(Args, Inputs));
   2072 
   2073   // Some flags which affect the language (via preprocessor
   2074   // defines).
   2075   if (Args.hasArg(options::OPT_static))
   2076     CmdArgs.push_back("-static-define");
   2077 
   2078   if (isa<AnalyzeJobAction>(JA)) {
   2079     // Enable region store model by default.
   2080     CmdArgs.push_back("-analyzer-store=region");
   2081 
   2082     // Treat blocks as analysis entry points.
   2083     CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
   2084 
   2085     CmdArgs.push_back("-analyzer-eagerly-assume");
   2086 
   2087     // Add default argument set.
   2088     if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
   2089       CmdArgs.push_back("-analyzer-checker=core");
   2090 
   2091       if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
   2092         CmdArgs.push_back("-analyzer-checker=unix");
   2093 
   2094       if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
   2095         CmdArgs.push_back("-analyzer-checker=osx");
   2096 
   2097       CmdArgs.push_back("-analyzer-checker=deadcode");
   2098 
   2099       if (types::isCXX(Inputs[0].getType()))
   2100         CmdArgs.push_back("-analyzer-checker=cplusplus");
   2101 
   2102       // Enable the following experimental checkers for testing.
   2103       CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
   2104       CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
   2105       CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
   2106       CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
   2107       CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
   2108       CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
   2109     }
   2110 
   2111     // Set the output format. The default is plist, for (lame) historical
   2112     // reasons.
   2113     CmdArgs.push_back("-analyzer-output");
   2114     if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
   2115       CmdArgs.push_back(A->getValue());
   2116     else
   2117       CmdArgs.push_back("plist");
   2118 
   2119     // Disable the presentation of standard compiler warnings when
   2120     // using --analyze.  We only want to show static analyzer diagnostics
   2121     // or frontend errors.
   2122     CmdArgs.push_back("-w");
   2123 
   2124     // Add -Xanalyzer arguments when running as analyzer.
   2125     Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
   2126   }
   2127 
   2128   CheckCodeGenerationOptions(D, Args);
   2129 
   2130   bool PIE = getToolChain().isPIEDefault();
   2131   bool PIC = PIE || getToolChain().isPICDefault();
   2132   bool IsPICLevelTwo = PIC;
   2133 
   2134   // For the PIC and PIE flag options, this logic is different from the
   2135   // legacy logic in very old versions of GCC, as that logic was just
   2136   // a bug no one had ever fixed. This logic is both more rational and
   2137   // consistent with GCC's new logic now that the bugs are fixed. The last
   2138   // argument relating to either PIC or PIE wins, and no other argument is
   2139   // used. If the last argument is any flavor of the '-fno-...' arguments,
   2140   // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
   2141   // at the same level.
   2142   Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
   2143                                  options::OPT_fpic, options::OPT_fno_pic,
   2144                                  options::OPT_fPIE, options::OPT_fno_PIE,
   2145                                  options::OPT_fpie, options::OPT_fno_pie);
   2146   // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
   2147   // is forced, then neither PIC nor PIE flags will have no effect.
   2148   if (!getToolChain().isPICDefaultForced()) {
   2149     if (LastPICArg) {
   2150       Option O = LastPICArg->getOption();
   2151       if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
   2152           O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
   2153         PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
   2154         PIC = PIE || O.matches(options::OPT_fPIC) ||
   2155               O.matches(options::OPT_fpic);
   2156         IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
   2157                         O.matches(options::OPT_fPIC);
   2158       } else {
   2159         PIE = PIC = false;
   2160       }
   2161     }
   2162   }
   2163 
   2164   // Inroduce a Darwin-specific hack. If the default is PIC but the flags
   2165   // specified while enabling PIC enabled level 1 PIC, just force it back to
   2166   // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
   2167   // informal testing).
   2168   if (PIC && getToolChain().getTriple().isOSDarwin())
   2169     IsPICLevelTwo |= getToolChain().isPICDefault();
   2170 
   2171   // Note that these flags are trump-cards. Regardless of the order w.r.t. the
   2172   // PIC or PIE options above, if these show up, PIC is disabled.
   2173   llvm::Triple Triple(TripleStr);
   2174   if (KernelOrKext &&
   2175       (Triple.getOS() != llvm::Triple::IOS ||
   2176        Triple.isOSVersionLT(6)))
   2177     PIC = PIE = false;
   2178   if (Args.hasArg(options::OPT_static))
   2179     PIC = PIE = false;
   2180 
   2181   if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
   2182     // This is a very special mode. It trumps the other modes, almost no one
   2183     // uses it, and it isn't even valid on any OS but Darwin.
   2184     if (!getToolChain().getTriple().isOSDarwin())
   2185       D.Diag(diag::err_drv_unsupported_opt_for_target)
   2186         << A->getSpelling() << getToolChain().getTriple().str();
   2187 
   2188     // FIXME: Warn when this flag trumps some other PIC or PIE flag.
   2189 
   2190     CmdArgs.push_back("-mrelocation-model");
   2191     CmdArgs.push_back("dynamic-no-pic");
   2192 
   2193     // Only a forced PIC mode can cause the actual compile to have PIC defines
   2194     // etc., no flags are sufficient. This behavior was selected to closely
   2195     // match that of llvm-gcc and Apple GCC before that.
   2196     if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
   2197       CmdArgs.push_back("-pic-level");
   2198       CmdArgs.push_back("2");
   2199     }
   2200   } else {
   2201     // Currently, LLVM only knows about PIC vs. static; the PIE differences are
   2202     // handled in Clang's IRGen by the -pie-level flag.
   2203     CmdArgs.push_back("-mrelocation-model");
   2204     CmdArgs.push_back(PIC ? "pic" : "static");
   2205 
   2206     if (PIC) {
   2207       CmdArgs.push_back("-pic-level");
   2208       CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
   2209       if (PIE) {
   2210         CmdArgs.push_back("-pie-level");
   2211         CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
   2212       }
   2213     }
   2214   }
   2215 
   2216   if (!Args.hasFlag(options::OPT_fmerge_all_constants,
   2217                     options::OPT_fno_merge_all_constants))
   2218     CmdArgs.push_back("-fno-merge-all-constants");
   2219 
   2220   // LLVM Code Generator Options.
   2221 
   2222   if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
   2223     CmdArgs.push_back("-mregparm");
   2224     CmdArgs.push_back(A->getValue());
   2225   }
   2226 
   2227   if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
   2228                                options::OPT_freg_struct_return)) {
   2229     if (getToolChain().getArch() != llvm::Triple::x86) {
   2230       D.Diag(diag::err_drv_unsupported_opt_for_target)
   2231         << A->getSpelling() << getToolChain().getTriple().str();
   2232     } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
   2233       CmdArgs.push_back("-fpcc-struct-return");
   2234     } else {
   2235       assert(A->getOption().matches(options::OPT_freg_struct_return));
   2236       CmdArgs.push_back("-freg-struct-return");
   2237     }
   2238   }
   2239 
   2240   if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
   2241     CmdArgs.push_back("-mrtd");
   2242 
   2243   if (shouldUseFramePointer(Args, getToolChain().getTriple()))
   2244     CmdArgs.push_back("-mdisable-fp-elim");
   2245   if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
   2246                     options::OPT_fno_zero_initialized_in_bss))
   2247     CmdArgs.push_back("-mno-zero-initialized-in-bss");
   2248 
   2249   bool OFastEnabled = isOptimizationLevelFast(Args);
   2250   // If -Ofast is the optimization level, then -fstrict-aliasing should be
   2251   // enabled.  This alias option is being used to simplify the hasFlag logic.
   2252   OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
   2253     options::OPT_fstrict_aliasing;
   2254   if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
   2255                     options::OPT_fno_strict_aliasing,
   2256                     getToolChain().IsStrictAliasingDefault()))
   2257     CmdArgs.push_back("-relaxed-aliasing");
   2258   if (Args.hasArg(options::OPT_fstruct_path_tbaa))
   2259     CmdArgs.push_back("-struct-path-tbaa");
   2260   if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
   2261                    false))
   2262     CmdArgs.push_back("-fstrict-enums");
   2263   if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
   2264                     options::OPT_fno_optimize_sibling_calls))
   2265     CmdArgs.push_back("-mdisable-tail-calls");
   2266 
   2267   // Handle segmented stacks.
   2268   if (Args.hasArg(options::OPT_fsplit_stack))
   2269     CmdArgs.push_back("-split-stacks");
   2270 
   2271   // If -Ofast is the optimization level, then -ffast-math should be enabled.
   2272   // This alias option is being used to simplify the getLastArg logic.
   2273   OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
   2274     options::OPT_ffast_math;
   2275 
   2276   // Handle various floating point optimization flags, mapping them to the
   2277   // appropriate LLVM code generation flags. The pattern for all of these is to
   2278   // default off the codegen optimizations, and if any flag enables them and no
   2279   // flag disables them after the flag enabling them, enable the codegen
   2280   // optimization. This is complicated by several "umbrella" flags.
   2281   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
   2282                                options::OPT_fno_fast_math,
   2283                                options::OPT_ffinite_math_only,
   2284                                options::OPT_fno_finite_math_only,
   2285                                options::OPT_fhonor_infinities,
   2286                                options::OPT_fno_honor_infinities))
   2287     if (A->getOption().getID() != options::OPT_fno_fast_math &&
   2288         A->getOption().getID() != options::OPT_fno_finite_math_only &&
   2289         A->getOption().getID() != options::OPT_fhonor_infinities)
   2290       CmdArgs.push_back("-menable-no-infs");
   2291   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
   2292                                options::OPT_fno_fast_math,
   2293                                options::OPT_ffinite_math_only,
   2294                                options::OPT_fno_finite_math_only,
   2295                                options::OPT_fhonor_nans,
   2296                                options::OPT_fno_honor_nans))
   2297     if (A->getOption().getID() != options::OPT_fno_fast_math &&
   2298         A->getOption().getID() != options::OPT_fno_finite_math_only &&
   2299         A->getOption().getID() != options::OPT_fhonor_nans)
   2300       CmdArgs.push_back("-menable-no-nans");
   2301 
   2302   // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
   2303   bool MathErrno = getToolChain().IsMathErrnoDefault();
   2304   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
   2305                                options::OPT_fno_fast_math,
   2306                                options::OPT_fmath_errno,
   2307                                options::OPT_fno_math_errno)) {
   2308     // Turning on -ffast_math (with either flag) removes the need for MathErrno.
   2309     // However, turning *off* -ffast_math merely restores the toolchain default
   2310     // (which may be false).
   2311     if (A->getOption().getID() == options::OPT_fno_math_errno ||
   2312         A->getOption().getID() == options::OPT_ffast_math ||
   2313         A->getOption().getID() == options::OPT_Ofast)
   2314       MathErrno = false;
   2315     else if (A->getOption().getID() == options::OPT_fmath_errno)
   2316       MathErrno = true;
   2317   }
   2318   if (MathErrno)
   2319     CmdArgs.push_back("-fmath-errno");
   2320 
   2321   // There are several flags which require disabling very specific
   2322   // optimizations. Any of these being disabled forces us to turn off the
   2323   // entire set of LLVM optimizations, so collect them through all the flag
   2324   // madness.
   2325   bool AssociativeMath = false;
   2326   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
   2327                                options::OPT_fno_fast_math,
   2328                                options::OPT_funsafe_math_optimizations,
   2329                                options::OPT_fno_unsafe_math_optimizations,
   2330                                options::OPT_fassociative_math,
   2331                                options::OPT_fno_associative_math))
   2332     if (A->getOption().getID() != options::OPT_fno_fast_math &&
   2333         A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
   2334         A->getOption().getID() != options::OPT_fno_associative_math)
   2335       AssociativeMath = true;
   2336   bool ReciprocalMath = false;
   2337   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
   2338                                options::OPT_fno_fast_math,
   2339                                options::OPT_funsafe_math_optimizations,
   2340                                options::OPT_fno_unsafe_math_optimizations,
   2341                                options::OPT_freciprocal_math,
   2342                                options::OPT_fno_reciprocal_math))
   2343     if (A->getOption().getID() != options::OPT_fno_fast_math &&
   2344         A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
   2345         A->getOption().getID() != options::OPT_fno_reciprocal_math)
   2346       ReciprocalMath = true;
   2347   bool SignedZeros = true;
   2348   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
   2349                                options::OPT_fno_fast_math,
   2350                                options::OPT_funsafe_math_optimizations,
   2351                                options::OPT_fno_unsafe_math_optimizations,
   2352                                options::OPT_fsigned_zeros,
   2353                                options::OPT_fno_signed_zeros))
   2354     if (A->getOption().getID() != options::OPT_fno_fast_math &&
   2355         A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
   2356         A->getOption().getID() != options::OPT_fsigned_zeros)
   2357       SignedZeros = false;
   2358   bool TrappingMath = true;
   2359   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
   2360                                options::OPT_fno_fast_math,
   2361                                options::OPT_funsafe_math_optimizations,
   2362                                options::OPT_fno_unsafe_math_optimizations,
   2363                                options::OPT_ftrapping_math,
   2364                                options::OPT_fno_trapping_math))
   2365     if (A->getOption().getID() != options::OPT_fno_fast_math &&
   2366         A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
   2367         A->getOption().getID() != options::OPT_ftrapping_math)
   2368       TrappingMath = false;
   2369   if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
   2370       !TrappingMath)
   2371     CmdArgs.push_back("-menable-unsafe-fp-math");
   2372 
   2373 
   2374   // Validate and pass through -fp-contract option.
   2375   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
   2376                                options::OPT_fno_fast_math,
   2377                                options::OPT_ffp_contract)) {
   2378     if (A->getOption().getID() == options::OPT_ffp_contract) {
   2379       StringRef Val = A->getValue();
   2380       if (Val == "fast" || Val == "on" || Val == "off") {
   2381         CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
   2382       } else {
   2383         D.Diag(diag::err_drv_unsupported_option_argument)
   2384           << A->getOption().getName() << Val;
   2385       }
   2386     } else if (A->getOption().matches(options::OPT_ffast_math) ||
   2387                (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
   2388       // If fast-math is set then set the fp-contract mode to fast.
   2389       CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
   2390     }
   2391   }
   2392 
   2393   // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
   2394   // and if we find them, tell the frontend to provide the appropriate
   2395   // preprocessor macros. This is distinct from enabling any optimizations as
   2396   // these options induce language changes which must survive serialization
   2397   // and deserialization, etc.
   2398   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
   2399                                options::OPT_fno_fast_math))
   2400       if (!A->getOption().matches(options::OPT_fno_fast_math))
   2401         CmdArgs.push_back("-ffast-math");
   2402   if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
   2403     if (A->getOption().matches(options::OPT_ffinite_math_only))
   2404       CmdArgs.push_back("-ffinite-math-only");
   2405 
   2406   // Decide whether to use verbose asm. Verbose assembly is the default on
   2407   // toolchains which have the integrated assembler on by default.
   2408   bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
   2409   if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
   2410                    IsVerboseAsmDefault) ||
   2411       Args.hasArg(options::OPT_dA))
   2412     CmdArgs.push_back("-masm-verbose");
   2413 
   2414   if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
   2415     CmdArgs.push_back("-mdebug-pass");
   2416     CmdArgs.push_back("Structure");
   2417   }
   2418   if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
   2419     CmdArgs.push_back("-mdebug-pass");
   2420     CmdArgs.push_back("Arguments");
   2421   }
   2422 
   2423   // Enable -mconstructor-aliases except on darwin, where we have to
   2424   // work around a linker bug;  see <rdar://problem/7651567>.
   2425   if (!getToolChain().getTriple().isOSDarwin())
   2426     CmdArgs.push_back("-mconstructor-aliases");
   2427 
   2428   // Darwin's kernel doesn't support guard variables; just die if we
   2429   // try to use them.
   2430   if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
   2431     CmdArgs.push_back("-fforbid-guard-variables");
   2432 
   2433   if (Args.hasArg(options::OPT_mms_bitfields)) {
   2434     CmdArgs.push_back("-mms-bitfields");
   2435   }
   2436 
   2437   // This is a coarse approximation of what llvm-gcc actually does, both
   2438   // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
   2439   // complicated ways.
   2440   bool AsynchronousUnwindTables =
   2441     Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
   2442                  options::OPT_fno_asynchronous_unwind_tables,
   2443                  getToolChain().IsUnwindTablesDefault() &&
   2444                  !KernelOrKext);
   2445   if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
   2446                    AsynchronousUnwindTables))
   2447     CmdArgs.push_back("-munwind-tables");
   2448 
   2449   getToolChain().addClangTargetOptions(Args, CmdArgs);
   2450 
   2451   if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
   2452     CmdArgs.push_back("-mlimit-float-precision");
   2453     CmdArgs.push_back(A->getValue());
   2454   }
   2455 
   2456   // FIXME: Handle -mtune=.
   2457   (void) Args.hasArg(options::OPT_mtune_EQ);
   2458 
   2459   if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
   2460     CmdArgs.push_back("-mcode-model");
   2461     CmdArgs.push_back(A->getValue());
   2462   }
   2463 
   2464   // Add target specific cpu and features flags.
   2465   switch(getToolChain().getArch()) {
   2466   default:
   2467     break;
   2468 
   2469   case llvm::Triple::arm:
   2470   case llvm::Triple::thumb:
   2471     AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
   2472     break;
   2473 
   2474   case llvm::Triple::mips:
   2475   case llvm::Triple::mipsel:
   2476   case llvm::Triple::mips64:
   2477   case llvm::Triple::mips64el:
   2478     AddMIPSTargetArgs(Args, CmdArgs);
   2479     break;
   2480 
   2481   case llvm::Triple::ppc:
   2482   case llvm::Triple::ppc64:
   2483   case llvm::Triple::ppc64le:
   2484     AddPPCTargetArgs(Args, CmdArgs);
   2485     break;
   2486 
   2487   case llvm::Triple::r600:
   2488     AddR600TargetArgs(Args, CmdArgs);
   2489     break;
   2490 
   2491   case llvm::Triple::sparc:
   2492     AddSparcTargetArgs(Args, CmdArgs);
   2493     break;
   2494 
   2495   case llvm::Triple::systemz:
   2496     AddSystemZTargetArgs(Args, CmdArgs);
   2497     break;
   2498 
   2499   case llvm::Triple::x86:
   2500   case llvm::Triple::x86_64:
   2501     AddX86TargetArgs(Args, CmdArgs);
   2502     break;
   2503 
   2504   case llvm::Triple::hexagon:
   2505     AddHexagonTargetArgs(Args, CmdArgs);
   2506     break;
   2507 
   2508   case llvm::Triple::aarch64:
   2509     AddAArch64TargetArgs(Args, CmdArgs);
   2510     break;
   2511   }
   2512 
   2513   // Pass the linker version in use.
   2514   if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
   2515     CmdArgs.push_back("-target-linker-version");
   2516     CmdArgs.push_back(A->getValue());
   2517   }
   2518 
   2519   if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
   2520     CmdArgs.push_back("-momit-leaf-frame-pointer");
   2521 
   2522   // Explicitly error on some things we know we don't support and can't just
   2523   // ignore.
   2524   types::ID InputType = Inputs[0].getType();
   2525   if (!Args.hasArg(options::OPT_fallow_unsupported)) {
   2526     Arg *Unsupported;
   2527     if (types::isCXX(InputType) &&
   2528         getToolChain().getTriple().isOSDarwin() &&
   2529         getToolChain().getArch() == llvm::Triple::x86) {
   2530       if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
   2531           (Unsupported = Args.getLastArg(options::OPT_mkernel)))
   2532         D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
   2533           << Unsupported->getOption().getName();
   2534     }
   2535   }
   2536 
   2537   Args.AddAllArgs(CmdArgs, options::OPT_v);
   2538   Args.AddLastArg(CmdArgs, options::OPT_H);
   2539   if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
   2540     CmdArgs.push_back("-header-include-file");
   2541     CmdArgs.push_back(D.CCPrintHeadersFilename ?
   2542                       D.CCPrintHeadersFilename : "-");
   2543   }
   2544   Args.AddLastArg(CmdArgs, options::OPT_P);
   2545   Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
   2546 
   2547   if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
   2548     CmdArgs.push_back("-diagnostic-log-file");
   2549     CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
   2550                       D.CCLogDiagnosticsFilename : "-");
   2551   }
   2552 
   2553   // Use the last option from "-g" group. "-gline-tables-only"
   2554   // is preserved, all other debug options are substituted with "-g".
   2555   Args.ClaimAllArgs(options::OPT_g_Group);
   2556   if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
   2557     if (A->getOption().matches(options::OPT_gline_tables_only))
   2558       CmdArgs.push_back("-gline-tables-only");
   2559     else if (A->getOption().matches(options::OPT_gdwarf_2))
   2560       CmdArgs.push_back("-gdwarf-2");
   2561     else if (A->getOption().matches(options::OPT_gdwarf_3))
   2562       CmdArgs.push_back("-gdwarf-3");
   2563     else if (A->getOption().matches(options::OPT_gdwarf_4))
   2564       CmdArgs.push_back("-gdwarf-4");
   2565     else if (!A->getOption().matches(options::OPT_g0) &&
   2566              !A->getOption().matches(options::OPT_ggdb0)) {
   2567       // Default is dwarf-2 for darwin.
   2568       if (getToolChain().getTriple().isOSDarwin())
   2569         CmdArgs.push_back("-gdwarf-2");
   2570       else
   2571         CmdArgs.push_back("-g");
   2572     }
   2573   }
   2574 
   2575   // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
   2576   Args.ClaimAllArgs(options::OPT_g_flags_Group);
   2577   if (Args.hasArg(options::OPT_gcolumn_info))
   2578     CmdArgs.push_back("-dwarf-column-info");
   2579 
   2580   // -gsplit-dwarf should turn on -g and enable the backend dwarf
   2581   // splitting and extraction.
   2582   // FIXME: Currently only works on Linux.
   2583   if (getToolChain().getTriple().getOS() == llvm::Triple::Linux &&
   2584       Args.hasArg(options::OPT_gsplit_dwarf)) {
   2585     CmdArgs.push_back("-g");
   2586     CmdArgs.push_back("-backend-option");
   2587     CmdArgs.push_back("-split-dwarf=Enable");
   2588   }
   2589 
   2590 
   2591   Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
   2592 
   2593   Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
   2594   Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
   2595 
   2596   Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
   2597 
   2598   if (Args.hasArg(options::OPT_ftest_coverage) ||
   2599       Args.hasArg(options::OPT_coverage))
   2600     CmdArgs.push_back("-femit-coverage-notes");
   2601   if (Args.hasArg(options::OPT_fprofile_arcs) ||
   2602       Args.hasArg(options::OPT_coverage))
   2603     CmdArgs.push_back("-femit-coverage-data");
   2604 
   2605   if (C.getArgs().hasArg(options::OPT_c) ||
   2606       C.getArgs().hasArg(options::OPT_S)) {
   2607     if (Output.isFilename()) {
   2608       CmdArgs.push_back("-coverage-file");
   2609       SmallString<128> CoverageFilename(Output.getFilename());
   2610       if (llvm::sys::path::is_relative(CoverageFilename.str())) {
   2611         if (const char *pwd = ::getenv("PWD")) {
   2612           if (llvm::sys::path::is_absolute(pwd)) {
   2613             SmallString<128> Pwd(pwd);
   2614             llvm::sys::path::append(Pwd, CoverageFilename.str());
   2615             CoverageFilename.swap(Pwd);
   2616           }
   2617         }
   2618       }
   2619       CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
   2620     }
   2621   }
   2622 
   2623   // Pass options for controlling the default header search paths.
   2624   if (Args.hasArg(options::OPT_nostdinc)) {
   2625     CmdArgs.push_back("-nostdsysteminc");
   2626     CmdArgs.push_back("-nobuiltininc");
   2627   } else {
   2628     if (Args.hasArg(options::OPT_nostdlibinc))
   2629         CmdArgs.push_back("-nostdsysteminc");
   2630     Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
   2631     Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
   2632   }
   2633 
   2634   // Pass the path to compiler resource files.
   2635   CmdArgs.push_back("-resource-dir");
   2636   CmdArgs.push_back(D.ResourceDir.c_str());
   2637 
   2638   Args.AddLastArg(CmdArgs, options::OPT_working_directory);
   2639 
   2640   bool ARCMTEnabled = false;
   2641   if (!Args.hasArg(options::OPT_fno_objc_arc)) {
   2642     if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
   2643                                        options::OPT_ccc_arcmt_modify,
   2644                                        options::OPT_ccc_arcmt_migrate)) {
   2645       ARCMTEnabled = true;
   2646       switch (A->getOption().getID()) {
   2647       default:
   2648         llvm_unreachable("missed a case");
   2649       case options::OPT_ccc_arcmt_check:
   2650         CmdArgs.push_back("-arcmt-check");
   2651         break;
   2652       case options::OPT_ccc_arcmt_modify:
   2653         CmdArgs.push_back("-arcmt-modify");
   2654         break;
   2655       case options::OPT_ccc_arcmt_migrate:
   2656         CmdArgs.push_back("-arcmt-migrate");
   2657         CmdArgs.push_back("-mt-migrate-directory");
   2658         CmdArgs.push_back(A->getValue());
   2659 
   2660         Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
   2661         Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
   2662         break;
   2663       }
   2664     }
   2665   } else {
   2666     Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
   2667     Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
   2668     Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
   2669   }
   2670 
   2671   if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
   2672     if (ARCMTEnabled) {
   2673       D.Diag(diag::err_drv_argument_not_allowed_with)
   2674         << A->getAsString(Args) << "-ccc-arcmt-migrate";
   2675     }
   2676     CmdArgs.push_back("-mt-migrate-directory");
   2677     CmdArgs.push_back(A->getValue());
   2678 
   2679     if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
   2680                      options::OPT_objcmt_migrate_subscripting,
   2681                      options::OPT_objcmt_migrate_property)) {
   2682       // None specified, means enable them all.
   2683       CmdArgs.push_back("-objcmt-migrate-literals");
   2684       CmdArgs.push_back("-objcmt-migrate-subscripting");
   2685       CmdArgs.push_back("-objcmt-migrate-property");
   2686     } else {
   2687       Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
   2688       Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
   2689       Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
   2690     }
   2691   }
   2692 
   2693   // Add preprocessing options like -I, -D, etc. if we are using the
   2694   // preprocessor.
   2695   //
   2696   // FIXME: Support -fpreprocessed
   2697   if (types::getPreprocessedType(InputType) != types::TY_INVALID)
   2698     AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
   2699 
   2700   // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
   2701   // that "The compiler can only warn and ignore the option if not recognized".
   2702   // When building with ccache, it will pass -D options to clang even on
   2703   // preprocessed inputs and configure concludes that -fPIC is not supported.
   2704   Args.ClaimAllArgs(options::OPT_D);
   2705 
   2706   // Manually translate -O4 to -O3; let clang reject others.
   2707   if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
   2708     if (A->getOption().matches(options::OPT_O4))
   2709       CmdArgs.push_back("-O3");
   2710     else
   2711       A->render(Args, CmdArgs);
   2712   }
   2713 
   2714   // Don't warn about unused -flto.  This can happen when we're preprocessing or
   2715   // precompiling.
   2716   Args.ClaimAllArgs(options::OPT_flto);
   2717 
   2718   Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
   2719   if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
   2720     CmdArgs.push_back("-pedantic");
   2721   Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
   2722   Args.AddLastArg(CmdArgs, options::OPT_w);
   2723 
   2724   // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
   2725   // (-ansi is equivalent to -std=c89 or -std=c++98).
   2726   //
   2727   // If a std is supplied, only add -trigraphs if it follows the
   2728   // option.
   2729   if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
   2730     if (Std->getOption().matches(options::OPT_ansi))
   2731       if (types::isCXX(InputType))
   2732         CmdArgs.push_back("-std=c++98");
   2733       else
   2734         CmdArgs.push_back("-std=c89");
   2735     else
   2736       Std->render(Args, CmdArgs);
   2737 
   2738     if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
   2739                                  options::OPT_trigraphs))
   2740       if (A != Std)
   2741         A->render(Args, CmdArgs);
   2742   } else {
   2743     // Honor -std-default.
   2744     //
   2745     // FIXME: Clang doesn't correctly handle -std= when the input language
   2746     // doesn't match. For the time being just ignore this for C++ inputs;
   2747     // eventually we want to do all the standard defaulting here instead of
   2748     // splitting it between the driver and clang -cc1.
   2749     if (!types::isCXX(InputType))
   2750       Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
   2751                                 "-std=", /*Joined=*/true);
   2752     else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
   2753       CmdArgs.push_back("-std=c++11");
   2754 
   2755     Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
   2756   }
   2757 
   2758   // Map the bizarre '-Wwrite-strings' flag to a more sensible
   2759   // '-fconst-strings'; this better indicates its actual behavior.
   2760   if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
   2761                    false)) {
   2762     // For perfect compatibility with GCC, we do this even in the presence of
   2763     // '-w'. This flag names something other than a warning for GCC.
   2764     CmdArgs.push_back("-fconst-strings");
   2765   }
   2766 
   2767   // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
   2768   // during C++ compilation, which it is by default. GCC keeps this define even
   2769   // in the presence of '-w', match this behavior bug-for-bug.
   2770   if (types::isCXX(InputType) &&
   2771       Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
   2772                    true)) {
   2773     CmdArgs.push_back("-fdeprecated-macro");
   2774   }
   2775 
   2776   // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
   2777   if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
   2778     if (Asm->getOption().matches(options::OPT_fasm))
   2779       CmdArgs.push_back("-fgnu-keywords");
   2780     else
   2781       CmdArgs.push_back("-fno-gnu-keywords");
   2782   }
   2783 
   2784   if (ShouldDisableCFI(Args, getToolChain()))
   2785     CmdArgs.push_back("-fno-dwarf2-cfi-asm");
   2786 
   2787   if (ShouldDisableDwarfDirectory(Args, getToolChain()))
   2788     CmdArgs.push_back("-fno-dwarf-directory-asm");
   2789 
   2790   if (ShouldDisableAutolink(Args, getToolChain()))
   2791     CmdArgs.push_back("-fno-autolink");
   2792 
   2793   // Add in -fdebug-compilation-dir if necessary.
   2794   addDebugCompDirArg(Args, CmdArgs);
   2795 
   2796   if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
   2797                                options::OPT_ftemplate_depth_EQ)) {
   2798     CmdArgs.push_back("-ftemplate-depth");
   2799     CmdArgs.push_back(A->getValue());
   2800   }
   2801 
   2802   if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
   2803     CmdArgs.push_back("-fconstexpr-depth");
   2804     CmdArgs.push_back(A->getValue());
   2805   }
   2806 
   2807   if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
   2808     CmdArgs.push_back("-fconstexpr-steps");
   2809     CmdArgs.push_back(A->getValue());
   2810   }
   2811 
   2812   if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
   2813     CmdArgs.push_back("-fbracket-depth");
   2814     CmdArgs.push_back(A->getValue());
   2815   }
   2816 
   2817   if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
   2818                                options::OPT_Wlarge_by_value_copy_def)) {
   2819     if (A->getNumValues()) {
   2820       StringRef bytes = A->getValue();
   2821       CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
   2822     } else
   2823       CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
   2824   }
   2825 
   2826 
   2827   if (Args.hasArg(options::OPT_relocatable_pch))
   2828     CmdArgs.push_back("-relocatable-pch");
   2829 
   2830   if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
   2831     CmdArgs.push_back("-fconstant-string-class");
   2832     CmdArgs.push_back(A->getValue());
   2833   }
   2834 
   2835   if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
   2836     CmdArgs.push_back("-ftabstop");
   2837     CmdArgs.push_back(A->getValue());
   2838   }
   2839 
   2840   CmdArgs.push_back("-ferror-limit");
   2841   if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
   2842     CmdArgs.push_back(A->getValue());
   2843   else
   2844     CmdArgs.push_back("19");
   2845 
   2846   if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
   2847     CmdArgs.push_back("-fmacro-backtrace-limit");
   2848     CmdArgs.push_back(A->getValue());
   2849   }
   2850 
   2851   if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
   2852     CmdArgs.push_back("-ftemplate-backtrace-limit");
   2853     CmdArgs.push_back(A->getValue());
   2854   }
   2855 
   2856   if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
   2857     CmdArgs.push_back("-fconstexpr-backtrace-limit");
   2858     CmdArgs.push_back(A->getValue());
   2859   }
   2860 
   2861   // Pass -fmessage-length=.
   2862   CmdArgs.push_back("-fmessage-length");
   2863   if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
   2864     CmdArgs.push_back(A->getValue());
   2865   } else {
   2866     // If -fmessage-length=N was not specified, determine whether this is a
   2867     // terminal and, if so, implicitly define -fmessage-length appropriately.
   2868     unsigned N = llvm::sys::Process::StandardErrColumns();
   2869     CmdArgs.push_back(Args.MakeArgString(Twine(N)));
   2870   }
   2871 
   2872   // -fvisibility= and -fvisibility-ms-compat are of a piece.
   2873   if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
   2874                                      options::OPT_fvisibility_ms_compat)) {
   2875     if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
   2876       CmdArgs.push_back("-fvisibility");
   2877       CmdArgs.push_back(A->getValue());
   2878     } else {
   2879       assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
   2880       CmdArgs.push_back("-fvisibility");
   2881       CmdArgs.push_back("hidden");
   2882       CmdArgs.push_back("-ftype-visibility");
   2883       CmdArgs.push_back("default");
   2884     }
   2885   }
   2886 
   2887   Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
   2888 
   2889   Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
   2890 
   2891   // -fhosted is default.
   2892   if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
   2893       KernelOrKext)
   2894     CmdArgs.push_back("-ffreestanding");
   2895 
   2896   // Forward -f (flag) options which we can pass directly.
   2897   Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
   2898   Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
   2899   Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
   2900   Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
   2901   Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
   2902   // AltiVec language extensions aren't relevant for assembling.
   2903   if (!isa<PreprocessJobAction>(JA) ||
   2904       Output.getType() != types::TY_PP_Asm)
   2905     Args.AddLastArg(CmdArgs, options::OPT_faltivec);
   2906   Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
   2907   Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
   2908 
   2909   SanitizerArgs Sanitize(getToolChain(), Args);
   2910   Sanitize.addArgs(Args, CmdArgs);
   2911 
   2912   if (!Args.hasFlag(options::OPT_fsanitize_recover,
   2913                     options::OPT_fno_sanitize_recover,
   2914                     true))
   2915     CmdArgs.push_back("-fno-sanitize-recover");
   2916 
   2917   if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
   2918       Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
   2919                    options::OPT_fno_sanitize_undefined_trap_on_error, false))
   2920     CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
   2921 
   2922   // Report an error for -faltivec on anything other than PowerPC.
   2923   if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
   2924     if (!(getToolChain().getArch() == llvm::Triple::ppc ||
   2925           getToolChain().getArch() == llvm::Triple::ppc64 ||
   2926           getToolChain().getArch() == llvm::Triple::ppc64le))
   2927       D.Diag(diag::err_drv_argument_only_allowed_with)
   2928         << A->getAsString(Args) << "ppc/ppc64/ppc64le";
   2929 
   2930   if (getToolChain().SupportsProfiling())
   2931     Args.AddLastArg(CmdArgs, options::OPT_pg);
   2932 
   2933   // -flax-vector-conversions is default.
   2934   if (!Args.hasFlag(options::OPT_flax_vector_conversions,
   2935                     options::OPT_fno_lax_vector_conversions))
   2936     CmdArgs.push_back("-fno-lax-vector-conversions");
   2937 
   2938   if (Args.getLastArg(options::OPT_fapple_kext))
   2939     CmdArgs.push_back("-fapple-kext");
   2940 
   2941   if (Args.hasFlag(options::OPT_frewrite_includes,
   2942                    options::OPT_fno_rewrite_includes, false))
   2943     CmdArgs.push_back("-frewrite-includes");
   2944 
   2945   Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
   2946   Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
   2947   Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
   2948   Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
   2949   Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
   2950 
   2951   if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
   2952     CmdArgs.push_back("-ftrapv-handler");
   2953     CmdArgs.push_back(A->getValue());
   2954   }
   2955 
   2956   Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
   2957 
   2958   // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
   2959   // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
   2960   if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
   2961                                options::OPT_fno_wrapv)) {
   2962     if (A->getOption().matches(options::OPT_fwrapv))
   2963       CmdArgs.push_back("-fwrapv");
   2964   } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
   2965                                       options::OPT_fno_strict_overflow)) {
   2966     if (A->getOption().matches(options::OPT_fno_strict_overflow))
   2967       CmdArgs.push_back("-fwrapv");
   2968   }
   2969   Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
   2970   Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
   2971 
   2972   Args.AddLastArg(CmdArgs, options::OPT_pthread);
   2973 
   2974 
   2975   // -stack-protector=0 is default.
   2976   unsigned StackProtectorLevel = 0;
   2977   if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
   2978                                options::OPT_fstack_protector_all,
   2979                                options::OPT_fstack_protector)) {
   2980     if (A->getOption().matches(options::OPT_fstack_protector))
   2981       StackProtectorLevel = 1;
   2982     else if (A->getOption().matches(options::OPT_fstack_protector_all))
   2983       StackProtectorLevel = 2;
   2984   } else {
   2985     StackProtectorLevel =
   2986       getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
   2987   }
   2988   if (StackProtectorLevel) {
   2989     CmdArgs.push_back("-stack-protector");
   2990     CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
   2991   }
   2992 
   2993   // --param ssp-buffer-size=
   2994   for (arg_iterator it = Args.filtered_begin(options::OPT__param),
   2995        ie = Args.filtered_end(); it != ie; ++it) {
   2996     StringRef Str((*it)->getValue());
   2997     if (Str.startswith("ssp-buffer-size=")) {
   2998       if (StackProtectorLevel) {
   2999         CmdArgs.push_back("-stack-protector-buffer-size");
   3000         // FIXME: Verify the argument is a valid integer.
   3001         CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
   3002       }
   3003       (*it)->claim();
   3004     }
   3005   }
   3006 
   3007   // Translate -mstackrealign
   3008   if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
   3009                    false)) {
   3010     CmdArgs.push_back("-backend-option");
   3011     CmdArgs.push_back("-force-align-stack");
   3012   }
   3013   if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
   3014                    false)) {
   3015     CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
   3016   }
   3017 
   3018   if (Args.hasArg(options::OPT_mstack_alignment)) {
   3019     StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
   3020     CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
   3021   }
   3022   // -mkernel implies -mstrict-align; don't add the redundant option.
   3023   if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
   3024     CmdArgs.push_back("-backend-option");
   3025     CmdArgs.push_back("-arm-strict-align");
   3026   }
   3027 
   3028   // Forward -f options with positive and negative forms; we translate
   3029   // these by hand.
   3030 
   3031   if (Args.hasArg(options::OPT_mkernel)) {
   3032     if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
   3033       CmdArgs.push_back("-fapple-kext");
   3034     if (!Args.hasArg(options::OPT_fbuiltin))
   3035       CmdArgs.push_back("-fno-builtin");
   3036     Args.ClaimAllArgs(options::OPT_fno_builtin);
   3037   }
   3038   // -fbuiltin is default.
   3039   else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
   3040     CmdArgs.push_back("-fno-builtin");
   3041 
   3042   if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
   3043                     options::OPT_fno_assume_sane_operator_new))
   3044     CmdArgs.push_back("-fno-assume-sane-operator-new");
   3045 
   3046   // -fblocks=0 is default.
   3047   if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
   3048                    getToolChain().IsBlocksDefault()) ||
   3049         (Args.hasArg(options::OPT_fgnu_runtime) &&
   3050          Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
   3051          !Args.hasArg(options::OPT_fno_blocks))) {
   3052     CmdArgs.push_back("-fblocks");
   3053 
   3054     if (!Args.hasArg(options::OPT_fgnu_runtime) &&
   3055         !getToolChain().hasBlocksRuntime())
   3056       CmdArgs.push_back("-fblocks-runtime-optional");
   3057   }
   3058 
   3059   // -fmodules enables modules (off by default). However, for C++/Objective-C++,
   3060   // users must also pass -fcxx-modules. The latter flag will disappear once the
   3061   // modules implementation is solid for C++/Objective-C++ programs as well.
   3062   bool HaveModules = false;
   3063   if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
   3064     bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
   3065                                      options::OPT_fno_cxx_modules,
   3066                                      false);
   3067     if (AllowedInCXX || !types::isCXX(InputType)) {
   3068       CmdArgs.push_back("-fmodules");
   3069       HaveModules = true;
   3070     }
   3071   }
   3072 
   3073   // -fmodule-maps enables module map processing (off by default) for header
   3074   // checking.  It is implied by -fmodules.
   3075   if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
   3076                    false)) {
   3077     CmdArgs.push_back("-fmodule-maps");
   3078   }
   3079 
   3080   // If a module path was provided, pass it along. Otherwise, use a temporary
   3081   // directory.
   3082   if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
   3083     A->claim();
   3084     if (HaveModules) {
   3085       A->render(Args, CmdArgs);
   3086     }
   3087   } else if (HaveModules) {
   3088     SmallString<128> DefaultModuleCache;
   3089     llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
   3090                                            DefaultModuleCache);
   3091     llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
   3092     llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
   3093     const char Arg[] = "-fmodules-cache-path=";
   3094     DefaultModuleCache.insert(DefaultModuleCache.begin(),
   3095                               Arg, Arg + strlen(Arg));
   3096     CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
   3097   }
   3098 
   3099   // Pass through all -fmodules-ignore-macro arguments.
   3100   Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
   3101   Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
   3102   Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
   3103 
   3104   // -faccess-control is default.
   3105   if (Args.hasFlag(options::OPT_fno_access_control,
   3106                    options::OPT_faccess_control,
   3107                    false))
   3108     CmdArgs.push_back("-fno-access-control");
   3109 
   3110   // -felide-constructors is the default.
   3111   if (Args.hasFlag(options::OPT_fno_elide_constructors,
   3112                    options::OPT_felide_constructors,
   3113                    false))
   3114     CmdArgs.push_back("-fno-elide-constructors");
   3115 
   3116   // -frtti is default.
   3117   if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
   3118       KernelOrKext) {
   3119     CmdArgs.push_back("-fno-rtti");
   3120 
   3121     // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
   3122     if (Sanitize.sanitizesVptr()) {
   3123       std::string NoRttiArg =
   3124         Args.getLastArg(options::OPT_mkernel,
   3125                         options::OPT_fapple_kext,
   3126                         options::OPT_fno_rtti)->getAsString(Args);
   3127       D.Diag(diag::err_drv_argument_not_allowed_with)
   3128         << "-fsanitize=vptr" << NoRttiArg;
   3129     }
   3130   }
   3131 
   3132   // -fshort-enums=0 is default for all architectures except Hexagon.
   3133   if (Args.hasFlag(options::OPT_fshort_enums,
   3134                    options::OPT_fno_short_enums,
   3135                    getToolChain().getArch() ==
   3136                    llvm::Triple::hexagon))
   3137     CmdArgs.push_back("-fshort-enums");
   3138 
   3139   // -fsigned-char is default.
   3140   if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
   3141                     isSignedCharDefault(getToolChain().getTriple())))
   3142     CmdArgs.push_back("-fno-signed-char");
   3143 
   3144   // -fthreadsafe-static is default.
   3145   if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
   3146                     options::OPT_fno_threadsafe_statics))
   3147     CmdArgs.push_back("-fno-threadsafe-statics");
   3148 
   3149   // -fuse-cxa-atexit is default.
   3150   if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
   3151                     options::OPT_fno_use_cxa_atexit,
   3152                    getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
   3153                   getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
   3154               getToolChain().getArch() != llvm::Triple::hexagon) ||
   3155       KernelOrKext)
   3156     CmdArgs.push_back("-fno-use-cxa-atexit");
   3157 
   3158   // -fms-extensions=0 is default.
   3159   if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
   3160                    getToolChain().getTriple().getOS() == llvm::Triple::Win32))
   3161     CmdArgs.push_back("-fms-extensions");
   3162 
   3163   // -fms-compatibility=0 is default.
   3164   if (Args.hasFlag(options::OPT_fms_compatibility,
   3165                    options::OPT_fno_ms_compatibility,
   3166                    (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
   3167                     Args.hasFlag(options::OPT_fms_extensions,
   3168                                  options::OPT_fno_ms_extensions,
   3169                                  true))))
   3170     CmdArgs.push_back("-fms-compatibility");
   3171 
   3172   // -fmsc-version=1300 is default.
   3173   if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
   3174                    getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
   3175       Args.hasArg(options::OPT_fmsc_version)) {
   3176     StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
   3177     if (msc_ver.empty())
   3178       CmdArgs.push_back("-fmsc-version=1300");
   3179     else
   3180       CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
   3181   }
   3182 
   3183 
   3184   // -fno-borland-extensions is default.
   3185   if (Args.hasFlag(options::OPT_fborland_extensions,
   3186                    options::OPT_fno_borland_extensions, false))
   3187     CmdArgs.push_back("-fborland-extensions");
   3188 
   3189   // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
   3190   // needs it.
   3191   if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
   3192                    options::OPT_fno_delayed_template_parsing,
   3193                    getToolChain().getTriple().getOS() == llvm::Triple::Win32))
   3194     CmdArgs.push_back("-fdelayed-template-parsing");
   3195 
   3196   // -fgnu-keywords default varies depending on language; only pass if
   3197   // specified.
   3198   if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
   3199                                options::OPT_fno_gnu_keywords))
   3200     A->render(Args, CmdArgs);
   3201 
   3202   if (Args.hasFlag(options::OPT_fgnu89_inline,
   3203                    options::OPT_fno_gnu89_inline,
   3204                    false))
   3205     CmdArgs.push_back("-fgnu89-inline");
   3206 
   3207   if (Args.hasArg(options::OPT_fno_inline))
   3208     CmdArgs.push_back("-fno-inline");
   3209 
   3210   if (Args.hasArg(options::OPT_fno_inline_functions))
   3211     CmdArgs.push_back("-fno-inline-functions");
   3212 
   3213   ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
   3214 
   3215   // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
   3216   // legacy is the default.
   3217   if (objcRuntime.isNonFragile()) {
   3218     if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
   3219                       options::OPT_fno_objc_legacy_dispatch,
   3220                       objcRuntime.isLegacyDispatchDefaultForArch(
   3221                         getToolChain().getArch()))) {
   3222       if (getToolChain().UseObjCMixedDispatch())
   3223         CmdArgs.push_back("-fobjc-dispatch-method=mixed");
   3224       else
   3225         CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
   3226     }
   3227   }
   3228 
   3229   // -fobjc-default-synthesize-properties=1 is default. This only has an effect
   3230   // if the nonfragile objc abi is used.
   3231   if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
   3232     CmdArgs.push_back("-fobjc-default-synthesize-properties");
   3233   }
   3234 
   3235   // -fencode-extended-block-signature=1 is default.
   3236   if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
   3237     CmdArgs.push_back("-fencode-extended-block-signature");
   3238   }
   3239 
   3240   // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
   3241   // NOTE: This logic is duplicated in ToolChains.cpp.
   3242   bool ARC = isObjCAutoRefCount(Args);
   3243   if (ARC) {
   3244     getToolChain().CheckObjCARC();
   3245 
   3246     CmdArgs.push_back("-fobjc-arc");
   3247 
   3248     // FIXME: It seems like this entire block, and several around it should be
   3249     // wrapped in isObjC, but for now we just use it here as this is where it
   3250     // was being used previously.
   3251     if (types::isCXX(InputType) && types::isObjC(InputType)) {
   3252       if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
   3253         CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
   3254       else
   3255         CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
   3256     }
   3257 
   3258     // Allow the user to enable full exceptions code emission.
   3259     // We define off for Objective-CC, on for Objective-C++.
   3260     if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
   3261                      options::OPT_fno_objc_arc_exceptions,
   3262                      /*default*/ types::isCXX(InputType)))
   3263       CmdArgs.push_back("-fobjc-arc-exceptions");
   3264   }
   3265 
   3266   // -fobjc-infer-related-result-type is the default, except in the Objective-C
   3267   // rewriter.
   3268   if (rewriteKind != RK_None)
   3269     CmdArgs.push_back("-fno-objc-infer-related-result-type");
   3270 
   3271   // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
   3272   // takes precedence.
   3273   const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
   3274   if (!GCArg)
   3275     GCArg = Args.getLastArg(options::OPT_fobjc_gc);
   3276   if (GCArg) {
   3277     if (ARC) {
   3278       D.Diag(diag::err_drv_objc_gc_arr)
   3279         << GCArg->getAsString(Args);
   3280     } else if (getToolChain().SupportsObjCGC()) {
   3281       GCArg->render(Args, CmdArgs);
   3282     } else {
   3283       // FIXME: We should move this to a hard error.
   3284       D.Diag(diag::warn_drv_objc_gc_unsupported)
   3285         << GCArg->getAsString(Args);
   3286     }
   3287   }
   3288 
   3289   // Add exception args.
   3290   addExceptionArgs(Args, InputType, getToolChain().getTriple(),
   3291                    KernelOrKext, objcRuntime, CmdArgs);
   3292 
   3293   if (getToolChain().UseSjLjExceptions())
   3294     CmdArgs.push_back("-fsjlj-exceptions");
   3295 
   3296   // C++ "sane" operator new.
   3297   if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
   3298                     options::OPT_fno_assume_sane_operator_new))
   3299     CmdArgs.push_back("-fno-assume-sane-operator-new");
   3300 
   3301   // -fconstant-cfstrings is default, and may be subject to argument translation
   3302   // on Darwin.
   3303   if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
   3304                     options::OPT_fno_constant_cfstrings) ||
   3305       !Args.hasFlag(options::OPT_mconstant_cfstrings,
   3306                     options::OPT_mno_constant_cfstrings))
   3307     CmdArgs.push_back("-fno-constant-cfstrings");
   3308 
   3309   // -fshort-wchar default varies depending on platform; only
   3310   // pass if specified.
   3311   if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
   3312     A->render(Args, CmdArgs);
   3313 
   3314   // -fno-pascal-strings is default, only pass non-default.
   3315   if (Args.hasFlag(options::OPT_fpascal_strings,
   3316                    options::OPT_fno_pascal_strings,
   3317                    false))
   3318     CmdArgs.push_back("-fpascal-strings");
   3319 
   3320   // Honor -fpack-struct= and -fpack-struct, if given. Note that
   3321   // -fno-pack-struct doesn't apply to -fpack-struct=.
   3322   if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
   3323     std::string PackStructStr = "-fpack-struct=";
   3324     PackStructStr += A->getValue();
   3325     CmdArgs.push_back(Args.MakeArgString(PackStructStr));
   3326   } else if (Args.hasFlag(options::OPT_fpack_struct,
   3327                           options::OPT_fno_pack_struct, false)) {
   3328     CmdArgs.push_back("-fpack-struct=1");
   3329   }
   3330 
   3331   if (KernelOrKext) {
   3332     if (!Args.hasArg(options::OPT_fcommon))
   3333       CmdArgs.push_back("-fno-common");
   3334     Args.ClaimAllArgs(options::OPT_fno_common);
   3335   }
   3336 
   3337   // -fcommon is default, only pass non-default.
   3338   else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
   3339     CmdArgs.push_back("-fno-common");
   3340 
   3341   // -fsigned-bitfields is default, and clang doesn't yet support
   3342   // -funsigned-bitfields.
   3343   if (!Args.hasFlag(options::OPT_fsigned_bitfields,
   3344                     options::OPT_funsigned_bitfields))
   3345     D.Diag(diag::warn_drv_clang_unsupported)
   3346       << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
   3347 
   3348   // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
   3349   if (!Args.hasFlag(options::OPT_ffor_scope,
   3350                     options::OPT_fno_for_scope))
   3351     D.Diag(diag::err_drv_clang_unsupported)
   3352       << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
   3353 
   3354   // -fcaret-diagnostics is default.
   3355   if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
   3356                     options::OPT_fno_caret_diagnostics, true))
   3357     CmdArgs.push_back("-fno-caret-diagnostics");
   3358 
   3359   // -fdiagnostics-fixit-info is default, only pass non-default.
   3360   if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
   3361                     options::OPT_fno_diagnostics_fixit_info))
   3362     CmdArgs.push_back("-fno-diagnostics-fixit-info");
   3363 
   3364   // Enable -fdiagnostics-show-option by default.
   3365   if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
   3366                    options::OPT_fno_diagnostics_show_option))
   3367     CmdArgs.push_back("-fdiagnostics-show-option");
   3368 
   3369   if (const Arg *A =
   3370         Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
   3371     CmdArgs.push_back("-fdiagnostics-show-category");
   3372     CmdArgs.push_back(A->getValue());
   3373   }
   3374 
   3375   if (const Arg *A =
   3376         Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
   3377     CmdArgs.push_back("-fdiagnostics-format");
   3378     CmdArgs.push_back(A->getValue());
   3379   }
   3380 
   3381   if (Arg *A = Args.getLastArg(
   3382       options::OPT_fdiagnostics_show_note_include_stack,
   3383       options::OPT_fno_diagnostics_show_note_include_stack)) {
   3384     if (A->getOption().matches(
   3385         options::OPT_fdiagnostics_show_note_include_stack))
   3386       CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
   3387     else
   3388       CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
   3389   }
   3390 
   3391   // Color diagnostics are the default, unless the terminal doesn't support
   3392   // them.
   3393   // Support both clang's -f[no-]color-diagnostics and gcc's
   3394   // -f[no-]diagnostics-colors[=never|always|auto].
   3395   enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
   3396   for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
   3397        it != ie; ++it) {
   3398     const Option &O = (*it)->getOption();
   3399     if (!O.matches(options::OPT_fcolor_diagnostics) &&
   3400         !O.matches(options::OPT_fdiagnostics_color) &&
   3401         !O.matches(options::OPT_fno_color_diagnostics) &&
   3402         !O.matches(options::OPT_fno_diagnostics_color) &&
   3403         !O.matches(options::OPT_fdiagnostics_color_EQ))
   3404       continue;
   3405 
   3406     (*it)->claim();
   3407     if (O.matches(options::OPT_fcolor_diagnostics) ||
   3408         O.matches(options::OPT_fdiagnostics_color)) {
   3409       ShowColors = Colors_On;
   3410     } else if (O.matches(options::OPT_fno_color_diagnostics) ||
   3411                O.matches(options::OPT_fno_diagnostics_color)) {
   3412       ShowColors = Colors_Off;
   3413     } else {
   3414       assert(O.matches(options::OPT_fdiagnostics_color_EQ));
   3415       StringRef value((*it)->getValue());
   3416       if (value == "always")
   3417         ShowColors = Colors_On;
   3418       else if (value == "never")
   3419         ShowColors = Colors_Off;
   3420       else if (value == "auto")
   3421         ShowColors = Colors_Auto;
   3422       else
   3423         getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
   3424           << ("-fdiagnostics-color=" + value).str();
   3425     }
   3426   }
   3427   if (ShowColors == Colors_On ||
   3428       (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
   3429     CmdArgs.push_back("-fcolor-diagnostics");
   3430 
   3431   if (!Args.hasFlag(options::OPT_fshow_source_location,
   3432                     options::OPT_fno_show_source_location))
   3433     CmdArgs.push_back("-fno-show-source-location");
   3434 
   3435   if (!Args.hasFlag(options::OPT_fshow_column,
   3436                     options::OPT_fno_show_column,
   3437                     true))
   3438     CmdArgs.push_back("-fno-show-column");
   3439 
   3440   if (!Args.hasFlag(options::OPT_fspell_checking,
   3441                     options::OPT_fno_spell_checking))
   3442     CmdArgs.push_back("-fno-spell-checking");
   3443 
   3444 
   3445   // -fno-asm-blocks is default.
   3446   if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
   3447                    false))
   3448     CmdArgs.push_back("-fasm-blocks");
   3449 
   3450   // If -Ofast is the optimization level, then -fvectorize should be enabled.
   3451   // This alias option is being used to simplify the hasFlag logic.
   3452   OptSpecifier VectorizeAliasOption = OFastEnabled ? options::OPT_Ofast :
   3453     options::OPT_fvectorize;
   3454 
   3455   // -fvectorize is default.
   3456   if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
   3457                    options::OPT_fno_vectorize, true))
   3458     CmdArgs.push_back("-vectorize-loops");
   3459 
   3460   // -fslp-vectorize is default.
   3461   if (Args.hasFlag(options::OPT_fslp_vectorize,
   3462                    options::OPT_fno_slp_vectorize, true))
   3463     CmdArgs.push_back("-vectorize-slp");
   3464 
   3465   // -fno-slp-vectorize-aggressive is default.
   3466   if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
   3467                    options::OPT_fno_slp_vectorize_aggressive, false))
   3468     CmdArgs.push_back("-vectorize-slp-aggressive");
   3469 
   3470   if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
   3471     A->render(Args, CmdArgs);
   3472 
   3473   // -fdollars-in-identifiers default varies depending on platform and
   3474   // language; only pass if specified.
   3475   if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
   3476                                options::OPT_fno_dollars_in_identifiers)) {
   3477     if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
   3478       CmdArgs.push_back("-fdollars-in-identifiers");
   3479     else
   3480       CmdArgs.push_back("-fno-dollars-in-identifiers");
   3481   }
   3482 
   3483   // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
   3484   // practical purposes.
   3485   if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
   3486                                options::OPT_fno_unit_at_a_time)) {
   3487     if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
   3488       D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
   3489   }
   3490 
   3491   if (Args.hasFlag(options::OPT_fapple_pragma_pack,
   3492                    options::OPT_fno_apple_pragma_pack, false))
   3493     CmdArgs.push_back("-fapple-pragma-pack");
   3494 
   3495   // le32-specific flags:
   3496   //  -fno-math-builtin: clang should not convert math builtins to intrinsics
   3497   //                     by default.
   3498   if (getToolChain().getArch() == llvm::Triple::le32) {
   3499     CmdArgs.push_back("-fno-math-builtin");
   3500   }
   3501 
   3502   // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
   3503   //
   3504   // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
   3505 #if 0
   3506   if (getToolChain().getTriple().isOSDarwin() &&
   3507       (getToolChain().getArch() == llvm::Triple::arm ||
   3508        getToolChain().getArch() == llvm::Triple::thumb)) {
   3509     if (!Args.hasArg(options::OPT_fbuiltin_strcat))
   3510       CmdArgs.push_back("-fno-builtin-strcat");
   3511     if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
   3512       CmdArgs.push_back("-fno-builtin-strcpy");
   3513   }
   3514 #endif
   3515 
   3516   // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
   3517   if (Arg *A = Args.getLastArg(options::OPT_traditional,
   3518                                options::OPT_traditional_cpp)) {
   3519     if (isa<PreprocessJobAction>(JA))
   3520       CmdArgs.push_back("-traditional-cpp");
   3521     else
   3522       D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
   3523   }
   3524 
   3525   Args.AddLastArg(CmdArgs, options::OPT_dM);
   3526   Args.AddLastArg(CmdArgs, options::OPT_dD);
   3527 
   3528   // Handle serialized diagnostics.
   3529   if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
   3530     CmdArgs.push_back("-serialize-diagnostic-file");
   3531     CmdArgs.push_back(Args.MakeArgString(A->getValue()));
   3532   }
   3533 
   3534   if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
   3535     CmdArgs.push_back("-fretain-comments-from-system-headers");
   3536 
   3537   // Forward -fcomment-block-commands to -cc1.
   3538   Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
   3539   // Forward -fparse-all-comments to -cc1.
   3540   Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
   3541 
   3542   // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
   3543   // parser.
   3544   Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
   3545   for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
   3546          ie = Args.filtered_end(); it != ie; ++it) {
   3547     (*it)->claim();
   3548 
   3549     // We translate this by hand to the -cc1 argument, since nightly test uses
   3550     // it and developers have been trained to spell it with -mllvm.
   3551     if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
   3552       CmdArgs.push_back("-disable-llvm-optzns");
   3553     else
   3554       (*it)->render(Args, CmdArgs);
   3555   }
   3556 
   3557   if (Output.getType() == types::TY_Dependencies) {
   3558     // Handled with other dependency code.
   3559   } else if (Output.isFilename()) {
   3560     CmdArgs.push_back("-o");
   3561     CmdArgs.push_back(Output.getFilename());
   3562   } else {
   3563     assert(Output.isNothing() && "Invalid output.");
   3564   }
   3565 
   3566   for (InputInfoList::const_iterator
   3567          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   3568     const InputInfo &II = *it;
   3569     CmdArgs.push_back("-x");
   3570     if (Args.hasArg(options::OPT_rewrite_objc))
   3571       CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
   3572     else
   3573       CmdArgs.push_back(types::getTypeName(II.getType()));
   3574     if (II.isFilename())
   3575       CmdArgs.push_back(II.getFilename());
   3576     else
   3577       II.getInputArg().renderAsInput(Args, CmdArgs);
   3578   }
   3579 
   3580   Args.AddAllArgs(CmdArgs, options::OPT_undef);
   3581 
   3582   const char *Exec = getToolChain().getDriver().getClangProgramPath();
   3583 
   3584   // Optionally embed the -cc1 level arguments into the debug info, for build
   3585   // analysis.
   3586   if (getToolChain().UseDwarfDebugFlags()) {
   3587     ArgStringList OriginalArgs;
   3588     for (ArgList::const_iterator it = Args.begin(),
   3589            ie = Args.end(); it != ie; ++it)
   3590       (*it)->render(Args, OriginalArgs);
   3591 
   3592     SmallString<256> Flags;
   3593     Flags += Exec;
   3594     for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
   3595       Flags += " ";
   3596       Flags += OriginalArgs[i];
   3597     }
   3598     CmdArgs.push_back("-dwarf-debug-flags");
   3599     CmdArgs.push_back(Args.MakeArgString(Flags.str()));
   3600   }
   3601 
   3602   // Add the split debug info name to the command lines here so we
   3603   // can propagate it to the backend.
   3604   bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
   3605     (getToolChain().getTriple().getOS() == llvm::Triple::Linux) &&
   3606     (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
   3607   const char *SplitDwarfOut;
   3608   if (SplitDwarf) {
   3609     CmdArgs.push_back("-split-dwarf-file");
   3610     SplitDwarfOut = SplitDebugName(Args, Inputs);
   3611     CmdArgs.push_back(SplitDwarfOut);
   3612   }
   3613 
   3614   // Finally add the compile command to the compilation.
   3615   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   3616 
   3617   // Handle the debug info splitting at object creation time if we're
   3618   // creating an object.
   3619   // TODO: Currently only works on linux with newer objcopy.
   3620   if (SplitDwarf && !isa<CompileJobAction>(JA))
   3621     SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
   3622 
   3623   if (Arg *A = Args.getLastArg(options::OPT_pg))
   3624     if (Args.hasArg(options::OPT_fomit_frame_pointer))
   3625       D.Diag(diag::err_drv_argument_not_allowed_with)
   3626         << "-fomit-frame-pointer" << A->getAsString(Args);
   3627 
   3628   // Claim some arguments which clang supports automatically.
   3629 
   3630   // -fpch-preprocess is used with gcc to add a special marker in the output to
   3631   // include the PCH file. Clang's PTH solution is completely transparent, so we
   3632   // do not need to deal with it at all.
   3633   Args.ClaimAllArgs(options::OPT_fpch_preprocess);
   3634 
   3635   // Claim some arguments which clang doesn't support, but we don't
   3636   // care to warn the user about.
   3637   Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
   3638   Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
   3639 
   3640   // Claim ignored clang-cl options.
   3641   Args.ClaimAllArgs(options::OPT_cl_ignored_Group);
   3642 
   3643   // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
   3644   Args.ClaimAllArgs(options::OPT_use_gold_plugin);
   3645   Args.ClaimAllArgs(options::OPT_emit_llvm);
   3646 }
   3647 
   3648 void ClangAs::AddARMTargetArgs(const ArgList &Args,
   3649                                ArgStringList &CmdArgs) const {
   3650   const Driver &D = getToolChain().getDriver();
   3651   llvm::Triple Triple = getToolChain().getTriple();
   3652 
   3653   // Set the CPU based on -march= and -mcpu=.
   3654   CmdArgs.push_back("-target-cpu");
   3655   CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
   3656 
   3657   // Honor -mfpu=.
   3658   if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
   3659     addFPUArgs(D, A, Args, CmdArgs);
   3660 
   3661   // Honor -mfpmath=.
   3662   if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
   3663     addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
   3664 }
   3665 
   3666 void ClangAs::AddX86TargetArgs(const ArgList &Args,
   3667                                ArgStringList &CmdArgs) const {
   3668   // Set the CPU based on -march=.
   3669   if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
   3670     CmdArgs.push_back("-target-cpu");
   3671     CmdArgs.push_back(CPUName);
   3672   }
   3673 }
   3674 
   3675 /// Add options related to the Objective-C runtime/ABI.
   3676 ///
   3677 /// Returns true if the runtime is non-fragile.
   3678 ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
   3679                                       ArgStringList &cmdArgs,
   3680                                       RewriteKind rewriteKind) const {
   3681   // Look for the controlling runtime option.
   3682   Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
   3683                                     options::OPT_fgnu_runtime,
   3684                                     options::OPT_fobjc_runtime_EQ);
   3685 
   3686   // Just forward -fobjc-runtime= to the frontend.  This supercedes
   3687   // options about fragility.
   3688   if (runtimeArg &&
   3689       runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
   3690     ObjCRuntime runtime;
   3691     StringRef value = runtimeArg->getValue();
   3692     if (runtime.tryParse(value)) {
   3693       getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
   3694         << value;
   3695     }
   3696 
   3697     runtimeArg->render(args, cmdArgs);
   3698     return runtime;
   3699   }
   3700 
   3701   // Otherwise, we'll need the ABI "version".  Version numbers are
   3702   // slightly confusing for historical reasons:
   3703   //   1 - Traditional "fragile" ABI
   3704   //   2 - Non-fragile ABI, version 1
   3705   //   3 - Non-fragile ABI, version 2
   3706   unsigned objcABIVersion = 1;
   3707   // If -fobjc-abi-version= is present, use that to set the version.
   3708   if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
   3709     StringRef value = abiArg->getValue();
   3710     if (value == "1")
   3711       objcABIVersion = 1;
   3712     else if (value == "2")
   3713       objcABIVersion = 2;
   3714     else if (value == "3")
   3715       objcABIVersion = 3;
   3716     else
   3717       getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
   3718         << value;
   3719   } else {
   3720     // Otherwise, determine if we are using the non-fragile ABI.
   3721     bool nonFragileABIIsDefault =
   3722       (rewriteKind == RK_NonFragile ||
   3723        (rewriteKind == RK_None &&
   3724         getToolChain().IsObjCNonFragileABIDefault()));
   3725     if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
   3726                      options::OPT_fno_objc_nonfragile_abi,
   3727                      nonFragileABIIsDefault)) {
   3728       // Determine the non-fragile ABI version to use.
   3729 #ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
   3730       unsigned nonFragileABIVersion = 1;
   3731 #else
   3732       unsigned nonFragileABIVersion = 2;
   3733 #endif
   3734 
   3735       if (Arg *abiArg = args.getLastArg(
   3736             options::OPT_fobjc_nonfragile_abi_version_EQ)) {
   3737         StringRef value = abiArg->getValue();
   3738         if (value == "1")
   3739           nonFragileABIVersion = 1;
   3740         else if (value == "2")
   3741           nonFragileABIVersion = 2;
   3742         else
   3743           getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
   3744             << value;
   3745       }
   3746 
   3747       objcABIVersion = 1 + nonFragileABIVersion;
   3748     } else {
   3749       objcABIVersion = 1;
   3750     }
   3751   }
   3752 
   3753   // We don't actually care about the ABI version other than whether
   3754   // it's non-fragile.
   3755   bool isNonFragile = objcABIVersion != 1;
   3756 
   3757   // If we have no runtime argument, ask the toolchain for its default runtime.
   3758   // However, the rewriter only really supports the Mac runtime, so assume that.
   3759   ObjCRuntime runtime;
   3760   if (!runtimeArg) {
   3761     switch (rewriteKind) {
   3762     case RK_None:
   3763       runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
   3764       break;
   3765     case RK_Fragile:
   3766       runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
   3767       break;
   3768     case RK_NonFragile:
   3769       runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
   3770       break;
   3771     }
   3772 
   3773   // -fnext-runtime
   3774   } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
   3775     // On Darwin, make this use the default behavior for the toolchain.
   3776     if (getToolChain().getTriple().isOSDarwin()) {
   3777       runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
   3778 
   3779     // Otherwise, build for a generic macosx port.
   3780     } else {
   3781       runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
   3782     }
   3783 
   3784   // -fgnu-runtime
   3785   } else {
   3786     assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
   3787     // Legacy behaviour is to target the gnustep runtime if we are i
   3788     // non-fragile mode or the GCC runtime in fragile mode.
   3789     if (isNonFragile)
   3790       runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
   3791     else
   3792       runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
   3793   }
   3794 
   3795   cmdArgs.push_back(args.MakeArgString(
   3796                                  "-fobjc-runtime=" + runtime.getAsString()));
   3797   return runtime;
   3798 }
   3799 
   3800 void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
   3801                            const InputInfo &Output,
   3802                            const InputInfoList &Inputs,
   3803                            const ArgList &Args,
   3804                            const char *LinkingOutput) const {
   3805   ArgStringList CmdArgs;
   3806 
   3807   assert(Inputs.size() == 1 && "Unexpected number of inputs.");
   3808   const InputInfo &Input = Inputs[0];
   3809 
   3810   // Don't warn about "clang -w -c foo.s"
   3811   Args.ClaimAllArgs(options::OPT_w);
   3812   // and "clang -emit-llvm -c foo.s"
   3813   Args.ClaimAllArgs(options::OPT_emit_llvm);
   3814   // and "clang -use-gold-plugin -c foo.s"
   3815   Args.ClaimAllArgs(options::OPT_use_gold_plugin);
   3816 
   3817   // Invoke ourselves in -cc1as mode.
   3818   //
   3819   // FIXME: Implement custom jobs for internal actions.
   3820   CmdArgs.push_back("-cc1as");
   3821 
   3822   // Add the "effective" target triple.
   3823   CmdArgs.push_back("-triple");
   3824   std::string TripleStr =
   3825     getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
   3826   CmdArgs.push_back(Args.MakeArgString(TripleStr));
   3827 
   3828   // Set the output mode, we currently only expect to be used as a real
   3829   // assembler.
   3830   CmdArgs.push_back("-filetype");
   3831   CmdArgs.push_back("obj");
   3832 
   3833   // Set the main file name, so that debug info works even with
   3834   // -save-temps or preprocessed assembly.
   3835   CmdArgs.push_back("-main-file-name");
   3836   CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
   3837 
   3838   // Add target specific cpu and features flags.
   3839   switch(getToolChain().getArch()) {
   3840   default:
   3841     break;
   3842 
   3843   case llvm::Triple::arm:
   3844   case llvm::Triple::thumb:
   3845     AddARMTargetArgs(Args, CmdArgs);
   3846     break;
   3847 
   3848   case llvm::Triple::x86:
   3849   case llvm::Triple::x86_64:
   3850     AddX86TargetArgs(Args, CmdArgs);
   3851     break;
   3852   }
   3853 
   3854   // Ignore explicit -force_cpusubtype_ALL option.
   3855   (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
   3856 
   3857   // Determine the original source input.
   3858   const Action *SourceAction = &JA;
   3859   while (SourceAction->getKind() != Action::InputClass) {
   3860     assert(!SourceAction->getInputs().empty() && "unexpected root action!");
   3861     SourceAction = SourceAction->getInputs()[0];
   3862   }
   3863 
   3864   // Forward -g and handle debug info related flags, assuming we are dealing
   3865   // with an actual assembly file.
   3866   if (SourceAction->getType() == types::TY_Asm ||
   3867       SourceAction->getType() == types::TY_PP_Asm) {
   3868     Args.ClaimAllArgs(options::OPT_g_Group);
   3869     if (Arg *A = Args.getLastArg(options::OPT_g_Group))
   3870       if (!A->getOption().matches(options::OPT_g0))
   3871         CmdArgs.push_back("-g");
   3872 
   3873     // Add the -fdebug-compilation-dir flag if needed.
   3874     addDebugCompDirArg(Args, CmdArgs);
   3875 
   3876     // Set the AT_producer to the clang version when using the integrated
   3877     // assembler on assembly source files.
   3878     CmdArgs.push_back("-dwarf-debug-producer");
   3879     CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
   3880   }
   3881 
   3882   // Optionally embed the -cc1as level arguments into the debug info, for build
   3883   // analysis.
   3884   if (getToolChain().UseDwarfDebugFlags()) {
   3885     ArgStringList OriginalArgs;
   3886     for (ArgList::const_iterator it = Args.begin(),
   3887            ie = Args.end(); it != ie; ++it)
   3888       (*it)->render(Args, OriginalArgs);
   3889 
   3890     SmallString<256> Flags;
   3891     const char *Exec = getToolChain().getDriver().getClangProgramPath();
   3892     Flags += Exec;
   3893     for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
   3894       Flags += " ";
   3895       Flags += OriginalArgs[i];
   3896     }
   3897     CmdArgs.push_back("-dwarf-debug-flags");
   3898     CmdArgs.push_back(Args.MakeArgString(Flags.str()));
   3899   }
   3900 
   3901   // FIXME: Add -static support, once we have it.
   3902 
   3903   CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
   3904                                     getToolChain().getDriver());
   3905 
   3906   Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
   3907 
   3908   assert(Output.isFilename() && "Unexpected lipo output.");
   3909   CmdArgs.push_back("-o");
   3910   CmdArgs.push_back(Output.getFilename());
   3911 
   3912   assert(Input.isFilename() && "Invalid input.");
   3913   CmdArgs.push_back(Input.getFilename());
   3914 
   3915   const char *Exec = getToolChain().getDriver().getClangProgramPath();
   3916   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   3917 
   3918   // Handle the debug info splitting at object creation time if we're
   3919   // creating an object.
   3920   // TODO: Currently only works on linux with newer objcopy.
   3921   if (Args.hasArg(options::OPT_gsplit_dwarf) &&
   3922       (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
   3923     SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
   3924                    SplitDebugName(Args, Inputs));
   3925 }
   3926 
   3927 void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
   3928                                const InputInfo &Output,
   3929                                const InputInfoList &Inputs,
   3930                                const ArgList &Args,
   3931                                const char *LinkingOutput) const {
   3932   const Driver &D = getToolChain().getDriver();
   3933   ArgStringList CmdArgs;
   3934 
   3935   for (ArgList::const_iterator
   3936          it = Args.begin(), ie = Args.end(); it != ie; ++it) {
   3937     Arg *A = *it;
   3938     if (forwardToGCC(A->getOption())) {
   3939       // Don't forward any -g arguments to assembly steps.
   3940       if (isa<AssembleJobAction>(JA) &&
   3941           A->getOption().matches(options::OPT_g_Group))
   3942         continue;
   3943 
   3944       // It is unfortunate that we have to claim here, as this means
   3945       // we will basically never report anything interesting for
   3946       // platforms using a generic gcc, even if we are just using gcc
   3947       // to get to the assembler.
   3948       A->claim();
   3949       A->render(Args, CmdArgs);
   3950     }
   3951   }
   3952 
   3953   RenderExtraToolArgs(JA, CmdArgs);
   3954 
   3955   // If using a driver driver, force the arch.
   3956   llvm::Triple::ArchType Arch = getToolChain().getArch();
   3957   if (getToolChain().getTriple().isOSDarwin()) {
   3958     CmdArgs.push_back("-arch");
   3959 
   3960     // FIXME: Remove these special cases.
   3961     if (Arch == llvm::Triple::ppc)
   3962       CmdArgs.push_back("ppc");
   3963     else if (Arch == llvm::Triple::ppc64)
   3964       CmdArgs.push_back("ppc64");
   3965     else if (Arch == llvm::Triple::ppc64le)
   3966       CmdArgs.push_back("ppc64le");
   3967     else
   3968       CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
   3969   }
   3970 
   3971   // Try to force gcc to match the tool chain we want, if we recognize
   3972   // the arch.
   3973   //
   3974   // FIXME: The triple class should directly provide the information we want
   3975   // here.
   3976   if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
   3977     CmdArgs.push_back("-m32");
   3978   else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
   3979            Arch == llvm::Triple::ppc64le)
   3980     CmdArgs.push_back("-m64");
   3981 
   3982   if (Output.isFilename()) {
   3983     CmdArgs.push_back("-o");
   3984     CmdArgs.push_back(Output.getFilename());
   3985   } else {
   3986     assert(Output.isNothing() && "Unexpected output");
   3987     CmdArgs.push_back("-fsyntax-only");
   3988   }
   3989 
   3990   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   3991                        options::OPT_Xassembler);
   3992 
   3993   // Only pass -x if gcc will understand it; otherwise hope gcc
   3994   // understands the suffix correctly. The main use case this would go
   3995   // wrong in is for linker inputs if they happened to have an odd
   3996   // suffix; really the only way to get this to happen is a command
   3997   // like '-x foobar a.c' which will treat a.c like a linker input.
   3998   //
   3999   // FIXME: For the linker case specifically, can we safely convert
   4000   // inputs into '-Wl,' options?
   4001   for (InputInfoList::const_iterator
   4002          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   4003     const InputInfo &II = *it;
   4004 
   4005     // Don't try to pass LLVM or AST inputs to a generic gcc.
   4006     if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
   4007         II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
   4008       D.Diag(diag::err_drv_no_linker_llvm_support)
   4009         << getToolChain().getTripleString();
   4010     else if (II.getType() == types::TY_AST)
   4011       D.Diag(diag::err_drv_no_ast_support)
   4012         << getToolChain().getTripleString();
   4013     else if (II.getType() == types::TY_ModuleFile)
   4014       D.Diag(diag::err_drv_no_module_support)
   4015         << getToolChain().getTripleString();
   4016 
   4017     if (types::canTypeBeUserSpecified(II.getType())) {
   4018       CmdArgs.push_back("-x");
   4019       CmdArgs.push_back(types::getTypeName(II.getType()));
   4020     }
   4021 
   4022     if (II.isFilename())
   4023       CmdArgs.push_back(II.getFilename());
   4024     else {
   4025       const Arg &A = II.getInputArg();
   4026 
   4027       // Reverse translate some rewritten options.
   4028       if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
   4029         CmdArgs.push_back("-lstdc++");
   4030         continue;
   4031       }
   4032 
   4033       // Don't render as input, we need gcc to do the translations.
   4034       A.render(Args, CmdArgs);
   4035     }
   4036   }
   4037 
   4038   const std::string customGCCName = D.getCCCGenericGCCName();
   4039   const char *GCCName;
   4040   if (!customGCCName.empty())
   4041     GCCName = customGCCName.c_str();
   4042   else if (D.CCCIsCXX()) {
   4043     GCCName = "g++";
   4044   } else
   4045     GCCName = "gcc";
   4046 
   4047   const char *Exec =
   4048     Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
   4049   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   4050 }
   4051 
   4052 void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
   4053                                           ArgStringList &CmdArgs) const {
   4054   CmdArgs.push_back("-E");
   4055 }
   4056 
   4057 void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
   4058                                           ArgStringList &CmdArgs) const {
   4059   // The type is good enough.
   4060 }
   4061 
   4062 void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
   4063                                        ArgStringList &CmdArgs) const {
   4064   const Driver &D = getToolChain().getDriver();
   4065 
   4066   // If -flto, etc. are present then make sure not to force assembly output.
   4067   if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
   4068       JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
   4069     CmdArgs.push_back("-c");
   4070   else {
   4071     if (JA.getType() != types::TY_PP_Asm)
   4072       D.Diag(diag::err_drv_invalid_gcc_output_type)
   4073         << getTypeName(JA.getType());
   4074 
   4075     CmdArgs.push_back("-S");
   4076   }
   4077 }
   4078 
   4079 void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
   4080                                         ArgStringList &CmdArgs) const {
   4081   CmdArgs.push_back("-c");
   4082 }
   4083 
   4084 void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
   4085                                     ArgStringList &CmdArgs) const {
   4086   // The types are (hopefully) good enough.
   4087 }
   4088 
   4089 // Hexagon tools start.
   4090 void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
   4091                                         ArgStringList &CmdArgs) const {
   4092 
   4093 }
   4094 void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   4095                                const InputInfo &Output,
   4096                                const InputInfoList &Inputs,
   4097                                const ArgList &Args,
   4098                                const char *LinkingOutput) const {
   4099 
   4100   const Driver &D = getToolChain().getDriver();
   4101   ArgStringList CmdArgs;
   4102 
   4103   std::string MarchString = "-march=";
   4104   MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
   4105   CmdArgs.push_back(Args.MakeArgString(MarchString));
   4106 
   4107   RenderExtraToolArgs(JA, CmdArgs);
   4108 
   4109   if (Output.isFilename()) {
   4110     CmdArgs.push_back("-o");
   4111     CmdArgs.push_back(Output.getFilename());
   4112   } else {
   4113     assert(Output.isNothing() && "Unexpected output");
   4114     CmdArgs.push_back("-fsyntax-only");
   4115   }
   4116 
   4117   std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
   4118   if (!SmallDataThreshold.empty())
   4119     CmdArgs.push_back(
   4120       Args.MakeArgString(std::string("-G") + SmallDataThreshold));
   4121 
   4122   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   4123                        options::OPT_Xassembler);
   4124 
   4125   // Only pass -x if gcc will understand it; otherwise hope gcc
   4126   // understands the suffix correctly. The main use case this would go
   4127   // wrong in is for linker inputs if they happened to have an odd
   4128   // suffix; really the only way to get this to happen is a command
   4129   // like '-x foobar a.c' which will treat a.c like a linker input.
   4130   //
   4131   // FIXME: For the linker case specifically, can we safely convert
   4132   // inputs into '-Wl,' options?
   4133   for (InputInfoList::const_iterator
   4134          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   4135     const InputInfo &II = *it;
   4136 
   4137     // Don't try to pass LLVM or AST inputs to a generic gcc.
   4138     if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
   4139         II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
   4140       D.Diag(clang::diag::err_drv_no_linker_llvm_support)
   4141         << getToolChain().getTripleString();
   4142     else if (II.getType() == types::TY_AST)
   4143       D.Diag(clang::diag::err_drv_no_ast_support)
   4144         << getToolChain().getTripleString();
   4145     else if (II.getType() == types::TY_ModuleFile)
   4146       D.Diag(diag::err_drv_no_module_support)
   4147       << getToolChain().getTripleString();
   4148 
   4149     if (II.isFilename())
   4150       CmdArgs.push_back(II.getFilename());
   4151     else
   4152       // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
   4153       II.getInputArg().render(Args, CmdArgs);
   4154   }
   4155 
   4156   const char *GCCName = "hexagon-as";
   4157   const char *Exec =
   4158     Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
   4159   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   4160 
   4161 }
   4162 void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
   4163                                     ArgStringList &CmdArgs) const {
   4164   // The types are (hopefully) good enough.
   4165 }
   4166 
   4167 void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
   4168                                const InputInfo &Output,
   4169                                const InputInfoList &Inputs,
   4170                                const ArgList &Args,
   4171                                const char *LinkingOutput) const {
   4172 
   4173   const toolchains::Hexagon_TC& ToolChain =
   4174     static_cast<const toolchains::Hexagon_TC&>(getToolChain());
   4175   const Driver &D = ToolChain.getDriver();
   4176 
   4177   ArgStringList CmdArgs;
   4178 
   4179   //----------------------------------------------------------------------------
   4180   //
   4181   //----------------------------------------------------------------------------
   4182   bool hasStaticArg = Args.hasArg(options::OPT_static);
   4183   bool buildingLib = Args.hasArg(options::OPT_shared);
   4184   bool buildPIE = Args.hasArg(options::OPT_pie);
   4185   bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
   4186   bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
   4187   bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
   4188   bool useShared = buildingLib && !hasStaticArg;
   4189 
   4190   //----------------------------------------------------------------------------
   4191   // Silence warnings for various options
   4192   //----------------------------------------------------------------------------
   4193 
   4194   Args.ClaimAllArgs(options::OPT_g_Group);
   4195   Args.ClaimAllArgs(options::OPT_emit_llvm);
   4196   Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
   4197                                      // handled somewhere else.
   4198   Args.ClaimAllArgs(options::OPT_static_libgcc);
   4199 
   4200   //----------------------------------------------------------------------------
   4201   //
   4202   //----------------------------------------------------------------------------
   4203   for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
   4204          e = ToolChain.ExtraOpts.end();
   4205        i != e; ++i)
   4206     CmdArgs.push_back(i->c_str());
   4207 
   4208   std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
   4209   CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
   4210 
   4211   if (buildingLib) {
   4212     CmdArgs.push_back("-shared");
   4213     CmdArgs.push_back("-call_shared"); // should be the default, but doing as
   4214                                        // hexagon-gcc does
   4215   }
   4216 
   4217   if (hasStaticArg)
   4218     CmdArgs.push_back("-static");
   4219 
   4220   if (buildPIE && !buildingLib)
   4221     CmdArgs.push_back("-pie");
   4222 
   4223   std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
   4224   if (!SmallDataThreshold.empty()) {
   4225     CmdArgs.push_back(
   4226       Args.MakeArgString(std::string("-G") + SmallDataThreshold));
   4227   }
   4228 
   4229   //----------------------------------------------------------------------------
   4230   //
   4231   //----------------------------------------------------------------------------
   4232   CmdArgs.push_back("-o");
   4233   CmdArgs.push_back(Output.getFilename());
   4234 
   4235   const std::string MarchSuffix = "/" + MarchString;
   4236   const std::string G0Suffix = "/G0";
   4237   const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
   4238   const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
   4239                               + "/";
   4240   const std::string StartFilesDir = RootDir
   4241                                     + "hexagon/lib"
   4242                                     + (buildingLib
   4243                                        ? MarchG0Suffix : MarchSuffix);
   4244 
   4245   //----------------------------------------------------------------------------
   4246   // moslib
   4247   //----------------------------------------------------------------------------
   4248   std::vector<std::string> oslibs;
   4249   bool hasStandalone= false;
   4250 
   4251   for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
   4252          ie = Args.filtered_end(); it != ie; ++it) {
   4253     (*it)->claim();
   4254     oslibs.push_back((*it)->getValue());
   4255     hasStandalone = hasStandalone || (oslibs.back() == "standalone");
   4256   }
   4257   if (oslibs.empty()) {
   4258     oslibs.push_back("standalone");
   4259     hasStandalone = true;
   4260   }
   4261 
   4262   //----------------------------------------------------------------------------
   4263   // Start Files
   4264   //----------------------------------------------------------------------------
   4265   if (incStdLib && incStartFiles) {
   4266 
   4267     if (!buildingLib) {
   4268       if (hasStandalone) {
   4269         CmdArgs.push_back(
   4270           Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
   4271       }
   4272       CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
   4273     }
   4274     std::string initObj = useShared ? "/initS.o" : "/init.o";
   4275     CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
   4276   }
   4277 
   4278   //----------------------------------------------------------------------------
   4279   // Library Search Paths
   4280   //----------------------------------------------------------------------------
   4281   const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
   4282   for (ToolChain::path_list::const_iterator
   4283          i = LibPaths.begin(),
   4284          e = LibPaths.end();
   4285        i != e;
   4286        ++i)
   4287     CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
   4288 
   4289   //----------------------------------------------------------------------------
   4290   //
   4291   //----------------------------------------------------------------------------
   4292   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   4293   Args.AddAllArgs(CmdArgs, options::OPT_e);
   4294   Args.AddAllArgs(CmdArgs, options::OPT_s);
   4295   Args.AddAllArgs(CmdArgs, options::OPT_t);
   4296   Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
   4297 
   4298   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
   4299 
   4300   //----------------------------------------------------------------------------
   4301   // Libraries
   4302   //----------------------------------------------------------------------------
   4303   if (incStdLib && incDefLibs) {
   4304     if (D.CCCIsCXX()) {
   4305       ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
   4306       CmdArgs.push_back("-lm");
   4307     }
   4308 
   4309     CmdArgs.push_back("--start-group");
   4310 
   4311     if (!buildingLib) {
   4312       for(std::vector<std::string>::iterator i = oslibs.begin(),
   4313             e = oslibs.end(); i != e; ++i)
   4314         CmdArgs.push_back(Args.MakeArgString("-l" + *i));
   4315       CmdArgs.push_back("-lc");
   4316     }
   4317     CmdArgs.push_back("-lgcc");
   4318 
   4319     CmdArgs.push_back("--end-group");
   4320   }
   4321 
   4322   //----------------------------------------------------------------------------
   4323   // End files
   4324   //----------------------------------------------------------------------------
   4325   if (incStdLib && incStartFiles) {
   4326     std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
   4327     CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
   4328   }
   4329 
   4330   std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
   4331   C.addCommand(
   4332     new Command(
   4333       JA, *this,
   4334       Args.MakeArgString(Linker), CmdArgs));
   4335 }
   4336 // Hexagon tools end.
   4337 
   4338 llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
   4339   // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
   4340   // archs which Darwin doesn't use.
   4341 
   4342   // The matching this routine does is fairly pointless, since it is neither the
   4343   // complete architecture list, nor a reasonable subset. The problem is that
   4344   // historically the driver driver accepts this and also ties its -march=
   4345   // handling to the architecture name, so we need to be careful before removing
   4346   // support for it.
   4347 
   4348   // This code must be kept in sync with Clang's Darwin specific argument
   4349   // translation.
   4350 
   4351   return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
   4352     .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
   4353     .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
   4354     .Case("ppc64", llvm::Triple::ppc64)
   4355     .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
   4356     .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
   4357            llvm::Triple::x86)
   4358     .Case("x86_64", llvm::Triple::x86_64)
   4359     // This is derived from the driver driver.
   4360     .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
   4361     .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
   4362     .Cases("armv7s", "xscale", llvm::Triple::arm)
   4363     .Case("r600", llvm::Triple::r600)
   4364     .Case("nvptx", llvm::Triple::nvptx)
   4365     .Case("nvptx64", llvm::Triple::nvptx64)
   4366     .Case("amdil", llvm::Triple::amdil)
   4367     .Case("spir", llvm::Triple::spir)
   4368     .Default(llvm::Triple::UnknownArch);
   4369 }
   4370 
   4371 const char *Clang::getBaseInputName(const ArgList &Args,
   4372                                     const InputInfoList &Inputs) {
   4373   return Args.MakeArgString(
   4374     llvm::sys::path::filename(Inputs[0].getBaseInput()));
   4375 }
   4376 
   4377 const char *Clang::getBaseInputStem(const ArgList &Args,
   4378                                     const InputInfoList &Inputs) {
   4379   const char *Str = getBaseInputName(Args, Inputs);
   4380 
   4381   if (const char *End = strrchr(Str, '.'))
   4382     return Args.MakeArgString(std::string(Str, End));
   4383 
   4384   return Str;
   4385 }
   4386 
   4387 const char *Clang::getDependencyFileName(const ArgList &Args,
   4388                                          const InputInfoList &Inputs) {
   4389   // FIXME: Think about this more.
   4390   std::string Res;
   4391 
   4392   if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
   4393     std::string Str(OutputOpt->getValue());
   4394     Res = Str.substr(0, Str.rfind('.'));
   4395   } else {
   4396     Res = getBaseInputStem(Args, Inputs);
   4397   }
   4398   return Args.MakeArgString(Res + ".d");
   4399 }
   4400 
   4401 void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   4402                                     const InputInfo &Output,
   4403                                     const InputInfoList &Inputs,
   4404                                     const ArgList &Args,
   4405                                     const char *LinkingOutput) const {
   4406   ArgStringList CmdArgs;
   4407 
   4408   assert(Inputs.size() == 1 && "Unexpected number of inputs.");
   4409   const InputInfo &Input = Inputs[0];
   4410 
   4411   // Determine the original source input.
   4412   const Action *SourceAction = &JA;
   4413   while (SourceAction->getKind() != Action::InputClass) {
   4414     assert(!SourceAction->getInputs().empty() && "unexpected root action!");
   4415     SourceAction = SourceAction->getInputs()[0];
   4416   }
   4417 
   4418   // Forward -g, assuming we are dealing with an actual assembly file.
   4419   if (SourceAction->getType() == types::TY_Asm ||
   4420       SourceAction->getType() == types::TY_PP_Asm) {
   4421     if (Args.hasArg(options::OPT_gstabs))
   4422       CmdArgs.push_back("--gstabs");
   4423     else if (Args.hasArg(options::OPT_g_Group))
   4424       CmdArgs.push_back("-g");
   4425   }
   4426 
   4427   // Derived from asm spec.
   4428   AddDarwinArch(Args, CmdArgs);
   4429 
   4430   // Use -force_cpusubtype_ALL on x86 by default.
   4431   if (getToolChain().getArch() == llvm::Triple::x86 ||
   4432       getToolChain().getArch() == llvm::Triple::x86_64 ||
   4433       Args.hasArg(options::OPT_force__cpusubtype__ALL))
   4434     CmdArgs.push_back("-force_cpusubtype_ALL");
   4435 
   4436   if (getToolChain().getArch() != llvm::Triple::x86_64 &&
   4437       (((Args.hasArg(options::OPT_mkernel) ||
   4438          Args.hasArg(options::OPT_fapple_kext)) &&
   4439         (!getDarwinToolChain().isTargetIPhoneOS() ||
   4440          getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
   4441        Args.hasArg(options::OPT_static)))
   4442     CmdArgs.push_back("-static");
   4443 
   4444   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   4445                        options::OPT_Xassembler);
   4446 
   4447   assert(Output.isFilename() && "Unexpected lipo output.");
   4448   CmdArgs.push_back("-o");
   4449   CmdArgs.push_back(Output.getFilename());
   4450 
   4451   assert(Input.isFilename() && "Invalid input.");
   4452   CmdArgs.push_back(Input.getFilename());
   4453 
   4454   // asm_final spec is empty.
   4455 
   4456   const char *Exec =
   4457     Args.MakeArgString(getToolChain().GetProgramPath("as"));
   4458   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   4459 }
   4460 
   4461 void darwin::DarwinTool::anchor() {}
   4462 
   4463 void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
   4464                                        ArgStringList &CmdArgs) const {
   4465   StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
   4466 
   4467   // Derived from darwin_arch spec.
   4468   CmdArgs.push_back("-arch");
   4469   CmdArgs.push_back(Args.MakeArgString(ArchName));
   4470 
   4471   // FIXME: Is this needed anymore?
   4472   if (ArchName == "arm")
   4473     CmdArgs.push_back("-force_cpusubtype_ALL");
   4474 }
   4475 
   4476 bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
   4477   // We only need to generate a temp path for LTO if we aren't compiling object
   4478   // files. When compiling source files, we run 'dsymutil' after linking. We
   4479   // don't run 'dsymutil' when compiling object files.
   4480   for (InputInfoList::const_iterator
   4481          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
   4482     if (it->getType() != types::TY_Object)
   4483       return true;
   4484 
   4485   return false;
   4486 }
   4487 
   4488 void darwin::Link::AddLinkArgs(Compilation &C,
   4489                                const ArgList &Args,
   4490                                ArgStringList &CmdArgs,
   4491                                const InputInfoList &Inputs) const {
   4492   const Driver &D = getToolChain().getDriver();
   4493   const toolchains::Darwin &DarwinTC = getDarwinToolChain();
   4494 
   4495   unsigned Version[3] = { 0, 0, 0 };
   4496   if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
   4497     bool HadExtra;
   4498     if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
   4499                                    Version[1], Version[2], HadExtra) ||
   4500         HadExtra)
   4501       D.Diag(diag::err_drv_invalid_version_number)
   4502         << A->getAsString(Args);
   4503   }
   4504 
   4505   // Newer linkers support -demangle, pass it if supported and not disabled by
   4506   // the user.
   4507   if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
   4508     // Don't pass -demangle to ld_classic.
   4509     //
   4510     // FIXME: This is a temporary workaround, ld should be handling this.
   4511     bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
   4512                           Args.hasArg(options::OPT_static));
   4513     if (getToolChain().getArch() == llvm::Triple::x86) {
   4514       for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
   4515                                                  options::OPT_Wl_COMMA),
   4516              ie = Args.filtered_end(); it != ie; ++it) {
   4517         const Arg *A = *it;
   4518         for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
   4519           if (StringRef(A->getValue(i)) == "-kext")
   4520             UsesLdClassic = true;
   4521       }
   4522     }
   4523     if (!UsesLdClassic)
   4524       CmdArgs.push_back("-demangle");
   4525   }
   4526 
   4527   if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
   4528     CmdArgs.push_back("-export_dynamic");
   4529 
   4530   // If we are using LTO, then automatically create a temporary file path for
   4531   // the linker to use, so that it's lifetime will extend past a possible
   4532   // dsymutil step.
   4533   if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
   4534     const char *TmpPath = C.getArgs().MakeArgString(
   4535       D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
   4536     C.addTempFile(TmpPath);
   4537     CmdArgs.push_back("-object_path_lto");
   4538     CmdArgs.push_back(TmpPath);
   4539   }
   4540 
   4541   // Derived from the "link" spec.
   4542   Args.AddAllArgs(CmdArgs, options::OPT_static);
   4543   if (!Args.hasArg(options::OPT_static))
   4544     CmdArgs.push_back("-dynamic");
   4545   if (Args.hasArg(options::OPT_fgnu_runtime)) {
   4546     // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
   4547     // here. How do we wish to handle such things?
   4548   }
   4549 
   4550   if (!Args.hasArg(options::OPT_dynamiclib)) {
   4551     AddDarwinArch(Args, CmdArgs);
   4552     // FIXME: Why do this only on this path?
   4553     Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
   4554 
   4555     Args.AddLastArg(CmdArgs, options::OPT_bundle);
   4556     Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
   4557     Args.AddAllArgs(CmdArgs, options::OPT_client__name);
   4558 
   4559     Arg *A;
   4560     if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
   4561         (A = Args.getLastArg(options::OPT_current__version)) ||
   4562         (A = Args.getLastArg(options::OPT_install__name)))
   4563       D.Diag(diag::err_drv_argument_only_allowed_with)
   4564         << A->getAsString(Args) << "-dynamiclib";
   4565 
   4566     Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
   4567     Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
   4568     Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
   4569   } else {
   4570     CmdArgs.push_back("-dylib");
   4571 
   4572     Arg *A;
   4573     if ((A = Args.getLastArg(options::OPT_bundle)) ||
   4574         (A = Args.getLastArg(options::OPT_bundle__loader)) ||
   4575         (A = Args.getLastArg(options::OPT_client__name)) ||
   4576         (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
   4577         (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
   4578         (A = Args.getLastArg(options::OPT_private__bundle)))
   4579       D.Diag(diag::err_drv_argument_not_allowed_with)
   4580         << A->getAsString(Args) << "-dynamiclib";
   4581 
   4582     Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
   4583                               "-dylib_compatibility_version");
   4584     Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
   4585                               "-dylib_current_version");
   4586 
   4587     AddDarwinArch(Args, CmdArgs);
   4588 
   4589     Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
   4590                               "-dylib_install_name");
   4591   }
   4592 
   4593   Args.AddLastArg(CmdArgs, options::OPT_all__load);
   4594   Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
   4595   Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
   4596   if (DarwinTC.isTargetIPhoneOS())
   4597     Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
   4598   Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
   4599   Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
   4600   Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
   4601   Args.AddLastArg(CmdArgs, options::OPT_dynamic);
   4602   Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
   4603   Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
   4604   Args.AddAllArgs(CmdArgs, options::OPT_force__load);
   4605   Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
   4606   Args.AddAllArgs(CmdArgs, options::OPT_image__base);
   4607   Args.AddAllArgs(CmdArgs, options::OPT_init);
   4608 
   4609   // Add the deployment target.
   4610   VersionTuple TargetVersion = DarwinTC.getTargetVersion();
   4611 
   4612   // If we had an explicit -mios-simulator-version-min argument, honor that,
   4613   // otherwise use the traditional deployment targets. We can't just check the
   4614   // is-sim attribute because existing code follows this path, and the linker
   4615   // may not handle the argument.
   4616   //
   4617   // FIXME: We may be able to remove this, once we can verify no one depends on
   4618   // it.
   4619   if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
   4620     CmdArgs.push_back("-ios_simulator_version_min");
   4621   else if (DarwinTC.isTargetIPhoneOS())
   4622     CmdArgs.push_back("-iphoneos_version_min");
   4623   else
   4624     CmdArgs.push_back("-macosx_version_min");
   4625   CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
   4626 
   4627   Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
   4628   Args.AddLastArg(CmdArgs, options::OPT_multi__module);
   4629   Args.AddLastArg(CmdArgs, options::OPT_single__module);
   4630   Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
   4631   Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
   4632 
   4633   if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
   4634                                      options::OPT_fno_pie,
   4635                                      options::OPT_fno_PIE)) {
   4636     if (A->getOption().matches(options::OPT_fpie) ||
   4637         A->getOption().matches(options::OPT_fPIE))
   4638       CmdArgs.push_back("-pie");
   4639     else
   4640       CmdArgs.push_back("-no_pie");
   4641   }
   4642 
   4643   Args.AddLastArg(CmdArgs, options::OPT_prebind);
   4644   Args.AddLastArg(CmdArgs, options::OPT_noprebind);
   4645   Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
   4646   Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
   4647   Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
   4648   Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
   4649   Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
   4650   Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
   4651   Args.AddAllArgs(CmdArgs, options::OPT_segprot);
   4652   Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
   4653   Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
   4654   Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
   4655   Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
   4656   Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
   4657   Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
   4658   Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
   4659 
   4660   // Give --sysroot= preference, over the Apple specific behavior to also use
   4661   // --isysroot as the syslibroot.
   4662   StringRef sysroot = C.getSysRoot();
   4663   if (sysroot != "") {
   4664     CmdArgs.push_back("-syslibroot");
   4665     CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
   4666   } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
   4667     CmdArgs.push_back("-syslibroot");
   4668     CmdArgs.push_back(A->getValue());
   4669   }
   4670 
   4671   Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
   4672   Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
   4673   Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
   4674   Args.AddAllArgs(CmdArgs, options::OPT_undefined);
   4675   Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
   4676   Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
   4677   Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
   4678   Args.AddAllArgs(CmdArgs, options::OPT_y);
   4679   Args.AddLastArg(CmdArgs, options::OPT_w);
   4680   Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
   4681   Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
   4682   Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
   4683   Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
   4684   Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
   4685   Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
   4686   Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
   4687   Args.AddLastArg(CmdArgs, options::OPT_whyload);
   4688   Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
   4689   Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
   4690   Args.AddLastArg(CmdArgs, options::OPT_dylinker);
   4691   Args.AddLastArg(CmdArgs, options::OPT_Mach);
   4692 }
   4693 
   4694 void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
   4695                                 const InputInfo &Output,
   4696                                 const InputInfoList &Inputs,
   4697                                 const ArgList &Args,
   4698                                 const char *LinkingOutput) const {
   4699   assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
   4700 
   4701   // The logic here is derived from gcc's behavior; most of which
   4702   // comes from specs (starting with link_command). Consult gcc for
   4703   // more information.
   4704   ArgStringList CmdArgs;
   4705 
   4706   /// Hack(tm) to ignore linking errors when we are doing ARC migration.
   4707   if (Args.hasArg(options::OPT_ccc_arcmt_check,
   4708                   options::OPT_ccc_arcmt_migrate)) {
   4709     for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
   4710       (*I)->claim();
   4711     const char *Exec =
   4712       Args.MakeArgString(getToolChain().GetProgramPath("touch"));
   4713     CmdArgs.push_back(Output.getFilename());
   4714     C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   4715     return;
   4716   }
   4717 
   4718   // I'm not sure why this particular decomposition exists in gcc, but
   4719   // we follow suite for ease of comparison.
   4720   AddLinkArgs(C, Args, CmdArgs, Inputs);
   4721 
   4722   Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
   4723   Args.AddAllArgs(CmdArgs, options::OPT_s);
   4724   Args.AddAllArgs(CmdArgs, options::OPT_t);
   4725   Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
   4726   Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
   4727   Args.AddLastArg(CmdArgs, options::OPT_e);
   4728   Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
   4729   Args.AddAllArgs(CmdArgs, options::OPT_r);
   4730 
   4731   // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
   4732   // members of static archive libraries which implement Objective-C classes or
   4733   // categories.
   4734   if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
   4735     CmdArgs.push_back("-ObjC");
   4736 
   4737   CmdArgs.push_back("-o");
   4738   CmdArgs.push_back(Output.getFilename());
   4739 
   4740   if (!Args.hasArg(options::OPT_nostdlib) &&
   4741       !Args.hasArg(options::OPT_nostartfiles)) {
   4742     // Derived from startfile spec.
   4743     if (Args.hasArg(options::OPT_dynamiclib)) {
   4744       // Derived from darwin_dylib1 spec.
   4745       if (getDarwinToolChain().isTargetIOSSimulator()) {
   4746         // The simulator doesn't have a versioned crt1 file.
   4747         CmdArgs.push_back("-ldylib1.o");
   4748       } else if (getDarwinToolChain().isTargetIPhoneOS()) {
   4749         if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
   4750           CmdArgs.push_back("-ldylib1.o");
   4751       } else {
   4752         if (getDarwinToolChain().isMacosxVersionLT(10, 5))
   4753           CmdArgs.push_back("-ldylib1.o");
   4754         else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
   4755           CmdArgs.push_back("-ldylib1.10.5.o");
   4756       }
   4757     } else {
   4758       if (Args.hasArg(options::OPT_bundle)) {
   4759         if (!Args.hasArg(options::OPT_static)) {
   4760           // Derived from darwin_bundle1 spec.
   4761           if (getDarwinToolChain().isTargetIOSSimulator()) {
   4762             // The simulator doesn't have a versioned crt1 file.
   4763             CmdArgs.push_back("-lbundle1.o");
   4764           } else if (getDarwinToolChain().isTargetIPhoneOS()) {
   4765             if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
   4766               CmdArgs.push_back("-lbundle1.o");
   4767           } else {
   4768             if (getDarwinToolChain().isMacosxVersionLT(10, 6))
   4769               CmdArgs.push_back("-lbundle1.o");
   4770           }
   4771         }
   4772       } else {
   4773         if (Args.hasArg(options::OPT_pg) &&
   4774             getToolChain().SupportsProfiling()) {
   4775           if (Args.hasArg(options::OPT_static) ||
   4776               Args.hasArg(options::OPT_object) ||
   4777               Args.hasArg(options::OPT_preload)) {
   4778             CmdArgs.push_back("-lgcrt0.o");
   4779           } else {
   4780             CmdArgs.push_back("-lgcrt1.o");
   4781 
   4782             // darwin_crt2 spec is empty.
   4783           }
   4784           // By default on OS X 10.8 and later, we don't link with a crt1.o
   4785           // file and the linker knows to use _main as the entry point.  But,
   4786           // when compiling with -pg, we need to link with the gcrt1.o file,
   4787           // so pass the -no_new_main option to tell the linker to use the
   4788           // "start" symbol as the entry point.
   4789           if (getDarwinToolChain().isTargetMacOS() &&
   4790               !getDarwinToolChain().isMacosxVersionLT(10, 8))
   4791             CmdArgs.push_back("-no_new_main");
   4792         } else {
   4793           if (Args.hasArg(options::OPT_static) ||
   4794               Args.hasArg(options::OPT_object) ||
   4795               Args.hasArg(options::OPT_preload)) {
   4796             CmdArgs.push_back("-lcrt0.o");
   4797           } else {
   4798             // Derived from darwin_crt1 spec.
   4799             if (getDarwinToolChain().isTargetIOSSimulator()) {
   4800               // The simulator doesn't have a versioned crt1 file.
   4801               CmdArgs.push_back("-lcrt1.o");
   4802             } else if (getDarwinToolChain().isTargetIPhoneOS()) {
   4803               if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
   4804                 CmdArgs.push_back("-lcrt1.o");
   4805               else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
   4806                 CmdArgs.push_back("-lcrt1.3.1.o");
   4807             } else {
   4808               if (getDarwinToolChain().isMacosxVersionLT(10, 5))
   4809                 CmdArgs.push_back("-lcrt1.o");
   4810               else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
   4811                 CmdArgs.push_back("-lcrt1.10.5.o");
   4812               else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
   4813                 CmdArgs.push_back("-lcrt1.10.6.o");
   4814 
   4815               // darwin_crt2 spec is empty.
   4816             }
   4817           }
   4818         }
   4819       }
   4820     }
   4821 
   4822     if (!getDarwinToolChain().isTargetIPhoneOS() &&
   4823         Args.hasArg(options::OPT_shared_libgcc) &&
   4824         getDarwinToolChain().isMacosxVersionLT(10, 5)) {
   4825       const char *Str =
   4826         Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
   4827       CmdArgs.push_back(Str);
   4828     }
   4829   }
   4830 
   4831   Args.AddAllArgs(CmdArgs, options::OPT_L);
   4832 
   4833   SanitizerArgs Sanitize(getToolChain(), Args);
   4834   // If we're building a dynamic lib with -fsanitize=address,
   4835   // unresolved symbols may appear. Mark all
   4836   // of them as dynamic_lookup. Linking executables is handled in
   4837   // lib/Driver/ToolChains.cpp.
   4838   if (Sanitize.needsAsanRt()) {
   4839     if (Args.hasArg(options::OPT_dynamiclib) ||
   4840         Args.hasArg(options::OPT_bundle)) {
   4841       CmdArgs.push_back("-undefined");
   4842       CmdArgs.push_back("dynamic_lookup");
   4843     }
   4844   }
   4845 
   4846   if (Args.hasArg(options::OPT_fopenmp))
   4847     // This is more complicated in gcc...
   4848     CmdArgs.push_back("-lgomp");
   4849 
   4850   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   4851 
   4852   if (isObjCRuntimeLinked(Args) &&
   4853       !Args.hasArg(options::OPT_nostdlib) &&
   4854       !Args.hasArg(options::OPT_nodefaultlibs)) {
   4855     // Avoid linking compatibility stubs on i386 mac.
   4856     if (!getDarwinToolChain().isTargetMacOS() ||
   4857         getDarwinToolChain().getArch() != llvm::Triple::x86) {
   4858       // If we don't have ARC or subscripting runtime support, link in the
   4859       // runtime stubs.  We have to do this *before* adding any of the normal
   4860       // linker inputs so that its initializer gets run first.
   4861       ObjCRuntime runtime =
   4862         getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
   4863       // We use arclite library for both ARC and subscripting support.
   4864       if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
   4865           !runtime.hasSubscripting())
   4866         getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
   4867     }
   4868     CmdArgs.push_back("-framework");
   4869     CmdArgs.push_back("Foundation");
   4870     // Link libobj.
   4871     CmdArgs.push_back("-lobjc");
   4872   }
   4873 
   4874   if (LinkingOutput) {
   4875     CmdArgs.push_back("-arch_multiple");
   4876     CmdArgs.push_back("-final_output");
   4877     CmdArgs.push_back(LinkingOutput);
   4878   }
   4879 
   4880   if (Args.hasArg(options::OPT_fnested_functions))
   4881     CmdArgs.push_back("-allow_stack_execute");
   4882 
   4883   if (!Args.hasArg(options::OPT_nostdlib) &&
   4884       !Args.hasArg(options::OPT_nodefaultlibs)) {
   4885     if (getToolChain().getDriver().CCCIsCXX())
   4886       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   4887 
   4888     // link_ssp spec is empty.
   4889 
   4890     // Let the tool chain choose which runtime library to link.
   4891     getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
   4892   }
   4893 
   4894   if (!Args.hasArg(options::OPT_nostdlib) &&
   4895       !Args.hasArg(options::OPT_nostartfiles)) {
   4896     // endfile_spec is empty.
   4897   }
   4898 
   4899   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   4900   Args.AddAllArgs(CmdArgs, options::OPT_F);
   4901 
   4902   const char *Exec =
   4903     Args.MakeArgString(getToolChain().GetProgramPath("ld"));
   4904   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   4905 }
   4906 
   4907 void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
   4908                                 const InputInfo &Output,
   4909                                 const InputInfoList &Inputs,
   4910                                 const ArgList &Args,
   4911                                 const char *LinkingOutput) const {
   4912   ArgStringList CmdArgs;
   4913 
   4914   CmdArgs.push_back("-create");
   4915   assert(Output.isFilename() && "Unexpected lipo output.");
   4916 
   4917   CmdArgs.push_back("-output");
   4918   CmdArgs.push_back(Output.getFilename());
   4919 
   4920   for (InputInfoList::const_iterator
   4921          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   4922     const InputInfo &II = *it;
   4923     assert(II.isFilename() && "Unexpected lipo input.");
   4924     CmdArgs.push_back(II.getFilename());
   4925   }
   4926   const char *Exec =
   4927     Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
   4928   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   4929 }
   4930 
   4931 void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
   4932                                     const InputInfo &Output,
   4933                                     const InputInfoList &Inputs,
   4934                                     const ArgList &Args,
   4935                                     const char *LinkingOutput) const {
   4936   ArgStringList CmdArgs;
   4937 
   4938   CmdArgs.push_back("-o");
   4939   CmdArgs.push_back(Output.getFilename());
   4940 
   4941   assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
   4942   const InputInfo &Input = Inputs[0];
   4943   assert(Input.isFilename() && "Unexpected dsymutil input.");
   4944   CmdArgs.push_back(Input.getFilename());
   4945 
   4946   const char *Exec =
   4947     Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
   4948   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   4949 }
   4950 
   4951 void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
   4952                                        const InputInfo &Output,
   4953                                        const InputInfoList &Inputs,
   4954                                        const ArgList &Args,
   4955                                        const char *LinkingOutput) const {
   4956   ArgStringList CmdArgs;
   4957   CmdArgs.push_back("--verify");
   4958   CmdArgs.push_back("--debug-info");
   4959   CmdArgs.push_back("--eh-frame");
   4960   CmdArgs.push_back("--quiet");
   4961 
   4962   assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
   4963   const InputInfo &Input = Inputs[0];
   4964   assert(Input.isFilename() && "Unexpected verify input");
   4965 
   4966   // Grabbing the output of the earlier dsymutil run.
   4967   CmdArgs.push_back(Input.getFilename());
   4968 
   4969   const char *Exec =
   4970     Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
   4971   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   4972 }
   4973 
   4974 void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   4975                                       const InputInfo &Output,
   4976                                       const InputInfoList &Inputs,
   4977                                       const ArgList &Args,
   4978                                       const char *LinkingOutput) const {
   4979   ArgStringList CmdArgs;
   4980 
   4981   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   4982                        options::OPT_Xassembler);
   4983 
   4984   CmdArgs.push_back("-o");
   4985   CmdArgs.push_back(Output.getFilename());
   4986 
   4987   for (InputInfoList::const_iterator
   4988          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   4989     const InputInfo &II = *it;
   4990     CmdArgs.push_back(II.getFilename());
   4991   }
   4992 
   4993   const char *Exec =
   4994     Args.MakeArgString(getToolChain().GetProgramPath("as"));
   4995   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   4996 }
   4997 
   4998 
   4999 void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
   5000                                   const InputInfo &Output,
   5001                                   const InputInfoList &Inputs,
   5002                                   const ArgList &Args,
   5003                                   const char *LinkingOutput) const {
   5004   // FIXME: Find a real GCC, don't hard-code versions here
   5005   std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
   5006   const llvm::Triple &T = getToolChain().getTriple();
   5007   std::string LibPath = "/usr/lib/";
   5008   llvm::Triple::ArchType Arch = T.getArch();
   5009   switch (Arch) {
   5010         case llvm::Triple::x86:
   5011           GCCLibPath += ("i386-" + T.getVendorName() + "-" +
   5012               T.getOSName()).str() + "/4.5.2/";
   5013           break;
   5014         case llvm::Triple::x86_64:
   5015           GCCLibPath += ("i386-" + T.getVendorName() + "-" +
   5016               T.getOSName()).str();
   5017           GCCLibPath += "/4.5.2/amd64/";
   5018           LibPath += "amd64/";
   5019           break;
   5020         default:
   5021           assert(0 && "Unsupported architecture");
   5022   }
   5023 
   5024   ArgStringList CmdArgs;
   5025 
   5026   // Demangle C++ names in errors
   5027   CmdArgs.push_back("-C");
   5028 
   5029   if ((!Args.hasArg(options::OPT_nostdlib)) &&
   5030       (!Args.hasArg(options::OPT_shared))) {
   5031     CmdArgs.push_back("-e");
   5032     CmdArgs.push_back("_start");
   5033   }
   5034 
   5035   if (Args.hasArg(options::OPT_static)) {
   5036     CmdArgs.push_back("-Bstatic");
   5037     CmdArgs.push_back("-dn");
   5038   } else {
   5039     CmdArgs.push_back("-Bdynamic");
   5040     if (Args.hasArg(options::OPT_shared)) {
   5041       CmdArgs.push_back("-shared");
   5042     } else {
   5043       CmdArgs.push_back("--dynamic-linker");
   5044       CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
   5045     }
   5046   }
   5047 
   5048   if (Output.isFilename()) {
   5049     CmdArgs.push_back("-o");
   5050     CmdArgs.push_back(Output.getFilename());
   5051   } else {
   5052     assert(Output.isNothing() && "Invalid output.");
   5053   }
   5054 
   5055   if (!Args.hasArg(options::OPT_nostdlib) &&
   5056       !Args.hasArg(options::OPT_nostartfiles)) {
   5057     if (!Args.hasArg(options::OPT_shared)) {
   5058       CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
   5059       CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
   5060       CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
   5061       CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
   5062     } else {
   5063       CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
   5064       CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
   5065       CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
   5066     }
   5067     if (getToolChain().getDriver().CCCIsCXX())
   5068       CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
   5069   }
   5070 
   5071   CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
   5072 
   5073   Args.AddAllArgs(CmdArgs, options::OPT_L);
   5074   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   5075   Args.AddAllArgs(CmdArgs, options::OPT_e);
   5076   Args.AddAllArgs(CmdArgs, options::OPT_r);
   5077 
   5078   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   5079 
   5080   if (!Args.hasArg(options::OPT_nostdlib) &&
   5081       !Args.hasArg(options::OPT_nodefaultlibs)) {
   5082     if (getToolChain().getDriver().CCCIsCXX())
   5083       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   5084     CmdArgs.push_back("-lgcc_s");
   5085     if (!Args.hasArg(options::OPT_shared)) {
   5086       CmdArgs.push_back("-lgcc");
   5087       CmdArgs.push_back("-lc");
   5088       CmdArgs.push_back("-lm");
   5089     }
   5090   }
   5091 
   5092   if (!Args.hasArg(options::OPT_nostdlib) &&
   5093       !Args.hasArg(options::OPT_nostartfiles)) {
   5094     CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
   5095   }
   5096   CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
   5097 
   5098   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
   5099 
   5100   const char *Exec =
   5101     Args.MakeArgString(getToolChain().GetProgramPath("ld"));
   5102   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   5103 }
   5104 
   5105 void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   5106                                       const InputInfo &Output,
   5107                                       const InputInfoList &Inputs,
   5108                                       const ArgList &Args,
   5109                                       const char *LinkingOutput) const {
   5110   ArgStringList CmdArgs;
   5111 
   5112   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   5113                        options::OPT_Xassembler);
   5114 
   5115   CmdArgs.push_back("-o");
   5116   CmdArgs.push_back(Output.getFilename());
   5117 
   5118   for (InputInfoList::const_iterator
   5119          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   5120     const InputInfo &II = *it;
   5121     CmdArgs.push_back(II.getFilename());
   5122   }
   5123 
   5124   const char *Exec =
   5125     Args.MakeArgString(getToolChain().GetProgramPath("gas"));
   5126   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   5127 }
   5128 
   5129 void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
   5130                                   const InputInfo &Output,
   5131                                   const InputInfoList &Inputs,
   5132                                   const ArgList &Args,
   5133                                   const char *LinkingOutput) const {
   5134   ArgStringList CmdArgs;
   5135 
   5136   if ((!Args.hasArg(options::OPT_nostdlib)) &&
   5137       (!Args.hasArg(options::OPT_shared))) {
   5138     CmdArgs.push_back("-e");
   5139     CmdArgs.push_back("_start");
   5140   }
   5141 
   5142   if (Args.hasArg(options::OPT_static)) {
   5143     CmdArgs.push_back("-Bstatic");
   5144     CmdArgs.push_back("-dn");
   5145   } else {
   5146 //    CmdArgs.push_back("--eh-frame-hdr");
   5147     CmdArgs.push_back("-Bdynamic");
   5148     if (Args.hasArg(options::OPT_shared)) {
   5149       CmdArgs.push_back("-shared");
   5150     } else {
   5151       CmdArgs.push_back("--dynamic-linker");
   5152       CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
   5153     }
   5154   }
   5155 
   5156   if (Output.isFilename()) {
   5157     CmdArgs.push_back("-o");
   5158     CmdArgs.push_back(Output.getFilename());
   5159   } else {
   5160     assert(Output.isNothing() && "Invalid output.");
   5161   }
   5162 
   5163   if (!Args.hasArg(options::OPT_nostdlib) &&
   5164       !Args.hasArg(options::OPT_nostartfiles)) {
   5165     if (!Args.hasArg(options::OPT_shared)) {
   5166       CmdArgs.push_back(Args.MakeArgString(
   5167                                 getToolChain().GetFilePath("crt1.o")));
   5168       CmdArgs.push_back(Args.MakeArgString(
   5169                                 getToolChain().GetFilePath("crti.o")));
   5170       CmdArgs.push_back(Args.MakeArgString(
   5171                                 getToolChain().GetFilePath("crtbegin.o")));
   5172     } else {
   5173       CmdArgs.push_back(Args.MakeArgString(
   5174                                 getToolChain().GetFilePath("crti.o")));
   5175     }
   5176     CmdArgs.push_back(Args.MakeArgString(
   5177                                 getToolChain().GetFilePath("crtn.o")));
   5178   }
   5179 
   5180   CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
   5181                                        + getToolChain().getTripleString()
   5182                                        + "/4.2.4"));
   5183 
   5184   Args.AddAllArgs(CmdArgs, options::OPT_L);
   5185   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   5186   Args.AddAllArgs(CmdArgs, options::OPT_e);
   5187 
   5188   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   5189 
   5190   if (!Args.hasArg(options::OPT_nostdlib) &&
   5191       !Args.hasArg(options::OPT_nodefaultlibs)) {
   5192     // FIXME: For some reason GCC passes -lgcc before adding
   5193     // the default system libraries. Just mimic this for now.
   5194     CmdArgs.push_back("-lgcc");
   5195 
   5196     if (Args.hasArg(options::OPT_pthread))
   5197       CmdArgs.push_back("-pthread");
   5198     if (!Args.hasArg(options::OPT_shared))
   5199       CmdArgs.push_back("-lc");
   5200     CmdArgs.push_back("-lgcc");
   5201   }
   5202 
   5203   if (!Args.hasArg(options::OPT_nostdlib) &&
   5204       !Args.hasArg(options::OPT_nostartfiles)) {
   5205     if (!Args.hasArg(options::OPT_shared))
   5206       CmdArgs.push_back(Args.MakeArgString(
   5207                                 getToolChain().GetFilePath("crtend.o")));
   5208   }
   5209 
   5210   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
   5211 
   5212   const char *Exec =
   5213     Args.MakeArgString(getToolChain().GetProgramPath("ld"));
   5214   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   5215 }
   5216 
   5217 void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   5218                                      const InputInfo &Output,
   5219                                      const InputInfoList &Inputs,
   5220                                      const ArgList &Args,
   5221                                      const char *LinkingOutput) const {
   5222   ArgStringList CmdArgs;
   5223 
   5224   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   5225                        options::OPT_Xassembler);
   5226 
   5227   CmdArgs.push_back("-o");
   5228   CmdArgs.push_back(Output.getFilename());
   5229 
   5230   for (InputInfoList::const_iterator
   5231          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   5232     const InputInfo &II = *it;
   5233     CmdArgs.push_back(II.getFilename());
   5234   }
   5235 
   5236   const char *Exec =
   5237     Args.MakeArgString(getToolChain().GetProgramPath("as"));
   5238   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   5239 }
   5240 
   5241 void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
   5242                                  const InputInfo &Output,
   5243                                  const InputInfoList &Inputs,
   5244                                  const ArgList &Args,
   5245                                  const char *LinkingOutput) const {
   5246   const Driver &D = getToolChain().getDriver();
   5247   ArgStringList CmdArgs;
   5248 
   5249   // Silence warning for "clang -g foo.o -o foo"
   5250   Args.ClaimAllArgs(options::OPT_g_Group);
   5251   // and "clang -emit-llvm foo.o -o foo"
   5252   Args.ClaimAllArgs(options::OPT_emit_llvm);
   5253   // and for "clang -w foo.o -o foo". Other warning options are already
   5254   // handled somewhere else.
   5255   Args.ClaimAllArgs(options::OPT_w);
   5256 
   5257   if ((!Args.hasArg(options::OPT_nostdlib)) &&
   5258       (!Args.hasArg(options::OPT_shared))) {
   5259     CmdArgs.push_back("-e");
   5260     CmdArgs.push_back("__start");
   5261   }
   5262 
   5263   if (Args.hasArg(options::OPT_static)) {
   5264     CmdArgs.push_back("-Bstatic");
   5265   } else {
   5266     if (Args.hasArg(options::OPT_rdynamic))
   5267       CmdArgs.push_back("-export-dynamic");
   5268     CmdArgs.push_back("--eh-frame-hdr");
   5269     CmdArgs.push_back("-Bdynamic");
   5270     if (Args.hasArg(options::OPT_shared)) {
   5271       CmdArgs.push_back("-shared");
   5272     } else {
   5273       CmdArgs.push_back("-dynamic-linker");
   5274       CmdArgs.push_back("/usr/libexec/ld.so");
   5275     }
   5276   }
   5277 
   5278   if (Args.hasArg(options::OPT_nopie))
   5279     CmdArgs.push_back("-nopie");
   5280 
   5281   if (Output.isFilename()) {
   5282     CmdArgs.push_back("-o");
   5283     CmdArgs.push_back(Output.getFilename());
   5284   } else {
   5285     assert(Output.isNothing() && "Invalid output.");
   5286   }
   5287 
   5288   if (!Args.hasArg(options::OPT_nostdlib) &&
   5289       !Args.hasArg(options::OPT_nostartfiles)) {
   5290     if (!Args.hasArg(options::OPT_shared)) {
   5291       if (Args.hasArg(options::OPT_pg))
   5292         CmdArgs.push_back(Args.MakeArgString(
   5293                                 getToolChain().GetFilePath("gcrt0.o")));
   5294       else
   5295         CmdArgs.push_back(Args.MakeArgString(
   5296                                 getToolChain().GetFilePath("crt0.o")));
   5297       CmdArgs.push_back(Args.MakeArgString(
   5298                               getToolChain().GetFilePath("crtbegin.o")));
   5299     } else {
   5300       CmdArgs.push_back(Args.MakeArgString(
   5301                               getToolChain().GetFilePath("crtbeginS.o")));
   5302     }
   5303   }
   5304 
   5305   std::string Triple = getToolChain().getTripleString();
   5306   if (Triple.substr(0, 6) == "x86_64")
   5307     Triple.replace(0, 6, "amd64");
   5308   CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
   5309                                        "/4.2.1"));
   5310 
   5311   Args.AddAllArgs(CmdArgs, options::OPT_L);
   5312   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   5313   Args.AddAllArgs(CmdArgs, options::OPT_e);
   5314   Args.AddAllArgs(CmdArgs, options::OPT_s);
   5315   Args.AddAllArgs(CmdArgs, options::OPT_t);
   5316   Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
   5317   Args.AddAllArgs(CmdArgs, options::OPT_r);
   5318 
   5319   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   5320 
   5321   if (!Args.hasArg(options::OPT_nostdlib) &&
   5322       !Args.hasArg(options::OPT_nodefaultlibs)) {
   5323     if (D.CCCIsCXX()) {
   5324       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   5325       if (Args.hasArg(options::OPT_pg))
   5326         CmdArgs.push_back("-lm_p");
   5327       else
   5328         CmdArgs.push_back("-lm");
   5329     }
   5330 
   5331     // FIXME: For some reason GCC passes -lgcc before adding
   5332     // the default system libraries. Just mimic this for now.
   5333     CmdArgs.push_back("-lgcc");
   5334 
   5335     if (Args.hasArg(options::OPT_pthread)) {
   5336       if (!Args.hasArg(options::OPT_shared) &&
   5337           Args.hasArg(options::OPT_pg))
   5338          CmdArgs.push_back("-lpthread_p");
   5339       else
   5340          CmdArgs.push_back("-lpthread");
   5341     }
   5342 
   5343     if (!Args.hasArg(options::OPT_shared)) {
   5344       if (Args.hasArg(options::OPT_pg))
   5345          CmdArgs.push_back("-lc_p");
   5346       else
   5347          CmdArgs.push_back("-lc");
   5348     }
   5349 
   5350     CmdArgs.push_back("-lgcc");
   5351   }
   5352 
   5353   if (!Args.hasArg(options::OPT_nostdlib) &&
   5354       !Args.hasArg(options::OPT_nostartfiles)) {
   5355     if (!Args.hasArg(options::OPT_shared))
   5356       CmdArgs.push_back(Args.MakeArgString(
   5357                               getToolChain().GetFilePath("crtend.o")));
   5358     else
   5359       CmdArgs.push_back(Args.MakeArgString(
   5360                               getToolChain().GetFilePath("crtendS.o")));
   5361   }
   5362 
   5363   const char *Exec =
   5364     Args.MakeArgString(getToolChain().GetProgramPath("ld"));
   5365   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   5366 }
   5367 
   5368 void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   5369                                     const InputInfo &Output,
   5370                                     const InputInfoList &Inputs,
   5371                                     const ArgList &Args,
   5372                                     const char *LinkingOutput) const {
   5373   ArgStringList CmdArgs;
   5374 
   5375   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   5376                        options::OPT_Xassembler);
   5377 
   5378   CmdArgs.push_back("-o");
   5379   CmdArgs.push_back(Output.getFilename());
   5380 
   5381   for (InputInfoList::const_iterator
   5382          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   5383     const InputInfo &II = *it;
   5384     CmdArgs.push_back(II.getFilename());
   5385   }
   5386 
   5387   const char *Exec =
   5388     Args.MakeArgString(getToolChain().GetProgramPath("as"));
   5389   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   5390 }
   5391 
   5392 void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
   5393                                 const InputInfo &Output,
   5394                                 const InputInfoList &Inputs,
   5395                                 const ArgList &Args,
   5396                                 const char *LinkingOutput) const {
   5397   const Driver &D = getToolChain().getDriver();
   5398   ArgStringList CmdArgs;
   5399 
   5400   if ((!Args.hasArg(options::OPT_nostdlib)) &&
   5401       (!Args.hasArg(options::OPT_shared))) {
   5402     CmdArgs.push_back("-e");
   5403     CmdArgs.push_back("__start");
   5404   }
   5405 
   5406   if (Args.hasArg(options::OPT_static)) {
   5407     CmdArgs.push_back("-Bstatic");
   5408   } else {
   5409     if (Args.hasArg(options::OPT_rdynamic))
   5410       CmdArgs.push_back("-export-dynamic");
   5411     CmdArgs.push_back("--eh-frame-hdr");
   5412     CmdArgs.push_back("-Bdynamic");
   5413     if (Args.hasArg(options::OPT_shared)) {
   5414       CmdArgs.push_back("-shared");
   5415     } else {
   5416       CmdArgs.push_back("-dynamic-linker");
   5417       CmdArgs.push_back("/usr/libexec/ld.so");
   5418     }
   5419   }
   5420 
   5421   if (Output.isFilename()) {
   5422     CmdArgs.push_back("-o");
   5423     CmdArgs.push_back(Output.getFilename());
   5424   } else {
   5425     assert(Output.isNothing() && "Invalid output.");
   5426   }
   5427 
   5428   if (!Args.hasArg(options::OPT_nostdlib) &&
   5429       !Args.hasArg(options::OPT_nostartfiles)) {
   5430     if (!Args.hasArg(options::OPT_shared)) {
   5431       if (Args.hasArg(options::OPT_pg))
   5432         CmdArgs.push_back(Args.MakeArgString(
   5433                                 getToolChain().GetFilePath("gcrt0.o")));
   5434       else
   5435         CmdArgs.push_back(Args.MakeArgString(
   5436                                 getToolChain().GetFilePath("crt0.o")));
   5437       CmdArgs.push_back(Args.MakeArgString(
   5438                               getToolChain().GetFilePath("crtbegin.o")));
   5439     } else {
   5440       CmdArgs.push_back(Args.MakeArgString(
   5441                               getToolChain().GetFilePath("crtbeginS.o")));
   5442     }
   5443   }
   5444 
   5445   Args.AddAllArgs(CmdArgs, options::OPT_L);
   5446   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   5447   Args.AddAllArgs(CmdArgs, options::OPT_e);
   5448 
   5449   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   5450 
   5451   if (!Args.hasArg(options::OPT_nostdlib) &&
   5452       !Args.hasArg(options::OPT_nodefaultlibs)) {
   5453     if (D.CCCIsCXX()) {
   5454       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   5455       if (Args.hasArg(options::OPT_pg))
   5456         CmdArgs.push_back("-lm_p");
   5457       else
   5458         CmdArgs.push_back("-lm");
   5459     }
   5460 
   5461     if (Args.hasArg(options::OPT_pthread)) {
   5462       if (!Args.hasArg(options::OPT_shared) &&
   5463           Args.hasArg(options::OPT_pg))
   5464         CmdArgs.push_back("-lpthread_p");
   5465       else
   5466         CmdArgs.push_back("-lpthread");
   5467     }
   5468 
   5469     if (!Args.hasArg(options::OPT_shared)) {
   5470       if (Args.hasArg(options::OPT_pg))
   5471         CmdArgs.push_back("-lc_p");
   5472       else
   5473         CmdArgs.push_back("-lc");
   5474     }
   5475 
   5476     std::string myarch = "-lclang_rt.";
   5477     const llvm::Triple &T = getToolChain().getTriple();
   5478     llvm::Triple::ArchType Arch = T.getArch();
   5479     switch (Arch) {
   5480           case llvm::Triple::arm:
   5481             myarch += ("arm");
   5482             break;
   5483           case llvm::Triple::x86:
   5484             myarch += ("i386");
   5485             break;
   5486           case llvm::Triple::x86_64:
   5487             myarch += ("amd64");
   5488             break;
   5489           default:
   5490             assert(0 && "Unsupported architecture");
   5491      }
   5492      CmdArgs.push_back(Args.MakeArgString(myarch));
   5493   }
   5494 
   5495   if (!Args.hasArg(options::OPT_nostdlib) &&
   5496       !Args.hasArg(options::OPT_nostartfiles)) {
   5497     if (!Args.hasArg(options::OPT_shared))
   5498       CmdArgs.push_back(Args.MakeArgString(
   5499                               getToolChain().GetFilePath("crtend.o")));
   5500     else
   5501       CmdArgs.push_back(Args.MakeArgString(
   5502                               getToolChain().GetFilePath("crtendS.o")));
   5503   }
   5504 
   5505   const char *Exec =
   5506     Args.MakeArgString(getToolChain().GetProgramPath("ld"));
   5507   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   5508 }
   5509 
   5510 void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   5511                                      const InputInfo &Output,
   5512                                      const InputInfoList &Inputs,
   5513                                      const ArgList &Args,
   5514                                      const char *LinkingOutput) const {
   5515   ArgStringList CmdArgs;
   5516 
   5517   // When building 32-bit code on FreeBSD/amd64, we have to explicitly
   5518   // instruct as in the base system to assemble 32-bit code.
   5519   if (getToolChain().getArch() == llvm::Triple::x86)
   5520     CmdArgs.push_back("--32");
   5521   else if (getToolChain().getArch() == llvm::Triple::ppc)
   5522     CmdArgs.push_back("-a32");
   5523   else if (getToolChain().getArch() == llvm::Triple::mips ||
   5524            getToolChain().getArch() == llvm::Triple::mipsel ||
   5525            getToolChain().getArch() == llvm::Triple::mips64 ||
   5526            getToolChain().getArch() == llvm::Triple::mips64el) {
   5527     StringRef CPUName;
   5528     StringRef ABIName;
   5529     getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
   5530 
   5531     CmdArgs.push_back("-march");
   5532     CmdArgs.push_back(CPUName.data());
   5533 
   5534     CmdArgs.push_back("-mabi");
   5535     CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
   5536 
   5537     if (getToolChain().getArch() == llvm::Triple::mips ||
   5538         getToolChain().getArch() == llvm::Triple::mips64)
   5539       CmdArgs.push_back("-EB");
   5540     else
   5541       CmdArgs.push_back("-EL");
   5542 
   5543     Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
   5544                                       options::OPT_fpic, options::OPT_fno_pic,
   5545                                       options::OPT_fPIE, options::OPT_fno_PIE,
   5546                                       options::OPT_fpie, options::OPT_fno_pie);
   5547     if (LastPICArg &&
   5548         (LastPICArg->getOption().matches(options::OPT_fPIC) ||
   5549          LastPICArg->getOption().matches(options::OPT_fpic) ||
   5550          LastPICArg->getOption().matches(options::OPT_fPIE) ||
   5551          LastPICArg->getOption().matches(options::OPT_fpie))) {
   5552       CmdArgs.push_back("-KPIC");
   5553     }
   5554   } else if (getToolChain().getArch() == llvm::Triple::arm ||
   5555              getToolChain().getArch() == llvm::Triple::thumb) {
   5556     CmdArgs.push_back("-mfpu=softvfp");
   5557     switch(getToolChain().getTriple().getEnvironment()) {
   5558     case llvm::Triple::GNUEABI:
   5559     case llvm::Triple::EABI:
   5560       CmdArgs.push_back("-meabi=5");
   5561       break;
   5562 
   5563     default:
   5564       CmdArgs.push_back("-matpcs");
   5565     }
   5566   }
   5567 
   5568   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   5569                        options::OPT_Xassembler);
   5570 
   5571   CmdArgs.push_back("-o");
   5572   CmdArgs.push_back(Output.getFilename());
   5573 
   5574   for (InputInfoList::const_iterator
   5575          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   5576     const InputInfo &II = *it;
   5577     CmdArgs.push_back(II.getFilename());
   5578   }
   5579 
   5580   const char *Exec =
   5581     Args.MakeArgString(getToolChain().GetProgramPath("as"));
   5582   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   5583 }
   5584 
   5585 void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
   5586                                  const InputInfo &Output,
   5587                                  const InputInfoList &Inputs,
   5588                                  const ArgList &Args,
   5589                                  const char *LinkingOutput) const {
   5590   const toolchains::FreeBSD& ToolChain =
   5591     static_cast<const toolchains::FreeBSD&>(getToolChain());
   5592   const Driver &D = ToolChain.getDriver();
   5593   ArgStringList CmdArgs;
   5594 
   5595   // Silence warning for "clang -g foo.o -o foo"
   5596   Args.ClaimAllArgs(options::OPT_g_Group);
   5597   // and "clang -emit-llvm foo.o -o foo"
   5598   Args.ClaimAllArgs(options::OPT_emit_llvm);
   5599   // and for "clang -w foo.o -o foo". Other warning options are already
   5600   // handled somewhere else.
   5601   Args.ClaimAllArgs(options::OPT_w);
   5602 
   5603   if (!D.SysRoot.empty())
   5604     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   5605 
   5606   if (Args.hasArg(options::OPT_pie))
   5607     CmdArgs.push_back("-pie");
   5608 
   5609   if (Args.hasArg(options::OPT_static)) {
   5610     CmdArgs.push_back("-Bstatic");
   5611   } else {
   5612     if (Args.hasArg(options::OPT_rdynamic))
   5613       CmdArgs.push_back("-export-dynamic");
   5614     CmdArgs.push_back("--eh-frame-hdr");
   5615     if (Args.hasArg(options::OPT_shared)) {
   5616       CmdArgs.push_back("-Bshareable");
   5617     } else {
   5618       CmdArgs.push_back("-dynamic-linker");
   5619       CmdArgs.push_back("/libexec/ld-elf.so.1");
   5620     }
   5621     if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
   5622       llvm::Triple::ArchType Arch = ToolChain.getArch();
   5623       if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
   5624           Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
   5625         CmdArgs.push_back("--hash-style=both");
   5626       }
   5627     }
   5628     CmdArgs.push_back("--enable-new-dtags");
   5629   }
   5630 
   5631   // When building 32-bit code on FreeBSD/amd64, we have to explicitly
   5632   // instruct ld in the base system to link 32-bit code.
   5633   if (ToolChain.getArch() == llvm::Triple::x86) {
   5634     CmdArgs.push_back("-m");
   5635     CmdArgs.push_back("elf_i386_fbsd");
   5636   }
   5637 
   5638   if (ToolChain.getArch() == llvm::Triple::ppc) {
   5639     CmdArgs.push_back("-m");
   5640     CmdArgs.push_back("elf32ppc_fbsd");
   5641   }
   5642 
   5643   if (Output.isFilename()) {
   5644     CmdArgs.push_back("-o");
   5645     CmdArgs.push_back(Output.getFilename());
   5646   } else {
   5647     assert(Output.isNothing() && "Invalid output.");
   5648   }
   5649 
   5650   if (!Args.hasArg(options::OPT_nostdlib) &&
   5651       !Args.hasArg(options::OPT_nostartfiles)) {
   5652     const char *crt1 = NULL;
   5653     if (!Args.hasArg(options::OPT_shared)) {
   5654       if (Args.hasArg(options::OPT_pg))
   5655         crt1 = "gcrt1.o";
   5656       else if (Args.hasArg(options::OPT_pie))
   5657         crt1 = "Scrt1.o";
   5658       else
   5659         crt1 = "crt1.o";
   5660     }
   5661     if (crt1)
   5662       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
   5663 
   5664     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
   5665 
   5666     const char *crtbegin = NULL;
   5667     if (Args.hasArg(options::OPT_static))
   5668       crtbegin = "crtbeginT.o";
   5669     else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
   5670       crtbegin = "crtbeginS.o";
   5671     else
   5672       crtbegin = "crtbegin.o";
   5673 
   5674     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
   5675   }
   5676 
   5677   Args.AddAllArgs(CmdArgs, options::OPT_L);
   5678   const ToolChain::path_list Paths = ToolChain.getFilePaths();
   5679   for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
   5680        i != e; ++i)
   5681     CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
   5682   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   5683   Args.AddAllArgs(CmdArgs, options::OPT_e);
   5684   Args.AddAllArgs(CmdArgs, options::OPT_s);
   5685   Args.AddAllArgs(CmdArgs, options::OPT_t);
   5686   Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
   5687   Args.AddAllArgs(CmdArgs, options::OPT_r);
   5688 
   5689   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
   5690 
   5691   if (!Args.hasArg(options::OPT_nostdlib) &&
   5692       !Args.hasArg(options::OPT_nodefaultlibs)) {
   5693     if (D.CCCIsCXX()) {
   5694       ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
   5695       if (Args.hasArg(options::OPT_pg))
   5696         CmdArgs.push_back("-lm_p");
   5697       else
   5698         CmdArgs.push_back("-lm");
   5699     }
   5700     // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
   5701     // the default system libraries. Just mimic this for now.
   5702     if (Args.hasArg(options::OPT_pg))
   5703       CmdArgs.push_back("-lgcc_p");
   5704     else
   5705       CmdArgs.push_back("-lgcc");
   5706     if (Args.hasArg(options::OPT_static)) {
   5707       CmdArgs.push_back("-lgcc_eh");
   5708     } else if (Args.hasArg(options::OPT_pg)) {
   5709       CmdArgs.push_back("-lgcc_eh_p");
   5710     } else {
   5711       CmdArgs.push_back("--as-needed");
   5712       CmdArgs.push_back("-lgcc_s");
   5713       CmdArgs.push_back("--no-as-needed");
   5714     }
   5715 
   5716     if (Args.hasArg(options::OPT_pthread)) {
   5717       if (Args.hasArg(options::OPT_pg))
   5718         CmdArgs.push_back("-lpthread_p");
   5719       else
   5720         CmdArgs.push_back("-lpthread");
   5721     }
   5722 
   5723     if (Args.hasArg(options::OPT_pg)) {
   5724       if (Args.hasArg(options::OPT_shared))
   5725         CmdArgs.push_back("-lc");
   5726       else
   5727         CmdArgs.push_back("-lc_p");
   5728       CmdArgs.push_back("-lgcc_p");
   5729     } else {
   5730       CmdArgs.push_back("-lc");
   5731       CmdArgs.push_back("-lgcc");
   5732     }
   5733 
   5734     if (Args.hasArg(options::OPT_static)) {
   5735       CmdArgs.push_back("-lgcc_eh");
   5736     } else if (Args.hasArg(options::OPT_pg)) {
   5737       CmdArgs.push_back("-lgcc_eh_p");
   5738     } else {
   5739       CmdArgs.push_back("--as-needed");
   5740       CmdArgs.push_back("-lgcc_s");
   5741       CmdArgs.push_back("--no-as-needed");
   5742     }
   5743   }
   5744 
   5745   if (!Args.hasArg(options::OPT_nostdlib) &&
   5746       !Args.hasArg(options::OPT_nostartfiles)) {
   5747     if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
   5748       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
   5749     else
   5750       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
   5751     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
   5752   }
   5753 
   5754   addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
   5755 
   5756   const char *Exec =
   5757     Args.MakeArgString(ToolChain.GetProgramPath("ld"));
   5758   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   5759 }
   5760 
   5761 void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   5762                                      const InputInfo &Output,
   5763                                      const InputInfoList &Inputs,
   5764                                      const ArgList &Args,
   5765                                      const char *LinkingOutput) const {
   5766   ArgStringList CmdArgs;
   5767 
   5768   // When building 32-bit code on NetBSD/amd64, we have to explicitly
   5769   // instruct as in the base system to assemble 32-bit code.
   5770   if (getToolChain().getArch() == llvm::Triple::x86)
   5771     CmdArgs.push_back("--32");
   5772 
   5773   // Set byte order explicitly
   5774   if (getToolChain().getArch() == llvm::Triple::mips)
   5775     CmdArgs.push_back("-EB");
   5776   else if (getToolChain().getArch() == llvm::Triple::mipsel)
   5777     CmdArgs.push_back("-EL");
   5778 
   5779   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   5780                        options::OPT_Xassembler);
   5781 
   5782   CmdArgs.push_back("-o");
   5783   CmdArgs.push_back(Output.getFilename());
   5784 
   5785   for (InputInfoList::const_iterator
   5786          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   5787     const InputInfo &II = *it;
   5788     CmdArgs.push_back(II.getFilename());
   5789   }
   5790 
   5791   const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
   5792   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   5793 }
   5794 
   5795 void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
   5796                                  const InputInfo &Output,
   5797                                  const InputInfoList &Inputs,
   5798                                  const ArgList &Args,
   5799                                  const char *LinkingOutput) const {
   5800   const Driver &D = getToolChain().getDriver();
   5801   ArgStringList CmdArgs;
   5802 
   5803   if (!D.SysRoot.empty())
   5804     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   5805 
   5806   if (Args.hasArg(options::OPT_static)) {
   5807     CmdArgs.push_back("-Bstatic");
   5808   } else {
   5809     if (Args.hasArg(options::OPT_rdynamic))
   5810       CmdArgs.push_back("-export-dynamic");
   5811     CmdArgs.push_back("--eh-frame-hdr");
   5812     if (Args.hasArg(options::OPT_shared)) {
   5813       CmdArgs.push_back("-Bshareable");
   5814     } else {
   5815       CmdArgs.push_back("-dynamic-linker");
   5816       CmdArgs.push_back("/libexec/ld.elf_so");
   5817     }
   5818   }
   5819 
   5820   // When building 32-bit code on NetBSD/amd64, we have to explicitly
   5821   // instruct ld in the base system to link 32-bit code.
   5822   if (getToolChain().getArch() == llvm::Triple::x86) {
   5823     CmdArgs.push_back("-m");
   5824     CmdArgs.push_back("elf_i386");
   5825   }
   5826 
   5827   if (Output.isFilename()) {
   5828     CmdArgs.push_back("-o");
   5829     CmdArgs.push_back(Output.getFilename());
   5830   } else {
   5831     assert(Output.isNothing() && "Invalid output.");
   5832   }
   5833 
   5834   if (!Args.hasArg(options::OPT_nostdlib) &&
   5835       !Args.hasArg(options::OPT_nostartfiles)) {
   5836     if (!Args.hasArg(options::OPT_shared)) {
   5837       CmdArgs.push_back(Args.MakeArgString(
   5838                               getToolChain().GetFilePath("crt0.o")));
   5839       CmdArgs.push_back(Args.MakeArgString(
   5840                               getToolChain().GetFilePath("crti.o")));
   5841       CmdArgs.push_back(Args.MakeArgString(
   5842                               getToolChain().GetFilePath("crtbegin.o")));
   5843     } else {
   5844       CmdArgs.push_back(Args.MakeArgString(
   5845                               getToolChain().GetFilePath("crti.o")));
   5846       CmdArgs.push_back(Args.MakeArgString(
   5847                               getToolChain().GetFilePath("crtbeginS.o")));
   5848     }
   5849   }
   5850 
   5851   Args.AddAllArgs(CmdArgs, options::OPT_L);
   5852   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   5853   Args.AddAllArgs(CmdArgs, options::OPT_e);
   5854   Args.AddAllArgs(CmdArgs, options::OPT_s);
   5855   Args.AddAllArgs(CmdArgs, options::OPT_t);
   5856   Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
   5857   Args.AddAllArgs(CmdArgs, options::OPT_r);
   5858 
   5859   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   5860 
   5861   if (!Args.hasArg(options::OPT_nostdlib) &&
   5862       !Args.hasArg(options::OPT_nodefaultlibs)) {
   5863     if (D.CCCIsCXX()) {
   5864       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   5865       CmdArgs.push_back("-lm");
   5866     }
   5867     // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
   5868     // the default system libraries. Just mimic this for now.
   5869     if (Args.hasArg(options::OPT_static)) {
   5870       CmdArgs.push_back("-lgcc_eh");
   5871     } else {
   5872       CmdArgs.push_back("--as-needed");
   5873       CmdArgs.push_back("-lgcc_s");
   5874       CmdArgs.push_back("--no-as-needed");
   5875     }
   5876     CmdArgs.push_back("-lgcc");
   5877 
   5878     if (Args.hasArg(options::OPT_pthread))
   5879       CmdArgs.push_back("-lpthread");
   5880     CmdArgs.push_back("-lc");
   5881 
   5882     CmdArgs.push_back("-lgcc");
   5883     if (Args.hasArg(options::OPT_static)) {
   5884       CmdArgs.push_back("-lgcc_eh");
   5885     } else {
   5886       CmdArgs.push_back("--as-needed");
   5887       CmdArgs.push_back("-lgcc_s");
   5888       CmdArgs.push_back("--no-as-needed");
   5889     }
   5890   }
   5891 
   5892   if (!Args.hasArg(options::OPT_nostdlib) &&
   5893       !Args.hasArg(options::OPT_nostartfiles)) {
   5894     if (!Args.hasArg(options::OPT_shared))
   5895       CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
   5896                                                                   "crtend.o")));
   5897     else
   5898       CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
   5899                                                                  "crtendS.o")));
   5900     CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
   5901                                                                     "crtn.o")));
   5902   }
   5903 
   5904   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
   5905 
   5906   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
   5907   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   5908 }
   5909 
   5910 void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   5911                                       const InputInfo &Output,
   5912                                       const InputInfoList &Inputs,
   5913                                       const ArgList &Args,
   5914                                       const char *LinkingOutput) const {
   5915   ArgStringList CmdArgs;
   5916 
   5917   // Add --32/--64 to make sure we get the format we want.
   5918   // This is incomplete
   5919   if (getToolChain().getArch() == llvm::Triple::x86) {
   5920     CmdArgs.push_back("--32");
   5921   } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
   5922     CmdArgs.push_back("--64");
   5923   } else if (getToolChain().getArch() == llvm::Triple::ppc) {
   5924     CmdArgs.push_back("-a32");
   5925     CmdArgs.push_back("-mppc");
   5926     CmdArgs.push_back("-many");
   5927   } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
   5928     CmdArgs.push_back("-a64");
   5929     CmdArgs.push_back("-mppc64");
   5930     CmdArgs.push_back("-many");
   5931   } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
   5932     CmdArgs.push_back("-a64");
   5933     CmdArgs.push_back("-mppc64le");
   5934     CmdArgs.push_back("-many");
   5935   } else if (getToolChain().getArch() == llvm::Triple::arm) {
   5936     StringRef MArch = getToolChain().getArchName();
   5937     if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
   5938       CmdArgs.push_back("-mfpu=neon");
   5939 
   5940     StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
   5941                                            getToolChain().getTriple());
   5942     CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
   5943 
   5944     Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
   5945     Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
   5946     Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
   5947   } else if (getToolChain().getArch() == llvm::Triple::mips ||
   5948              getToolChain().getArch() == llvm::Triple::mipsel ||
   5949              getToolChain().getArch() == llvm::Triple::mips64 ||
   5950              getToolChain().getArch() == llvm::Triple::mips64el) {
   5951     StringRef CPUName;
   5952     StringRef ABIName;
   5953     getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
   5954 
   5955     CmdArgs.push_back("-march");
   5956     CmdArgs.push_back(CPUName.data());
   5957 
   5958     CmdArgs.push_back("-mabi");
   5959     CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
   5960 
   5961     if (getToolChain().getArch() == llvm::Triple::mips ||
   5962         getToolChain().getArch() == llvm::Triple::mips64)
   5963       CmdArgs.push_back("-EB");
   5964     else
   5965       CmdArgs.push_back("-EL");
   5966 
   5967     Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
   5968     Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
   5969                     options::OPT_mno_micromips);
   5970     Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
   5971     Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
   5972 
   5973     Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
   5974                                       options::OPT_fpic, options::OPT_fno_pic,
   5975                                       options::OPT_fPIE, options::OPT_fno_PIE,
   5976                                       options::OPT_fpie, options::OPT_fno_pie);
   5977     if (LastPICArg &&
   5978         (LastPICArg->getOption().matches(options::OPT_fPIC) ||
   5979          LastPICArg->getOption().matches(options::OPT_fpic) ||
   5980          LastPICArg->getOption().matches(options::OPT_fPIE) ||
   5981          LastPICArg->getOption().matches(options::OPT_fpie))) {
   5982       CmdArgs.push_back("-KPIC");
   5983     }
   5984   } else if (getToolChain().getArch() == llvm::Triple::systemz) {
   5985     // Always pass an -march option, since our default of z10 is later
   5986     // than the GNU assembler's default.
   5987     StringRef CPUName = getSystemZTargetCPU(Args);
   5988     CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
   5989   }
   5990 
   5991   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   5992                        options::OPT_Xassembler);
   5993 
   5994   CmdArgs.push_back("-o");
   5995   CmdArgs.push_back(Output.getFilename());
   5996 
   5997   for (InputInfoList::const_iterator
   5998          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   5999     const InputInfo &II = *it;
   6000     CmdArgs.push_back(II.getFilename());
   6001   }
   6002 
   6003   const char *Exec =
   6004     Args.MakeArgString(getToolChain().GetProgramPath("as"));
   6005   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   6006 
   6007   // Handle the debug info splitting at object creation time if we're
   6008   // creating an object.
   6009   // TODO: Currently only works on linux with newer objcopy.
   6010   if (Args.hasArg(options::OPT_gsplit_dwarf) &&
   6011       (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
   6012     SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
   6013                    SplitDebugName(Args, Inputs));
   6014 }
   6015 
   6016 static void AddLibgcc(llvm::Triple Triple, const Driver &D,
   6017                       ArgStringList &CmdArgs, const ArgList &Args) {
   6018   bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
   6019   bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
   6020                       Args.hasArg(options::OPT_static);
   6021   if (!D.CCCIsCXX())
   6022     CmdArgs.push_back("-lgcc");
   6023 
   6024   if (StaticLibgcc || isAndroid) {
   6025     if (D.CCCIsCXX())
   6026       CmdArgs.push_back("-lgcc");
   6027   } else {
   6028     if (!D.CCCIsCXX())
   6029       CmdArgs.push_back("--as-needed");
   6030     CmdArgs.push_back("-lgcc_s");
   6031     if (!D.CCCIsCXX())
   6032       CmdArgs.push_back("--no-as-needed");
   6033   }
   6034 
   6035   if (StaticLibgcc && !isAndroid)
   6036     CmdArgs.push_back("-lgcc_eh");
   6037   else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
   6038     CmdArgs.push_back("-lgcc");
   6039 
   6040   // According to Android ABI, we have to link with libdl if we are
   6041   // linking with non-static libgcc.
   6042   //
   6043   // NOTE: This fixes a link error on Android MIPS as well.  The non-static
   6044   // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
   6045   if (isAndroid && !StaticLibgcc)
   6046     CmdArgs.push_back("-ldl");
   6047 }
   6048 
   6049 static bool hasMipsN32ABIArg(const ArgList &Args) {
   6050   Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
   6051   return A && (A->getValue() == StringRef("n32"));
   6052 }
   6053 
   6054 static StringRef getLinuxDynamicLinker(const ArgList &Args,
   6055                                        const toolchains::Linux &ToolChain) {
   6056   if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
   6057     return "/system/bin/linker";
   6058   else if (ToolChain.getArch() == llvm::Triple::x86)
   6059     return "/lib/ld-linux.so.2";
   6060   else if (ToolChain.getArch() == llvm::Triple::aarch64)
   6061     return "/lib/ld-linux-aarch64.so.1";
   6062   else if (ToolChain.getArch() == llvm::Triple::arm ||
   6063            ToolChain.getArch() == llvm::Triple::thumb) {
   6064     if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
   6065       return "/lib/ld-linux-armhf.so.3";
   6066     else
   6067       return "/lib/ld-linux.so.3";
   6068   } else if (ToolChain.getArch() == llvm::Triple::mips ||
   6069              ToolChain.getArch() == llvm::Triple::mipsel)
   6070     return "/lib/ld.so.1";
   6071   else if (ToolChain.getArch() == llvm::Triple::mips64 ||
   6072            ToolChain.getArch() == llvm::Triple::mips64el) {
   6073     if (hasMipsN32ABIArg(Args))
   6074       return "/lib32/ld.so.1";
   6075     else
   6076       return "/lib64/ld.so.1";
   6077   } else if (ToolChain.getArch() == llvm::Triple::ppc)
   6078     return "/lib/ld.so.1";
   6079   else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
   6080            ToolChain.getArch() == llvm::Triple::ppc64le ||
   6081            ToolChain.getArch() == llvm::Triple::systemz)
   6082     return "/lib64/ld64.so.1";
   6083   else
   6084     return "/lib64/ld-linux-x86-64.so.2";
   6085 }
   6086 
   6087 void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
   6088                                   const InputInfo &Output,
   6089                                   const InputInfoList &Inputs,
   6090                                   const ArgList &Args,
   6091                                   const char *LinkingOutput) const {
   6092   const toolchains::Linux& ToolChain =
   6093     static_cast<const toolchains::Linux&>(getToolChain());
   6094   const Driver &D = ToolChain.getDriver();
   6095   const bool isAndroid =
   6096     ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
   6097   SanitizerArgs Sanitize(getToolChain(), Args);
   6098   const bool IsPIE =
   6099     !Args.hasArg(options::OPT_shared) &&
   6100     (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
   6101 
   6102   ArgStringList CmdArgs;
   6103 
   6104   // Silence warning for "clang -g foo.o -o foo"
   6105   Args.ClaimAllArgs(options::OPT_g_Group);
   6106   // and "clang -emit-llvm foo.o -o foo"
   6107   Args.ClaimAllArgs(options::OPT_emit_llvm);
   6108   // and for "clang -w foo.o -o foo". Other warning options are already
   6109   // handled somewhere else.
   6110   Args.ClaimAllArgs(options::OPT_w);
   6111 
   6112   if (!D.SysRoot.empty())
   6113     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   6114 
   6115   if (IsPIE)
   6116     CmdArgs.push_back("-pie");
   6117 
   6118   if (Args.hasArg(options::OPT_rdynamic))
   6119     CmdArgs.push_back("-export-dynamic");
   6120 
   6121   if (Args.hasArg(options::OPT_s))
   6122     CmdArgs.push_back("-s");
   6123 
   6124   for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
   6125          e = ToolChain.ExtraOpts.end();
   6126        i != e; ++i)
   6127     CmdArgs.push_back(i->c_str());
   6128 
   6129   if (!Args.hasArg(options::OPT_static)) {
   6130     CmdArgs.push_back("--eh-frame-hdr");
   6131   }
   6132 
   6133   CmdArgs.push_back("-m");
   6134   if (ToolChain.getArch() == llvm::Triple::x86)
   6135     CmdArgs.push_back("elf_i386");
   6136   else if (ToolChain.getArch() == llvm::Triple::aarch64)
   6137     CmdArgs.push_back("aarch64linux");
   6138   else if (ToolChain.getArch() == llvm::Triple::arm
   6139            ||  ToolChain.getArch() == llvm::Triple::thumb)
   6140     CmdArgs.push_back("armelf_linux_eabi");
   6141   else if (ToolChain.getArch() == llvm::Triple::ppc)
   6142     CmdArgs.push_back("elf32ppclinux");
   6143   else if (ToolChain.getArch() == llvm::Triple::ppc64)
   6144     CmdArgs.push_back("elf64ppc");
   6145   else if (ToolChain.getArch() == llvm::Triple::mips)
   6146     CmdArgs.push_back("elf32btsmip");
   6147   else if (ToolChain.getArch() == llvm::Triple::mipsel)
   6148     CmdArgs.push_back("elf32ltsmip");
   6149   else if (ToolChain.getArch() == llvm::Triple::mips64) {
   6150     if (hasMipsN32ABIArg(Args))
   6151       CmdArgs.push_back("elf32btsmipn32");
   6152     else
   6153       CmdArgs.push_back("elf64btsmip");
   6154   }
   6155   else if (ToolChain.getArch() == llvm::Triple::mips64el) {
   6156     if (hasMipsN32ABIArg(Args))
   6157       CmdArgs.push_back("elf32ltsmipn32");
   6158     else
   6159       CmdArgs.push_back("elf64ltsmip");
   6160   }
   6161   else if (ToolChain.getArch() == llvm::Triple::systemz)
   6162     CmdArgs.push_back("elf64_s390");
   6163   else
   6164     CmdArgs.push_back("elf_x86_64");
   6165 
   6166   if (Args.hasArg(options::OPT_static)) {
   6167     if (ToolChain.getArch() == llvm::Triple::arm
   6168         || ToolChain.getArch() == llvm::Triple::thumb)
   6169       CmdArgs.push_back("-Bstatic");
   6170     else
   6171       CmdArgs.push_back("-static");
   6172   } else if (Args.hasArg(options::OPT_shared)) {
   6173     CmdArgs.push_back("-shared");
   6174     if (isAndroid) {
   6175       CmdArgs.push_back("-Bsymbolic");
   6176     }
   6177   }
   6178 
   6179   if (ToolChain.getArch() == llvm::Triple::arm ||
   6180       ToolChain.getArch() == llvm::Triple::thumb ||
   6181       (!Args.hasArg(options::OPT_static) &&
   6182        !Args.hasArg(options::OPT_shared))) {
   6183     CmdArgs.push_back("-dynamic-linker");
   6184     CmdArgs.push_back(Args.MakeArgString(
   6185         D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
   6186   }
   6187 
   6188   CmdArgs.push_back("-o");
   6189   CmdArgs.push_back(Output.getFilename());
   6190 
   6191   if (!Args.hasArg(options::OPT_nostdlib) &&
   6192       !Args.hasArg(options::OPT_nostartfiles)) {
   6193     if (!isAndroid) {
   6194       const char *crt1 = NULL;
   6195       if (!Args.hasArg(options::OPT_shared)){
   6196         if (Args.hasArg(options::OPT_pg))
   6197           crt1 = "gcrt1.o";
   6198         else if (IsPIE)
   6199           crt1 = "Scrt1.o";
   6200         else
   6201           crt1 = "crt1.o";
   6202       }
   6203       if (crt1)
   6204         CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
   6205 
   6206       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
   6207     }
   6208 
   6209     const char *crtbegin;
   6210     if (Args.hasArg(options::OPT_static))
   6211       crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
   6212     else if (Args.hasArg(options::OPT_shared))
   6213       crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
   6214     else if (IsPIE)
   6215       crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
   6216     else
   6217       crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
   6218     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
   6219 
   6220     // Add crtfastmath.o if available and fast math is enabled.
   6221     ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
   6222   }
   6223 
   6224   Args.AddAllArgs(CmdArgs, options::OPT_L);
   6225 
   6226   const ToolChain::path_list Paths = ToolChain.getFilePaths();
   6227 
   6228   for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
   6229        i != e; ++i)
   6230     CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
   6231 
   6232   // Tell the linker to load the plugin. This has to come before AddLinkerInputs
   6233   // as gold requires -plugin to come before any -plugin-opt that -Wl might
   6234   // forward.
   6235   if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
   6236     CmdArgs.push_back("-plugin");
   6237     std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
   6238     CmdArgs.push_back(Args.MakeArgString(Plugin));
   6239 
   6240     // Try to pass driver level flags relevant to LTO code generation down to
   6241     // the plugin.
   6242 
   6243     // Handle architecture-specific flags for selecting CPU variants.
   6244     if (ToolChain.getArch() == llvm::Triple::x86 ||
   6245         ToolChain.getArch() == llvm::Triple::x86_64)
   6246       CmdArgs.push_back(
   6247           Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
   6248                              getX86TargetCPU(Args, ToolChain.getTriple())));
   6249     else if (ToolChain.getArch() == llvm::Triple::arm ||
   6250              ToolChain.getArch() == llvm::Triple::thumb)
   6251       CmdArgs.push_back(
   6252           Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
   6253                              getARMTargetCPU(Args, ToolChain.getTriple())));
   6254 
   6255     // FIXME: Factor out logic for MIPS, PPC, and other targets to support this
   6256     // as well.
   6257   }
   6258 
   6259 
   6260   if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
   6261     CmdArgs.push_back("--no-demangle");
   6262 
   6263   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
   6264 
   6265   // Call these before we add the C++ ABI library.
   6266   if (Sanitize.needsUbsanRt())
   6267     addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
   6268                     Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
   6269                     Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
   6270   if (Sanitize.needsAsanRt())
   6271     addAsanRTLinux(getToolChain(), Args, CmdArgs);
   6272   if (Sanitize.needsTsanRt())
   6273     addTsanRTLinux(getToolChain(), Args, CmdArgs);
   6274   if (Sanitize.needsMsanRt())
   6275     addMsanRTLinux(getToolChain(), Args, CmdArgs);
   6276   if (Sanitize.needsLsanRt())
   6277     addLsanRTLinux(getToolChain(), Args, CmdArgs);
   6278 
   6279   // The profile runtime also needs access to system libraries.
   6280   addProfileRTLinux(getToolChain(), Args, CmdArgs);
   6281 
   6282   if (D.CCCIsCXX() &&
   6283       !Args.hasArg(options::OPT_nostdlib) &&
   6284       !Args.hasArg(options::OPT_nodefaultlibs)) {
   6285     bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
   6286       !Args.hasArg(options::OPT_static);
   6287     if (OnlyLibstdcxxStatic)
   6288       CmdArgs.push_back("-Bstatic");
   6289     ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
   6290     if (OnlyLibstdcxxStatic)
   6291       CmdArgs.push_back("-Bdynamic");
   6292     CmdArgs.push_back("-lm");
   6293   }
   6294 
   6295   if (!Args.hasArg(options::OPT_nostdlib)) {
   6296     if (!Args.hasArg(options::OPT_nodefaultlibs)) {
   6297       if (Args.hasArg(options::OPT_static))
   6298         CmdArgs.push_back("--start-group");
   6299 
   6300       bool OpenMP = Args.hasArg(options::OPT_fopenmp);
   6301       if (OpenMP) {
   6302         CmdArgs.push_back("-lgomp");
   6303 
   6304         // FIXME: Exclude this for platforms whith libgomp that doesn't require
   6305         // librt. Most modern Linux platfroms require it, but some may not.
   6306         CmdArgs.push_back("-lrt");
   6307       }
   6308 
   6309       AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
   6310 
   6311       if (Args.hasArg(options::OPT_pthread) ||
   6312           Args.hasArg(options::OPT_pthreads) || OpenMP)
   6313         CmdArgs.push_back("-lpthread");
   6314 
   6315       CmdArgs.push_back("-lc");
   6316 
   6317       if (Args.hasArg(options::OPT_static))
   6318         CmdArgs.push_back("--end-group");
   6319       else
   6320         AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
   6321     }
   6322 
   6323     if (!Args.hasArg(options::OPT_nostartfiles)) {
   6324       const char *crtend;
   6325       if (Args.hasArg(options::OPT_shared))
   6326         crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
   6327       else if (IsPIE)
   6328         crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
   6329       else
   6330         crtend = isAndroid ? "crtend_android.o" : "crtend.o";
   6331 
   6332       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
   6333       if (!isAndroid)
   6334         CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
   6335     }
   6336   }
   6337 
   6338   C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
   6339 }
   6340 
   6341 void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   6342                                    const InputInfo &Output,
   6343                                    const InputInfoList &Inputs,
   6344                                    const ArgList &Args,
   6345                                    const char *LinkingOutput) const {
   6346   ArgStringList CmdArgs;
   6347 
   6348   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   6349                        options::OPT_Xassembler);
   6350 
   6351   CmdArgs.push_back("-o");
   6352   CmdArgs.push_back(Output.getFilename());
   6353 
   6354   for (InputInfoList::const_iterator
   6355          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   6356     const InputInfo &II = *it;
   6357     CmdArgs.push_back(II.getFilename());
   6358   }
   6359 
   6360   const char *Exec =
   6361     Args.MakeArgString(getToolChain().GetProgramPath("as"));
   6362   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   6363 }
   6364 
   6365 void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
   6366                                const InputInfo &Output,
   6367                                const InputInfoList &Inputs,
   6368                                const ArgList &Args,
   6369                                const char *LinkingOutput) const {
   6370   const Driver &D = getToolChain().getDriver();
   6371   ArgStringList CmdArgs;
   6372 
   6373   if (Output.isFilename()) {
   6374     CmdArgs.push_back("-o");
   6375     CmdArgs.push_back(Output.getFilename());
   6376   } else {
   6377     assert(Output.isNothing() && "Invalid output.");
   6378   }
   6379 
   6380   if (!Args.hasArg(options::OPT_nostdlib) &&
   6381       !Args.hasArg(options::OPT_nostartfiles)) {
   6382       CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
   6383       CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
   6384       CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
   6385       CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
   6386   }
   6387 
   6388   Args.AddAllArgs(CmdArgs, options::OPT_L);
   6389   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   6390   Args.AddAllArgs(CmdArgs, options::OPT_e);
   6391 
   6392   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   6393 
   6394   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
   6395 
   6396   if (!Args.hasArg(options::OPT_nostdlib) &&
   6397       !Args.hasArg(options::OPT_nodefaultlibs)) {
   6398     if (D.CCCIsCXX()) {
   6399       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   6400       CmdArgs.push_back("-lm");
   6401     }
   6402   }
   6403 
   6404   if (!Args.hasArg(options::OPT_nostdlib) &&
   6405       !Args.hasArg(options::OPT_nostartfiles)) {
   6406     if (Args.hasArg(options::OPT_pthread))
   6407       CmdArgs.push_back("-lpthread");
   6408     CmdArgs.push_back("-lc");
   6409     CmdArgs.push_back("-lCompilerRT-Generic");
   6410     CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
   6411     CmdArgs.push_back(
   6412          Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
   6413   }
   6414 
   6415   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
   6416   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   6417 }
   6418 
   6419 /// DragonFly Tools
   6420 
   6421 // For now, DragonFly Assemble does just about the same as for
   6422 // FreeBSD, but this may change soon.
   6423 void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   6424                                        const InputInfo &Output,
   6425                                        const InputInfoList &Inputs,
   6426                                        const ArgList &Args,
   6427                                        const char *LinkingOutput) const {
   6428   ArgStringList CmdArgs;
   6429 
   6430   // When building 32-bit code on DragonFly/pc64, we have to explicitly
   6431   // instruct as in the base system to assemble 32-bit code.
   6432   if (getToolChain().getArch() == llvm::Triple::x86)
   6433     CmdArgs.push_back("--32");
   6434 
   6435   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   6436                        options::OPT_Xassembler);
   6437 
   6438   CmdArgs.push_back("-o");
   6439   CmdArgs.push_back(Output.getFilename());
   6440 
   6441   for (InputInfoList::const_iterator
   6442          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   6443     const InputInfo &II = *it;
   6444     CmdArgs.push_back(II.getFilename());
   6445   }
   6446 
   6447   const char *Exec =
   6448     Args.MakeArgString(getToolChain().GetProgramPath("as"));
   6449   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   6450 }
   6451 
   6452 void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
   6453                                    const InputInfo &Output,
   6454                                    const InputInfoList &Inputs,
   6455                                    const ArgList &Args,
   6456                                    const char *LinkingOutput) const {
   6457   bool UseGCC47 = false;
   6458   const Driver &D = getToolChain().getDriver();
   6459   ArgStringList CmdArgs;
   6460 
   6461   if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
   6462     UseGCC47 = false;
   6463 
   6464   if (!D.SysRoot.empty())
   6465     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   6466 
   6467   CmdArgs.push_back("--eh-frame-hdr");
   6468   if (Args.hasArg(options::OPT_static)) {
   6469     CmdArgs.push_back("-Bstatic");
   6470   } else {
   6471     if (Args.hasArg(options::OPT_rdynamic))
   6472       CmdArgs.push_back("-export-dynamic");
   6473     if (Args.hasArg(options::OPT_shared))
   6474       CmdArgs.push_back("-Bshareable");
   6475     else {
   6476       CmdArgs.push_back("-dynamic-linker");
   6477       CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
   6478     }
   6479     CmdArgs.push_back("--hash-style=both");
   6480   }
   6481 
   6482   // When building 32-bit code on DragonFly/pc64, we have to explicitly
   6483   // instruct ld in the base system to link 32-bit code.
   6484   if (getToolChain().getArch() == llvm::Triple::x86) {
   6485     CmdArgs.push_back("-m");
   6486     CmdArgs.push_back("elf_i386");
   6487   }
   6488 
   6489   if (Output.isFilename()) {
   6490     CmdArgs.push_back("-o");
   6491     CmdArgs.push_back(Output.getFilename());
   6492   } else {
   6493     assert(Output.isNothing() && "Invalid output.");
   6494   }
   6495 
   6496   if (!Args.hasArg(options::OPT_nostdlib) &&
   6497       !Args.hasArg(options::OPT_nostartfiles)) {
   6498     if (!Args.hasArg(options::OPT_shared)) {
   6499       if (Args.hasArg(options::OPT_pg))
   6500         CmdArgs.push_back(Args.MakeArgString(
   6501                                 getToolChain().GetFilePath("gcrt1.o")));
   6502       else {
   6503         if (Args.hasArg(options::OPT_pie))
   6504           CmdArgs.push_back(Args.MakeArgString(
   6505                                   getToolChain().GetFilePath("Scrt1.o")));
   6506         else
   6507           CmdArgs.push_back(Args.MakeArgString(
   6508                                   getToolChain().GetFilePath("crt1.o")));
   6509       }
   6510     }
   6511     CmdArgs.push_back(Args.MakeArgString(
   6512                             getToolChain().GetFilePath("crti.o")));
   6513     if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
   6514       CmdArgs.push_back(Args.MakeArgString(
   6515                               getToolChain().GetFilePath("crtbeginS.o")));
   6516     else
   6517       CmdArgs.push_back(Args.MakeArgString(
   6518                               getToolChain().GetFilePath("crtbegin.o")));
   6519   }
   6520 
   6521   Args.AddAllArgs(CmdArgs, options::OPT_L);
   6522   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   6523   Args.AddAllArgs(CmdArgs, options::OPT_e);
   6524 
   6525   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   6526 
   6527   if (!Args.hasArg(options::OPT_nostdlib) &&
   6528       !Args.hasArg(options::OPT_nodefaultlibs)) {
   6529     // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
   6530     //         rpaths
   6531     if (UseGCC47)
   6532       CmdArgs.push_back("-L/usr/lib/gcc47");
   6533     else
   6534       CmdArgs.push_back("-L/usr/lib/gcc44");
   6535 
   6536     if (!Args.hasArg(options::OPT_static)) {
   6537       if (UseGCC47) {
   6538         CmdArgs.push_back("-rpath");
   6539         CmdArgs.push_back("/usr/lib/gcc47");
   6540       } else {
   6541         CmdArgs.push_back("-rpath");
   6542         CmdArgs.push_back("/usr/lib/gcc44");
   6543       }
   6544     }
   6545 
   6546     if (D.CCCIsCXX()) {
   6547       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   6548       CmdArgs.push_back("-lm");
   6549     }
   6550 
   6551     if (Args.hasArg(options::OPT_pthread))
   6552       CmdArgs.push_back("-lpthread");
   6553 
   6554     if (!Args.hasArg(options::OPT_nolibc)) {
   6555       CmdArgs.push_back("-lc");
   6556     }
   6557 
   6558     if (UseGCC47) {
   6559       if (Args.hasArg(options::OPT_static) ||
   6560           Args.hasArg(options::OPT_static_libgcc)) {
   6561         CmdArgs.push_back("-lgcc");
   6562         CmdArgs.push_back("-lgcc_eh");
   6563       } else {
   6564         if (Args.hasArg(options::OPT_shared_libgcc)) {
   6565           CmdArgs.push_back("-lgcc_pic");
   6566           if (!Args.hasArg(options::OPT_shared))
   6567             CmdArgs.push_back("-lgcc");
   6568         } else {
   6569           CmdArgs.push_back("-lgcc");
   6570           CmdArgs.push_back("--as-needed");
   6571           CmdArgs.push_back("-lgcc_pic");
   6572           CmdArgs.push_back("--no-as-needed");
   6573         }
   6574       }
   6575     } else {
   6576       if (Args.hasArg(options::OPT_shared)) {
   6577         CmdArgs.push_back("-lgcc_pic");
   6578       } else {
   6579         CmdArgs.push_back("-lgcc");
   6580       }
   6581     }
   6582   }
   6583 
   6584   if (!Args.hasArg(options::OPT_nostdlib) &&
   6585       !Args.hasArg(options::OPT_nostartfiles)) {
   6586     if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
   6587       CmdArgs.push_back(Args.MakeArgString(
   6588                               getToolChain().GetFilePath("crtendS.o")));
   6589     else
   6590       CmdArgs.push_back(Args.MakeArgString(
   6591                               getToolChain().GetFilePath("crtend.o")));
   6592     CmdArgs.push_back(Args.MakeArgString(
   6593                             getToolChain().GetFilePath("crtn.o")));
   6594   }
   6595 
   6596   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
   6597 
   6598   const char *Exec =
   6599     Args.MakeArgString(getToolChain().GetProgramPath("ld"));
   6600   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   6601 }
   6602 
   6603 void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
   6604                                       const InputInfo &Output,
   6605                                       const InputInfoList &Inputs,
   6606                                       const ArgList &Args,
   6607                                       const char *LinkingOutput) const {
   6608   ArgStringList CmdArgs;
   6609 
   6610   if (Output.isFilename()) {
   6611     CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
   6612                                          Output.getFilename()));
   6613   } else {
   6614     assert(Output.isNothing() && "Invalid output.");
   6615   }
   6616 
   6617   if (!Args.hasArg(options::OPT_nostdlib) &&
   6618     !Args.hasArg(options::OPT_nostartfiles)) {
   6619     CmdArgs.push_back("-defaultlib:libcmt");
   6620   }
   6621 
   6622   CmdArgs.push_back("-nologo");
   6623 
   6624   Args.AddAllArgValues(CmdArgs, options::OPT_l);
   6625 
   6626   // Add filenames immediately.
   6627   for (InputInfoList::const_iterator
   6628        it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   6629     if (it->isFilename())
   6630       CmdArgs.push_back(it->getFilename());
   6631   }
   6632 
   6633   const char *Exec =
   6634     Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
   6635   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   6636 }
   6637