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 
     12 #include "clang/Driver/Action.h"
     13 #include "clang/Driver/Arg.h"
     14 #include "clang/Driver/ArgList.h"
     15 #include "clang/Driver/Driver.h"
     16 #include "clang/Driver/DriverDiagnostic.h"
     17 #include "clang/Driver/Compilation.h"
     18 #include "clang/Driver/Job.h"
     19 #include "clang/Driver/HostInfo.h"
     20 #include "clang/Driver/ObjCRuntime.h"
     21 #include "clang/Driver/Option.h"
     22 #include "clang/Driver/Options.h"
     23 #include "clang/Driver/ToolChain.h"
     24 #include "clang/Driver/Util.h"
     25 
     26 #include "llvm/ADT/SmallString.h"
     27 #include "llvm/ADT/StringSwitch.h"
     28 #include "llvm/ADT/Twine.h"
     29 #include "llvm/Support/FileSystem.h"
     30 #include "llvm/Support/Format.h"
     31 #include "llvm/Support/raw_ostream.h"
     32 #include "llvm/Support/Host.h"
     33 #include "llvm/Support/Process.h"
     34 #include "llvm/Support/ErrorHandling.h"
     35 
     36 #include "InputInfo.h"
     37 #include "ToolChains.h"
     38 
     39 #ifdef __CYGWIN__
     40 #include <cygwin/version.h>
     41 #if defined(CYGWIN_VERSION_DLL_MAJOR) && CYGWIN_VERSION_DLL_MAJOR<1007
     42 #define IS_CYGWIN15 1
     43 #endif
     44 #endif
     45 
     46 using namespace clang::driver;
     47 using namespace clang::driver::tools;
     48 
     49 /// FindTargetProgramPath - Return path of the target specific version of
     50 /// ProgName.  If it doesn't exist, return path of ProgName itself.
     51 static std::string FindTargetProgramPath(const ToolChain &TheToolChain,
     52                                          const std::string TripleString,
     53                                          const char *ProgName) {
     54   std::string Executable(TripleString + "-" + ProgName);
     55   std::string Path(TheToolChain.GetProgramPath(Executable.c_str()));
     56   if (Path != Executable)
     57     return Path;
     58   return TheToolChain.GetProgramPath(ProgName);
     59 }
     60 
     61 /// CheckPreprocessingOptions - Perform some validation of preprocessing
     62 /// arguments that is shared with gcc.
     63 static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
     64   if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
     65     if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
     66       D.Diag(clang::diag::err_drv_argument_only_allowed_with)
     67         << A->getAsString(Args) << "-E";
     68 }
     69 
     70 /// CheckCodeGenerationOptions - Perform some validation of code generation
     71 /// arguments that is shared with gcc.
     72 static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
     73   // In gcc, only ARM checks this, but it seems reasonable to check universally.
     74   if (Args.hasArg(options::OPT_static))
     75     if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
     76                                        options::OPT_mdynamic_no_pic))
     77       D.Diag(clang::diag::err_drv_argument_not_allowed_with)
     78         << A->getAsString(Args) << "-static";
     79 }
     80 
     81 // Quote target names for inclusion in GNU Make dependency files.
     82 // Only the characters '$', '#', ' ', '\t' are quoted.
     83 static void QuoteTarget(llvm::StringRef Target,
     84                         llvm::SmallVectorImpl<char> &Res) {
     85   for (unsigned i = 0, e = Target.size(); i != e; ++i) {
     86     switch (Target[i]) {
     87     case ' ':
     88     case '\t':
     89       // Escape the preceding backslashes
     90       for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
     91         Res.push_back('\\');
     92 
     93       // Escape the space/tab
     94       Res.push_back('\\');
     95       break;
     96     case '$':
     97       Res.push_back('$');
     98       break;
     99     case '#':
    100       Res.push_back('\\');
    101       break;
    102     default:
    103       break;
    104     }
    105 
    106     Res.push_back(Target[i]);
    107   }
    108 }
    109 
    110 static void AddLinkerInputs(const ToolChain &TC,
    111                             const InputInfoList &Inputs, const ArgList &Args,
    112                             ArgStringList &CmdArgs) {
    113   const Driver &D = TC.getDriver();
    114 
    115   // Add extra linker input arguments which are not treated as inputs
    116   // (constructed via -Xarch_).
    117   Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
    118 
    119   for (InputInfoList::const_iterator
    120          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
    121     const InputInfo &II = *it;
    122 
    123     if (!TC.HasNativeLLVMSupport()) {
    124       // Don't try to pass LLVM inputs unless we have native support.
    125       if (II.getType() == types::TY_LLVM_IR ||
    126           II.getType() == types::TY_LTO_IR ||
    127           II.getType() == types::TY_LLVM_BC ||
    128           II.getType() == types::TY_LTO_BC)
    129         D.Diag(clang::diag::err_drv_no_linker_llvm_support)
    130           << TC.getTripleString();
    131     }
    132 
    133     // Add filenames immediately.
    134     if (II.isFilename()) {
    135       CmdArgs.push_back(II.getFilename());
    136       continue;
    137     }
    138 
    139     // Otherwise, this is a linker input argument.
    140     const Arg &A = II.getInputArg();
    141 
    142     // Handle reserved library options.
    143     if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
    144       TC.AddCXXStdlibLibArgs(Args, CmdArgs);
    145     } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
    146       TC.AddCCKextLibArgs(Args, CmdArgs);
    147     } else
    148       A.renderAsInput(Args, CmdArgs);
    149   }
    150 }
    151 
    152 /// \brief Determine whether Objective-C automated reference counting is
    153 /// enabled.
    154 static bool isObjCAutoRefCount(const ArgList &Args) {
    155   return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
    156 }
    157 
    158 static void addProfileRT(const ToolChain &TC, const ArgList &Args,
    159                          ArgStringList &CmdArgs,
    160                          llvm::Triple Triple) {
    161   if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
    162         Args.hasArg(options::OPT_fprofile_generate) ||
    163         Args.hasArg(options::OPT_fcreate_profile) ||
    164         Args.hasArg(options::OPT_coverage)))
    165     return;
    166 
    167   // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
    168   // the link line. We cannot do the same thing because unlike gcov there is a
    169   // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
    170   // not supported by old linkers.
    171   llvm::Twine ProfileRT =
    172     llvm::Twine(TC.getDriver().Dir) + "/../lib/" + "libprofile_rt.a";
    173 
    174   if (Triple.getOS() == llvm::Triple::Darwin) {
    175     // On Darwin, if the static library doesn't exist try the dylib.
    176     bool Exists;
    177     if (llvm::sys::fs::exists(ProfileRT.str(), Exists) || !Exists)
    178       ProfileRT =
    179         llvm::Twine(TC.getDriver().Dir) + "/../lib/" + "libprofile_rt.dylib";
    180   }
    181 
    182   CmdArgs.push_back(Args.MakeArgString(ProfileRT));
    183 }
    184 
    185 void Clang::AddPreprocessingOptions(const Driver &D,
    186                                     const ArgList &Args,
    187                                     ArgStringList &CmdArgs,
    188                                     const InputInfo &Output,
    189                                     const InputInfoList &Inputs) const {
    190   Arg *A;
    191 
    192   CheckPreprocessingOptions(D, Args);
    193 
    194   Args.AddLastArg(CmdArgs, options::OPT_C);
    195   Args.AddLastArg(CmdArgs, options::OPT_CC);
    196 
    197   // Handle dependency file generation.
    198   if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
    199       (A = Args.getLastArg(options::OPT_MD)) ||
    200       (A = Args.getLastArg(options::OPT_MMD))) {
    201     // Determine the output location.
    202     const char *DepFile;
    203     if (Output.getType() == types::TY_Dependencies) {
    204       DepFile = Output.getFilename();
    205     } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
    206       DepFile = MF->getValue(Args);
    207     } else if (A->getOption().matches(options::OPT_M) ||
    208                A->getOption().matches(options::OPT_MM)) {
    209       DepFile = "-";
    210     } else {
    211       DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
    212     }
    213     CmdArgs.push_back("-dependency-file");
    214     CmdArgs.push_back(DepFile);
    215 
    216     // Add a default target if one wasn't specified.
    217     if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
    218       const char *DepTarget;
    219 
    220       // If user provided -o, that is the dependency target, except
    221       // when we are only generating a dependency file.
    222       Arg *OutputOpt = Args.getLastArg(options::OPT_o);
    223       if (OutputOpt && Output.getType() != types::TY_Dependencies) {
    224         DepTarget = OutputOpt->getValue(Args);
    225       } else {
    226         // Otherwise derive from the base input.
    227         //
    228         // FIXME: This should use the computed output file location.
    229         llvm::SmallString<128> P(Inputs[0].getBaseInput());
    230         llvm::sys::path::replace_extension(P, "o");
    231         DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
    232       }
    233 
    234       CmdArgs.push_back("-MT");
    235       llvm::SmallString<128> Quoted;
    236       QuoteTarget(DepTarget, Quoted);
    237       CmdArgs.push_back(Args.MakeArgString(Quoted));
    238     }
    239 
    240     if (A->getOption().matches(options::OPT_M) ||
    241         A->getOption().matches(options::OPT_MD))
    242       CmdArgs.push_back("-sys-header-deps");
    243   }
    244 
    245   if (Args.hasArg(options::OPT_MG)) {
    246     if (!A || A->getOption().matches(options::OPT_MD) ||
    247               A->getOption().matches(options::OPT_MMD))
    248       D.Diag(clang::diag::err_drv_mg_requires_m_or_mm);
    249     CmdArgs.push_back("-MG");
    250   }
    251 
    252   Args.AddLastArg(CmdArgs, options::OPT_MP);
    253 
    254   // Convert all -MQ <target> args to -MT <quoted target>
    255   for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
    256                                              options::OPT_MQ),
    257          ie = Args.filtered_end(); it != ie; ++it) {
    258     const Arg *A = *it;
    259     A->claim();
    260 
    261     if (A->getOption().matches(options::OPT_MQ)) {
    262       CmdArgs.push_back("-MT");
    263       llvm::SmallString<128> Quoted;
    264       QuoteTarget(A->getValue(Args), Quoted);
    265       CmdArgs.push_back(Args.MakeArgString(Quoted));
    266 
    267     // -MT flag - no change
    268     } else {
    269       A->render(Args, CmdArgs);
    270     }
    271   }
    272 
    273   // Add -i* options, and automatically translate to
    274   // -include-pch/-include-pth for transparent PCH support. It's
    275   // wonky, but we include looking for .gch so we can support seamless
    276   // replacement into a build system already set up to be generating
    277   // .gch files.
    278   bool RenderedImplicitInclude = false;
    279   for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
    280          ie = Args.filtered_end(); it != ie; ++it) {
    281     const Arg *A = it;
    282 
    283     if (A->getOption().matches(options::OPT_include)) {
    284       bool IsFirstImplicitInclude = !RenderedImplicitInclude;
    285       RenderedImplicitInclude = true;
    286 
    287       // Use PCH if the user requested it.
    288       bool UsePCH = D.CCCUsePCH;
    289 
    290       bool FoundPTH = false;
    291       bool FoundPCH = false;
    292       llvm::sys::Path P(A->getValue(Args));
    293       bool Exists;
    294       if (UsePCH) {
    295         P.appendSuffix("pch");
    296         if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
    297           FoundPCH = true;
    298         else
    299           P.eraseSuffix();
    300       }
    301 
    302       if (!FoundPCH) {
    303         P.appendSuffix("pth");
    304         if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
    305           FoundPTH = true;
    306         else
    307           P.eraseSuffix();
    308       }
    309 
    310       if (!FoundPCH && !FoundPTH) {
    311         P.appendSuffix("gch");
    312         if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
    313           FoundPCH = UsePCH;
    314           FoundPTH = !UsePCH;
    315         }
    316         else
    317           P.eraseSuffix();
    318       }
    319 
    320       if (FoundPCH || FoundPTH) {
    321         if (IsFirstImplicitInclude) {
    322           A->claim();
    323           if (UsePCH)
    324             CmdArgs.push_back("-include-pch");
    325           else
    326             CmdArgs.push_back("-include-pth");
    327           CmdArgs.push_back(Args.MakeArgString(P.str()));
    328           continue;
    329         } else {
    330           // Ignore the PCH if not first on command line and emit warning.
    331           D.Diag(clang::diag::warn_drv_pch_not_first_include)
    332               << P.str() << A->getAsString(Args);
    333         }
    334       }
    335     }
    336 
    337     // Not translated, render as usual.
    338     A->claim();
    339     A->render(Args, CmdArgs);
    340   }
    341 
    342   Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
    343   Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
    344 
    345   // Add C++ include arguments, if needed.
    346   types::ID InputType = Inputs[0].getType();
    347   if (types::isCXX(InputType)) {
    348     bool ObjCXXAutoRefCount
    349       = types::isObjC(InputType) && isObjCAutoRefCount(Args);
    350     getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs,
    351                                                 ObjCXXAutoRefCount);
    352     Args.AddAllArgs(CmdArgs, options::OPT_stdlib_EQ);
    353   }
    354 
    355   // Add -Wp, and -Xassembler if using the preprocessor.
    356 
    357   // FIXME: There is a very unfortunate problem here, some troubled
    358   // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
    359   // really support that we would have to parse and then translate
    360   // those options. :(
    361   Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
    362                        options::OPT_Xpreprocessor);
    363 
    364   // -I- is a deprecated GCC feature, reject it.
    365   if (Arg *A = Args.getLastArg(options::OPT_I_))
    366     D.Diag(clang::diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
    367 
    368   // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
    369   // -isysroot to the CC1 invocation.
    370   if (Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
    371     if (!Args.hasArg(options::OPT_isysroot)) {
    372       CmdArgs.push_back("-isysroot");
    373       CmdArgs.push_back(A->getValue(Args));
    374     }
    375   }
    376 }
    377 
    378 /// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
    379 //
    380 // FIXME: tblgen this.
    381 static const char *getARMTargetCPU(const ArgList &Args,
    382                                    const llvm::Triple &Triple) {
    383   // FIXME: Warn on inconsistent use of -mcpu and -march.
    384 
    385   // If we have -mcpu=, use that.
    386   if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
    387     return A->getValue(Args);
    388 
    389   llvm::StringRef MArch;
    390   if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
    391     // Otherwise, if we have -march= choose the base CPU for that arch.
    392     MArch = A->getValue(Args);
    393   } else {
    394     // Otherwise, use the Arch from the triple.
    395     MArch = Triple.getArchName();
    396   }
    397 
    398   if (MArch == "armv2" || MArch == "armv2a")
    399     return "arm2";
    400   if (MArch == "armv3")
    401     return "arm6";
    402   if (MArch == "armv3m")
    403     return "arm7m";
    404   if (MArch == "armv4" || MArch == "armv4t")
    405     return "arm7tdmi";
    406   if (MArch == "armv5" || MArch == "armv5t")
    407     return "arm10tdmi";
    408   if (MArch == "armv5e" || MArch == "armv5te")
    409     return "arm1026ejs";
    410   if (MArch == "armv5tej")
    411     return "arm926ej-s";
    412   if (MArch == "armv6" || MArch == "armv6k")
    413     return "arm1136jf-s";
    414   if (MArch == "armv6j")
    415     return "arm1136j-s";
    416   if (MArch == "armv6z" || MArch == "armv6zk")
    417     return "arm1176jzf-s";
    418   if (MArch == "armv6t2")
    419     return "arm1156t2-s";
    420   if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
    421     return "cortex-a8";
    422   if (MArch == "armv7r" || MArch == "armv7-r")
    423     return "cortex-r4";
    424   if (MArch == "armv7m" || MArch == "armv7-m")
    425     return "cortex-m3";
    426   if (MArch == "ep9312")
    427     return "ep9312";
    428   if (MArch == "iwmmxt")
    429     return "iwmmxt";
    430   if (MArch == "xscale")
    431     return "xscale";
    432   if (MArch == "armv6m" || MArch == "armv6-m")
    433     return "cortex-m0";
    434 
    435   // If all else failed, return the most base CPU LLVM supports.
    436   return "arm7tdmi";
    437 }
    438 
    439 /// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
    440 /// CPU.
    441 //
    442 // FIXME: This is redundant with -mcpu, why does LLVM use this.
    443 // FIXME: tblgen this, or kill it!
    444 static const char *getLLVMArchSuffixForARM(llvm::StringRef CPU) {
    445   if (CPU == "arm7tdmi" || CPU == "arm7tdmi-s" || CPU == "arm710t" ||
    446       CPU == "arm720t" || CPU == "arm9" || CPU == "arm9tdmi" ||
    447       CPU == "arm920" || CPU == "arm920t" || CPU == "arm922t" ||
    448       CPU == "arm940t" || CPU == "ep9312")
    449     return "v4t";
    450 
    451   if (CPU == "arm10tdmi" || CPU == "arm1020t")
    452     return "v5";
    453 
    454   if (CPU == "arm9e" || CPU == "arm926ej-s" || CPU == "arm946e-s" ||
    455       CPU == "arm966e-s" || CPU == "arm968e-s" || CPU == "arm10e" ||
    456       CPU == "arm1020e" || CPU == "arm1022e" || CPU == "xscale" ||
    457       CPU == "iwmmxt")
    458     return "v5e";
    459 
    460   if (CPU == "arm1136j-s" || CPU == "arm1136jf-s" || CPU == "arm1176jz-s" ||
    461       CPU == "arm1176jzf-s" || CPU == "mpcorenovfp" || CPU == "mpcore")
    462     return "v6";
    463 
    464   if (CPU == "arm1156t2-s" || CPU == "arm1156t2f-s")
    465     return "v6t2";
    466 
    467   if (CPU == "cortex-a8" || CPU == "cortex-a9")
    468     return "v7";
    469 
    470   return "";
    471 }
    472 
    473 // FIXME: Move to target hook.
    474 static bool isSignedCharDefault(const llvm::Triple &Triple) {
    475   switch (Triple.getArch()) {
    476   default:
    477     return true;
    478 
    479   case llvm::Triple::arm:
    480   case llvm::Triple::ppc:
    481   case llvm::Triple::ppc64:
    482     if (Triple.getOS() == llvm::Triple::Darwin)
    483       return true;
    484     return false;
    485 
    486   case llvm::Triple::systemz:
    487     return false;
    488   }
    489 }
    490 
    491 void Clang::AddARMTargetArgs(const ArgList &Args,
    492                              ArgStringList &CmdArgs,
    493                              bool KernelOrKext) const {
    494   const Driver &D = getToolChain().getDriver();
    495   llvm::Triple Triple = getToolChain().getTriple();
    496 
    497   // Disable movt generation, if requested.
    498 #ifdef DISABLE_ARM_DARWIN_USE_MOVT
    499   CmdArgs.push_back("-backend-option");
    500   CmdArgs.push_back("-arm-darwin-use-movt=0");
    501 #endif
    502 
    503   // Select the ABI to use.
    504   //
    505   // FIXME: Support -meabi.
    506   const char *ABIName = 0;
    507   if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
    508     ABIName = A->getValue(Args);
    509   } else {
    510     // Select the default based on the platform.
    511     switch(Triple.getEnvironment()) {
    512     case llvm::Triple::GNUEABI:
    513       ABIName = "aapcs-linux";
    514       break;
    515     case llvm::Triple::EABI:
    516       ABIName = "aapcs";
    517       break;
    518     default:
    519       ABIName = "apcs-gnu";
    520     }
    521   }
    522   CmdArgs.push_back("-target-abi");
    523   CmdArgs.push_back(ABIName);
    524 
    525   // Set the CPU based on -march= and -mcpu=.
    526   CmdArgs.push_back("-target-cpu");
    527   CmdArgs.push_back(getARMTargetCPU(Args, Triple));
    528 
    529   // Select the float ABI as determined by -msoft-float, -mhard-float, and
    530   // -mfloat-abi=.
    531   llvm::StringRef FloatABI;
    532   if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
    533                                options::OPT_mhard_float,
    534                                options::OPT_mfloat_abi_EQ)) {
    535     if (A->getOption().matches(options::OPT_msoft_float))
    536       FloatABI = "soft";
    537     else if (A->getOption().matches(options::OPT_mhard_float))
    538       FloatABI = "hard";
    539     else {
    540       FloatABI = A->getValue(Args);
    541       if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
    542         D.Diag(clang::diag::err_drv_invalid_mfloat_abi)
    543           << A->getAsString(Args);
    544         FloatABI = "soft";
    545       }
    546     }
    547   }
    548 
    549   // If unspecified, choose the default based on the platform.
    550   if (FloatABI.empty()) {
    551     const llvm::Triple &Triple = getToolChain().getTriple();
    552     switch (Triple.getOS()) {
    553     case llvm::Triple::Darwin: {
    554       // Darwin defaults to "softfp" for v6 and v7.
    555       //
    556       // FIXME: Factor out an ARM class so we can cache the arch somewhere.
    557       llvm::StringRef ArchName =
    558         getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
    559       if (ArchName.startswith("v6") || ArchName.startswith("v7"))
    560         FloatABI = "softfp";
    561       else
    562         FloatABI = "soft";
    563       break;
    564     }
    565 
    566     case llvm::Triple::Linux: {
    567       if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUEABI) {
    568         FloatABI = "softfp";
    569         break;
    570       }
    571     }
    572     // fall through
    573 
    574     default:
    575       switch(Triple.getEnvironment()) {
    576       case llvm::Triple::GNUEABI:
    577         FloatABI = "softfp";
    578         break;
    579       case llvm::Triple::EABI:
    580         // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
    581         FloatABI = "softfp";
    582         break;
    583       default:
    584         // Assume "soft", but warn the user we are guessing.
    585         FloatABI = "soft";
    586         D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft";
    587         break;
    588       }
    589     }
    590   }
    591 
    592   if (FloatABI == "soft") {
    593     // Floating point operations and argument passing are soft.
    594     //
    595     // FIXME: This changes CPP defines, we need -target-soft-float.
    596     CmdArgs.push_back("-msoft-float");
    597     CmdArgs.push_back("-mfloat-abi");
    598     CmdArgs.push_back("soft");
    599   } else if (FloatABI == "softfp") {
    600     // Floating point operations are hard, but argument passing is soft.
    601     CmdArgs.push_back("-mfloat-abi");
    602     CmdArgs.push_back("soft");
    603   } else {
    604     // Floating point operations and argument passing are hard.
    605     assert(FloatABI == "hard" && "Invalid float abi!");
    606     CmdArgs.push_back("-mfloat-abi");
    607     CmdArgs.push_back("hard");
    608   }
    609 
    610   // Set appropriate target features for floating point mode.
    611   //
    612   // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
    613   // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
    614   // stripped out by the ARM target.
    615 
    616   // Use software floating point operations?
    617   if (FloatABI == "soft") {
    618     CmdArgs.push_back("-target-feature");
    619     CmdArgs.push_back("+soft-float");
    620   }
    621 
    622   // Use software floating point argument passing?
    623   if (FloatABI != "hard") {
    624     CmdArgs.push_back("-target-feature");
    625     CmdArgs.push_back("+soft-float-abi");
    626   }
    627 
    628   // Honor -mfpu=.
    629   //
    630   // FIXME: Centralize feature selection, defaulting shouldn't be also in the
    631   // frontend target.
    632   if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ)) {
    633     llvm::StringRef FPU = A->getValue(Args);
    634 
    635     // Set the target features based on the FPU.
    636     if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
    637       // Disable any default FPU support.
    638       CmdArgs.push_back("-target-feature");
    639       CmdArgs.push_back("-vfp2");
    640       CmdArgs.push_back("-target-feature");
    641       CmdArgs.push_back("-vfp3");
    642       CmdArgs.push_back("-target-feature");
    643       CmdArgs.push_back("-neon");
    644     } else if (FPU == "vfp") {
    645       CmdArgs.push_back("-target-feature");
    646       CmdArgs.push_back("+vfp2");
    647     } else if (FPU == "vfp3") {
    648       CmdArgs.push_back("-target-feature");
    649       CmdArgs.push_back("+vfp3");
    650     } else if (FPU == "neon") {
    651       CmdArgs.push_back("-target-feature");
    652       CmdArgs.push_back("+neon");
    653     } else
    654       D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
    655   }
    656 
    657   // Setting -msoft-float effectively disables NEON because of the GCC
    658   // implementation, although the same isn't true of VFP or VFP3.
    659   if (FloatABI == "soft") {
    660     CmdArgs.push_back("-target-feature");
    661     CmdArgs.push_back("-neon");
    662   }
    663 
    664   // Kernel code has more strict alignment requirements.
    665   if (KernelOrKext) {
    666     CmdArgs.push_back("-backend-option");
    667     CmdArgs.push_back("-arm-long-calls");
    668 
    669     CmdArgs.push_back("-backend-option");
    670     CmdArgs.push_back("-arm-strict-align");
    671 
    672     // The kext linker doesn't know how to deal with movw/movt.
    673 #ifndef DISABLE_ARM_DARWIN_USE_MOVT
    674     CmdArgs.push_back("-backend-option");
    675     CmdArgs.push_back("-arm-darwin-use-movt=0");
    676 #endif
    677   }
    678 }
    679 
    680 void Clang::AddMIPSTargetArgs(const ArgList &Args,
    681                              ArgStringList &CmdArgs) const {
    682   const Driver &D = getToolChain().getDriver();
    683 
    684   // Select the ABI to use.
    685   const char *ABIName = 0;
    686   if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
    687     ABIName = A->getValue(Args);
    688   } else {
    689     ABIName = "o32";
    690   }
    691 
    692   CmdArgs.push_back("-target-abi");
    693   CmdArgs.push_back(ABIName);
    694 
    695   if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
    696     llvm::StringRef MArch = A->getValue(Args);
    697     CmdArgs.push_back("-target-cpu");
    698 
    699     if ((MArch == "r2000") || (MArch == "r3000"))
    700       CmdArgs.push_back("mips1");
    701     else if (MArch == "r6000")
    702       CmdArgs.push_back("mips2");
    703     else
    704       CmdArgs.push_back(Args.MakeArgString(MArch));
    705   }
    706 
    707   // Select the float ABI as determined by -msoft-float, -mhard-float, and
    708   llvm::StringRef FloatABI;
    709   if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
    710                                options::OPT_mhard_float)) {
    711     if (A->getOption().matches(options::OPT_msoft_float))
    712       FloatABI = "soft";
    713     else if (A->getOption().matches(options::OPT_mhard_float))
    714       FloatABI = "hard";
    715   }
    716 
    717   // If unspecified, choose the default based on the platform.
    718   if (FloatABI.empty()) {
    719     // Assume "soft", but warn the user we are guessing.
    720     FloatABI = "soft";
    721     D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft";
    722   }
    723 
    724   if (FloatABI == "soft") {
    725     // Floating point operations and argument passing are soft.
    726     //
    727     // FIXME: This changes CPP defines, we need -target-soft-float.
    728     CmdArgs.push_back("-msoft-float");
    729   } else {
    730     assert(FloatABI == "hard" && "Invalid float abi!");
    731     CmdArgs.push_back("-mhard-float");
    732   }
    733 }
    734 
    735 void Clang::AddSparcTargetArgs(const ArgList &Args,
    736                              ArgStringList &CmdArgs) const {
    737   const Driver &D = getToolChain().getDriver();
    738 
    739   if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
    740     llvm::StringRef MArch = A->getValue(Args);
    741     CmdArgs.push_back("-target-cpu");
    742     CmdArgs.push_back(MArch.str().c_str());
    743   }
    744 
    745   // Select the float ABI as determined by -msoft-float, -mhard-float, and
    746   llvm::StringRef FloatABI;
    747   if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
    748                                options::OPT_mhard_float)) {
    749     if (A->getOption().matches(options::OPT_msoft_float))
    750       FloatABI = "soft";
    751     else if (A->getOption().matches(options::OPT_mhard_float))
    752       FloatABI = "hard";
    753   }
    754 
    755   // If unspecified, choose the default based on the platform.
    756   if (FloatABI.empty()) {
    757     switch (getToolChain().getTriple().getOS()) {
    758     default:
    759       // Assume "soft", but warn the user we are guessing.
    760       FloatABI = "soft";
    761       D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft";
    762       break;
    763     }
    764   }
    765 
    766   if (FloatABI == "soft") {
    767     // Floating point operations and argument passing are soft.
    768     //
    769     // FIXME: This changes CPP defines, we need -target-soft-float.
    770     CmdArgs.push_back("-msoft-float");
    771     CmdArgs.push_back("-target-feature");
    772     CmdArgs.push_back("+soft-float");
    773   } else {
    774     assert(FloatABI == "hard" && "Invalid float abi!");
    775     CmdArgs.push_back("-mhard-float");
    776   }
    777 }
    778 
    779 void Clang::AddX86TargetArgs(const ArgList &Args,
    780                              ArgStringList &CmdArgs) const {
    781   if (!Args.hasFlag(options::OPT_mred_zone,
    782                     options::OPT_mno_red_zone,
    783                     true) ||
    784       Args.hasArg(options::OPT_mkernel) ||
    785       Args.hasArg(options::OPT_fapple_kext))
    786     CmdArgs.push_back("-disable-red-zone");
    787 
    788   if (Args.hasFlag(options::OPT_msoft_float,
    789                    options::OPT_mno_soft_float,
    790                    false))
    791     CmdArgs.push_back("-no-implicit-float");
    792 
    793   const char *CPUName = 0;
    794   if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
    795     if (llvm::StringRef(A->getValue(Args)) == "native") {
    796       // FIXME: Reject attempts to use -march=native unless the target matches
    797       // the host.
    798       //
    799       // FIXME: We should also incorporate the detected target features for use
    800       // with -native.
    801       std::string CPU = llvm::sys::getHostCPUName();
    802       if (!CPU.empty())
    803         CPUName = Args.MakeArgString(CPU);
    804     } else
    805       CPUName = A->getValue(Args);
    806   }
    807 
    808   // Select the default CPU if none was given (or detection failed).
    809   if (!CPUName) {
    810     // FIXME: Need target hooks.
    811     if (getToolChain().getOS().startswith("darwin")) {
    812       if (getToolChain().getArch() == llvm::Triple::x86_64)
    813         CPUName = "core2";
    814       else if (getToolChain().getArch() == llvm::Triple::x86)
    815         CPUName = "yonah";
    816     } else if (getToolChain().getOS().startswith("haiku"))  {
    817       if (getToolChain().getArch() == llvm::Triple::x86_64)
    818         CPUName = "x86-64";
    819       else if (getToolChain().getArch() == llvm::Triple::x86)
    820         CPUName = "i586";
    821     } else if (getToolChain().getOS().startswith("openbsd"))  {
    822       if (getToolChain().getArch() == llvm::Triple::x86_64)
    823         CPUName = "x86-64";
    824       else if (getToolChain().getArch() == llvm::Triple::x86)
    825         CPUName = "i486";
    826     } else if (getToolChain().getOS().startswith("freebsd"))  {
    827       if (getToolChain().getArch() == llvm::Triple::x86_64)
    828         CPUName = "x86-64";
    829       else if (getToolChain().getArch() == llvm::Triple::x86)
    830         CPUName = "i486";
    831     } else if (getToolChain().getOS().startswith("netbsd"))  {
    832       if (getToolChain().getArch() == llvm::Triple::x86_64)
    833         CPUName = "x86-64";
    834       else if (getToolChain().getArch() == llvm::Triple::x86)
    835         CPUName = "i486";
    836     } else {
    837       if (getToolChain().getArch() == llvm::Triple::x86_64)
    838         CPUName = "x86-64";
    839       else if (getToolChain().getArch() == llvm::Triple::x86)
    840         CPUName = "pentium4";
    841     }
    842   }
    843 
    844   if (CPUName) {
    845     CmdArgs.push_back("-target-cpu");
    846     CmdArgs.push_back(CPUName);
    847   }
    848 
    849   // The required algorithm here is slightly strange: the options are applied
    850   // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
    851   // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
    852   // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
    853   // former correctly, but not the latter; handle directly-overridden
    854   // attributes here.
    855   llvm::StringMap<unsigned> PrevFeature;
    856   std::vector<const char*> Features;
    857   for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
    858          ie = Args.filtered_end(); it != ie; ++it) {
    859     llvm::StringRef Name = (*it)->getOption().getName();
    860     (*it)->claim();
    861 
    862     // Skip over "-m".
    863     assert(Name.startswith("-m") && "Invalid feature name.");
    864     Name = Name.substr(2);
    865 
    866     bool IsNegative = Name.startswith("no-");
    867     if (IsNegative)
    868       Name = Name.substr(3);
    869 
    870     unsigned& Prev = PrevFeature[Name];
    871     if (Prev)
    872       Features[Prev - 1] = 0;
    873     Prev = Features.size() + 1;
    874     Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
    875   }
    876   for (unsigned i = 0; i < Features.size(); i++) {
    877     if (Features[i]) {
    878       CmdArgs.push_back("-target-feature");
    879       CmdArgs.push_back(Features[i]);
    880     }
    881   }
    882 }
    883 
    884 static bool
    885 shouldUseExceptionTablesForObjCExceptions(unsigned objcABIVersion,
    886                                           const llvm::Triple &Triple) {
    887   // We use the zero-cost exception tables for Objective-C if the non-fragile
    888   // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
    889   // later.
    890 
    891   if (objcABIVersion >= 2)
    892     return true;
    893 
    894   if (Triple.getOS() != llvm::Triple::Darwin)
    895     return false;
    896 
    897   return (!Triple.isMacOSXVersionLT(10,5) &&
    898           (Triple.getArch() == llvm::Triple::x86_64 ||
    899            Triple.getArch() == llvm::Triple::arm));
    900 }
    901 
    902 /// addExceptionArgs - Adds exception related arguments to the driver command
    903 /// arguments. There's a master flag, -fexceptions and also language specific
    904 /// flags to enable/disable C++ and Objective-C exceptions.
    905 /// This makes it possible to for example disable C++ exceptions but enable
    906 /// Objective-C exceptions.
    907 static void addExceptionArgs(const ArgList &Args, types::ID InputType,
    908                              const llvm::Triple &Triple,
    909                              bool KernelOrKext, bool IsRewriter,
    910                              unsigned objcABIVersion,
    911                              ArgStringList &CmdArgs) {
    912   if (KernelOrKext)
    913     return;
    914 
    915   // Exceptions are enabled by default.
    916   bool ExceptionsEnabled = true;
    917 
    918   // This keeps track of whether exceptions were explicitly turned on or off.
    919   bool DidHaveExplicitExceptionFlag = false;
    920 
    921   if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
    922                                options::OPT_fno_exceptions)) {
    923     if (A->getOption().matches(options::OPT_fexceptions))
    924       ExceptionsEnabled = true;
    925     else
    926       ExceptionsEnabled = false;
    927 
    928     DidHaveExplicitExceptionFlag = true;
    929   }
    930 
    931   bool ShouldUseExceptionTables = false;
    932 
    933   // Exception tables and cleanups can be enabled with -fexceptions even if the
    934   // language itself doesn't support exceptions.
    935   if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
    936     ShouldUseExceptionTables = true;
    937 
    938   // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
    939   // is not necessarily sensible, but follows GCC.
    940   if (types::isObjC(InputType) &&
    941       Args.hasFlag(options::OPT_fobjc_exceptions,
    942                    options::OPT_fno_objc_exceptions,
    943                    true)) {
    944     CmdArgs.push_back("-fobjc-exceptions");
    945 
    946     ShouldUseExceptionTables |=
    947       shouldUseExceptionTablesForObjCExceptions(objcABIVersion, Triple);
    948   }
    949 
    950   if (types::isCXX(InputType)) {
    951     bool CXXExceptionsEnabled = ExceptionsEnabled;
    952 
    953     if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
    954                                  options::OPT_fno_cxx_exceptions,
    955                                  options::OPT_fexceptions,
    956                                  options::OPT_fno_exceptions)) {
    957       if (A->getOption().matches(options::OPT_fcxx_exceptions))
    958         CXXExceptionsEnabled = true;
    959       else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
    960         CXXExceptionsEnabled = false;
    961     }
    962 
    963     if (CXXExceptionsEnabled) {
    964       CmdArgs.push_back("-fcxx-exceptions");
    965 
    966       ShouldUseExceptionTables = true;
    967     }
    968   }
    969 
    970   if (ShouldUseExceptionTables)
    971     CmdArgs.push_back("-fexceptions");
    972 }
    973 
    974 static bool ShouldDisableCFI(const ArgList &Args,
    975                              const ToolChain &TC) {
    976   if (TC.getTriple().getOS() == llvm::Triple::Darwin) {
    977     // The native darwin assembler doesn't support cfi directives, so
    978     // we disable them if we think the .s file will be passed to it.
    979 
    980     // FIXME: Duplicated code with ToolChains.cpp
    981     // FIXME: This doesn't belong here, but ideally we will support static soon
    982     // anyway.
    983     bool HasStatic = (Args.hasArg(options::OPT_mkernel) ||
    984                       Args.hasArg(options::OPT_static) ||
    985                       Args.hasArg(options::OPT_fapple_kext));
    986     bool IsIADefault = TC.IsIntegratedAssemblerDefault() && !HasStatic;
    987     bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
    988                                         options::OPT_no_integrated_as,
    989                                         IsIADefault);
    990     bool UseCFI = Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
    991                                options::OPT_fno_dwarf2_cfi_asm,
    992                                UseIntegratedAs);
    993     return !UseCFI;
    994   }
    995 
    996   // For now we assume that every other assembler support CFI.
    997   return false;
    998 }
    999 
   1000 /// \brief Check whether the given input tree contains any compilation actions.
   1001 static bool ContainsCompileAction(const Action *A) {
   1002   if (llvm::isa<CompileJobAction>(A))
   1003     return true;
   1004 
   1005   for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
   1006     if (ContainsCompileAction(*it))
   1007       return true;
   1008 
   1009   return false;
   1010 }
   1011 
   1012 /// \brief Check if -relax-all should be passed to the internal assembler.
   1013 /// This is done by default when compiling non-assembler source with -O0.
   1014 static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
   1015   bool RelaxDefault = true;
   1016 
   1017   if (Arg *A = Args.getLastArg(options::OPT_O_Group))
   1018     RelaxDefault = A->getOption().matches(options::OPT_O0);
   1019 
   1020   if (RelaxDefault) {
   1021     RelaxDefault = false;
   1022     for (ActionList::const_iterator it = C.getActions().begin(),
   1023            ie = C.getActions().end(); it != ie; ++it) {
   1024       if (ContainsCompileAction(*it)) {
   1025         RelaxDefault = true;
   1026         break;
   1027       }
   1028     }
   1029   }
   1030 
   1031   return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
   1032     RelaxDefault);
   1033 }
   1034 
   1035 void Clang::ConstructJob(Compilation &C, const JobAction &JA,
   1036                          const InputInfo &Output,
   1037                          const InputInfoList &Inputs,
   1038                          const ArgList &Args,
   1039                          const char *LinkingOutput) const {
   1040   bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
   1041                                   options::OPT_fapple_kext);
   1042   const Driver &D = getToolChain().getDriver();
   1043   ArgStringList CmdArgs;
   1044 
   1045   assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
   1046 
   1047   // Invoke ourselves in -cc1 mode.
   1048   //
   1049   // FIXME: Implement custom jobs for internal actions.
   1050   CmdArgs.push_back("-cc1");
   1051 
   1052   // Add the "effective" target triple.
   1053   CmdArgs.push_back("-triple");
   1054   std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
   1055   CmdArgs.push_back(Args.MakeArgString(TripleStr));
   1056 
   1057   // Select the appropriate action.
   1058   bool IsRewriter = false;
   1059   if (isa<AnalyzeJobAction>(JA)) {
   1060     assert(JA.getType() == types::TY_Plist && "Invalid output type.");
   1061     CmdArgs.push_back("-analyze");
   1062   } else if (isa<PreprocessJobAction>(JA)) {
   1063     if (Output.getType() == types::TY_Dependencies)
   1064       CmdArgs.push_back("-Eonly");
   1065     else
   1066       CmdArgs.push_back("-E");
   1067   } else if (isa<AssembleJobAction>(JA)) {
   1068     CmdArgs.push_back("-emit-obj");
   1069 
   1070     if (UseRelaxAll(C, Args))
   1071       CmdArgs.push_back("-mrelax-all");
   1072 
   1073     // When using an integrated assembler, translate -Wa, and -Xassembler
   1074     // options.
   1075     for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
   1076                                                options::OPT_Xassembler),
   1077            ie = Args.filtered_end(); it != ie; ++it) {
   1078       const Arg *A = *it;
   1079       A->claim();
   1080 
   1081       for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
   1082         llvm::StringRef Value = A->getValue(Args, i);
   1083 
   1084         if (Value == "-force_cpusubtype_ALL") {
   1085           // Do nothing, this is the default and we don't support anything else.
   1086         } else if (Value == "-L") {
   1087           CmdArgs.push_back("-msave-temp-labels");
   1088         } else if (Value == "--fatal-warnings") {
   1089           CmdArgs.push_back("-mllvm");
   1090           CmdArgs.push_back("-fatal-assembler-warnings");
   1091         } else if (Value == "--noexecstack") {
   1092           CmdArgs.push_back("-mnoexecstack");
   1093         } else {
   1094           D.Diag(clang::diag::err_drv_unsupported_option_argument)
   1095             << A->getOption().getName() << Value;
   1096         }
   1097       }
   1098     }
   1099 
   1100     // Also ignore explicit -force_cpusubtype_ALL option.
   1101     (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
   1102   } else if (isa<PrecompileJobAction>(JA)) {
   1103     // Use PCH if the user requested it.
   1104     bool UsePCH = D.CCCUsePCH;
   1105 
   1106     if (UsePCH)
   1107       CmdArgs.push_back("-emit-pch");
   1108     else
   1109       CmdArgs.push_back("-emit-pth");
   1110   } else {
   1111     assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
   1112 
   1113     if (JA.getType() == types::TY_Nothing) {
   1114       CmdArgs.push_back("-fsyntax-only");
   1115     } else if (JA.getType() == types::TY_LLVM_IR ||
   1116                JA.getType() == types::TY_LTO_IR) {
   1117       CmdArgs.push_back("-emit-llvm");
   1118     } else if (JA.getType() == types::TY_LLVM_BC ||
   1119                JA.getType() == types::TY_LTO_BC) {
   1120       CmdArgs.push_back("-emit-llvm-bc");
   1121     } else if (JA.getType() == types::TY_PP_Asm) {
   1122       CmdArgs.push_back("-S");
   1123     } else if (JA.getType() == types::TY_AST) {
   1124       CmdArgs.push_back("-emit-pch");
   1125     } else if (JA.getType() == types::TY_RewrittenObjC) {
   1126       CmdArgs.push_back("-rewrite-objc");
   1127       IsRewriter = true;
   1128     } else {
   1129       assert(JA.getType() == types::TY_PP_Asm &&
   1130              "Unexpected output type!");
   1131     }
   1132   }
   1133 
   1134   // The make clang go fast button.
   1135   CmdArgs.push_back("-disable-free");
   1136 
   1137   // Disable the verification pass in -asserts builds.
   1138 #ifdef NDEBUG
   1139   CmdArgs.push_back("-disable-llvm-verifier");
   1140 #endif
   1141 
   1142   // Set the main file name, so that debug info works even with
   1143   // -save-temps.
   1144   CmdArgs.push_back("-main-file-name");
   1145   CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
   1146 
   1147   // Some flags which affect the language (via preprocessor
   1148   // defines). See darwin::CC1::AddCPPArgs.
   1149   if (Args.hasArg(options::OPT_static))
   1150     CmdArgs.push_back("-static-define");
   1151 
   1152   if (isa<AnalyzeJobAction>(JA)) {
   1153     // Enable region store model by default.
   1154     CmdArgs.push_back("-analyzer-store=region");
   1155 
   1156     // Treat blocks as analysis entry points.
   1157     CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
   1158 
   1159     CmdArgs.push_back("-analyzer-eagerly-assume");
   1160 
   1161     // Add default argument set.
   1162     if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
   1163       CmdArgs.push_back("-analyzer-checker=core");
   1164       CmdArgs.push_back("-analyzer-checker=deadcode");
   1165       CmdArgs.push_back("-analyzer-checker=security");
   1166 
   1167       if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
   1168         CmdArgs.push_back("-analyzer-checker=unix");
   1169 
   1170       if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
   1171         CmdArgs.push_back("-analyzer-checker=osx");
   1172     }
   1173 
   1174     // Set the output format. The default is plist, for (lame) historical
   1175     // reasons.
   1176     CmdArgs.push_back("-analyzer-output");
   1177     if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
   1178       CmdArgs.push_back(A->getValue(Args));
   1179     else
   1180       CmdArgs.push_back("plist");
   1181 
   1182     // Disable the presentation of standard compiler warnings when
   1183     // using --analyze.  We only want to show static analyzer diagnostics
   1184     // or frontend errors.
   1185     CmdArgs.push_back("-w");
   1186 
   1187     // Add -Xanalyzer arguments when running as analyzer.
   1188     Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
   1189   }
   1190 
   1191   CheckCodeGenerationOptions(D, Args);
   1192 
   1193   // Perform argument translation for LLVM backend. This
   1194   // takes some care in reconciling with llvm-gcc. The
   1195   // issue is that llvm-gcc translates these options based on
   1196   // the values in cc1, whereas we are processing based on
   1197   // the driver arguments.
   1198 
   1199   // This comes from the default translation the driver + cc1
   1200   // would do to enable flag_pic.
   1201   //
   1202   // FIXME: Centralize this code.
   1203   bool PICEnabled = (Args.hasArg(options::OPT_fPIC) ||
   1204                      Args.hasArg(options::OPT_fpic) ||
   1205                      Args.hasArg(options::OPT_fPIE) ||
   1206                      Args.hasArg(options::OPT_fpie));
   1207   bool PICDisabled = (Args.hasArg(options::OPT_mkernel) ||
   1208                       Args.hasArg(options::OPT_static));
   1209   const char *Model = getToolChain().GetForcedPicModel();
   1210   if (!Model) {
   1211     if (Args.hasArg(options::OPT_mdynamic_no_pic))
   1212       Model = "dynamic-no-pic";
   1213     else if (PICDisabled)
   1214       Model = "static";
   1215     else if (PICEnabled)
   1216       Model = "pic";
   1217     else
   1218       Model = getToolChain().GetDefaultRelocationModel();
   1219   }
   1220   if (llvm::StringRef(Model) != "pic") {
   1221     CmdArgs.push_back("-mrelocation-model");
   1222     CmdArgs.push_back(Model);
   1223   }
   1224 
   1225   // Infer the __PIC__ value.
   1226   //
   1227   // FIXME:  This isn't quite right on Darwin, which always sets
   1228   // __PIC__=2.
   1229   if (strcmp(Model, "pic") == 0 || strcmp(Model, "dynamic-no-pic") == 0) {
   1230     CmdArgs.push_back("-pic-level");
   1231     CmdArgs.push_back(Args.hasArg(options::OPT_fPIC) ? "2" : "1");
   1232   }
   1233   if (!Args.hasFlag(options::OPT_fmerge_all_constants,
   1234                     options::OPT_fno_merge_all_constants))
   1235     CmdArgs.push_back("-fno-merge-all-constants");
   1236 
   1237   // LLVM Code Generator Options.
   1238 
   1239   if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
   1240     CmdArgs.push_back("-mregparm");
   1241     CmdArgs.push_back(A->getValue(Args));
   1242   }
   1243 
   1244   if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
   1245     CmdArgs.push_back("-mrtd");
   1246 
   1247   // FIXME: Set --enable-unsafe-fp-math.
   1248   if (Args.hasFlag(options::OPT_fno_omit_frame_pointer,
   1249                    options::OPT_fomit_frame_pointer))
   1250     CmdArgs.push_back("-mdisable-fp-elim");
   1251   if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
   1252                     options::OPT_fno_zero_initialized_in_bss))
   1253     CmdArgs.push_back("-mno-zero-initialized-in-bss");
   1254   if (!Args.hasFlag(options::OPT_fstrict_aliasing,
   1255                     options::OPT_fno_strict_aliasing,
   1256                     getToolChain().IsStrictAliasingDefault()))
   1257     CmdArgs.push_back("-relaxed-aliasing");
   1258 
   1259   // Decide whether to use verbose asm. Verbose assembly is the default on
   1260   // toolchains which have the integrated assembler on by default.
   1261   bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
   1262   if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
   1263                    IsVerboseAsmDefault) ||
   1264       Args.hasArg(options::OPT_dA))
   1265     CmdArgs.push_back("-masm-verbose");
   1266 
   1267   if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
   1268     CmdArgs.push_back("-mdebug-pass");
   1269     CmdArgs.push_back("Structure");
   1270   }
   1271   if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
   1272     CmdArgs.push_back("-mdebug-pass");
   1273     CmdArgs.push_back("Arguments");
   1274   }
   1275 
   1276   // Enable -mconstructor-aliases except on darwin, where we have to
   1277   // work around a linker bug;  see <rdar://problem/7651567>.
   1278   if (getToolChain().getTriple().getOS() != llvm::Triple::Darwin)
   1279     CmdArgs.push_back("-mconstructor-aliases");
   1280 
   1281   // Darwin's kernel doesn't support guard variables; just die if we
   1282   // try to use them.
   1283   if (KernelOrKext &&
   1284       getToolChain().getTriple().getOS() == llvm::Triple::Darwin)
   1285     CmdArgs.push_back("-fforbid-guard-variables");
   1286 
   1287   if (Args.hasArg(options::OPT_mms_bitfields)) {
   1288     CmdArgs.push_back("-mms-bitfields");
   1289   }
   1290 
   1291   // This is a coarse approximation of what llvm-gcc actually does, both
   1292   // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
   1293   // complicated ways.
   1294   bool AsynchronousUnwindTables =
   1295     Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
   1296                  options::OPT_fno_asynchronous_unwind_tables,
   1297                  getToolChain().IsUnwindTablesDefault() &&
   1298                  !KernelOrKext);
   1299   if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
   1300                    AsynchronousUnwindTables))
   1301     CmdArgs.push_back("-munwind-tables");
   1302 
   1303   if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
   1304     CmdArgs.push_back("-mlimit-float-precision");
   1305     CmdArgs.push_back(A->getValue(Args));
   1306   }
   1307 
   1308   // FIXME: Handle -mtune=.
   1309   (void) Args.hasArg(options::OPT_mtune_EQ);
   1310 
   1311   if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
   1312     CmdArgs.push_back("-mcode-model");
   1313     CmdArgs.push_back(A->getValue(Args));
   1314   }
   1315 
   1316   // Add target specific cpu and features flags.
   1317   switch(getToolChain().getTriple().getArch()) {
   1318   default:
   1319     break;
   1320 
   1321   case llvm::Triple::arm:
   1322   case llvm::Triple::thumb:
   1323     AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
   1324     break;
   1325 
   1326   case llvm::Triple::mips:
   1327   case llvm::Triple::mipsel:
   1328     AddMIPSTargetArgs(Args, CmdArgs);
   1329     break;
   1330 
   1331   case llvm::Triple::sparc:
   1332     AddSparcTargetArgs(Args, CmdArgs);
   1333     break;
   1334 
   1335   case llvm::Triple::x86:
   1336   case llvm::Triple::x86_64:
   1337     AddX86TargetArgs(Args, CmdArgs);
   1338     break;
   1339   }
   1340 
   1341   // Pass the linker version in use.
   1342   if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
   1343     CmdArgs.push_back("-target-linker-version");
   1344     CmdArgs.push_back(A->getValue(Args));
   1345   }
   1346 
   1347   // -mno-omit-leaf-frame-pointer is the default on Darwin.
   1348   if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
   1349                    options::OPT_mno_omit_leaf_frame_pointer,
   1350                    getToolChain().getTriple().getOS() != llvm::Triple::Darwin))
   1351     CmdArgs.push_back("-momit-leaf-frame-pointer");
   1352 
   1353   // -fno-math-errno is default.
   1354   if (Args.hasFlag(options::OPT_fmath_errno,
   1355                    options::OPT_fno_math_errno,
   1356                    false))
   1357     CmdArgs.push_back("-fmath-errno");
   1358 
   1359   // Explicitly error on some things we know we don't support and can't just
   1360   // ignore.
   1361   types::ID InputType = Inputs[0].getType();
   1362   if (!Args.hasArg(options::OPT_fallow_unsupported)) {
   1363     Arg *Unsupported;
   1364     if ((Unsupported = Args.getLastArg(options::OPT_iframework)))
   1365       D.Diag(clang::diag::err_drv_clang_unsupported)
   1366         << Unsupported->getOption().getName();
   1367 
   1368     if (types::isCXX(InputType) &&
   1369         getToolChain().getTriple().getOS() == llvm::Triple::Darwin &&
   1370         getToolChain().getTriple().getArch() == llvm::Triple::x86) {
   1371       if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)))
   1372         D.Diag(clang::diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
   1373           << Unsupported->getOption().getName();
   1374     }
   1375   }
   1376 
   1377   Args.AddAllArgs(CmdArgs, options::OPT_v);
   1378   Args.AddLastArg(CmdArgs, options::OPT_H);
   1379   if (D.CCPrintHeaders) {
   1380     CmdArgs.push_back("-header-include-file");
   1381     CmdArgs.push_back(D.CCPrintHeadersFilename ?
   1382                       D.CCPrintHeadersFilename : "-");
   1383   }
   1384   Args.AddLastArg(CmdArgs, options::OPT_P);
   1385   Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
   1386 
   1387   if (D.CCLogDiagnostics) {
   1388     CmdArgs.push_back("-diagnostic-log-file");
   1389     CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
   1390                       D.CCLogDiagnosticsFilename : "-");
   1391   }
   1392 
   1393   // Special case debug options to only pass -g to clang. This is
   1394   // wrong.
   1395   Args.ClaimAllArgs(options::OPT_g_Group);
   1396   if (Arg *A = Args.getLastArg(options::OPT_g_Group))
   1397     if (!A->getOption().matches(options::OPT_g0))
   1398       CmdArgs.push_back("-g");
   1399 
   1400   Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
   1401   Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
   1402 
   1403   Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
   1404 
   1405   if (Args.hasArg(options::OPT_ftest_coverage) ||
   1406       Args.hasArg(options::OPT_coverage))
   1407     CmdArgs.push_back("-femit-coverage-notes");
   1408   if (Args.hasArg(options::OPT_fprofile_arcs) ||
   1409       Args.hasArg(options::OPT_coverage))
   1410     CmdArgs.push_back("-femit-coverage-data");
   1411 
   1412   if (C.getArgs().hasArg(options::OPT_c) ||
   1413       C.getArgs().hasArg(options::OPT_S)) {
   1414     if (Output.isFilename()) {
   1415       CmdArgs.push_back("-coverage-file");
   1416       CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
   1417     }
   1418   }
   1419 
   1420   Args.AddLastArg(CmdArgs, options::OPT_nostdinc);
   1421   Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
   1422   Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
   1423 
   1424   // Pass the path to compiler resource files.
   1425   CmdArgs.push_back("-resource-dir");
   1426   CmdArgs.push_back(D.ResourceDir.c_str());
   1427 
   1428   Args.AddLastArg(CmdArgs, options::OPT_working_directory);
   1429 
   1430   if (!Args.hasArg(options::OPT_fno_objc_arc)) {
   1431     if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
   1432                                        options::OPT_ccc_arcmt_modify,
   1433                                        options::OPT_ccc_arcmt_migrate)) {
   1434       switch (A->getOption().getID()) {
   1435       default:
   1436         llvm_unreachable("missed a case");
   1437       case options::OPT_ccc_arcmt_check:
   1438         CmdArgs.push_back("-arcmt-check");
   1439         break;
   1440       case options::OPT_ccc_arcmt_modify:
   1441         CmdArgs.push_back("-arcmt-modify");
   1442         break;
   1443       case options::OPT_ccc_arcmt_migrate:
   1444         CmdArgs.push_back("-arcmt-migrate");
   1445         CmdArgs.push_back("-arcmt-migrate-directory");
   1446         CmdArgs.push_back(A->getValue(Args));
   1447 
   1448         Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
   1449         Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
   1450         break;
   1451       }
   1452     }
   1453   }
   1454 
   1455   // Add preprocessing options like -I, -D, etc. if we are using the
   1456   // preprocessor.
   1457   //
   1458   // FIXME: Support -fpreprocessed
   1459   if (types::getPreprocessedType(InputType) != types::TY_INVALID)
   1460     AddPreprocessingOptions(D, Args, CmdArgs, Output, Inputs);
   1461 
   1462   // Manually translate -O to -O2 and -O4 to -O3; let clang reject
   1463   // others.
   1464   if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
   1465     if (A->getOption().matches(options::OPT_O4))
   1466       CmdArgs.push_back("-O3");
   1467     else if (A->getOption().matches(options::OPT_O) &&
   1468              A->getValue(Args)[0] == '\0')
   1469       CmdArgs.push_back("-O2");
   1470     else
   1471       A->render(Args, CmdArgs);
   1472   }
   1473 
   1474   Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
   1475   Args.AddLastArg(CmdArgs, options::OPT_pedantic);
   1476   Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
   1477   Args.AddLastArg(CmdArgs, options::OPT_w);
   1478 
   1479   // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
   1480   // (-ansi is equivalent to -std=c89).
   1481   //
   1482   // If a std is supplied, only add -trigraphs if it follows the
   1483   // option.
   1484   if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
   1485     if (Std->getOption().matches(options::OPT_ansi))
   1486       if (types::isCXX(InputType))
   1487         CmdArgs.push_back("-std=c++98");
   1488       else
   1489         CmdArgs.push_back("-std=c89");
   1490     else
   1491       Std->render(Args, CmdArgs);
   1492 
   1493     if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
   1494                                  options::OPT_trigraphs))
   1495       if (A != Std)
   1496         A->render(Args, CmdArgs);
   1497   } else {
   1498     // Honor -std-default.
   1499     //
   1500     // FIXME: Clang doesn't correctly handle -std= when the input language
   1501     // doesn't match. For the time being just ignore this for C++ inputs;
   1502     // eventually we want to do all the standard defaulting here instead of
   1503     // splitting it between the driver and clang -cc1.
   1504     if (!types::isCXX(InputType))
   1505         Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
   1506                                   "-std=", /*Joined=*/true);
   1507     Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
   1508   }
   1509 
   1510   // Map the bizarre '-Wwrite-strings' flag to a more sensible
   1511   // '-fconst-strings'; this better indicates its actual behavior.
   1512   if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
   1513                    false)) {
   1514     // For perfect compatibility with GCC, we do this even in the presence of
   1515     // '-w'. This flag names something other than a warning for GCC.
   1516     CmdArgs.push_back("-fconst-strings");
   1517   }
   1518 
   1519   // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
   1520   // during C++ compilation, which it is by default. GCC keeps this define even
   1521   // in the presence of '-w', match this behavior bug-for-bug.
   1522   if (types::isCXX(InputType) &&
   1523       Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
   1524                    true)) {
   1525     CmdArgs.push_back("-fdeprecated-macro");
   1526   }
   1527 
   1528   // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
   1529   if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
   1530     if (Asm->getOption().matches(options::OPT_fasm))
   1531       CmdArgs.push_back("-fgnu-keywords");
   1532     else
   1533       CmdArgs.push_back("-fno-gnu-keywords");
   1534   }
   1535 
   1536   if (ShouldDisableCFI(Args, getToolChain()))
   1537     CmdArgs.push_back("-fno-dwarf2-cfi-asm");
   1538 
   1539   if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) {
   1540     CmdArgs.push_back("-ftemplate-depth");
   1541     CmdArgs.push_back(A->getValue(Args));
   1542   }
   1543 
   1544   if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
   1545                                options::OPT_Wlarge_by_value_copy_def)) {
   1546     CmdArgs.push_back("-Wlarge-by-value-copy");
   1547     if (A->getNumValues())
   1548       CmdArgs.push_back(A->getValue(Args));
   1549     else
   1550       CmdArgs.push_back("64"); // default value for -Wlarge-by-value-copy.
   1551   }
   1552 
   1553   if (Args.hasArg(options::OPT__relocatable_pch))
   1554     CmdArgs.push_back("-relocatable-pch");
   1555 
   1556   if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
   1557     CmdArgs.push_back("-fconstant-string-class");
   1558     CmdArgs.push_back(A->getValue(Args));
   1559   }
   1560 
   1561   if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
   1562     CmdArgs.push_back("-ftabstop");
   1563     CmdArgs.push_back(A->getValue(Args));
   1564   }
   1565 
   1566   CmdArgs.push_back("-ferror-limit");
   1567   if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
   1568     CmdArgs.push_back(A->getValue(Args));
   1569   else
   1570     CmdArgs.push_back("19");
   1571 
   1572   if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
   1573     CmdArgs.push_back("-fmacro-backtrace-limit");
   1574     CmdArgs.push_back(A->getValue(Args));
   1575   }
   1576 
   1577   if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
   1578     CmdArgs.push_back("-ftemplate-backtrace-limit");
   1579     CmdArgs.push_back(A->getValue(Args));
   1580   }
   1581 
   1582   // Pass -fmessage-length=.
   1583   CmdArgs.push_back("-fmessage-length");
   1584   if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
   1585     CmdArgs.push_back(A->getValue(Args));
   1586   } else {
   1587     // If -fmessage-length=N was not specified, determine whether this is a
   1588     // terminal and, if so, implicitly define -fmessage-length appropriately.
   1589     unsigned N = llvm::sys::Process::StandardErrColumns();
   1590     CmdArgs.push_back(Args.MakeArgString(llvm::Twine(N)));
   1591   }
   1592 
   1593   if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
   1594     CmdArgs.push_back("-fvisibility");
   1595     CmdArgs.push_back(A->getValue(Args));
   1596   }
   1597 
   1598   Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
   1599 
   1600   // -fhosted is default.
   1601   if (KernelOrKext || Args.hasFlag(options::OPT_ffreestanding,
   1602                                    options::OPT_fhosted,
   1603                                    false))
   1604     CmdArgs.push_back("-ffreestanding");
   1605 
   1606   // Forward -f (flag) options which we can pass directly.
   1607   Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
   1608   Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
   1609   Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
   1610   Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
   1611   if (getToolChain().SupportsProfiling())
   1612     Args.AddLastArg(CmdArgs, options::OPT_pg);
   1613 
   1614   // -flax-vector-conversions is default.
   1615   if (!Args.hasFlag(options::OPT_flax_vector_conversions,
   1616                     options::OPT_fno_lax_vector_conversions))
   1617     CmdArgs.push_back("-fno-lax-vector-conversions");
   1618 
   1619   if (Args.getLastArg(options::OPT_fapple_kext))
   1620     CmdArgs.push_back("-fapple-kext");
   1621 
   1622   Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
   1623   Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
   1624   Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
   1625   Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
   1626   Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
   1627 
   1628   if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
   1629     CmdArgs.push_back("-ftrapv-handler");
   1630     CmdArgs.push_back(A->getValue(Args));
   1631   }
   1632 
   1633   // Forward -ftrap_function= options to the backend.
   1634   if (Arg *A = Args.getLastArg(options::OPT_ftrap_function_EQ)) {
   1635     llvm::StringRef FuncName = A->getValue(Args);
   1636     CmdArgs.push_back("-backend-option");
   1637     CmdArgs.push_back(Args.MakeArgString("-trap-func=" + FuncName));
   1638   }
   1639 
   1640   // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
   1641   // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
   1642   if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
   1643                                options::OPT_fno_wrapv)) {
   1644     if (A->getOption().matches(options::OPT_fwrapv))
   1645       CmdArgs.push_back("-fwrapv");
   1646   } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
   1647                                       options::OPT_fno_strict_overflow)) {
   1648     if (A->getOption().matches(options::OPT_fno_strict_overflow))
   1649       CmdArgs.push_back("-fwrapv");
   1650   }
   1651   Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
   1652   Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
   1653 
   1654   Args.AddLastArg(CmdArgs, options::OPT_pthread);
   1655 
   1656   // -stack-protector=0 is default.
   1657   unsigned StackProtectorLevel = 0;
   1658   if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
   1659                                options::OPT_fstack_protector_all,
   1660                                options::OPT_fstack_protector)) {
   1661     if (A->getOption().matches(options::OPT_fstack_protector))
   1662       StackProtectorLevel = 1;
   1663     else if (A->getOption().matches(options::OPT_fstack_protector_all))
   1664       StackProtectorLevel = 2;
   1665   } else
   1666     StackProtectorLevel = getToolChain().GetDefaultStackProtectorLevel();
   1667   if (StackProtectorLevel) {
   1668     CmdArgs.push_back("-stack-protector");
   1669     CmdArgs.push_back(Args.MakeArgString(llvm::Twine(StackProtectorLevel)));
   1670   }
   1671 
   1672   // Translate -mstackrealign
   1673   if (Args.hasArg(options::OPT_mstackrealign)) {
   1674     CmdArgs.push_back("-backend-option");
   1675     CmdArgs.push_back("-force-align-stack");
   1676   }
   1677 
   1678   // Forward -f options with positive and negative forms; we translate
   1679   // these by hand.
   1680 
   1681   if (Args.hasArg(options::OPT_mkernel)) {
   1682     if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
   1683       CmdArgs.push_back("-fapple-kext");
   1684     if (!Args.hasArg(options::OPT_fbuiltin))
   1685       CmdArgs.push_back("-fno-builtin");
   1686   }
   1687   // -fbuiltin is default.
   1688   else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
   1689     CmdArgs.push_back("-fno-builtin");
   1690 
   1691   if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
   1692                     options::OPT_fno_assume_sane_operator_new))
   1693     CmdArgs.push_back("-fno-assume-sane-operator-new");
   1694 
   1695   // -fblocks=0 is default.
   1696   if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
   1697                    getToolChain().IsBlocksDefault()) ||
   1698         (Args.hasArg(options::OPT_fgnu_runtime) &&
   1699          Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
   1700          !Args.hasArg(options::OPT_fno_blocks))) {
   1701     CmdArgs.push_back("-fblocks");
   1702   }
   1703 
   1704   // -faccess-control is default.
   1705   if (Args.hasFlag(options::OPT_fno_access_control,
   1706                    options::OPT_faccess_control,
   1707                    false))
   1708     CmdArgs.push_back("-fno-access-control");
   1709 
   1710   // -felide-constructors is the default.
   1711   if (Args.hasFlag(options::OPT_fno_elide_constructors,
   1712                    options::OPT_felide_constructors,
   1713                    false))
   1714     CmdArgs.push_back("-fno-elide-constructors");
   1715 
   1716   // -frtti is default.
   1717   if (KernelOrKext ||
   1718       !Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti))
   1719     CmdArgs.push_back("-fno-rtti");
   1720 
   1721   // -fshort-enums=0 is default.
   1722   // FIXME: Are there targers where -fshort-enums is on by default ?
   1723   if (Args.hasFlag(options::OPT_fshort_enums,
   1724                    options::OPT_fno_short_enums, false))
   1725     CmdArgs.push_back("-fshort-enums");
   1726 
   1727   // -fsigned-char is default.
   1728   if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
   1729                     isSignedCharDefault(getToolChain().getTriple())))
   1730     CmdArgs.push_back("-fno-signed-char");
   1731 
   1732   // -fthreadsafe-static is default.
   1733   if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
   1734                     options::OPT_fno_threadsafe_statics))
   1735     CmdArgs.push_back("-fno-threadsafe-statics");
   1736 
   1737   // -fuse-cxa-atexit is default.
   1738   if (KernelOrKext ||
   1739     !Args.hasFlag(options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
   1740                   getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
   1741                   getToolChain().getTriple().getOS() != llvm::Triple::MinGW32))
   1742     CmdArgs.push_back("-fno-use-cxa-atexit");
   1743 
   1744   // -fms-extensions=0 is default.
   1745   if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
   1746                    getToolChain().getTriple().getOS() == llvm::Triple::Win32))
   1747     CmdArgs.push_back("-fms-extensions");
   1748 
   1749   // -fmsc-version=1300 is default.
   1750   if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
   1751                    getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
   1752       Args.hasArg(options::OPT_fmsc_version)) {
   1753     llvm::StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
   1754     if (msc_ver.empty())
   1755       CmdArgs.push_back("-fmsc-version=1300");
   1756     else
   1757       CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
   1758   }
   1759 
   1760 
   1761   // -fborland-extensions=0 is default.
   1762   if (Args.hasFlag(options::OPT_fborland_extensions,
   1763                    options::OPT_fno_borland_extensions, false))
   1764     CmdArgs.push_back("-fborland-extensions");
   1765 
   1766   // -fno-delayed-template-parsing is default.
   1767   if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
   1768                    options::OPT_fno_delayed_template_parsing,
   1769                    false))
   1770     CmdArgs.push_back("-fdelayed-template-parsing");
   1771 
   1772   // -fgnu-keywords default varies depending on language; only pass if
   1773   // specified.
   1774   if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
   1775                                options::OPT_fno_gnu_keywords))
   1776     A->render(Args, CmdArgs);
   1777 
   1778   if (Args.hasFlag(options::OPT_fgnu89_inline,
   1779                    options::OPT_fno_gnu89_inline,
   1780                    false))
   1781     CmdArgs.push_back("-fgnu89-inline");
   1782 
   1783   // -fobjc-nonfragile-abi=0 is default.
   1784   ObjCRuntime objCRuntime;
   1785   unsigned objcABIVersion = 0;
   1786   if (types::isObjC(InputType)) {
   1787     bool NeXTRuntimeIsDefault
   1788       = (IsRewriter || getToolChain().getTriple().isOSDarwin());
   1789     if (Args.hasFlag(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
   1790                      NeXTRuntimeIsDefault)) {
   1791       objCRuntime.setKind(ObjCRuntime::NeXT);
   1792     } else {
   1793       CmdArgs.push_back("-fgnu-runtime");
   1794       objCRuntime.setKind(ObjCRuntime::GNU);
   1795     }
   1796     getToolChain().configureObjCRuntime(objCRuntime);
   1797     if (objCRuntime.HasARC)
   1798       CmdArgs.push_back("-fobjc-runtime-has-arc");
   1799     if (objCRuntime.HasWeak)
   1800       CmdArgs.push_back("-fobjc-runtime-has-weak");
   1801     if (objCRuntime.HasTerminate)
   1802       CmdArgs.push_back("-fobjc-runtime-has-terminate");
   1803 
   1804     // Compute the Objective-C ABI "version" to use. Version numbers are
   1805     // slightly confusing for historical reasons:
   1806     //   1 - Traditional "fragile" ABI
   1807     //   2 - Non-fragile ABI, version 1
   1808     //   3 - Non-fragile ABI, version 2
   1809     objcABIVersion = 1;
   1810     // If -fobjc-abi-version= is present, use that to set the version.
   1811     if (Arg *A = Args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
   1812       if (llvm::StringRef(A->getValue(Args)) == "1")
   1813         objcABIVersion = 1;
   1814       else if (llvm::StringRef(A->getValue(Args)) == "2")
   1815         objcABIVersion = 2;
   1816       else if (llvm::StringRef(A->getValue(Args)) == "3")
   1817         objcABIVersion = 3;
   1818       else
   1819         D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
   1820     } else {
   1821       // Otherwise, determine if we are using the non-fragile ABI.
   1822       if (Args.hasFlag(options::OPT_fobjc_nonfragile_abi,
   1823                        options::OPT_fno_objc_nonfragile_abi,
   1824                        getToolChain().IsObjCNonFragileABIDefault())) {
   1825         // Determine the non-fragile ABI version to use.
   1826 #ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
   1827         unsigned NonFragileABIVersion = 1;
   1828 #else
   1829         unsigned NonFragileABIVersion = 2;
   1830 #endif
   1831 
   1832         if (Arg *A = Args.getLastArg(
   1833               options::OPT_fobjc_nonfragile_abi_version_EQ)) {
   1834           if (llvm::StringRef(A->getValue(Args)) == "1")
   1835             NonFragileABIVersion = 1;
   1836           else if (llvm::StringRef(A->getValue(Args)) == "2")
   1837             NonFragileABIVersion = 2;
   1838           else
   1839             D.Diag(clang::diag::err_drv_clang_unsupported)
   1840               << A->getAsString(Args);
   1841         }
   1842 
   1843         objcABIVersion = 1 + NonFragileABIVersion;
   1844       } else {
   1845         objcABIVersion = 1;
   1846       }
   1847     }
   1848 
   1849     if (objcABIVersion == 2 || objcABIVersion == 3) {
   1850       CmdArgs.push_back("-fobjc-nonfragile-abi");
   1851 
   1852       // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
   1853       // legacy is the default.
   1854       if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
   1855                         options::OPT_fno_objc_legacy_dispatch,
   1856                         getToolChain().IsObjCLegacyDispatchDefault())) {
   1857         if (getToolChain().UseObjCMixedDispatch())
   1858           CmdArgs.push_back("-fobjc-dispatch-method=mixed");
   1859         else
   1860           CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
   1861       }
   1862     }
   1863 
   1864     // FIXME: Don't expose -fobjc-default-synthesize-properties as a top-level
   1865     // driver flag yet.  This feature is still under active development
   1866     // and shouldn't be exposed as a user visible feature (which may change).
   1867     // Clang still supports this as a -cc1 option for development and testing.
   1868 #if 0
   1869     // -fobjc-default-synthesize-properties=0 is default.
   1870     if (Args.hasFlag(options::OPT_fobjc_default_synthesize_properties,
   1871                      options::OPT_fno_objc_default_synthesize_properties,
   1872                      getToolChain().IsObjCDefaultSynthPropertiesDefault())) {
   1873       CmdArgs.push_back("-fobjc-default-synthesize-properties");
   1874     }
   1875 #endif
   1876   }
   1877 
   1878   // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
   1879   // NOTE: This logic is duplicated in ToolChains.cpp.
   1880   bool ARC = isObjCAutoRefCount(Args);
   1881   if (ARC) {
   1882     CmdArgs.push_back("-fobjc-arc");
   1883 
   1884     // Allow the user to enable full exceptions code emission.
   1885     // We define off for Objective-CC, on for Objective-C++.
   1886     if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
   1887                      options::OPT_fno_objc_arc_exceptions,
   1888                      /*default*/ types::isCXX(InputType)))
   1889       CmdArgs.push_back("-fobjc-arc-exceptions");
   1890   }
   1891 
   1892   // -fobjc-infer-related-result-type is the default, except in the Objective-C
   1893   // rewriter.
   1894   if (IsRewriter)
   1895     CmdArgs.push_back("-fno-objc-infer-related-result-type");
   1896 
   1897   // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
   1898   // takes precedence.
   1899   const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
   1900   if (!GCArg)
   1901     GCArg = Args.getLastArg(options::OPT_fobjc_gc);
   1902   if (GCArg) {
   1903     if (ARC) {
   1904       D.Diag(clang::diag::err_drv_objc_gc_arr)
   1905         << GCArg->getAsString(Args);
   1906     } else if (getToolChain().SupportsObjCGC()) {
   1907       GCArg->render(Args, CmdArgs);
   1908     } else {
   1909       // FIXME: We should move this to a hard error.
   1910       D.Diag(clang::diag::warn_drv_objc_gc_unsupported)
   1911         << GCArg->getAsString(Args);
   1912     }
   1913   }
   1914 
   1915   // Add exception args.
   1916   addExceptionArgs(Args, InputType, getToolChain().getTriple(),
   1917                    KernelOrKext, IsRewriter, objcABIVersion, CmdArgs);
   1918 
   1919   if (getToolChain().UseSjLjExceptions())
   1920     CmdArgs.push_back("-fsjlj-exceptions");
   1921 
   1922   // C++ "sane" operator new.
   1923   if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
   1924                     options::OPT_fno_assume_sane_operator_new))
   1925     CmdArgs.push_back("-fno-assume-sane-operator-new");
   1926 
   1927   // -fconstant-cfstrings is default, and may be subject to argument translation
   1928   // on Darwin.
   1929   if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
   1930                     options::OPT_fno_constant_cfstrings) ||
   1931       !Args.hasFlag(options::OPT_mconstant_cfstrings,
   1932                     options::OPT_mno_constant_cfstrings))
   1933     CmdArgs.push_back("-fno-constant-cfstrings");
   1934 
   1935   // -fshort-wchar default varies depending on platform; only
   1936   // pass if specified.
   1937   if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
   1938     A->render(Args, CmdArgs);
   1939 
   1940   // -fno-pascal-strings is default, only pass non-default. If the tool chain
   1941   // happened to translate to -mpascal-strings, we want to back translate here.
   1942   //
   1943   // FIXME: This is gross; that translation should be pulled from the
   1944   // tool chain.
   1945   if (Args.hasFlag(options::OPT_fpascal_strings,
   1946                    options::OPT_fno_pascal_strings,
   1947                    false) ||
   1948       Args.hasFlag(options::OPT_mpascal_strings,
   1949                    options::OPT_mno_pascal_strings,
   1950                    false))
   1951     CmdArgs.push_back("-fpascal-strings");
   1952 
   1953   if (Args.hasArg(options::OPT_mkernel) ||
   1954       Args.hasArg(options::OPT_fapple_kext)) {
   1955     if (!Args.hasArg(options::OPT_fcommon))
   1956       CmdArgs.push_back("-fno-common");
   1957   }
   1958   // -fcommon is default, only pass non-default.
   1959   else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
   1960     CmdArgs.push_back("-fno-common");
   1961 
   1962   // -fsigned-bitfields is default, and clang doesn't yet support
   1963   // -funsigned-bitfields.
   1964   if (!Args.hasFlag(options::OPT_fsigned_bitfields,
   1965                     options::OPT_funsigned_bitfields))
   1966     D.Diag(clang::diag::warn_drv_clang_unsupported)
   1967       << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
   1968 
   1969   // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
   1970   if (!Args.hasFlag(options::OPT_ffor_scope,
   1971                     options::OPT_fno_for_scope))
   1972     D.Diag(clang::diag::err_drv_clang_unsupported)
   1973       << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
   1974 
   1975   // -fcaret-diagnostics is default.
   1976   if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
   1977                     options::OPT_fno_caret_diagnostics, true))
   1978     CmdArgs.push_back("-fno-caret-diagnostics");
   1979 
   1980   // -fdiagnostics-fixit-info is default, only pass non-default.
   1981   if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
   1982                     options::OPT_fno_diagnostics_fixit_info))
   1983     CmdArgs.push_back("-fno-diagnostics-fixit-info");
   1984 
   1985   // Enable -fdiagnostics-show-name by default.
   1986   if (Args.hasFlag(options::OPT_fdiagnostics_show_name,
   1987                    options::OPT_fno_diagnostics_show_name, false))
   1988     CmdArgs.push_back("-fdiagnostics-show-name");
   1989 
   1990   // Enable -fdiagnostics-show-option by default.
   1991   if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
   1992                    options::OPT_fno_diagnostics_show_option))
   1993     CmdArgs.push_back("-fdiagnostics-show-option");
   1994 
   1995   if (const Arg *A =
   1996         Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
   1997     CmdArgs.push_back("-fdiagnostics-show-category");
   1998     CmdArgs.push_back(A->getValue(Args));
   1999   }
   2000 
   2001   if (const Arg *A =
   2002         Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
   2003     CmdArgs.push_back("-fdiagnostics-format");
   2004     CmdArgs.push_back(A->getValue(Args));
   2005   }
   2006 
   2007   if (Arg *A = Args.getLastArg(
   2008       options::OPT_fdiagnostics_show_note_include_stack,
   2009       options::OPT_fno_diagnostics_show_note_include_stack)) {
   2010     if (A->getOption().matches(
   2011         options::OPT_fdiagnostics_show_note_include_stack))
   2012       CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
   2013     else
   2014       CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
   2015   }
   2016 
   2017   // Color diagnostics are the default, unless the terminal doesn't support
   2018   // them.
   2019   if (Args.hasFlag(options::OPT_fcolor_diagnostics,
   2020                    options::OPT_fno_color_diagnostics,
   2021                    llvm::sys::Process::StandardErrHasColors()))
   2022     CmdArgs.push_back("-fcolor-diagnostics");
   2023 
   2024   if (!Args.hasFlag(options::OPT_fshow_source_location,
   2025                     options::OPT_fno_show_source_location))
   2026     CmdArgs.push_back("-fno-show-source-location");
   2027 
   2028   if (!Args.hasFlag(options::OPT_fshow_column,
   2029                     options::OPT_fno_show_column,
   2030                     true))
   2031     CmdArgs.push_back("-fno-show-column");
   2032 
   2033   if (!Args.hasFlag(options::OPT_fspell_checking,
   2034                     options::OPT_fno_spell_checking))
   2035     CmdArgs.push_back("-fno-spell-checking");
   2036 
   2037 
   2038   // Silently ignore -fasm-blocks for now.
   2039   (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
   2040                       false);
   2041 
   2042   if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
   2043     A->render(Args, CmdArgs);
   2044 
   2045   // -fdollars-in-identifiers default varies depending on platform and
   2046   // language; only pass if specified.
   2047   if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
   2048                                options::OPT_fno_dollars_in_identifiers)) {
   2049     if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
   2050       CmdArgs.push_back("-fdollars-in-identifiers");
   2051     else
   2052       CmdArgs.push_back("-fno-dollars-in-identifiers");
   2053   }
   2054 
   2055   // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
   2056   // practical purposes.
   2057   if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
   2058                                options::OPT_fno_unit_at_a_time)) {
   2059     if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
   2060       D.Diag(clang::diag::warn_drv_clang_unsupported) << A->getAsString(Args);
   2061   }
   2062 
   2063   // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
   2064   //
   2065   // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
   2066 #if 0
   2067   if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin &&
   2068       (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
   2069        getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
   2070     if (!Args.hasArg(options::OPT_fbuiltin_strcat))
   2071       CmdArgs.push_back("-fno-builtin-strcat");
   2072     if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
   2073       CmdArgs.push_back("-fno-builtin-strcpy");
   2074   }
   2075 #endif
   2076 
   2077   // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
   2078   if (Arg *A = Args.getLastArg(options::OPT_traditional,
   2079                                options::OPT_traditional_cpp)) {
   2080     if (isa<PreprocessJobAction>(JA))
   2081       CmdArgs.push_back("-traditional-cpp");
   2082     else
   2083       D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
   2084   }
   2085 
   2086   Args.AddLastArg(CmdArgs, options::OPT_dM);
   2087   Args.AddLastArg(CmdArgs, options::OPT_dD);
   2088 
   2089   // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
   2090   // parser.
   2091   Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
   2092   for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
   2093          ie = Args.filtered_end(); it != ie; ++it) {
   2094     (*it)->claim();
   2095 
   2096     // We translate this by hand to the -cc1 argument, since nightly test uses
   2097     // it and developers have been trained to spell it with -mllvm.
   2098     if (llvm::StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
   2099       CmdArgs.push_back("-disable-llvm-optzns");
   2100     else
   2101       (*it)->render(Args, CmdArgs);
   2102   }
   2103 
   2104   if (Output.getType() == types::TY_Dependencies) {
   2105     // Handled with other dependency code.
   2106   } else if (Output.isFilename()) {
   2107     CmdArgs.push_back("-o");
   2108     CmdArgs.push_back(Output.getFilename());
   2109   } else {
   2110     assert(Output.isNothing() && "Invalid output.");
   2111   }
   2112 
   2113   for (InputInfoList::const_iterator
   2114          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   2115     const InputInfo &II = *it;
   2116     CmdArgs.push_back("-x");
   2117     CmdArgs.push_back(types::getTypeName(II.getType()));
   2118     if (II.isFilename())
   2119       CmdArgs.push_back(II.getFilename());
   2120     else
   2121       II.getInputArg().renderAsInput(Args, CmdArgs);
   2122   }
   2123 
   2124   Args.AddAllArgs(CmdArgs, options::OPT_undef);
   2125 
   2126   const char *Exec = getToolChain().getDriver().getClangProgramPath();
   2127 
   2128   // Optionally embed the -cc1 level arguments into the debug info, for build
   2129   // analysis.
   2130   if (getToolChain().UseDwarfDebugFlags()) {
   2131     ArgStringList OriginalArgs;
   2132     for (ArgList::const_iterator it = Args.begin(),
   2133            ie = Args.end(); it != ie; ++it)
   2134       (*it)->render(Args, OriginalArgs);
   2135 
   2136     llvm::SmallString<256> Flags;
   2137     Flags += Exec;
   2138     for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
   2139       Flags += " ";
   2140       Flags += OriginalArgs[i];
   2141     }
   2142     CmdArgs.push_back("-dwarf-debug-flags");
   2143     CmdArgs.push_back(Args.MakeArgString(Flags.str()));
   2144   }
   2145 
   2146   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   2147 
   2148   if (Arg *A = Args.getLastArg(options::OPT_pg))
   2149     if (Args.hasArg(options::OPT_fomit_frame_pointer))
   2150       D.Diag(clang::diag::err_drv_argument_not_allowed_with)
   2151         << "-fomit-frame-pointer" << A->getAsString(Args);
   2152 
   2153   // Claim some arguments which clang supports automatically.
   2154 
   2155   // -fpch-preprocess is used with gcc to add a special marker in the output to
   2156   // include the PCH file. Clang's PTH solution is completely transparent, so we
   2157   // do not need to deal with it at all.
   2158   Args.ClaimAllArgs(options::OPT_fpch_preprocess);
   2159 
   2160   // Claim some arguments which clang doesn't support, but we don't
   2161   // care to warn the user about.
   2162   Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
   2163   Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
   2164 
   2165   // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
   2166   Args.ClaimAllArgs(options::OPT_use_gold_plugin);
   2167   Args.ClaimAllArgs(options::OPT_emit_llvm);
   2168 }
   2169 
   2170 void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
   2171                            const InputInfo &Output,
   2172                            const InputInfoList &Inputs,
   2173                            const ArgList &Args,
   2174                            const char *LinkingOutput) const {
   2175   ArgStringList CmdArgs;
   2176 
   2177   assert(Inputs.size() == 1 && "Unexpected number of inputs.");
   2178   const InputInfo &Input = Inputs[0];
   2179 
   2180   // Don't warn about "clang -w -c foo.s"
   2181   Args.ClaimAllArgs(options::OPT_w);
   2182   // and "clang -emit-llvm -c foo.s"
   2183   Args.ClaimAllArgs(options::OPT_emit_llvm);
   2184   // and "clang -use-gold-plugin -c foo.s"
   2185   Args.ClaimAllArgs(options::OPT_use_gold_plugin);
   2186 
   2187   // Invoke ourselves in -cc1as mode.
   2188   //
   2189   // FIXME: Implement custom jobs for internal actions.
   2190   CmdArgs.push_back("-cc1as");
   2191 
   2192   // Add the "effective" target triple.
   2193   CmdArgs.push_back("-triple");
   2194   std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
   2195   CmdArgs.push_back(Args.MakeArgString(TripleStr));
   2196 
   2197   // Set the output mode, we currently only expect to be used as a real
   2198   // assembler.
   2199   CmdArgs.push_back("-filetype");
   2200   CmdArgs.push_back("obj");
   2201 
   2202   if (UseRelaxAll(C, Args))
   2203     CmdArgs.push_back("-relax-all");
   2204 
   2205   // Ignore explicit -force_cpusubtype_ALL option.
   2206   (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
   2207 
   2208   // FIXME: Add -g support, once we have it.
   2209 
   2210   // FIXME: Add -static support, once we have it.
   2211 
   2212   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   2213                        options::OPT_Xassembler);
   2214   Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
   2215 
   2216   assert(Output.isFilename() && "Unexpected lipo output.");
   2217   CmdArgs.push_back("-o");
   2218   CmdArgs.push_back(Output.getFilename());
   2219 
   2220   assert(Input.isFilename() && "Invalid input.");
   2221   CmdArgs.push_back(Input.getFilename());
   2222 
   2223   const char *Exec = getToolChain().getDriver().getClangProgramPath();
   2224   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   2225 }
   2226 
   2227 void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
   2228                                const InputInfo &Output,
   2229                                const InputInfoList &Inputs,
   2230                                const ArgList &Args,
   2231                                const char *LinkingOutput) const {
   2232   const Driver &D = getToolChain().getDriver();
   2233   ArgStringList CmdArgs;
   2234 
   2235   for (ArgList::const_iterator
   2236          it = Args.begin(), ie = Args.end(); it != ie; ++it) {
   2237     Arg *A = *it;
   2238     if (A->getOption().hasForwardToGCC()) {
   2239       // Don't forward any -g arguments to assembly steps.
   2240       if (isa<AssembleJobAction>(JA) &&
   2241           A->getOption().matches(options::OPT_g_Group))
   2242         continue;
   2243 
   2244       // It is unfortunate that we have to claim here, as this means
   2245       // we will basically never report anything interesting for
   2246       // platforms using a generic gcc, even if we are just using gcc
   2247       // to get to the assembler.
   2248       A->claim();
   2249       A->render(Args, CmdArgs);
   2250     }
   2251   }
   2252 
   2253   RenderExtraToolArgs(JA, CmdArgs);
   2254 
   2255   // If using a driver driver, force the arch.
   2256   const std::string &Arch = getToolChain().getArchName();
   2257   if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin) {
   2258     CmdArgs.push_back("-arch");
   2259 
   2260     // FIXME: Remove these special cases.
   2261     if (Arch == "powerpc")
   2262       CmdArgs.push_back("ppc");
   2263     else if (Arch == "powerpc64")
   2264       CmdArgs.push_back("ppc64");
   2265     else
   2266       CmdArgs.push_back(Args.MakeArgString(Arch));
   2267   }
   2268 
   2269   // Try to force gcc to match the tool chain we want, if we recognize
   2270   // the arch.
   2271   //
   2272   // FIXME: The triple class should directly provide the information we want
   2273   // here.
   2274   if (Arch == "i386" || Arch == "powerpc")
   2275     CmdArgs.push_back("-m32");
   2276   else if (Arch == "x86_64" || Arch == "powerpc64")
   2277     CmdArgs.push_back("-m64");
   2278 
   2279   if (Output.isFilename()) {
   2280     CmdArgs.push_back("-o");
   2281     CmdArgs.push_back(Output.getFilename());
   2282   } else {
   2283     assert(Output.isNothing() && "Unexpected output");
   2284     CmdArgs.push_back("-fsyntax-only");
   2285   }
   2286 
   2287 
   2288   // Only pass -x if gcc will understand it; otherwise hope gcc
   2289   // understands the suffix correctly. The main use case this would go
   2290   // wrong in is for linker inputs if they happened to have an odd
   2291   // suffix; really the only way to get this to happen is a command
   2292   // like '-x foobar a.c' which will treat a.c like a linker input.
   2293   //
   2294   // FIXME: For the linker case specifically, can we safely convert
   2295   // inputs into '-Wl,' options?
   2296   for (InputInfoList::const_iterator
   2297          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   2298     const InputInfo &II = *it;
   2299 
   2300     // Don't try to pass LLVM or AST inputs to a generic gcc.
   2301     if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
   2302         II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
   2303       D.Diag(clang::diag::err_drv_no_linker_llvm_support)
   2304         << getToolChain().getTripleString();
   2305     else if (II.getType() == types::TY_AST)
   2306       D.Diag(clang::diag::err_drv_no_ast_support)
   2307         << getToolChain().getTripleString();
   2308 
   2309     if (types::canTypeBeUserSpecified(II.getType())) {
   2310       CmdArgs.push_back("-x");
   2311       CmdArgs.push_back(types::getTypeName(II.getType()));
   2312     }
   2313 
   2314     if (II.isFilename())
   2315       CmdArgs.push_back(II.getFilename());
   2316     else {
   2317       const Arg &A = II.getInputArg();
   2318 
   2319       // Reverse translate some rewritten options.
   2320       if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
   2321         CmdArgs.push_back("-lstdc++");
   2322         continue;
   2323       }
   2324 
   2325       // Don't render as input, we need gcc to do the translations.
   2326       A.render(Args, CmdArgs);
   2327     }
   2328   }
   2329 
   2330   const std::string customGCCName = D.getCCCGenericGCCName();
   2331   const char *GCCName;
   2332   if (!customGCCName.empty())
   2333     GCCName = customGCCName.c_str();
   2334   else if (D.CCCIsCXX) {
   2335 #ifdef IS_CYGWIN15
   2336     // FIXME: Detect the version of Cygwin at runtime?
   2337     GCCName = "g++-4";
   2338 #else
   2339     GCCName = "g++";
   2340 #endif
   2341   } else
   2342     GCCName = "gcc";
   2343 
   2344   const char *Exec =
   2345     Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
   2346   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   2347 }
   2348 
   2349 void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
   2350                                           ArgStringList &CmdArgs) const {
   2351   CmdArgs.push_back("-E");
   2352 }
   2353 
   2354 void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
   2355                                           ArgStringList &CmdArgs) const {
   2356   // The type is good enough.
   2357 }
   2358 
   2359 void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
   2360                                        ArgStringList &CmdArgs) const {
   2361   const Driver &D = getToolChain().getDriver();
   2362 
   2363   // If -flto, etc. are present then make sure not to force assembly output.
   2364   if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
   2365       JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
   2366     CmdArgs.push_back("-c");
   2367   else {
   2368     if (JA.getType() != types::TY_PP_Asm)
   2369       D.Diag(clang::diag::err_drv_invalid_gcc_output_type)
   2370         << getTypeName(JA.getType());
   2371 
   2372     CmdArgs.push_back("-S");
   2373   }
   2374 }
   2375 
   2376 void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
   2377                                         ArgStringList &CmdArgs) const {
   2378   CmdArgs.push_back("-c");
   2379 }
   2380 
   2381 void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
   2382                                     ArgStringList &CmdArgs) const {
   2383   // The types are (hopefully) good enough.
   2384 }
   2385 
   2386 const char *darwin::CC1::getCC1Name(types::ID Type) const {
   2387   switch (Type) {
   2388   default:
   2389     assert(0 && "Unexpected type for Darwin CC1 tool.");
   2390   case types::TY_Asm:
   2391   case types::TY_C: case types::TY_CHeader:
   2392   case types::TY_PP_C: case types::TY_PP_CHeader:
   2393     return "cc1";
   2394   case types::TY_ObjC: case types::TY_ObjCHeader:
   2395   case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader:
   2396     return "cc1obj";
   2397   case types::TY_CXX: case types::TY_CXXHeader:
   2398   case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
   2399     return "cc1plus";
   2400   case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
   2401   case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader:
   2402     return "cc1objplus";
   2403   }
   2404 }
   2405 
   2406 const char *darwin::CC1::getBaseInputName(const ArgList &Args,
   2407                                           const InputInfoList &Inputs) {
   2408   return Args.MakeArgString(
   2409     llvm::sys::path::filename(Inputs[0].getBaseInput()));
   2410 }
   2411 
   2412 const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
   2413                                           const InputInfoList &Inputs) {
   2414   const char *Str = getBaseInputName(Args, Inputs);
   2415 
   2416   if (const char *End = strrchr(Str, '.'))
   2417     return Args.MakeArgString(std::string(Str, End));
   2418 
   2419   return Str;
   2420 }
   2421 
   2422 const char *
   2423 darwin::CC1::getDependencyFileName(const ArgList &Args,
   2424                                    const InputInfoList &Inputs) {
   2425   // FIXME: Think about this more.
   2426   std::string Res;
   2427 
   2428   if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
   2429     std::string Str(OutputOpt->getValue(Args));
   2430 
   2431     Res = Str.substr(0, Str.rfind('.'));
   2432   } else
   2433     Res = darwin::CC1::getBaseInputStem(Args, Inputs);
   2434 
   2435   return Args.MakeArgString(Res + ".d");
   2436 }
   2437 
   2438 void darwin::CC1::AddCC1Args(const ArgList &Args,
   2439                              ArgStringList &CmdArgs) const {
   2440   const Driver &D = getToolChain().getDriver();
   2441 
   2442   CheckCodeGenerationOptions(D, Args);
   2443 
   2444   // Derived from cc1 spec.
   2445   if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
   2446       !Args.hasArg(options::OPT_mdynamic_no_pic))
   2447     CmdArgs.push_back("-fPIC");
   2448 
   2449   if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
   2450       getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
   2451     if (!Args.hasArg(options::OPT_fbuiltin_strcat))
   2452       CmdArgs.push_back("-fno-builtin-strcat");
   2453     if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
   2454       CmdArgs.push_back("-fno-builtin-strcpy");
   2455   }
   2456 
   2457   if (Args.hasArg(options::OPT_g_Flag) &&
   2458       !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
   2459     CmdArgs.push_back("-feliminate-unused-debug-symbols");
   2460 }
   2461 
   2462 void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
   2463                                     const InputInfoList &Inputs,
   2464                                     const ArgStringList &OutputArgs) const {
   2465   const Driver &D = getToolChain().getDriver();
   2466 
   2467   // Derived from cc1_options spec.
   2468   if (Args.hasArg(options::OPT_fast) ||
   2469       Args.hasArg(options::OPT_fastf) ||
   2470       Args.hasArg(options::OPT_fastcp))
   2471     CmdArgs.push_back("-O3");
   2472 
   2473   if (Arg *A = Args.getLastArg(options::OPT_pg))
   2474     if (Args.hasArg(options::OPT_fomit_frame_pointer))
   2475       D.Diag(clang::diag::err_drv_argument_not_allowed_with)
   2476         << A->getAsString(Args) << "-fomit-frame-pointer";
   2477 
   2478   AddCC1Args(Args, CmdArgs);
   2479 
   2480   if (!Args.hasArg(options::OPT_Q))
   2481     CmdArgs.push_back("-quiet");
   2482 
   2483   CmdArgs.push_back("-dumpbase");
   2484   CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
   2485 
   2486   Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
   2487 
   2488   Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
   2489   Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
   2490 
   2491   // FIXME: The goal is to use the user provided -o if that is our
   2492   // final output, otherwise to drive from the original input
   2493   // name. Find a clean way to go about this.
   2494   if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
   2495       Args.hasArg(options::OPT_o)) {
   2496     Arg *OutputOpt = Args.getLastArg(options::OPT_o);
   2497     CmdArgs.push_back("-auxbase-strip");
   2498     CmdArgs.push_back(OutputOpt->getValue(Args));
   2499   } else {
   2500     CmdArgs.push_back("-auxbase");
   2501     CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
   2502   }
   2503 
   2504   Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
   2505 
   2506   Args.AddAllArgs(CmdArgs, options::OPT_O);
   2507   // FIXME: -Wall is getting some special treatment. Investigate.
   2508   Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
   2509   Args.AddLastArg(CmdArgs, options::OPT_w);
   2510   Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
   2511                   options::OPT_trigraphs);
   2512   if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
   2513     // Honor -std-default.
   2514     Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
   2515                               "-std=", /*Joined=*/true);
   2516   }
   2517 
   2518   if (Args.hasArg(options::OPT_v))
   2519     CmdArgs.push_back("-version");
   2520   if (Args.hasArg(options::OPT_pg) &&
   2521       getToolChain().SupportsProfiling())
   2522     CmdArgs.push_back("-p");
   2523   Args.AddLastArg(CmdArgs, options::OPT_p);
   2524 
   2525   // The driver treats -fsyntax-only specially.
   2526   if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
   2527       getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
   2528     // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
   2529     // used to inhibit the default -fno-builtin-str{cat,cpy}.
   2530     //
   2531     // FIXME: Should we grow a better way to deal with "removing" args?
   2532     for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
   2533                                                options::OPT_fsyntax_only),
   2534            ie = Args.filtered_end(); it != ie; ++it) {
   2535       if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
   2536           !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
   2537         (*it)->claim();
   2538         (*it)->render(Args, CmdArgs);
   2539       }
   2540     }
   2541   } else
   2542     Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
   2543 
   2544   // Claim Clang only -f options, they aren't worth warning about.
   2545   Args.ClaimAllArgs(options::OPT_f_clang_Group);
   2546 
   2547   Args.AddAllArgs(CmdArgs, options::OPT_undef);
   2548   if (Args.hasArg(options::OPT_Qn))
   2549     CmdArgs.push_back("-fno-ident");
   2550 
   2551   // FIXME: This isn't correct.
   2552   //Args.AddLastArg(CmdArgs, options::OPT__help)
   2553   //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
   2554 
   2555   CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
   2556 
   2557   // FIXME: Still don't get what is happening here. Investigate.
   2558   Args.AddAllArgs(CmdArgs, options::OPT__param);
   2559 
   2560   if (Args.hasArg(options::OPT_fmudflap) ||
   2561       Args.hasArg(options::OPT_fmudflapth)) {
   2562     CmdArgs.push_back("-fno-builtin");
   2563     CmdArgs.push_back("-fno-merge-constants");
   2564   }
   2565 
   2566   if (Args.hasArg(options::OPT_coverage)) {
   2567     CmdArgs.push_back("-fprofile-arcs");
   2568     CmdArgs.push_back("-ftest-coverage");
   2569   }
   2570 
   2571   if (types::isCXX(Inputs[0].getType()))
   2572     CmdArgs.push_back("-D__private_extern__=extern");
   2573 }
   2574 
   2575 void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
   2576                                     const InputInfoList &Inputs,
   2577                                     const ArgStringList &OutputArgs) const {
   2578   // Derived from cpp_options
   2579   AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
   2580 
   2581   CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
   2582 
   2583   AddCC1Args(Args, CmdArgs);
   2584 
   2585   // NOTE: The code below has some commonality with cpp_options, but
   2586   // in classic gcc style ends up sending things in different
   2587   // orders. This may be a good merge candidate once we drop pedantic
   2588   // compatibility.
   2589 
   2590   Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
   2591   Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
   2592                   options::OPT_trigraphs);
   2593   if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
   2594     // Honor -std-default.
   2595     Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
   2596                               "-std=", /*Joined=*/true);
   2597   }
   2598   Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
   2599   Args.AddLastArg(CmdArgs, options::OPT_w);
   2600 
   2601   // The driver treats -fsyntax-only specially.
   2602   Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
   2603 
   2604   // Claim Clang only -f options, they aren't worth warning about.
   2605   Args.ClaimAllArgs(options::OPT_f_clang_Group);
   2606 
   2607   if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
   2608       !Args.hasArg(options::OPT_fno_working_directory))
   2609     CmdArgs.push_back("-fworking-directory");
   2610 
   2611   Args.AddAllArgs(CmdArgs, options::OPT_O);
   2612   Args.AddAllArgs(CmdArgs, options::OPT_undef);
   2613   if (Args.hasArg(options::OPT_save_temps))
   2614     CmdArgs.push_back("-fpch-preprocess");
   2615 }
   2616 
   2617 void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
   2618                                           ArgStringList &CmdArgs,
   2619                                           const InputInfoList &Inputs) const {
   2620   const Driver &D = getToolChain().getDriver();
   2621 
   2622   CheckPreprocessingOptions(D, Args);
   2623 
   2624   // Derived from cpp_unique_options.
   2625   // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
   2626   Args.AddLastArg(CmdArgs, options::OPT_C);
   2627   Args.AddLastArg(CmdArgs, options::OPT_CC);
   2628   if (!Args.hasArg(options::OPT_Q))
   2629     CmdArgs.push_back("-quiet");
   2630   Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
   2631   Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
   2632   Args.AddLastArg(CmdArgs, options::OPT_v);
   2633   Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
   2634   Args.AddLastArg(CmdArgs, options::OPT_P);
   2635 
   2636   // FIXME: Handle %I properly.
   2637   if (getToolChain().getArchName() == "x86_64") {
   2638     CmdArgs.push_back("-imultilib");
   2639     CmdArgs.push_back("x86_64");
   2640   }
   2641 
   2642   if (Args.hasArg(options::OPT_MD)) {
   2643     CmdArgs.push_back("-MD");
   2644     CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
   2645   }
   2646 
   2647   if (Args.hasArg(options::OPT_MMD)) {
   2648     CmdArgs.push_back("-MMD");
   2649     CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
   2650   }
   2651 
   2652   Args.AddLastArg(CmdArgs, options::OPT_M);
   2653   Args.AddLastArg(CmdArgs, options::OPT_MM);
   2654   Args.AddAllArgs(CmdArgs, options::OPT_MF);
   2655   Args.AddLastArg(CmdArgs, options::OPT_MG);
   2656   Args.AddLastArg(CmdArgs, options::OPT_MP);
   2657   Args.AddAllArgs(CmdArgs, options::OPT_MQ);
   2658   Args.AddAllArgs(CmdArgs, options::OPT_MT);
   2659   if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
   2660       (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
   2661     if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
   2662       CmdArgs.push_back("-MQ");
   2663       CmdArgs.push_back(OutputOpt->getValue(Args));
   2664     }
   2665   }
   2666 
   2667   Args.AddLastArg(CmdArgs, options::OPT_remap);
   2668   if (Args.hasArg(options::OPT_g3))
   2669     CmdArgs.push_back("-dD");
   2670   Args.AddLastArg(CmdArgs, options::OPT_H);
   2671 
   2672   AddCPPArgs(Args, CmdArgs);
   2673 
   2674   Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
   2675   Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
   2676 
   2677   for (InputInfoList::const_iterator
   2678          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   2679     const InputInfo &II = *it;
   2680 
   2681     CmdArgs.push_back(II.getFilename());
   2682   }
   2683 
   2684   Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
   2685                        options::OPT_Xpreprocessor);
   2686 
   2687   if (Args.hasArg(options::OPT_fmudflap)) {
   2688     CmdArgs.push_back("-D_MUDFLAP");
   2689     CmdArgs.push_back("-include");
   2690     CmdArgs.push_back("mf-runtime.h");
   2691   }
   2692 
   2693   if (Args.hasArg(options::OPT_fmudflapth)) {
   2694     CmdArgs.push_back("-D_MUDFLAP");
   2695     CmdArgs.push_back("-D_MUDFLAPTH");
   2696     CmdArgs.push_back("-include");
   2697     CmdArgs.push_back("mf-runtime.h");
   2698   }
   2699 }
   2700 
   2701 void darwin::CC1::AddCPPArgs(const ArgList &Args,
   2702                              ArgStringList &CmdArgs) const {
   2703   // Derived from cpp spec.
   2704 
   2705   if (Args.hasArg(options::OPT_static)) {
   2706     // The gcc spec is broken here, it refers to dynamic but
   2707     // that has been translated. Start by being bug compatible.
   2708 
   2709     // if (!Args.hasArg(arglist.parser.dynamicOption))
   2710     CmdArgs.push_back("-D__STATIC__");
   2711   } else
   2712     CmdArgs.push_back("-D__DYNAMIC__");
   2713 
   2714   if (Args.hasArg(options::OPT_pthread))
   2715     CmdArgs.push_back("-D_REENTRANT");
   2716 }
   2717 
   2718 void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
   2719                                       const InputInfo &Output,
   2720                                       const InputInfoList &Inputs,
   2721                                       const ArgList &Args,
   2722                                       const char *LinkingOutput) const {
   2723   ArgStringList CmdArgs;
   2724 
   2725   assert(Inputs.size() == 1 && "Unexpected number of inputs!");
   2726 
   2727   CmdArgs.push_back("-E");
   2728 
   2729   if (Args.hasArg(options::OPT_traditional) ||
   2730       Args.hasArg(options::OPT_traditional_cpp))
   2731     CmdArgs.push_back("-traditional-cpp");
   2732 
   2733   ArgStringList OutputArgs;
   2734   assert(Output.isFilename() && "Unexpected CC1 output.");
   2735   OutputArgs.push_back("-o");
   2736   OutputArgs.push_back(Output.getFilename());
   2737 
   2738   if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
   2739     AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
   2740   } else {
   2741     AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
   2742     CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
   2743   }
   2744 
   2745   Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
   2746 
   2747   const char *CC1Name = getCC1Name(Inputs[0].getType());
   2748   const char *Exec =
   2749     Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
   2750   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   2751 }
   2752 
   2753 void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
   2754                                    const InputInfo &Output,
   2755                                    const InputInfoList &Inputs,
   2756                                    const ArgList &Args,
   2757                                    const char *LinkingOutput) const {
   2758   const Driver &D = getToolChain().getDriver();
   2759   ArgStringList CmdArgs;
   2760 
   2761   assert(Inputs.size() == 1 && "Unexpected number of inputs!");
   2762 
   2763   types::ID InputType = Inputs[0].getType();
   2764   const Arg *A;
   2765   if ((A = Args.getLastArg(options::OPT_traditional)))
   2766     D.Diag(clang::diag::err_drv_argument_only_allowed_with)
   2767       << A->getAsString(Args) << "-E";
   2768 
   2769   if (JA.getType() == types::TY_LLVM_IR ||
   2770       JA.getType() == types::TY_LTO_IR)
   2771     CmdArgs.push_back("-emit-llvm");
   2772   else if (JA.getType() == types::TY_LLVM_BC ||
   2773            JA.getType() == types::TY_LTO_BC)
   2774     CmdArgs.push_back("-emit-llvm-bc");
   2775   else if (Output.getType() == types::TY_AST)
   2776     D.Diag(clang::diag::err_drv_no_ast_support)
   2777       << getToolChain().getTripleString();
   2778   else if (JA.getType() != types::TY_PP_Asm &&
   2779            JA.getType() != types::TY_PCH)
   2780     D.Diag(clang::diag::err_drv_invalid_gcc_output_type)
   2781       << getTypeName(JA.getType());
   2782 
   2783   ArgStringList OutputArgs;
   2784   if (Output.getType() != types::TY_PCH) {
   2785     OutputArgs.push_back("-o");
   2786     if (Output.isNothing())
   2787       OutputArgs.push_back("/dev/null");
   2788     else
   2789       OutputArgs.push_back(Output.getFilename());
   2790   }
   2791 
   2792   // There is no need for this level of compatibility, but it makes
   2793   // diffing easier.
   2794   bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
   2795                           Args.hasArg(options::OPT_S));
   2796 
   2797   if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
   2798     AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
   2799     if (OutputArgsEarly) {
   2800       AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
   2801     } else {
   2802       AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
   2803       CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
   2804     }
   2805   } else {
   2806     CmdArgs.push_back("-fpreprocessed");
   2807 
   2808     for (InputInfoList::const_iterator
   2809            it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   2810       const InputInfo &II = *it;
   2811 
   2812       // Reject AST inputs.
   2813       if (II.getType() == types::TY_AST) {
   2814         D.Diag(clang::diag::err_drv_no_ast_support)
   2815           << getToolChain().getTripleString();
   2816         return;
   2817       }
   2818 
   2819       CmdArgs.push_back(II.getFilename());
   2820     }
   2821 
   2822     if (OutputArgsEarly) {
   2823       AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
   2824     } else {
   2825       AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
   2826       CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
   2827     }
   2828   }
   2829 
   2830   if (Output.getType() == types::TY_PCH) {
   2831     assert(Output.isFilename() && "Invalid PCH output.");
   2832 
   2833     CmdArgs.push_back("-o");
   2834     // NOTE: gcc uses a temp .s file for this, but there doesn't seem
   2835     // to be a good reason.
   2836     CmdArgs.push_back("/dev/null");
   2837 
   2838     CmdArgs.push_back("--output-pch=");
   2839     CmdArgs.push_back(Output.getFilename());
   2840   }
   2841 
   2842   const char *CC1Name = getCC1Name(Inputs[0].getType());
   2843   const char *Exec =
   2844     Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
   2845   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   2846 }
   2847 
   2848 void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   2849                                     const InputInfo &Output,
   2850                                     const InputInfoList &Inputs,
   2851                                     const ArgList &Args,
   2852                                     const char *LinkingOutput) const {
   2853   ArgStringList CmdArgs;
   2854 
   2855   assert(Inputs.size() == 1 && "Unexpected number of inputs.");
   2856   const InputInfo &Input = Inputs[0];
   2857 
   2858   // Determine the original source input.
   2859   const Action *SourceAction = &JA;
   2860   while (SourceAction->getKind() != Action::InputClass) {
   2861     assert(!SourceAction->getInputs().empty() && "unexpected root action!");
   2862     SourceAction = SourceAction->getInputs()[0];
   2863   }
   2864 
   2865   // Forward -g, assuming we are dealing with an actual assembly file.
   2866   if (SourceAction->getType() == types::TY_Asm ||
   2867       SourceAction->getType() == types::TY_PP_Asm) {
   2868     if (Args.hasArg(options::OPT_gstabs))
   2869       CmdArgs.push_back("--gstabs");
   2870     else if (Args.hasArg(options::OPT_g_Group))
   2871       CmdArgs.push_back("--gdwarf2");
   2872   }
   2873 
   2874   // Derived from asm spec.
   2875   AddDarwinArch(Args, CmdArgs);
   2876 
   2877   // Use -force_cpusubtype_ALL on x86 by default.
   2878   if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
   2879       getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
   2880       Args.hasArg(options::OPT_force__cpusubtype__ALL))
   2881     CmdArgs.push_back("-force_cpusubtype_ALL");
   2882 
   2883   if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
   2884       (Args.hasArg(options::OPT_mkernel) ||
   2885        Args.hasArg(options::OPT_static) ||
   2886        Args.hasArg(options::OPT_fapple_kext)))
   2887     CmdArgs.push_back("-static");
   2888 
   2889   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   2890                        options::OPT_Xassembler);
   2891 
   2892   assert(Output.isFilename() && "Unexpected lipo output.");
   2893   CmdArgs.push_back("-o");
   2894   CmdArgs.push_back(Output.getFilename());
   2895 
   2896   assert(Input.isFilename() && "Invalid input.");
   2897   CmdArgs.push_back(Input.getFilename());
   2898 
   2899   // asm_final spec is empty.
   2900 
   2901   const char *Exec =
   2902     Args.MakeArgString(getToolChain().GetProgramPath("as"));
   2903   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   2904 }
   2905 
   2906 void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
   2907                                        ArgStringList &CmdArgs) const {
   2908   llvm::StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
   2909 
   2910   // Derived from darwin_arch spec.
   2911   CmdArgs.push_back("-arch");
   2912   CmdArgs.push_back(Args.MakeArgString(ArchName));
   2913 
   2914   // FIXME: Is this needed anymore?
   2915   if (ArchName == "arm")
   2916     CmdArgs.push_back("-force_cpusubtype_ALL");
   2917 }
   2918 
   2919 void darwin::Link::AddLinkArgs(Compilation &C,
   2920                                const ArgList &Args,
   2921                                ArgStringList &CmdArgs) const {
   2922   const Driver &D = getToolChain().getDriver();
   2923   const toolchains::Darwin &DarwinTC = getDarwinToolChain();
   2924 
   2925   unsigned Version[3] = { 0, 0, 0 };
   2926   if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
   2927     bool HadExtra;
   2928     if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
   2929                                    Version[1], Version[2], HadExtra) ||
   2930         HadExtra)
   2931       D.Diag(clang::diag::err_drv_invalid_version_number)
   2932         << A->getAsString(Args);
   2933   }
   2934 
   2935   // Newer linkers support -demangle, pass it if supported and not disabled by
   2936   // the user.
   2937   //
   2938   // FIXME: We temporarily avoid passing -demangle to any iOS linker, because
   2939   // unfortunately we can't be guaranteed that the linker version used there
   2940   // will match the linker version detected at configure time. We need the
   2941   // universal driver.
   2942   if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle) &&
   2943       !DarwinTC.isTargetIPhoneOS()) {
   2944     // Don't pass -demangle to ld_classic.
   2945     //
   2946     // FIXME: This is a temporary workaround, ld should be handling this.
   2947     bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
   2948                           Args.hasArg(options::OPT_static));
   2949     if (getToolChain().getArch() == llvm::Triple::x86) {
   2950       for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
   2951                                                  options::OPT_Wl_COMMA),
   2952              ie = Args.filtered_end(); it != ie; ++it) {
   2953         const Arg *A = *it;
   2954         for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
   2955           if (llvm::StringRef(A->getValue(Args, i)) == "-kext")
   2956             UsesLdClassic = true;
   2957       }
   2958     }
   2959     if (!UsesLdClassic)
   2960       CmdArgs.push_back("-demangle");
   2961   }
   2962 
   2963   // If we are using LTO, then automatically create a temporary file path for
   2964   // the linker to use, so that it's lifetime will extend past a possible
   2965   // dsymutil step.
   2966   if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
   2967     const char *TmpPath = C.getArgs().MakeArgString(
   2968       D.GetTemporaryPath(types::getTypeTempSuffix(types::TY_Object)));
   2969     C.addTempFile(TmpPath);
   2970     CmdArgs.push_back("-object_path_lto");
   2971     CmdArgs.push_back(TmpPath);
   2972   }
   2973 
   2974   // Derived from the "link" spec.
   2975   Args.AddAllArgs(CmdArgs, options::OPT_static);
   2976   if (!Args.hasArg(options::OPT_static))
   2977     CmdArgs.push_back("-dynamic");
   2978   if (Args.hasArg(options::OPT_fgnu_runtime)) {
   2979     // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
   2980     // here. How do we wish to handle such things?
   2981   }
   2982 
   2983   if (!Args.hasArg(options::OPT_dynamiclib)) {
   2984     AddDarwinArch(Args, CmdArgs);
   2985     // FIXME: Why do this only on this path?
   2986     Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
   2987 
   2988     Args.AddLastArg(CmdArgs, options::OPT_bundle);
   2989     Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
   2990     Args.AddAllArgs(CmdArgs, options::OPT_client__name);
   2991 
   2992     Arg *A;
   2993     if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
   2994         (A = Args.getLastArg(options::OPT_current__version)) ||
   2995         (A = Args.getLastArg(options::OPT_install__name)))
   2996       D.Diag(clang::diag::err_drv_argument_only_allowed_with)
   2997         << A->getAsString(Args) << "-dynamiclib";
   2998 
   2999     Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
   3000     Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
   3001     Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
   3002   } else {
   3003     CmdArgs.push_back("-dylib");
   3004 
   3005     Arg *A;
   3006     if ((A = Args.getLastArg(options::OPT_bundle)) ||
   3007         (A = Args.getLastArg(options::OPT_bundle__loader)) ||
   3008         (A = Args.getLastArg(options::OPT_client__name)) ||
   3009         (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
   3010         (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
   3011         (A = Args.getLastArg(options::OPT_private__bundle)))
   3012       D.Diag(clang::diag::err_drv_argument_not_allowed_with)
   3013         << A->getAsString(Args) << "-dynamiclib";
   3014 
   3015     Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
   3016                               "-dylib_compatibility_version");
   3017     Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
   3018                               "-dylib_current_version");
   3019 
   3020     AddDarwinArch(Args, CmdArgs);
   3021 
   3022     Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
   3023                               "-dylib_install_name");
   3024   }
   3025 
   3026   Args.AddLastArg(CmdArgs, options::OPT_all__load);
   3027   Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
   3028   Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
   3029   if (DarwinTC.isTargetIPhoneOS())
   3030     Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
   3031   Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
   3032   Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
   3033   Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
   3034   Args.AddLastArg(CmdArgs, options::OPT_dynamic);
   3035   Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
   3036   Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
   3037   Args.AddAllArgs(CmdArgs, options::OPT_force__load);
   3038   Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
   3039   Args.AddAllArgs(CmdArgs, options::OPT_image__base);
   3040   Args.AddAllArgs(CmdArgs, options::OPT_init);
   3041 
   3042   // Add the deployment target.
   3043   unsigned TargetVersion[3];
   3044   DarwinTC.getTargetVersion(TargetVersion);
   3045 
   3046   // If we had an explicit -mios-simulator-version-min argument, honor that,
   3047   // otherwise use the traditional deployment targets. We can't just check the
   3048   // is-sim attribute because existing code follows this path, and the linker
   3049   // may not handle the argument.
   3050   //
   3051   // FIXME: We may be able to remove this, once we can verify no one depends on
   3052   // it.
   3053   if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
   3054     CmdArgs.push_back("-ios_simulator_version_min");
   3055   else if (DarwinTC.isTargetIPhoneOS())
   3056     CmdArgs.push_back("-iphoneos_version_min");
   3057   else
   3058     CmdArgs.push_back("-macosx_version_min");
   3059   CmdArgs.push_back(Args.MakeArgString(llvm::Twine(TargetVersion[0]) + "." +
   3060                                        llvm::Twine(TargetVersion[1]) + "." +
   3061                                        llvm::Twine(TargetVersion[2])));
   3062 
   3063   Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
   3064   Args.AddLastArg(CmdArgs, options::OPT_multi__module);
   3065   Args.AddLastArg(CmdArgs, options::OPT_single__module);
   3066   Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
   3067   Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
   3068 
   3069   if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
   3070                                      options::OPT_fno_pie,
   3071                                      options::OPT_fno_PIE)) {
   3072     if (A->getOption().matches(options::OPT_fpie) ||
   3073         A->getOption().matches(options::OPT_fPIE))
   3074       CmdArgs.push_back("-pie");
   3075     else
   3076       CmdArgs.push_back("-no_pie");
   3077   }
   3078 
   3079   Args.AddLastArg(CmdArgs, options::OPT_prebind);
   3080   Args.AddLastArg(CmdArgs, options::OPT_noprebind);
   3081   Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
   3082   Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
   3083   Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
   3084   Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
   3085   Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
   3086   Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
   3087   Args.AddAllArgs(CmdArgs, options::OPT_segprot);
   3088   Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
   3089   Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
   3090   Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
   3091   Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
   3092   Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
   3093   Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
   3094   Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
   3095 
   3096   // Give --sysroot= preference, over the Apple specific behavior to also use
   3097   // --isysroot as the syslibroot.
   3098   if (const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
   3099     CmdArgs.push_back("-syslibroot");
   3100     CmdArgs.push_back(A->getValue(Args));
   3101   } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
   3102     CmdArgs.push_back("-syslibroot");
   3103     CmdArgs.push_back(A->getValue(Args));
   3104   } else if (getDarwinToolChain().isTargetIPhoneOS()) {
   3105     CmdArgs.push_back("-syslibroot");
   3106     CmdArgs.push_back("/Developer/SDKs/Extra");
   3107   }
   3108 
   3109   Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
   3110   Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
   3111   Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
   3112   Args.AddAllArgs(CmdArgs, options::OPT_undefined);
   3113   Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
   3114   Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
   3115   Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
   3116   Args.AddAllArgs(CmdArgs, options::OPT_y);
   3117   Args.AddLastArg(CmdArgs, options::OPT_w);
   3118   Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
   3119   Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
   3120   Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
   3121   Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
   3122   Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
   3123   Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
   3124   Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
   3125   Args.AddLastArg(CmdArgs, options::OPT_whyload);
   3126   Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
   3127   Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
   3128   Args.AddLastArg(CmdArgs, options::OPT_dylinker);
   3129   Args.AddLastArg(CmdArgs, options::OPT_Mach);
   3130 }
   3131 
   3132 void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
   3133                                 const InputInfo &Output,
   3134                                 const InputInfoList &Inputs,
   3135                                 const ArgList &Args,
   3136                                 const char *LinkingOutput) const {
   3137   assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
   3138 
   3139   // The logic here is derived from gcc's behavior; most of which
   3140   // comes from specs (starting with link_command). Consult gcc for
   3141   // more information.
   3142   ArgStringList CmdArgs;
   3143 
   3144   // I'm not sure why this particular decomposition exists in gcc, but
   3145   // we follow suite for ease of comparison.
   3146   AddLinkArgs(C, Args, CmdArgs);
   3147 
   3148   Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
   3149   Args.AddAllArgs(CmdArgs, options::OPT_s);
   3150   Args.AddAllArgs(CmdArgs, options::OPT_t);
   3151   Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
   3152   Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
   3153   Args.AddAllArgs(CmdArgs, options::OPT_A);
   3154   Args.AddLastArg(CmdArgs, options::OPT_e);
   3155   Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
   3156   Args.AddAllArgs(CmdArgs, options::OPT_r);
   3157 
   3158   // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
   3159   // members of static archive libraries which implement Objective-C classes or
   3160   // categories.
   3161   if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
   3162     CmdArgs.push_back("-ObjC");
   3163 
   3164   CmdArgs.push_back("-o");
   3165   CmdArgs.push_back(Output.getFilename());
   3166 
   3167   if (!Args.hasArg(options::OPT_A) &&
   3168       !Args.hasArg(options::OPT_nostdlib) &&
   3169       !Args.hasArg(options::OPT_nostartfiles)) {
   3170     // Derived from startfile spec.
   3171     if (Args.hasArg(options::OPT_dynamiclib)) {
   3172       // Derived from darwin_dylib1 spec.
   3173       if (getDarwinToolChain().isTargetIOSSimulator()) {
   3174         // The simulator doesn't have a versioned crt1 file.
   3175         CmdArgs.push_back("-ldylib1.o");
   3176       } else if (getDarwinToolChain().isTargetIPhoneOS()) {
   3177         if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
   3178           CmdArgs.push_back("-ldylib1.o");
   3179       } else {
   3180         if (getDarwinToolChain().isMacosxVersionLT(10, 5))
   3181           CmdArgs.push_back("-ldylib1.o");
   3182         else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
   3183           CmdArgs.push_back("-ldylib1.10.5.o");
   3184       }
   3185     } else {
   3186       if (Args.hasArg(options::OPT_bundle)) {
   3187         if (!Args.hasArg(options::OPT_static)) {
   3188           // Derived from darwin_bundle1 spec.
   3189           if (getDarwinToolChain().isTargetIOSSimulator()) {
   3190             // The simulator doesn't have a versioned crt1 file.
   3191             CmdArgs.push_back("-lbundle1.o");
   3192           } else if (getDarwinToolChain().isTargetIPhoneOS()) {
   3193             if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
   3194               CmdArgs.push_back("-lbundle1.o");
   3195           } else {
   3196             if (getDarwinToolChain().isMacosxVersionLT(10, 6))
   3197               CmdArgs.push_back("-lbundle1.o");
   3198           }
   3199         }
   3200       } else {
   3201         if (Args.hasArg(options::OPT_pg) &&
   3202             getToolChain().SupportsProfiling()) {
   3203           if (Args.hasArg(options::OPT_static) ||
   3204               Args.hasArg(options::OPT_object) ||
   3205               Args.hasArg(options::OPT_preload)) {
   3206             CmdArgs.push_back("-lgcrt0.o");
   3207           } else {
   3208             CmdArgs.push_back("-lgcrt1.o");
   3209 
   3210             // darwin_crt2 spec is empty.
   3211           }
   3212         } else {
   3213           if (Args.hasArg(options::OPT_static) ||
   3214               Args.hasArg(options::OPT_object) ||
   3215               Args.hasArg(options::OPT_preload)) {
   3216             CmdArgs.push_back("-lcrt0.o");
   3217           } else {
   3218             // Derived from darwin_crt1 spec.
   3219             if (getDarwinToolChain().isTargetIOSSimulator()) {
   3220               // The simulator doesn't have a versioned crt1 file.
   3221               CmdArgs.push_back("-lcrt1.o");
   3222             } else if (getDarwinToolChain().isTargetIPhoneOS()) {
   3223               if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
   3224                 CmdArgs.push_back("-lcrt1.o");
   3225               else
   3226                 CmdArgs.push_back("-lcrt1.3.1.o");
   3227             } else {
   3228               if (getDarwinToolChain().isMacosxVersionLT(10, 5))
   3229                 CmdArgs.push_back("-lcrt1.o");
   3230               else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
   3231                 CmdArgs.push_back("-lcrt1.10.5.o");
   3232               else
   3233                 CmdArgs.push_back("-lcrt1.10.6.o");
   3234 
   3235               // darwin_crt2 spec is empty.
   3236             }
   3237           }
   3238         }
   3239       }
   3240     }
   3241 
   3242     if (!getDarwinToolChain().isTargetIPhoneOS() &&
   3243         Args.hasArg(options::OPT_shared_libgcc) &&
   3244         getDarwinToolChain().isMacosxVersionLT(10, 5)) {
   3245       const char *Str =
   3246         Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
   3247       CmdArgs.push_back(Str);
   3248     }
   3249   }
   3250 
   3251   Args.AddAllArgs(CmdArgs, options::OPT_L);
   3252 
   3253   if (Args.hasArg(options::OPT_fopenmp))
   3254     // This is more complicated in gcc...
   3255     CmdArgs.push_back("-lgomp");
   3256 
   3257   getDarwinToolChain().AddLinkSearchPathArgs(Args, CmdArgs);
   3258 
   3259   // In ARC, if we don't have runtime support, link in the runtime
   3260   // stubs.  We have to do this *before* adding any of the normal
   3261   // linker inputs so that its initializer gets run first.
   3262   if (isObjCAutoRefCount(Args)) {
   3263     ObjCRuntime runtime;
   3264     getDarwinToolChain().configureObjCRuntime(runtime);
   3265     if (!runtime.HasARC)
   3266       getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
   3267   }
   3268 
   3269   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   3270 
   3271   if (LinkingOutput) {
   3272     CmdArgs.push_back("-arch_multiple");
   3273     CmdArgs.push_back("-final_output");
   3274     CmdArgs.push_back(LinkingOutput);
   3275   }
   3276 
   3277   if (Args.hasArg(options::OPT_fnested_functions))
   3278     CmdArgs.push_back("-allow_stack_execute");
   3279 
   3280   if (!Args.hasArg(options::OPT_nostdlib) &&
   3281       !Args.hasArg(options::OPT_nodefaultlibs)) {
   3282     if (getToolChain().getDriver().CCCIsCXX)
   3283       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   3284 
   3285     // link_ssp spec is empty.
   3286 
   3287     // Let the tool chain choose which runtime library to link.
   3288     getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
   3289   }
   3290 
   3291   if (!Args.hasArg(options::OPT_A) &&
   3292       !Args.hasArg(options::OPT_nostdlib) &&
   3293       !Args.hasArg(options::OPT_nostartfiles)) {
   3294     // endfile_spec is empty.
   3295   }
   3296 
   3297   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
   3298 
   3299   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   3300   Args.AddAllArgs(CmdArgs, options::OPT_F);
   3301 
   3302   const char *Exec =
   3303     Args.MakeArgString(getToolChain().GetProgramPath("ld"));
   3304   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   3305 }
   3306 
   3307 void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
   3308                                 const InputInfo &Output,
   3309                                 const InputInfoList &Inputs,
   3310                                 const ArgList &Args,
   3311                                 const char *LinkingOutput) const {
   3312   ArgStringList CmdArgs;
   3313 
   3314   CmdArgs.push_back("-create");
   3315   assert(Output.isFilename() && "Unexpected lipo output.");
   3316 
   3317   CmdArgs.push_back("-output");
   3318   CmdArgs.push_back(Output.getFilename());
   3319 
   3320   for (InputInfoList::const_iterator
   3321          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   3322     const InputInfo &II = *it;
   3323     assert(II.isFilename() && "Unexpected lipo input.");
   3324     CmdArgs.push_back(II.getFilename());
   3325   }
   3326   const char *Exec =
   3327     Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
   3328   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   3329 }
   3330 
   3331 void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
   3332                                     const InputInfo &Output,
   3333                                     const InputInfoList &Inputs,
   3334                                     const ArgList &Args,
   3335                                     const char *LinkingOutput) const {
   3336   ArgStringList CmdArgs;
   3337 
   3338   CmdArgs.push_back("-o");
   3339   CmdArgs.push_back(Output.getFilename());
   3340 
   3341   assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
   3342   const InputInfo &Input = Inputs[0];
   3343   assert(Input.isFilename() && "Unexpected dsymutil input.");
   3344   CmdArgs.push_back(Input.getFilename());
   3345 
   3346   const char *Exec =
   3347     Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
   3348   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   3349 }
   3350 
   3351 void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   3352                                       const InputInfo &Output,
   3353                                       const InputInfoList &Inputs,
   3354                                       const ArgList &Args,
   3355                                       const char *LinkingOutput) const {
   3356   ArgStringList CmdArgs;
   3357 
   3358   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   3359                        options::OPT_Xassembler);
   3360 
   3361   CmdArgs.push_back("-o");
   3362   CmdArgs.push_back(Output.getFilename());
   3363 
   3364   for (InputInfoList::const_iterator
   3365          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   3366     const InputInfo &II = *it;
   3367     CmdArgs.push_back(II.getFilename());
   3368   }
   3369 
   3370   const char *Exec =
   3371     Args.MakeArgString(getToolChain().GetProgramPath("gas"));
   3372   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   3373 }
   3374 
   3375 void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
   3376                                   const InputInfo &Output,
   3377                                   const InputInfoList &Inputs,
   3378                                   const ArgList &Args,
   3379                                   const char *LinkingOutput) const {
   3380   ArgStringList CmdArgs;
   3381 
   3382   if ((!Args.hasArg(options::OPT_nostdlib)) &&
   3383       (!Args.hasArg(options::OPT_shared))) {
   3384     CmdArgs.push_back("-e");
   3385     CmdArgs.push_back("_start");
   3386   }
   3387 
   3388   if (Args.hasArg(options::OPT_static)) {
   3389     CmdArgs.push_back("-Bstatic");
   3390     CmdArgs.push_back("-dn");
   3391   } else {
   3392 //    CmdArgs.push_back("--eh-frame-hdr");
   3393     CmdArgs.push_back("-Bdynamic");
   3394     if (Args.hasArg(options::OPT_shared)) {
   3395       CmdArgs.push_back("-shared");
   3396     } else {
   3397       CmdArgs.push_back("--dynamic-linker");
   3398       CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
   3399     }
   3400   }
   3401 
   3402   if (Output.isFilename()) {
   3403     CmdArgs.push_back("-o");
   3404     CmdArgs.push_back(Output.getFilename());
   3405   } else {
   3406     assert(Output.isNothing() && "Invalid output.");
   3407   }
   3408 
   3409   if (!Args.hasArg(options::OPT_nostdlib) &&
   3410       !Args.hasArg(options::OPT_nostartfiles)) {
   3411     if (!Args.hasArg(options::OPT_shared)) {
   3412       CmdArgs.push_back(Args.MakeArgString(
   3413                                 getToolChain().GetFilePath("crt1.o")));
   3414       CmdArgs.push_back(Args.MakeArgString(
   3415                                 getToolChain().GetFilePath("crti.o")));
   3416       CmdArgs.push_back(Args.MakeArgString(
   3417                                 getToolChain().GetFilePath("crtbegin.o")));
   3418     } else {
   3419       CmdArgs.push_back(Args.MakeArgString(
   3420                                 getToolChain().GetFilePath("crti.o")));
   3421     }
   3422     CmdArgs.push_back(Args.MakeArgString(
   3423                                 getToolChain().GetFilePath("crtn.o")));
   3424   }
   3425 
   3426   CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
   3427                                        + getToolChain().getTripleString()
   3428                                        + "/4.2.4"));
   3429 
   3430   Args.AddAllArgs(CmdArgs, options::OPT_L);
   3431   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   3432   Args.AddAllArgs(CmdArgs, options::OPT_e);
   3433 
   3434   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   3435 
   3436   if (!Args.hasArg(options::OPT_nostdlib) &&
   3437       !Args.hasArg(options::OPT_nodefaultlibs)) {
   3438     // FIXME: For some reason GCC passes -lgcc before adding
   3439     // the default system libraries. Just mimic this for now.
   3440     CmdArgs.push_back("-lgcc");
   3441 
   3442     if (Args.hasArg(options::OPT_pthread))
   3443       CmdArgs.push_back("-pthread");
   3444     if (!Args.hasArg(options::OPT_shared))
   3445       CmdArgs.push_back("-lc");
   3446     CmdArgs.push_back("-lgcc");
   3447   }
   3448 
   3449   if (!Args.hasArg(options::OPT_nostdlib) &&
   3450       !Args.hasArg(options::OPT_nostartfiles)) {
   3451     if (!Args.hasArg(options::OPT_shared))
   3452       CmdArgs.push_back(Args.MakeArgString(
   3453                                 getToolChain().GetFilePath("crtend.o")));
   3454   }
   3455 
   3456   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
   3457 
   3458   const char *Exec =
   3459     Args.MakeArgString(getToolChain().GetProgramPath("ld"));
   3460   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   3461 }
   3462 
   3463 void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   3464                                      const InputInfo &Output,
   3465                                      const InputInfoList &Inputs,
   3466                                      const ArgList &Args,
   3467                                      const char *LinkingOutput) const {
   3468   ArgStringList CmdArgs;
   3469 
   3470   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   3471                        options::OPT_Xassembler);
   3472 
   3473   CmdArgs.push_back("-o");
   3474   CmdArgs.push_back(Output.getFilename());
   3475 
   3476   for (InputInfoList::const_iterator
   3477          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   3478     const InputInfo &II = *it;
   3479     CmdArgs.push_back(II.getFilename());
   3480   }
   3481 
   3482   const char *Exec =
   3483     Args.MakeArgString(getToolChain().GetProgramPath("as"));
   3484   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   3485 }
   3486 
   3487 void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
   3488                                  const InputInfo &Output,
   3489                                  const InputInfoList &Inputs,
   3490                                  const ArgList &Args,
   3491                                  const char *LinkingOutput) const {
   3492   const Driver &D = getToolChain().getDriver();
   3493   ArgStringList CmdArgs;
   3494 
   3495   if ((!Args.hasArg(options::OPT_nostdlib)) &&
   3496       (!Args.hasArg(options::OPT_shared))) {
   3497     CmdArgs.push_back("-e");
   3498     CmdArgs.push_back("__start");
   3499   }
   3500 
   3501   if (Args.hasArg(options::OPT_static)) {
   3502     CmdArgs.push_back("-Bstatic");
   3503   } else {
   3504     if (Args.hasArg(options::OPT_rdynamic))
   3505       CmdArgs.push_back("-export-dynamic");
   3506     CmdArgs.push_back("--eh-frame-hdr");
   3507     CmdArgs.push_back("-Bdynamic");
   3508     if (Args.hasArg(options::OPT_shared)) {
   3509       CmdArgs.push_back("-shared");
   3510     } else {
   3511       CmdArgs.push_back("-dynamic-linker");
   3512       CmdArgs.push_back("/usr/libexec/ld.so");
   3513     }
   3514   }
   3515 
   3516   if (Output.isFilename()) {
   3517     CmdArgs.push_back("-o");
   3518     CmdArgs.push_back(Output.getFilename());
   3519   } else {
   3520     assert(Output.isNothing() && "Invalid output.");
   3521   }
   3522 
   3523   if (!Args.hasArg(options::OPT_nostdlib) &&
   3524       !Args.hasArg(options::OPT_nostartfiles)) {
   3525     if (!Args.hasArg(options::OPT_shared)) {
   3526       CmdArgs.push_back(Args.MakeArgString(
   3527                               getToolChain().GetFilePath("crt0.o")));
   3528       CmdArgs.push_back(Args.MakeArgString(
   3529                               getToolChain().GetFilePath("crtbegin.o")));
   3530     } else {
   3531       CmdArgs.push_back(Args.MakeArgString(
   3532                               getToolChain().GetFilePath("crtbeginS.o")));
   3533     }
   3534   }
   3535 
   3536   std::string Triple = getToolChain().getTripleString();
   3537   if (Triple.substr(0, 6) == "x86_64")
   3538     Triple.replace(0, 6, "amd64");
   3539   CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
   3540                                        "/4.2.1"));
   3541 
   3542   Args.AddAllArgs(CmdArgs, options::OPT_L);
   3543   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   3544   Args.AddAllArgs(CmdArgs, options::OPT_e);
   3545 
   3546   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   3547 
   3548   if (!Args.hasArg(options::OPT_nostdlib) &&
   3549       !Args.hasArg(options::OPT_nodefaultlibs)) {
   3550     if (D.CCCIsCXX) {
   3551       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   3552       CmdArgs.push_back("-lm");
   3553     }
   3554 
   3555     // FIXME: For some reason GCC passes -lgcc before adding
   3556     // the default system libraries. Just mimic this for now.
   3557     CmdArgs.push_back("-lgcc");
   3558 
   3559     if (Args.hasArg(options::OPT_pthread))
   3560       CmdArgs.push_back("-lpthread");
   3561     if (!Args.hasArg(options::OPT_shared))
   3562       CmdArgs.push_back("-lc");
   3563     CmdArgs.push_back("-lgcc");
   3564   }
   3565 
   3566   if (!Args.hasArg(options::OPT_nostdlib) &&
   3567       !Args.hasArg(options::OPT_nostartfiles)) {
   3568     if (!Args.hasArg(options::OPT_shared))
   3569       CmdArgs.push_back(Args.MakeArgString(
   3570                               getToolChain().GetFilePath("crtend.o")));
   3571     else
   3572       CmdArgs.push_back(Args.MakeArgString(
   3573                               getToolChain().GetFilePath("crtendS.o")));
   3574   }
   3575 
   3576   const char *Exec =
   3577     Args.MakeArgString(getToolChain().GetProgramPath("ld"));
   3578   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   3579 }
   3580 
   3581 void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   3582                                      const InputInfo &Output,
   3583                                      const InputInfoList &Inputs,
   3584                                      const ArgList &Args,
   3585                                      const char *LinkingOutput) const {
   3586   ArgStringList CmdArgs;
   3587 
   3588   // When building 32-bit code on FreeBSD/amd64, we have to explicitly
   3589   // instruct as in the base system to assemble 32-bit code.
   3590   if (getToolChain().getArchName() == "i386")
   3591     CmdArgs.push_back("--32");
   3592 
   3593   if (getToolChain().getArchName() == "powerpc")
   3594     CmdArgs.push_back("-a32");
   3595 
   3596   // Set byte order explicitly
   3597   if (getToolChain().getArchName() == "mips")
   3598     CmdArgs.push_back("-EB");
   3599   else if (getToolChain().getArchName() == "mipsel")
   3600     CmdArgs.push_back("-EL");
   3601 
   3602   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   3603                        options::OPT_Xassembler);
   3604 
   3605   CmdArgs.push_back("-o");
   3606   CmdArgs.push_back(Output.getFilename());
   3607 
   3608   for (InputInfoList::const_iterator
   3609          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   3610     const InputInfo &II = *it;
   3611     CmdArgs.push_back(II.getFilename());
   3612   }
   3613 
   3614   const char *Exec =
   3615     Args.MakeArgString(getToolChain().GetProgramPath("as"));
   3616   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   3617 }
   3618 
   3619 void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
   3620                                  const InputInfo &Output,
   3621                                  const InputInfoList &Inputs,
   3622                                  const ArgList &Args,
   3623                                  const char *LinkingOutput) const {
   3624   const Driver &D = getToolChain().getDriver();
   3625   ArgStringList CmdArgs;
   3626 
   3627   if (!D.SysRoot.empty())
   3628     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   3629 
   3630   if (Args.hasArg(options::OPT_static)) {
   3631     CmdArgs.push_back("-Bstatic");
   3632   } else {
   3633     if (Args.hasArg(options::OPT_rdynamic))
   3634       CmdArgs.push_back("-export-dynamic");
   3635     CmdArgs.push_back("--eh-frame-hdr");
   3636     if (Args.hasArg(options::OPT_shared)) {
   3637       CmdArgs.push_back("-Bshareable");
   3638     } else {
   3639       CmdArgs.push_back("-dynamic-linker");
   3640       CmdArgs.push_back("/libexec/ld-elf.so.1");
   3641     }
   3642   }
   3643 
   3644   // When building 32-bit code on FreeBSD/amd64, we have to explicitly
   3645   // instruct ld in the base system to link 32-bit code.
   3646   if (getToolChain().getArchName() == "i386") {
   3647     CmdArgs.push_back("-m");
   3648     CmdArgs.push_back("elf_i386_fbsd");
   3649   }
   3650 
   3651   if (getToolChain().getArchName() == "powerpc") {
   3652     CmdArgs.push_back("-m");
   3653     CmdArgs.push_back("elf32ppc");
   3654   }
   3655 
   3656   if (Output.isFilename()) {
   3657     CmdArgs.push_back("-o");
   3658     CmdArgs.push_back(Output.getFilename());
   3659   } else {
   3660     assert(Output.isNothing() && "Invalid output.");
   3661   }
   3662 
   3663   if (!Args.hasArg(options::OPT_nostdlib) &&
   3664       !Args.hasArg(options::OPT_nostartfiles)) {
   3665     if (!Args.hasArg(options::OPT_shared)) {
   3666       if (Args.hasArg(options::OPT_pg))
   3667         CmdArgs.push_back(Args.MakeArgString(
   3668                                 getToolChain().GetFilePath("gcrt1.o")));
   3669       else
   3670         CmdArgs.push_back(Args.MakeArgString(
   3671                                 getToolChain().GetFilePath("crt1.o")));
   3672       CmdArgs.push_back(Args.MakeArgString(
   3673                               getToolChain().GetFilePath("crti.o")));
   3674       CmdArgs.push_back(Args.MakeArgString(
   3675                               getToolChain().GetFilePath("crtbegin.o")));
   3676     } else {
   3677       CmdArgs.push_back(Args.MakeArgString(
   3678                               getToolChain().GetFilePath("crti.o")));
   3679       CmdArgs.push_back(Args.MakeArgString(
   3680                               getToolChain().GetFilePath("crtbeginS.o")));
   3681     }
   3682   }
   3683 
   3684   Args.AddAllArgs(CmdArgs, options::OPT_L);
   3685   const ToolChain::path_list Paths = getToolChain().getFilePaths();
   3686   for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
   3687        i != e; ++i)
   3688     CmdArgs.push_back(Args.MakeArgString(llvm::StringRef("-L") + *i));
   3689   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   3690   Args.AddAllArgs(CmdArgs, options::OPT_e);
   3691   Args.AddAllArgs(CmdArgs, options::OPT_s);
   3692   Args.AddAllArgs(CmdArgs, options::OPT_t);
   3693   Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
   3694   Args.AddAllArgs(CmdArgs, options::OPT_r);
   3695 
   3696   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   3697 
   3698   if (!Args.hasArg(options::OPT_nostdlib) &&
   3699       !Args.hasArg(options::OPT_nodefaultlibs)) {
   3700     if (D.CCCIsCXX) {
   3701       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   3702       if (Args.hasArg(options::OPT_pg))
   3703         CmdArgs.push_back("-lm_p");
   3704       else
   3705         CmdArgs.push_back("-lm");
   3706     }
   3707     // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
   3708     // the default system libraries. Just mimic this for now.
   3709     if (Args.hasArg(options::OPT_pg))
   3710       CmdArgs.push_back("-lgcc_p");
   3711     else
   3712       CmdArgs.push_back("-lgcc");
   3713     if (Args.hasArg(options::OPT_static)) {
   3714       CmdArgs.push_back("-lgcc_eh");
   3715     } else if (Args.hasArg(options::OPT_pg)) {
   3716       CmdArgs.push_back("-lgcc_eh_p");
   3717     } else {
   3718       CmdArgs.push_back("--as-needed");
   3719       CmdArgs.push_back("-lgcc_s");
   3720       CmdArgs.push_back("--no-as-needed");
   3721     }
   3722 
   3723     if (Args.hasArg(options::OPT_pthread)) {
   3724       if (Args.hasArg(options::OPT_pg))
   3725         CmdArgs.push_back("-lpthread_p");
   3726       else
   3727         CmdArgs.push_back("-lpthread");
   3728     }
   3729 
   3730     if (Args.hasArg(options::OPT_pg)) {
   3731       if (Args.hasArg(options::OPT_shared))
   3732         CmdArgs.push_back("-lc");
   3733       else
   3734         CmdArgs.push_back("-lc_p");
   3735       CmdArgs.push_back("-lgcc_p");
   3736     } else {
   3737       CmdArgs.push_back("-lc");
   3738       CmdArgs.push_back("-lgcc");
   3739     }
   3740 
   3741     if (Args.hasArg(options::OPT_static)) {
   3742       CmdArgs.push_back("-lgcc_eh");
   3743     } else if (Args.hasArg(options::OPT_pg)) {
   3744       CmdArgs.push_back("-lgcc_eh_p");
   3745     } else {
   3746       CmdArgs.push_back("--as-needed");
   3747       CmdArgs.push_back("-lgcc_s");
   3748       CmdArgs.push_back("--no-as-needed");
   3749     }
   3750   }
   3751 
   3752   if (!Args.hasArg(options::OPT_nostdlib) &&
   3753       !Args.hasArg(options::OPT_nostartfiles)) {
   3754     if (!Args.hasArg(options::OPT_shared))
   3755       CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
   3756                                                                   "crtend.o")));
   3757     else
   3758       CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
   3759                                                                  "crtendS.o")));
   3760     CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
   3761                                                                     "crtn.o")));
   3762   }
   3763 
   3764   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
   3765 
   3766   const char *Exec =
   3767     Args.MakeArgString(getToolChain().GetProgramPath("ld"));
   3768   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   3769 }
   3770 
   3771 void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   3772                                      const InputInfo &Output,
   3773                                      const InputInfoList &Inputs,
   3774                                      const ArgList &Args,
   3775                                      const char *LinkingOutput) const {
   3776   ArgStringList CmdArgs;
   3777 
   3778   // When building 32-bit code on NetBSD/amd64, we have to explicitly
   3779   // instruct as in the base system to assemble 32-bit code.
   3780   if (ToolTriple.getArch() == llvm::Triple::x86_64 &&
   3781       getToolChain().getArch() == llvm::Triple::x86)
   3782     CmdArgs.push_back("--32");
   3783 
   3784 
   3785   // Set byte order explicitly
   3786   if (getToolChain().getArchName() == "mips")
   3787     CmdArgs.push_back("-EB");
   3788   else if (getToolChain().getArchName() == "mipsel")
   3789     CmdArgs.push_back("-EL");
   3790 
   3791   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   3792                        options::OPT_Xassembler);
   3793 
   3794   CmdArgs.push_back("-o");
   3795   CmdArgs.push_back(Output.getFilename());
   3796 
   3797   for (InputInfoList::const_iterator
   3798          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   3799     const InputInfo &II = *it;
   3800     CmdArgs.push_back(II.getFilename());
   3801   }
   3802 
   3803   const char *Exec = Args.MakeArgString(FindTargetProgramPath(getToolChain(),
   3804                                                       ToolTriple.getTriple(),
   3805                                                       "as"));
   3806   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   3807 }
   3808 
   3809 void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
   3810                                  const InputInfo &Output,
   3811                                  const InputInfoList &Inputs,
   3812                                  const ArgList &Args,
   3813                                  const char *LinkingOutput) const {
   3814   const Driver &D = getToolChain().getDriver();
   3815   ArgStringList CmdArgs;
   3816 
   3817   if (!D.SysRoot.empty())
   3818     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   3819 
   3820   if (Args.hasArg(options::OPT_static)) {
   3821     CmdArgs.push_back("-Bstatic");
   3822   } else {
   3823     if (Args.hasArg(options::OPT_rdynamic))
   3824       CmdArgs.push_back("-export-dynamic");
   3825     CmdArgs.push_back("--eh-frame-hdr");
   3826     if (Args.hasArg(options::OPT_shared)) {
   3827       CmdArgs.push_back("-Bshareable");
   3828     } else {
   3829       CmdArgs.push_back("-dynamic-linker");
   3830       CmdArgs.push_back("/libexec/ld.elf_so");
   3831     }
   3832   }
   3833 
   3834   // When building 32-bit code on NetBSD/amd64, we have to explicitly
   3835   // instruct ld in the base system to link 32-bit code.
   3836   if (ToolTriple.getArch() == llvm::Triple::x86_64 &&
   3837       getToolChain().getArch() == llvm::Triple::x86) {
   3838     CmdArgs.push_back("-m");
   3839     CmdArgs.push_back("elf_i386");
   3840   }
   3841 
   3842   if (Output.isFilename()) {
   3843     CmdArgs.push_back("-o");
   3844     CmdArgs.push_back(Output.getFilename());
   3845   } else {
   3846     assert(Output.isNothing() && "Invalid output.");
   3847   }
   3848 
   3849   if (!Args.hasArg(options::OPT_nostdlib) &&
   3850       !Args.hasArg(options::OPT_nostartfiles)) {
   3851     if (!Args.hasArg(options::OPT_shared)) {
   3852       CmdArgs.push_back(Args.MakeArgString(
   3853                               getToolChain().GetFilePath("crt0.o")));
   3854       CmdArgs.push_back(Args.MakeArgString(
   3855                               getToolChain().GetFilePath("crti.o")));
   3856       CmdArgs.push_back(Args.MakeArgString(
   3857                               getToolChain().GetFilePath("crtbegin.o")));
   3858     } else {
   3859       CmdArgs.push_back(Args.MakeArgString(
   3860                               getToolChain().GetFilePath("crti.o")));
   3861       CmdArgs.push_back(Args.MakeArgString(
   3862                               getToolChain().GetFilePath("crtbeginS.o")));
   3863     }
   3864   }
   3865 
   3866   Args.AddAllArgs(CmdArgs, options::OPT_L);
   3867   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   3868   Args.AddAllArgs(CmdArgs, options::OPT_e);
   3869   Args.AddAllArgs(CmdArgs, options::OPT_s);
   3870   Args.AddAllArgs(CmdArgs, options::OPT_t);
   3871   Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
   3872   Args.AddAllArgs(CmdArgs, options::OPT_r);
   3873 
   3874   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   3875 
   3876   if (!Args.hasArg(options::OPT_nostdlib) &&
   3877       !Args.hasArg(options::OPT_nodefaultlibs)) {
   3878     if (D.CCCIsCXX) {
   3879       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   3880       CmdArgs.push_back("-lm");
   3881     }
   3882     // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
   3883     // the default system libraries. Just mimic this for now.
   3884     if (Args.hasArg(options::OPT_static)) {
   3885       CmdArgs.push_back("-lgcc_eh");
   3886     } else {
   3887       CmdArgs.push_back("--as-needed");
   3888       CmdArgs.push_back("-lgcc_s");
   3889       CmdArgs.push_back("--no-as-needed");
   3890     }
   3891     CmdArgs.push_back("-lgcc");
   3892 
   3893     if (Args.hasArg(options::OPT_pthread))
   3894       CmdArgs.push_back("-lpthread");
   3895     CmdArgs.push_back("-lc");
   3896 
   3897     CmdArgs.push_back("-lgcc");
   3898     if (Args.hasArg(options::OPT_static)) {
   3899       CmdArgs.push_back("-lgcc_eh");
   3900     } else {
   3901       CmdArgs.push_back("--as-needed");
   3902       CmdArgs.push_back("-lgcc_s");
   3903       CmdArgs.push_back("--no-as-needed");
   3904     }
   3905   }
   3906 
   3907   if (!Args.hasArg(options::OPT_nostdlib) &&
   3908       !Args.hasArg(options::OPT_nostartfiles)) {
   3909     if (!Args.hasArg(options::OPT_shared))
   3910       CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
   3911                                                                   "crtend.o")));
   3912     else
   3913       CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
   3914                                                                  "crtendS.o")));
   3915     CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
   3916                                                                     "crtn.o")));
   3917   }
   3918 
   3919   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
   3920 
   3921   const char *Exec = Args.MakeArgString(FindTargetProgramPath(getToolChain(),
   3922                                                       ToolTriple.getTriple(),
   3923                                                       "ld"));
   3924   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   3925 }
   3926 
   3927 void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   3928                                         const InputInfo &Output,
   3929                                         const InputInfoList &Inputs,
   3930                                         const ArgList &Args,
   3931                                         const char *LinkingOutput) const {
   3932   ArgStringList CmdArgs;
   3933 
   3934   // Add --32/--64 to make sure we get the format we want.
   3935   // This is incomplete
   3936   if (getToolChain().getArch() == llvm::Triple::x86) {
   3937     CmdArgs.push_back("--32");
   3938   } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
   3939     CmdArgs.push_back("--64");
   3940   } else if (getToolChain().getArch() == llvm::Triple::arm) {
   3941     llvm::StringRef MArch = getToolChain().getArchName();
   3942     if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
   3943       CmdArgs.push_back("-mfpu=neon");
   3944   }
   3945 
   3946   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   3947                        options::OPT_Xassembler);
   3948 
   3949   CmdArgs.push_back("-o");
   3950   CmdArgs.push_back(Output.getFilename());
   3951 
   3952   for (InputInfoList::const_iterator
   3953          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   3954     const InputInfo &II = *it;
   3955     CmdArgs.push_back(II.getFilename());
   3956   }
   3957 
   3958   const char *Exec =
   3959     Args.MakeArgString(getToolChain().GetProgramPath("as"));
   3960   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   3961 }
   3962 
   3963 void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
   3964                                     const InputInfo &Output,
   3965                                     const InputInfoList &Inputs,
   3966                                     const ArgList &Args,
   3967                                     const char *LinkingOutput) const {
   3968   const toolchains::Linux& ToolChain =
   3969     static_cast<const toolchains::Linux&>(getToolChain());
   3970   const Driver &D = ToolChain.getDriver();
   3971   ArgStringList CmdArgs;
   3972 
   3973   // Silence warning for "clang -g foo.o -o foo"
   3974   Args.ClaimAllArgs(options::OPT_g_Group);
   3975   // and "clang -emit-llvm foo.o -o foo"
   3976   Args.ClaimAllArgs(options::OPT_emit_llvm);
   3977   // and for "clang -g foo.o -o foo". Other warning options are already
   3978   // handled somewhere else.
   3979   Args.ClaimAllArgs(options::OPT_w);
   3980 
   3981   if (!D.SysRoot.empty())
   3982     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   3983 
   3984   if (Args.hasArg(options::OPT_pie))
   3985     CmdArgs.push_back("-pie");
   3986 
   3987   if (Args.hasArg(options::OPT_rdynamic))
   3988     CmdArgs.push_back("-export-dynamic");
   3989 
   3990   if (Args.hasArg(options::OPT_s))
   3991     CmdArgs.push_back("-s");
   3992 
   3993   for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
   3994          e = ToolChain.ExtraOpts.end();
   3995        i != e; ++i)
   3996     CmdArgs.push_back(i->c_str());
   3997 
   3998   if (!Args.hasArg(options::OPT_static)) {
   3999     CmdArgs.push_back("--eh-frame-hdr");
   4000   }
   4001 
   4002   CmdArgs.push_back("-m");
   4003   if (ToolChain.getArch() == llvm::Triple::x86)
   4004     CmdArgs.push_back("elf_i386");
   4005   else if (ToolChain.getArch() == llvm::Triple::arm
   4006            ||  ToolChain.getArch() == llvm::Triple::thumb)
   4007     CmdArgs.push_back("armelf_linux_eabi");
   4008   else if (ToolChain.getArch() == llvm::Triple::ppc)
   4009     CmdArgs.push_back("elf32ppclinux");
   4010   else if (ToolChain.getArch() == llvm::Triple::ppc64)
   4011     CmdArgs.push_back("elf64ppc");
   4012   else
   4013     CmdArgs.push_back("elf_x86_64");
   4014 
   4015   if (Args.hasArg(options::OPT_static)) {
   4016     if (ToolChain.getArch() == llvm::Triple::arm
   4017         || ToolChain.getArch() == llvm::Triple::thumb)
   4018       CmdArgs.push_back("-Bstatic");
   4019     else
   4020       CmdArgs.push_back("-static");
   4021   } else if (Args.hasArg(options::OPT_shared)) {
   4022     CmdArgs.push_back("-shared");
   4023   }
   4024 
   4025   if (ToolChain.getArch() == llvm::Triple::arm ||
   4026       ToolChain.getArch() == llvm::Triple::thumb ||
   4027       (!Args.hasArg(options::OPT_static) &&
   4028        !Args.hasArg(options::OPT_shared))) {
   4029     CmdArgs.push_back("-dynamic-linker");
   4030     if (ToolChain.getArch() == llvm::Triple::x86)
   4031       CmdArgs.push_back("/lib/ld-linux.so.2");
   4032     else if (ToolChain.getArch() == llvm::Triple::arm ||
   4033              ToolChain.getArch() == llvm::Triple::thumb)
   4034       CmdArgs.push_back("/lib/ld-linux.so.3");
   4035     else if (ToolChain.getArch() == llvm::Triple::ppc)
   4036       CmdArgs.push_back("/lib/ld.so.1");
   4037     else if (ToolChain.getArch() == llvm::Triple::ppc64)
   4038       CmdArgs.push_back("/lib64/ld64.so.1");
   4039     else
   4040       CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
   4041   }
   4042 
   4043   CmdArgs.push_back("-o");
   4044   CmdArgs.push_back(Output.getFilename());
   4045 
   4046   if (!Args.hasArg(options::OPT_nostdlib) &&
   4047       !Args.hasArg(options::OPT_nostartfiles)) {
   4048     const char *crt1 = NULL;
   4049     if (!Args.hasArg(options::OPT_shared)){
   4050       if (Args.hasArg(options::OPT_pie))
   4051         crt1 = "Scrt1.o";
   4052       else
   4053         crt1 = "crt1.o";
   4054     }
   4055     if (crt1)
   4056       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
   4057 
   4058     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
   4059 
   4060     const char *crtbegin;
   4061     if (Args.hasArg(options::OPT_static))
   4062       crtbegin = "crtbeginT.o";
   4063     else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
   4064       crtbegin = "crtbeginS.o";
   4065     else
   4066       crtbegin = "crtbegin.o";
   4067     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
   4068   }
   4069 
   4070   Args.AddAllArgs(CmdArgs, options::OPT_L);
   4071 
   4072   const ToolChain::path_list Paths = ToolChain.getFilePaths();
   4073 
   4074   for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
   4075        i != e; ++i)
   4076     CmdArgs.push_back(Args.MakeArgString(llvm::StringRef("-L") + *i));
   4077 
   4078   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
   4079 
   4080   if (D.CCCIsCXX && !Args.hasArg(options::OPT_nostdlib)) {
   4081     ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
   4082     CmdArgs.push_back("-lm");
   4083   }
   4084 
   4085   if (!Args.hasArg(options::OPT_nostdlib)) {
   4086     if (Args.hasArg(options::OPT_static))
   4087       CmdArgs.push_back("--start-group");
   4088 
   4089     if (!D.CCCIsCXX)
   4090       CmdArgs.push_back("-lgcc");
   4091 
   4092     if (Args.hasArg(options::OPT_static)) {
   4093       if (D.CCCIsCXX)
   4094         CmdArgs.push_back("-lgcc");
   4095     } else {
   4096       if (!D.CCCIsCXX)
   4097         CmdArgs.push_back("--as-needed");
   4098       CmdArgs.push_back("-lgcc_s");
   4099       if (!D.CCCIsCXX)
   4100         CmdArgs.push_back("--no-as-needed");
   4101     }
   4102 
   4103     if (Args.hasArg(options::OPT_static))
   4104       CmdArgs.push_back("-lgcc_eh");
   4105     else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
   4106       CmdArgs.push_back("-lgcc");
   4107 
   4108     if (Args.hasArg(options::OPT_pthread) ||
   4109         Args.hasArg(options::OPT_pthreads))
   4110       CmdArgs.push_back("-lpthread");
   4111 
   4112     CmdArgs.push_back("-lc");
   4113 
   4114     if (Args.hasArg(options::OPT_static))
   4115       CmdArgs.push_back("--end-group");
   4116     else {
   4117       if (!D.CCCIsCXX)
   4118         CmdArgs.push_back("-lgcc");
   4119 
   4120       if (!D.CCCIsCXX)
   4121         CmdArgs.push_back("--as-needed");
   4122       CmdArgs.push_back("-lgcc_s");
   4123       if (!D.CCCIsCXX)
   4124         CmdArgs.push_back("--no-as-needed");
   4125 
   4126       if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
   4127         CmdArgs.push_back("-lgcc");
   4128     }
   4129 
   4130 
   4131     if (!Args.hasArg(options::OPT_nostartfiles)) {
   4132       const char *crtend;
   4133       if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
   4134         crtend = "crtendS.o";
   4135       else
   4136         crtend = "crtend.o";
   4137 
   4138       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
   4139       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
   4140     }
   4141   }
   4142 
   4143   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
   4144 
   4145   if (Args.hasArg(options::OPT_use_gold_plugin)) {
   4146     CmdArgs.push_back("-plugin");
   4147     std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
   4148     CmdArgs.push_back(Args.MakeArgString(Plugin));
   4149   }
   4150 
   4151   C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
   4152 }
   4153 
   4154 void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   4155                                    const InputInfo &Output,
   4156                                    const InputInfoList &Inputs,
   4157                                    const ArgList &Args,
   4158                                    const char *LinkingOutput) const {
   4159   ArgStringList CmdArgs;
   4160 
   4161   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   4162                        options::OPT_Xassembler);
   4163 
   4164   CmdArgs.push_back("-o");
   4165   CmdArgs.push_back(Output.getFilename());
   4166 
   4167   for (InputInfoList::const_iterator
   4168          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   4169     const InputInfo &II = *it;
   4170     CmdArgs.push_back(II.getFilename());
   4171   }
   4172 
   4173   const char *Exec =
   4174     Args.MakeArgString(getToolChain().GetProgramPath("gas"));
   4175   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   4176 }
   4177 
   4178 void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
   4179                                const InputInfo &Output,
   4180                                const InputInfoList &Inputs,
   4181                                const ArgList &Args,
   4182                                const char *LinkingOutput) const {
   4183   const Driver &D = getToolChain().getDriver();
   4184   ArgStringList CmdArgs;
   4185 
   4186   if (Output.isFilename()) {
   4187     CmdArgs.push_back("-o");
   4188     CmdArgs.push_back(Output.getFilename());
   4189   } else {
   4190     assert(Output.isNothing() && "Invalid output.");
   4191   }
   4192 
   4193   if (!Args.hasArg(options::OPT_nostdlib) &&
   4194       !Args.hasArg(options::OPT_nostartfiles))
   4195     CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
   4196                                                       "/usr/gnu/lib/crtso.o")));
   4197 
   4198   Args.AddAllArgs(CmdArgs, options::OPT_L);
   4199   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   4200   Args.AddAllArgs(CmdArgs, options::OPT_e);
   4201 
   4202   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   4203 
   4204   if (!Args.hasArg(options::OPT_nostdlib) &&
   4205       !Args.hasArg(options::OPT_nodefaultlibs)) {
   4206     if (D.CCCIsCXX) {
   4207       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   4208       CmdArgs.push_back("-lm");
   4209     }
   4210 
   4211     if (Args.hasArg(options::OPT_pthread))
   4212       CmdArgs.push_back("-lpthread");
   4213     CmdArgs.push_back("-lc");
   4214     CmdArgs.push_back("-lgcc");
   4215     CmdArgs.push_back("-L/usr/gnu/lib");
   4216     // FIXME: fill in the correct search path for the final
   4217     // support libraries.
   4218     CmdArgs.push_back("-L/usr/gnu/lib/gcc/i686-pc-minix/4.4.3");
   4219   }
   4220 
   4221   if (!Args.hasArg(options::OPT_nostdlib) &&
   4222       !Args.hasArg(options::OPT_nostartfiles)) {
   4223     CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
   4224                                               "/usr/gnu/lib/libend.a")));
   4225   }
   4226 
   4227   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
   4228 
   4229   const char *Exec =
   4230     Args.MakeArgString(getToolChain().GetProgramPath("/usr/gnu/bin/gld"));
   4231   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   4232 }
   4233 
   4234 /// DragonFly Tools
   4235 
   4236 // For now, DragonFly Assemble does just about the same as for
   4237 // FreeBSD, but this may change soon.
   4238 void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
   4239                                        const InputInfo &Output,
   4240                                        const InputInfoList &Inputs,
   4241                                        const ArgList &Args,
   4242                                        const char *LinkingOutput) const {
   4243   ArgStringList CmdArgs;
   4244 
   4245   // When building 32-bit code on DragonFly/pc64, we have to explicitly
   4246   // instruct as in the base system to assemble 32-bit code.
   4247   if (getToolChain().getArchName() == "i386")
   4248     CmdArgs.push_back("--32");
   4249 
   4250   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
   4251                        options::OPT_Xassembler);
   4252 
   4253   CmdArgs.push_back("-o");
   4254   CmdArgs.push_back(Output.getFilename());
   4255 
   4256   for (InputInfoList::const_iterator
   4257          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
   4258     const InputInfo &II = *it;
   4259     CmdArgs.push_back(II.getFilename());
   4260   }
   4261 
   4262   const char *Exec =
   4263     Args.MakeArgString(getToolChain().GetProgramPath("as"));
   4264   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   4265 }
   4266 
   4267 void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
   4268                                    const InputInfo &Output,
   4269                                    const InputInfoList &Inputs,
   4270                                    const ArgList &Args,
   4271                                    const char *LinkingOutput) const {
   4272   const Driver &D = getToolChain().getDriver();
   4273   ArgStringList CmdArgs;
   4274 
   4275   if (!D.SysRoot.empty())
   4276     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
   4277 
   4278   if (Args.hasArg(options::OPT_static)) {
   4279     CmdArgs.push_back("-Bstatic");
   4280   } else {
   4281     if (Args.hasArg(options::OPT_shared))
   4282       CmdArgs.push_back("-Bshareable");
   4283     else {
   4284       CmdArgs.push_back("-dynamic-linker");
   4285       CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
   4286     }
   4287   }
   4288 
   4289   // When building 32-bit code on DragonFly/pc64, we have to explicitly
   4290   // instruct ld in the base system to link 32-bit code.
   4291   if (getToolChain().getArchName() == "i386") {
   4292     CmdArgs.push_back("-m");
   4293     CmdArgs.push_back("elf_i386");
   4294   }
   4295 
   4296   if (Output.isFilename()) {
   4297     CmdArgs.push_back("-o");
   4298     CmdArgs.push_back(Output.getFilename());
   4299   } else {
   4300     assert(Output.isNothing() && "Invalid output.");
   4301   }
   4302 
   4303   if (!Args.hasArg(options::OPT_nostdlib) &&
   4304       !Args.hasArg(options::OPT_nostartfiles)) {
   4305     if (!Args.hasArg(options::OPT_shared)) {
   4306       CmdArgs.push_back(
   4307             Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
   4308       CmdArgs.push_back(
   4309             Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
   4310       CmdArgs.push_back(
   4311             Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
   4312     } else {
   4313       CmdArgs.push_back(
   4314             Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
   4315       CmdArgs.push_back(
   4316             Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
   4317     }
   4318   }
   4319 
   4320   Args.AddAllArgs(CmdArgs, options::OPT_L);
   4321   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   4322   Args.AddAllArgs(CmdArgs, options::OPT_e);
   4323 
   4324   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   4325 
   4326   if (!Args.hasArg(options::OPT_nostdlib) &&
   4327       !Args.hasArg(options::OPT_nodefaultlibs)) {
   4328     // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
   4329     //         rpaths
   4330     CmdArgs.push_back("-L/usr/lib/gcc41");
   4331 
   4332     if (!Args.hasArg(options::OPT_static)) {
   4333       CmdArgs.push_back("-rpath");
   4334       CmdArgs.push_back("/usr/lib/gcc41");
   4335 
   4336       CmdArgs.push_back("-rpath-link");
   4337       CmdArgs.push_back("/usr/lib/gcc41");
   4338 
   4339       CmdArgs.push_back("-rpath");
   4340       CmdArgs.push_back("/usr/lib");
   4341 
   4342       CmdArgs.push_back("-rpath-link");
   4343       CmdArgs.push_back("/usr/lib");
   4344     }
   4345 
   4346     if (D.CCCIsCXX) {
   4347       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
   4348       CmdArgs.push_back("-lm");
   4349     }
   4350 
   4351     if (Args.hasArg(options::OPT_shared)) {
   4352       CmdArgs.push_back("-lgcc_pic");
   4353     } else {
   4354       CmdArgs.push_back("-lgcc");
   4355     }
   4356 
   4357 
   4358     if (Args.hasArg(options::OPT_pthread))
   4359       CmdArgs.push_back("-lpthread");
   4360 
   4361     if (!Args.hasArg(options::OPT_nolibc)) {
   4362       CmdArgs.push_back("-lc");
   4363     }
   4364 
   4365     if (Args.hasArg(options::OPT_shared)) {
   4366       CmdArgs.push_back("-lgcc_pic");
   4367     } else {
   4368       CmdArgs.push_back("-lgcc");
   4369     }
   4370   }
   4371 
   4372   if (!Args.hasArg(options::OPT_nostdlib) &&
   4373       !Args.hasArg(options::OPT_nostartfiles)) {
   4374     if (!Args.hasArg(options::OPT_shared))
   4375       CmdArgs.push_back(Args.MakeArgString(
   4376                               getToolChain().GetFilePath("crtend.o")));
   4377     else
   4378       CmdArgs.push_back(Args.MakeArgString(
   4379                               getToolChain().GetFilePath("crtendS.o")));
   4380     CmdArgs.push_back(Args.MakeArgString(
   4381                               getToolChain().GetFilePath("crtn.o")));
   4382   }
   4383 
   4384   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
   4385 
   4386   const char *Exec =
   4387     Args.MakeArgString(getToolChain().GetProgramPath("ld"));
   4388   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   4389 }
   4390 
   4391 void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
   4392                                       const InputInfo &Output,
   4393                                       const InputInfoList &Inputs,
   4394                                       const ArgList &Args,
   4395                                       const char *LinkingOutput) const {
   4396   ArgStringList CmdArgs;
   4397 
   4398   if (Output.isFilename()) {
   4399     CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
   4400                                          Output.getFilename()));
   4401   } else {
   4402     assert(Output.isNothing() && "Invalid output.");
   4403   }
   4404 
   4405   if (!Args.hasArg(options::OPT_nostdlib) &&
   4406     !Args.hasArg(options::OPT_nostartfiles)) {
   4407     CmdArgs.push_back("-defaultlib:libcmt");
   4408   }
   4409 
   4410   CmdArgs.push_back("-nologo");
   4411 
   4412   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
   4413 
   4414   const char *Exec =
   4415     Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
   4416   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
   4417 }
   4418