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