Tools.cpp revision 6f4bed50c076d7c8dd115c4c8af150d44bb6b379
1//===--- Tools.cpp - Tools Implementations ------------------------------*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
11
12#include "clang/Driver/Action.h"
13#include "clang/Driver/Arg.h"
14#include "clang/Driver/ArgList.h"
15#include "clang/Driver/Driver.h"
16#include "clang/Driver/DriverDiagnostic.h"
17#include "clang/Driver/Compilation.h"
18#include "clang/Driver/Job.h"
19#include "clang/Driver/HostInfo.h"
20#include "clang/Driver/Option.h"
21#include "clang/Driver/Options.h"
22#include "clang/Driver/ToolChain.h"
23#include "clang/Driver/Util.h"
24
25#include "llvm/ADT/SmallString.h"
26#include "llvm/ADT/StringSwitch.h"
27#include "llvm/ADT/Twine.h"
28#include "llvm/Support/Format.h"
29#include "llvm/Support/raw_ostream.h"
30#include "llvm/System/Host.h"
31#include "llvm/System/Process.h"
32
33#include "InputInfo.h"
34#include "ToolChains.h"
35
36using namespace clang::driver;
37using namespace clang::driver::tools;
38
39/// CheckPreprocessingOptions - Perform some validation of preprocessing
40/// arguments that is shared with gcc.
41static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
42  if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
43    if (!Args.hasArg(options::OPT_E))
44      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
45        << A->getAsString(Args) << "-E";
46}
47
48/// CheckCodeGenerationOptions - Perform some validation of code generation
49/// arguments that is shared with gcc.
50static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
51  // In gcc, only ARM checks this, but it seems reasonable to check universally.
52  if (Args.hasArg(options::OPT_static))
53    if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
54                                       options::OPT_mdynamic_no_pic))
55      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
56        << A->getAsString(Args) << "-static";
57}
58
59// Quote target names for inclusion in GNU Make dependency files.
60// Only the characters '$', '#', ' ', '\t' are quoted.
61static void QuoteTarget(llvm::StringRef Target,
62                        llvm::SmallVectorImpl<char> &Res) {
63  for (unsigned i = 0, e = Target.size(); i != e; ++i) {
64    switch (Target[i]) {
65    case ' ':
66    case '\t':
67      // Escape the preceding backslashes
68      for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
69        Res.push_back('\\');
70
71      // Escape the space/tab
72      Res.push_back('\\');
73      break;
74    case '$':
75      Res.push_back('$');
76      break;
77    case '#':
78      Res.push_back('\\');
79      break;
80    default:
81      break;
82    }
83
84    Res.push_back(Target[i]);
85  }
86}
87
88void Clang::AddPreprocessingOptions(const Driver &D,
89                                    const ArgList &Args,
90                                    ArgStringList &CmdArgs,
91                                    const InputInfo &Output,
92                                    const InputInfoList &Inputs) const {
93  Arg *A;
94
95  CheckPreprocessingOptions(D, Args);
96
97  Args.AddLastArg(CmdArgs, options::OPT_C);
98  Args.AddLastArg(CmdArgs, options::OPT_CC);
99
100  // Handle dependency file generation.
101  if ((A = Args.getLastArg(options::OPT_M)) ||
102      (A = Args.getLastArg(options::OPT_MM)) ||
103      (A = Args.getLastArg(options::OPT_MD)) ||
104      (A = Args.getLastArg(options::OPT_MMD))) {
105    // Determine the output location.
106    const char *DepFile;
107    if (Output.getType() == types::TY_Dependencies) {
108      if (Output.isPipe())
109        DepFile = "-";
110      else
111        DepFile = Output.getFilename();
112    } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
113      DepFile = MF->getValue(Args);
114    } else if (A->getOption().matches(options::OPT_M) ||
115               A->getOption().matches(options::OPT_MM)) {
116      DepFile = "-";
117    } else {
118      DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
119    }
120    CmdArgs.push_back("-dependency-file");
121    CmdArgs.push_back(DepFile);
122
123    // Add a default target if one wasn't specified.
124    if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
125      const char *DepTarget;
126
127      // If user provided -o, that is the dependency target, except
128      // when we are only generating a dependency file.
129      Arg *OutputOpt = Args.getLastArg(options::OPT_o);
130      if (OutputOpt && Output.getType() != types::TY_Dependencies) {
131        DepTarget = OutputOpt->getValue(Args);
132      } else {
133        // Otherwise derive from the base input.
134        //
135        // FIXME: This should use the computed output file location.
136        llvm::sys::Path P(Inputs[0].getBaseInput());
137
138        P.eraseSuffix();
139        P.appendSuffix("o");
140        DepTarget = Args.MakeArgString(P.getLast());
141      }
142
143      CmdArgs.push_back("-MT");
144      llvm::SmallString<128> Quoted;
145      QuoteTarget(DepTarget, Quoted);
146      CmdArgs.push_back(Args.MakeArgString(Quoted));
147    }
148
149    if (A->getOption().matches(options::OPT_M) ||
150        A->getOption().matches(options::OPT_MD))
151      CmdArgs.push_back("-sys-header-deps");
152  }
153
154  Args.AddLastArg(CmdArgs, options::OPT_MP);
155
156  // Convert all -MQ <target> args to -MT <quoted target>
157  for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
158                                             options::OPT_MQ),
159         ie = Args.filtered_end(); it != ie; ++it) {
160    const Arg *A = *it;
161    A->claim();
162
163    if (A->getOption().matches(options::OPT_MQ)) {
164      CmdArgs.push_back("-MT");
165      llvm::SmallString<128> Quoted;
166      QuoteTarget(A->getValue(Args), Quoted);
167      CmdArgs.push_back(Args.MakeArgString(Quoted));
168
169    // -MT flag - no change
170    } else {
171      A->render(Args, CmdArgs);
172    }
173  }
174
175  // Add -i* options, and automatically translate to
176  // -include-pch/-include-pth for transparent PCH support. It's
177  // wonky, but we include looking for .gch so we can support seamless
178  // replacement into a build system already set up to be generating
179  // .gch files.
180  for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
181         ie = Args.filtered_end(); it != ie; ++it) {
182    const Arg *A = it;
183
184    if (A->getOption().matches(options::OPT_include)) {
185      // Use PCH if the user requested it, except for C++ (for now).
186      bool UsePCH = D.CCCUsePCH;
187      if (types::isCXX(Inputs[0].getType()))
188        UsePCH = false;
189
190      bool FoundPTH = false;
191      bool FoundPCH = false;
192      llvm::sys::Path P(A->getValue(Args));
193      if (UsePCH) {
194        P.appendSuffix("pch");
195        if (P.exists())
196          FoundPCH = true;
197        else
198          P.eraseSuffix();
199      }
200
201      if (!FoundPCH) {
202        P.appendSuffix("pth");
203        if (P.exists())
204          FoundPTH = true;
205        else
206          P.eraseSuffix();
207      }
208
209      if (!FoundPCH && !FoundPTH) {
210        P.appendSuffix("gch");
211        if (P.exists()) {
212          FoundPCH = UsePCH;
213          FoundPTH = !UsePCH;
214        }
215        else
216          P.eraseSuffix();
217      }
218
219      if (FoundPCH || FoundPTH) {
220        A->claim();
221        if (UsePCH)
222          CmdArgs.push_back("-include-pch");
223        else
224          CmdArgs.push_back("-include-pth");
225        CmdArgs.push_back(Args.MakeArgString(P.str()));
226        continue;
227      }
228    }
229
230    // Not translated, render as usual.
231    A->claim();
232    A->render(Args, CmdArgs);
233  }
234
235  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
236  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
237
238  // Add -Wp, and -Xassembler if using the preprocessor.
239
240  // FIXME: There is a very unfortunate problem here, some troubled
241  // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
242  // really support that we would have to parse and then translate
243  // those options. :(
244  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
245                       options::OPT_Xpreprocessor);
246
247  // -I- is a deprecated GCC feature, reject it.
248  if (Arg *A = Args.getLastArg(options::OPT_I_))
249    D.Diag(clang::diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
250}
251
252/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targetting.
253//
254// FIXME: tblgen this.
255static const char *getARMTargetCPU(const ArgList &Args,
256                                   const llvm::Triple &Triple) {
257  // FIXME: Warn on inconsistent use of -mcpu and -march.
258
259  // If we have -mcpu=, use that.
260  if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
261    return A->getValue(Args);
262
263  llvm::StringRef MArch;
264  if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
265    // Otherwise, if we have -march= choose the base CPU for that arch.
266    MArch = A->getValue(Args);
267  } else {
268    // Otherwise, use the Arch from the triple.
269    MArch = Triple.getArchName();
270  }
271
272  if (MArch == "armv2" || MArch == "armv2a")
273    return "arm2";
274  if (MArch == "armv3")
275    return "arm6";
276  if (MArch == "armv3m")
277    return "arm7m";
278  if (MArch == "armv4" || MArch == "armv4t")
279    return "arm7tdmi";
280  if (MArch == "armv5" || MArch == "armv5t")
281    return "arm10tdmi";
282  if (MArch == "armv5e" || MArch == "armv5te")
283    return "arm1026ejs";
284  if (MArch == "armv5tej")
285    return "arm926ej-s";
286  if (MArch == "armv6" || MArch == "armv6k")
287    return "arm1136jf-s";
288  if (MArch == "armv6j")
289    return "arm1136j-s";
290  if (MArch == "armv6z" || MArch == "armv6zk")
291    return "arm1176jzf-s";
292  if (MArch == "armv6t2")
293    return "arm1156t2-s";
294  if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
295    return "cortex-a8";
296  if (MArch == "armv7r" || MArch == "armv7-r")
297    return "cortex-r4";
298  if (MArch == "armv7m" || MArch == "armv7-m")
299    return "cortex-m3";
300  if (MArch == "ep9312")
301    return "ep9312";
302  if (MArch == "iwmmxt")
303    return "iwmmxt";
304  if (MArch == "xscale")
305    return "xscale";
306
307  // If all else failed, return the most base CPU LLVM supports.
308  return "arm7tdmi";
309}
310
311/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
312/// CPU.
313//
314// FIXME: This is redundant with -mcpu, why does LLVM use this.
315// FIXME: tblgen this, or kill it!
316static const char *getLLVMArchSuffixForARM(llvm::StringRef CPU) {
317  if (CPU == "arm7tdmi" || CPU == "arm7tdmi-s" || CPU == "arm710t" ||
318      CPU == "arm720t" || CPU == "arm9" || CPU == "arm9tdmi" ||
319      CPU == "arm920" || CPU == "arm920t" || CPU == "arm922t" ||
320      CPU == "arm940t" || CPU == "ep9312")
321    return "v4t";
322
323  if (CPU == "arm10tdmi" || CPU == "arm1020t")
324    return "v5";
325
326  if (CPU == "arm9e" || CPU == "arm926ej-s" || CPU == "arm946e-s" ||
327      CPU == "arm966e-s" || CPU == "arm968e-s" || CPU == "arm10e" ||
328      CPU == "arm1020e" || CPU == "arm1022e" || CPU == "xscale" ||
329      CPU == "iwmmxt")
330    return "v5e";
331
332  if (CPU == "arm1136j-s" || CPU == "arm1136jf-s" || CPU == "arm1176jz-s" ||
333      CPU == "arm1176jzf-s" || CPU == "mpcorenovfp" || CPU == "mpcore")
334    return "v6";
335
336  if (CPU == "arm1156t2-s" || CPU == "arm1156t2f-s")
337    return "v6t2";
338
339  if (CPU == "cortex-a8" || CPU == "cortex-a9")
340    return "v7";
341
342  return "";
343}
344
345/// getLLVMTriple - Get the LLVM triple to use for a particular toolchain, which
346/// may depend on command line arguments.
347static std::string getLLVMTriple(const ToolChain &TC, const ArgList &Args) {
348  switch (TC.getTriple().getArch()) {
349  default:
350    return TC.getTripleString();
351
352  case llvm::Triple::arm:
353  case llvm::Triple::thumb: {
354    // FIXME: Factor into subclasses.
355    llvm::Triple Triple = TC.getTriple();
356
357    // Thumb2 is the default for V7 on Darwin.
358    //
359    // FIXME: Thumb should just be another -target-feaure, not in the triple.
360    llvm::StringRef Suffix =
361      getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
362    bool ThumbDefault =
363      (Suffix == "v7" && TC.getTriple().getOS() == llvm::Triple::Darwin);
364    std::string ArchName = "arm";
365    if (Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault))
366      ArchName = "thumb";
367    Triple.setArchName(ArchName + Suffix.str());
368
369    return Triple.getTriple();
370  }
371  }
372}
373
374// FIXME: Move to target hook.
375static bool isSignedCharDefault(const llvm::Triple &Triple) {
376  switch (Triple.getArch()) {
377  default:
378    return true;
379
380  case llvm::Triple::ppc:
381  case llvm::Triple::ppc64:
382    if (Triple.getOS() == llvm::Triple::Darwin)
383      return true;
384    return false;
385
386  case llvm::Triple::systemz:
387    return false;
388  }
389}
390
391void Clang::AddARMTargetArgs(const ArgList &Args,
392                             ArgStringList &CmdArgs) const {
393  const Driver &D = getToolChain().getDriver();
394  llvm::Triple Triple = getToolChain().getTriple();
395
396  // Select the ABI to use.
397  //
398  // FIXME: Support -meabi.
399  const char *ABIName = 0;
400  if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
401    ABIName = A->getValue(Args);
402  } else {
403    // Select the default based on the platform.
404    llvm::StringRef env = Triple.getEnvironmentName();
405    if (env == "gnueabi")
406      ABIName = "aapcs-linux";
407    else if (env == "eabi")
408      ABIName = "aapcs";
409    else
410      ABIName = "apcs-gnu";
411  }
412  CmdArgs.push_back("-target-abi");
413  CmdArgs.push_back(ABIName);
414
415  // Set the CPU based on -march= and -mcpu=.
416  CmdArgs.push_back("-target-cpu");
417  CmdArgs.push_back(getARMTargetCPU(Args, Triple));
418
419  // Select the float ABI as determined by -msoft-float, -mhard-float, and
420  // -mfloat-abi=.
421  llvm::StringRef FloatABI;
422  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
423                               options::OPT_mhard_float,
424                               options::OPT_mfloat_abi_EQ)) {
425    if (A->getOption().matches(options::OPT_msoft_float))
426      FloatABI = "soft";
427    else if (A->getOption().matches(options::OPT_mhard_float))
428      FloatABI = "hard";
429    else {
430      FloatABI = A->getValue(Args);
431      if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
432        D.Diag(clang::diag::err_drv_invalid_mfloat_abi)
433          << A->getAsString(Args);
434        FloatABI = "soft";
435      }
436    }
437  }
438
439  // If unspecified, choose the default based on the platform.
440  if (FloatABI.empty()) {
441    const llvm::Triple &Triple = getToolChain().getTriple();
442    switch (Triple.getOS()) {
443    case llvm::Triple::Darwin: {
444      // Darwin defaults to "softfp" for v6 and v7.
445      //
446      // FIXME: Factor out an ARM class so we can cache the arch somewhere.
447      llvm::StringRef ArchName =
448        getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
449      if (ArchName.startswith("v6") || ArchName.startswith("v7"))
450        FloatABI = "softfp";
451      else
452        FloatABI = "soft";
453      break;
454    }
455
456    case llvm::Triple::Linux: {
457      llvm::StringRef Env = getToolChain().getTriple().getEnvironmentName();
458      if (Env == "gnueabi") {
459        FloatABI = "softfp";
460        break;
461      }
462    }
463    // fall through
464
465    default:
466      // Assume "soft", but warn the user we are guessing.
467      FloatABI = "soft";
468      D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft";
469      break;
470    }
471  }
472
473  if (FloatABI == "soft") {
474    // Floating point operations and argument passing are soft.
475    //
476    // FIXME: This changes CPP defines, we need -target-soft-float.
477    CmdArgs.push_back("-msoft-float");
478    CmdArgs.push_back("-mfloat-abi");
479    CmdArgs.push_back("soft");
480  } else if (FloatABI == "softfp") {
481    // Floating point operations are hard, but argument passing is soft.
482    CmdArgs.push_back("-mfloat-abi");
483    CmdArgs.push_back("soft");
484  } else {
485    // Floating point operations and argument passing are hard.
486    assert(FloatABI == "hard" && "Invalid float abi!");
487    CmdArgs.push_back("-mfloat-abi");
488    CmdArgs.push_back("hard");
489  }
490
491  // Set appropriate target features for floating point mode.
492  //
493  // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
494  // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
495  // stripped out by the ARM target.
496
497  // Use software floating point operations?
498  if (FloatABI == "soft") {
499    CmdArgs.push_back("-target-feature");
500    CmdArgs.push_back("+soft-float");
501  }
502
503  // Use software floating point argument passing?
504  if (FloatABI != "hard") {
505    CmdArgs.push_back("-target-feature");
506    CmdArgs.push_back("+soft-float-abi");
507  }
508
509  // Honor -mfpu=.
510  //
511  // FIXME: Centralize feature selection, defaulting shouldn't be also in the
512  // frontend target.
513  if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ)) {
514    llvm::StringRef FPU = A->getValue(Args);
515
516    // Set the target features based on the FPU.
517    if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
518      // Disable any default FPU support.
519      CmdArgs.push_back("-target-feature");
520      CmdArgs.push_back("-vfp2");
521      CmdArgs.push_back("-target-feature");
522      CmdArgs.push_back("-vfp3");
523      CmdArgs.push_back("-target-feature");
524      CmdArgs.push_back("-neon");
525    } else if (FPU == "vfp") {
526      CmdArgs.push_back("-target-feature");
527      CmdArgs.push_back("+vfp2");
528    } else if (FPU == "vfp3") {
529      CmdArgs.push_back("-target-feature");
530      CmdArgs.push_back("+vfp3");
531    } else if (FPU == "neon") {
532      CmdArgs.push_back("-target-feature");
533      CmdArgs.push_back("+neon");
534    } else
535      D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
536  }
537}
538
539void Clang::AddMIPSTargetArgs(const ArgList &Args,
540                             ArgStringList &CmdArgs) const {
541  const Driver &D = getToolChain().getDriver();
542
543  // Select the ABI to use.
544  const char *ABIName = 0;
545  if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
546    ABIName = A->getValue(Args);
547  } else {
548    ABIName = "o32";
549  }
550
551  CmdArgs.push_back("-target-abi");
552  CmdArgs.push_back(ABIName);
553
554  if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
555    llvm::StringRef MArch = A->getValue(Args);
556    CmdArgs.push_back("-target-cpu");
557
558    if ((MArch == "r2000") || (MArch == "r3000"))
559      CmdArgs.push_back("mips1");
560    else if (MArch == "r6000")
561      CmdArgs.push_back("mips2");
562    else
563      CmdArgs.push_back(MArch.str().c_str());
564  }
565
566  // Select the float ABI as determined by -msoft-float, -mhard-float, and
567  llvm::StringRef FloatABI;
568  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
569                               options::OPT_mhard_float)) {
570    if (A->getOption().matches(options::OPT_msoft_float))
571      FloatABI = "soft";
572    else if (A->getOption().matches(options::OPT_mhard_float))
573      FloatABI = "hard";
574  }
575
576  // If unspecified, choose the default based on the platform.
577  if (FloatABI.empty()) {
578    // Assume "soft", but warn the user we are guessing.
579    FloatABI = "soft";
580    D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft";
581  }
582
583  if (FloatABI == "soft") {
584    // Floating point operations and argument passing are soft.
585    //
586    // FIXME: This changes CPP defines, we need -target-soft-float.
587    CmdArgs.push_back("-msoft-float");
588  } else {
589    assert(FloatABI == "hard" && "Invalid float abi!");
590    CmdArgs.push_back("-mhard-float");
591  }
592}
593
594void Clang::AddX86TargetArgs(const ArgList &Args,
595                             ArgStringList &CmdArgs) const {
596  if (!Args.hasFlag(options::OPT_mred_zone,
597                    options::OPT_mno_red_zone,
598                    true) ||
599      Args.hasArg(options::OPT_mkernel) ||
600      Args.hasArg(options::OPT_fapple_kext))
601    CmdArgs.push_back("-disable-red-zone");
602
603  if (Args.hasFlag(options::OPT_msoft_float,
604                   options::OPT_mno_soft_float,
605                   false))
606    CmdArgs.push_back("-no-implicit-float");
607
608  const char *CPUName = 0;
609  if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
610    if (llvm::StringRef(A->getValue(Args)) == "native") {
611      // FIXME: Reject attempts to use -march=native unless the target matches
612      // the host.
613      //
614      // FIXME: We should also incorporate the detected target features for use
615      // with -native.
616      std::string CPU = llvm::sys::getHostCPUName();
617      if (!CPU.empty())
618        CPUName = Args.MakeArgString(CPU);
619    } else
620      CPUName = A->getValue(Args);
621  }
622
623  // Select the default CPU if none was given (or detection failed).
624  if (!CPUName) {
625    // FIXME: Need target hooks.
626    if (getToolChain().getOS().startswith("darwin")) {
627      if (getToolChain().getArchName() == "x86_64")
628        CPUName = "core2";
629      else if (getToolChain().getArchName() == "i386")
630        CPUName = "yonah";
631    } else if (getToolChain().getOS().startswith("haiku"))  {
632      if (getToolChain().getArchName() == "x86_64")
633        CPUName = "x86-64";
634      else if (getToolChain().getArchName() == "i386")
635        CPUName = "i586";
636    } else {
637      if (getToolChain().getArchName() == "x86_64")
638        CPUName = "x86-64";
639      else if (getToolChain().getArchName() == "i386")
640        CPUName = "pentium4";
641    }
642  }
643
644  if (CPUName) {
645    CmdArgs.push_back("-target-cpu");
646    CmdArgs.push_back(CPUName);
647  }
648
649  for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
650         ie = Args.filtered_end(); it != ie; ++it) {
651    llvm::StringRef Name = (*it)->getOption().getName();
652    (*it)->claim();
653
654    // Skip over "-m".
655    assert(Name.startswith("-m") && "Invalid feature name.");
656    Name = Name.substr(2);
657
658    bool IsNegative = Name.startswith("no-");
659    if (IsNegative)
660      Name = Name.substr(3);
661
662    CmdArgs.push_back("-target-feature");
663    CmdArgs.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
664  }
665}
666
667static bool needsExceptions(const ArgList &Args,  types::ID InputType,
668                            const llvm::Triple &Triple) {
669  if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
670                               options::OPT_fno_exceptions)) {
671    if (A->getOption().matches(options::OPT_fexceptions))
672      return true;
673    else
674      return false;
675  }
676  switch (InputType) {
677  case types::TY_CXX: case types::TY_CXXHeader:
678  case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
679  case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
680  case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader:
681    return true;
682
683  case types::TY_ObjC: case types::TY_ObjCHeader:
684  case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader:
685    if (Args.hasArg(options::OPT_fobjc_nonfragile_abi))
686      return true;
687    if (Triple.getOS() != llvm::Triple::Darwin)
688      return false;
689    return (Triple.getDarwinMajorNumber() >= 9 &&
690            Triple.getArch() == llvm::Triple::x86_64);
691
692  default:
693    return false;
694  }
695}
696
697/// getEffectiveClangTriple - Get the "effective" target triple, which is the
698/// triple for the target but with the OS version potentially modified for
699/// Darwin's -mmacosx-version-min.
700static std::string getEffectiveClangTriple(const Driver &D,
701                                           const ToolChain &TC,
702                                           const ArgList &Args) {
703  llvm::Triple Triple(getLLVMTriple(TC, Args));
704
705  // Handle -mmacosx-version-min and -miphoneos-version-min.
706  if (Triple.getOS() != llvm::Triple::Darwin) {
707    // Diagnose use of -mmacosx-version-min and -miphoneos-version-min on
708    // non-Darwin.
709    if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ,
710                                 options::OPT_miphoneos_version_min_EQ))
711      D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
712  } else {
713    const toolchains::Darwin &DarwinTC(
714      reinterpret_cast<const toolchains::Darwin&>(TC));
715
716    // If the target isn't initialized (e.g., an unknown Darwin platform, return
717    // the default triple).
718    if (!DarwinTC.isTargetInitialized())
719      return Triple.getTriple();
720
721    unsigned Version[3];
722    DarwinTC.getTargetVersion(Version);
723
724    // Mangle the target version into the OS triple component.  For historical
725    // reasons that make little sense, the version passed here is the "darwin"
726    // version, which drops the 10 and offsets by 4. See inverse code when
727    // setting the OS version preprocessor define.
728    if (!DarwinTC.isTargetIPhoneOS()) {
729      Version[0] = Version[1] + 4;
730      Version[1] = Version[2];
731      Version[2] = 0;
732    } else {
733      // Use the environment to communicate that we are targetting iPhoneOS.
734      Triple.setEnvironmentName("iphoneos");
735    }
736
737    llvm::SmallString<16> Str;
738    llvm::raw_svector_ostream(Str) << "darwin" << Version[0]
739                                   << "." << Version[1] << "." << Version[2];
740    Triple.setOSName(Str.str());
741  }
742
743  return Triple.getTriple();
744}
745
746void Clang::ConstructJob(Compilation &C, const JobAction &JA,
747                         Job &Dest,
748                         const InputInfo &Output,
749                         const InputInfoList &Inputs,
750                         const ArgList &Args,
751                         const char *LinkingOutput) const {
752  bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
753                                  options::OPT_fapple_kext);
754  const Driver &D = getToolChain().getDriver();
755  ArgStringList CmdArgs;
756
757  assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
758
759  // Invoke ourselves in -cc1 mode.
760  //
761  // FIXME: Implement custom jobs for internal actions.
762  CmdArgs.push_back("-cc1");
763
764  // Add the "effective" target triple.
765  CmdArgs.push_back("-triple");
766  std::string TripleStr = getEffectiveClangTriple(D, getToolChain(), Args);
767  CmdArgs.push_back(Args.MakeArgString(TripleStr));
768
769  // Select the appropriate action.
770  if (isa<AnalyzeJobAction>(JA)) {
771    assert(JA.getType() == types::TY_Plist && "Invalid output type.");
772    CmdArgs.push_back("-analyze");
773  } else if (isa<PreprocessJobAction>(JA)) {
774    if (Output.getType() == types::TY_Dependencies)
775      CmdArgs.push_back("-Eonly");
776    else
777      CmdArgs.push_back("-E");
778  } else if (isa<AssembleJobAction>(JA)) {
779    CmdArgs.push_back("-emit-obj");
780
781    // At -O0, we use -mrelax-all by default.
782    bool IsOpt = false;
783    if (Arg *A = Args.getLastArg(options::OPT_O_Group))
784      IsOpt = !A->getOption().matches(options::OPT_O0);
785    if (Args.hasFlag(options::OPT_mrelax_all,
786                      options::OPT_mno_relax_all,
787                      !IsOpt))
788      CmdArgs.push_back("-mrelax-all");
789  } else if (isa<PrecompileJobAction>(JA)) {
790    // Use PCH if the user requested it, except for C++ (for now).
791    bool UsePCH = D.CCCUsePCH;
792    if (types::isCXX(Inputs[0].getType()))
793      UsePCH = false;
794
795    if (UsePCH)
796      CmdArgs.push_back("-emit-pch");
797    else
798      CmdArgs.push_back("-emit-pth");
799  } else {
800    assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
801
802    if (JA.getType() == types::TY_Nothing) {
803      CmdArgs.push_back("-fsyntax-only");
804    } else if (JA.getType() == types::TY_LLVM_IR ||
805               JA.getType() == types::TY_LTO_IR) {
806      CmdArgs.push_back("-emit-llvm");
807    } else if (JA.getType() == types::TY_LLVM_BC ||
808               JA.getType() == types::TY_LTO_BC) {
809      CmdArgs.push_back("-emit-llvm-bc");
810    } else if (JA.getType() == types::TY_PP_Asm) {
811      CmdArgs.push_back("-S");
812    } else if (JA.getType() == types::TY_AST) {
813      CmdArgs.push_back("-emit-pch");
814    } else if (JA.getType() == types::TY_RewrittenObjC) {
815      CmdArgs.push_back("-rewrite-objc");
816    } else {
817      assert(JA.getType() == types::TY_PP_Asm &&
818             "Unexpected output type!");
819    }
820  }
821
822  // The make clang go fast button.
823  CmdArgs.push_back("-disable-free");
824
825  // Disable the verification pass in -asserts builds.
826#ifdef NDEBUG
827  CmdArgs.push_back("-disable-llvm-verifier");
828#endif
829
830  // Set the main file name, so that debug info works even with
831  // -save-temps.
832  CmdArgs.push_back("-main-file-name");
833  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
834
835  // Some flags which affect the language (via preprocessor
836  // defines). See darwin::CC1::AddCPPArgs.
837  if (Args.hasArg(options::OPT_static))
838    CmdArgs.push_back("-static-define");
839
840  if (isa<AnalyzeJobAction>(JA)) {
841    // Enable region store model by default.
842    CmdArgs.push_back("-analyzer-store=region");
843
844    // Treat blocks as analysis entry points.
845    CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
846
847    // Add default argument set.
848    if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
849      CmdArgs.push_back("-analyzer-check-dead-stores");
850      // Do not enable the security-syntatic check since it
851      // it needs to be refined (known issues).
852      // CmdArgs.push_back("-analyzer-check-security-syntactic");
853      CmdArgs.push_back("-analyzer-check-objc-mem");
854      CmdArgs.push_back("-analyzer-eagerly-assume");
855      CmdArgs.push_back("-analyzer-check-objc-methodsigs");
856      // Do not enable the missing -dealloc check.
857      // '-analyzer-check-objc-missing-dealloc',
858      CmdArgs.push_back("-analyzer-check-objc-unused-ivars");
859    }
860
861    // Set the output format. The default is plist, for (lame) historical
862    // reasons.
863    CmdArgs.push_back("-analyzer-output");
864    if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
865      CmdArgs.push_back(A->getValue(Args));
866    else
867      CmdArgs.push_back("plist");
868
869    // Disable the presentation of standard compiler warnings when
870    // using --analyze.  We only want to show static analyzer diagnostics
871    // or frontend errors.
872    CmdArgs.push_back("-w");
873
874    // Add -Xanalyzer arguments when running as analyzer.
875    Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
876  }
877
878  CheckCodeGenerationOptions(D, Args);
879
880  // Perform argument translation for LLVM backend. This
881  // takes some care in reconciling with llvm-gcc. The
882  // issue is that llvm-gcc translates these options based on
883  // the values in cc1, whereas we are processing based on
884  // the driver arguments.
885
886  // This comes from the default translation the driver + cc1
887  // would do to enable flag_pic.
888  //
889  // FIXME: Centralize this code.
890  bool PICEnabled = (Args.hasArg(options::OPT_fPIC) ||
891                     Args.hasArg(options::OPT_fpic) ||
892                     Args.hasArg(options::OPT_fPIE) ||
893                     Args.hasArg(options::OPT_fpie));
894  bool PICDisabled = (Args.hasArg(options::OPT_mkernel) ||
895                      Args.hasArg(options::OPT_static));
896  const char *Model = getToolChain().GetForcedPicModel();
897  if (!Model) {
898    if (Args.hasArg(options::OPT_mdynamic_no_pic))
899      Model = "dynamic-no-pic";
900    else if (PICDisabled)
901      Model = "static";
902    else if (PICEnabled)
903      Model = "pic";
904    else
905      Model = getToolChain().GetDefaultRelocationModel();
906  }
907  if (llvm::StringRef(Model) != "pic") {
908    CmdArgs.push_back("-mrelocation-model");
909    CmdArgs.push_back(Model);
910  }
911
912  // Infer the __PIC__ value.
913  //
914  // FIXME:  This isn't quite right on Darwin, which always sets
915  // __PIC__=2.
916  if (strcmp(Model, "pic") == 0 || strcmp(Model, "dynamic-no-pic") == 0) {
917    CmdArgs.push_back("-pic-level");
918    CmdArgs.push_back(Args.hasArg(options::OPT_fPIC) ? "2" : "1");
919  }
920  if (!Args.hasFlag(options::OPT_fmerge_all_constants,
921                    options::OPT_fno_merge_all_constants))
922    CmdArgs.push_back("-no-merge-all-constants");
923
924  // LLVM Code Generator Options.
925
926  // FIXME: Set --enable-unsafe-fp-math.
927  if (Args.hasFlag(options::OPT_fno_omit_frame_pointer,
928                   options::OPT_fomit_frame_pointer))
929    CmdArgs.push_back("-mdisable-fp-elim");
930  if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
931                    options::OPT_fno_zero_initialized_in_bss))
932    CmdArgs.push_back("-mno-zero-initialized-in-bss");
933
934  // Decide whether to use verbose asm. Verbose assembly is the default on
935  // toolchains which have the integrated assembler on by default.
936  bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
937  if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
938                   IsVerboseAsmDefault) ||
939      Args.hasArg(options::OPT_dA))
940    CmdArgs.push_back("-masm-verbose");
941
942  if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
943    CmdArgs.push_back("-mdebug-pass");
944    CmdArgs.push_back("Structure");
945  }
946  if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
947    CmdArgs.push_back("-mdebug-pass");
948    CmdArgs.push_back("Arguments");
949  }
950
951  // Enable -mconstructor-aliases except on darwin, where we have to
952  // work around a linker bug;  see <rdar://problem/7651567>.
953  if (getToolChain().getTriple().getOS() != llvm::Triple::Darwin)
954    CmdArgs.push_back("-mconstructor-aliases");
955
956  // This is a coarse approximation of what llvm-gcc actually does, both
957  // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
958  // complicated ways.
959  bool AsynchronousUnwindTables =
960    Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
961                 options::OPT_fno_asynchronous_unwind_tables,
962                 getToolChain().IsUnwindTablesDefault() &&
963                 !KernelOrKext);
964  if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
965                   AsynchronousUnwindTables))
966    CmdArgs.push_back("-munwind-tables");
967
968  if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
969    CmdArgs.push_back("-mlimit-float-precision");
970    CmdArgs.push_back(A->getValue(Args));
971  }
972
973  // FIXME: Handle -mtune=.
974  (void) Args.hasArg(options::OPT_mtune_EQ);
975
976  if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
977    CmdArgs.push_back("-mcode-model");
978    CmdArgs.push_back(A->getValue(Args));
979  }
980
981  // Add target specific cpu and features flags.
982  switch(getToolChain().getTriple().getArch()) {
983  default:
984    break;
985
986  case llvm::Triple::arm:
987  case llvm::Triple::thumb:
988    AddARMTargetArgs(Args, CmdArgs);
989    break;
990
991  case llvm::Triple::mips:
992  case llvm::Triple::mipsel:
993    AddMIPSTargetArgs(Args, CmdArgs);
994    break;
995
996  case llvm::Triple::x86:
997  case llvm::Triple::x86_64:
998    AddX86TargetArgs(Args, CmdArgs);
999    break;
1000  }
1001
1002  // -mno-omit-leaf-frame-pointer is default.
1003  if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
1004                   options::OPT_mno_omit_leaf_frame_pointer, false))
1005    CmdArgs.push_back("-momit-leaf-frame-pointer");
1006
1007  // -fno-math-errno is default.
1008  if (Args.hasFlag(options::OPT_fmath_errno,
1009                   options::OPT_fno_math_errno,
1010                   false))
1011    CmdArgs.push_back("-fmath-errno");
1012
1013  // Explicitly error on some things we know we don't support and can't just
1014  // ignore.
1015  types::ID InputType = Inputs[0].getType();
1016  Arg *Unsupported;
1017  if ((Unsupported = Args.getLastArg(options::OPT_MG)) ||
1018      (Unsupported = Args.getLastArg(options::OPT_iframework)) ||
1019      (Unsupported = Args.getLastArg(options::OPT_fshort_enums)))
1020    D.Diag(clang::diag::err_drv_clang_unsupported)
1021      << Unsupported->getOption().getName();
1022
1023  if (types::isCXX(InputType) &&
1024      getToolChain().getTriple().getOS() == llvm::Triple::Darwin &&
1025      getToolChain().getTriple().getArch() == llvm::Triple::x86) {
1026    if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)))
1027      D.Diag(clang::diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
1028        << Unsupported->getOption().getName();
1029  }
1030
1031  Args.AddAllArgs(CmdArgs, options::OPT_v);
1032  Args.AddLastArg(CmdArgs, options::OPT_P);
1033  Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
1034
1035  // Special case debug options to only pass -g to clang. This is
1036  // wrong.
1037  Args.ClaimAllArgs(options::OPT_g_Group);
1038  if (Arg *A = Args.getLastArg(options::OPT_g_Group))
1039    if (!A->getOption().matches(options::OPT_g0))
1040      CmdArgs.push_back("-g");
1041
1042  Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
1043  Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
1044
1045  Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
1046
1047  Args.AddLastArg(CmdArgs, options::OPT_nostdinc);
1048  Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
1049  Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
1050
1051  // Pass the path to compiler resource files.
1052  CmdArgs.push_back("-resource-dir");
1053  CmdArgs.push_back(D.ResourceDir.c_str());
1054
1055  // Add preprocessing options like -I, -D, etc. if we are using the
1056  // preprocessor.
1057  //
1058  // FIXME: Support -fpreprocessed
1059  if (types::getPreprocessedType(InputType) != types::TY_INVALID)
1060    AddPreprocessingOptions(D, Args, CmdArgs, Output, Inputs);
1061
1062  // Manually translate -O to -O2 and -O4 to -O3; let clang reject
1063  // others.
1064  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1065    if (A->getOption().matches(options::OPT_O4))
1066      CmdArgs.push_back("-O3");
1067    else if (A->getOption().matches(options::OPT_O) &&
1068             A->getValue(Args)[0] == '\0')
1069      CmdArgs.push_back("-O2");
1070    else
1071      A->render(Args, CmdArgs);
1072  }
1073
1074  Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
1075  Args.AddLastArg(CmdArgs, options::OPT_pedantic);
1076  Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
1077  Args.AddLastArg(CmdArgs, options::OPT_w);
1078
1079  // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
1080  // (-ansi is equivalent to -std=c89).
1081  //
1082  // If a std is supplied, only add -trigraphs if it follows the
1083  // option.
1084  if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
1085    if (Std->getOption().matches(options::OPT_ansi))
1086      if (types::isCXX(InputType))
1087        CmdArgs.push_back("-std=c++98");
1088      else
1089        CmdArgs.push_back("-std=c89");
1090    else
1091      Std->render(Args, CmdArgs);
1092
1093    if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
1094                                 options::OPT_trigraphs))
1095      if (A != Std)
1096        A->render(Args, CmdArgs);
1097  } else {
1098    // Honor -std-default.
1099    //
1100    // FIXME: Clang doesn't correctly handle -std= when the input language
1101    // doesn't match. For the time being just ignore this for C++ inputs;
1102    // eventually we want to do all the standard defaulting here instead of
1103    // splitting it between the driver and clang -cc1.
1104    if (!types::isCXX(InputType))
1105        Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
1106                                  "-std=", /*Joined=*/true);
1107    Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
1108  }
1109
1110  // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
1111  if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
1112    if (Asm->getOption().matches(options::OPT_fasm))
1113      CmdArgs.push_back("-fgnu-keywords");
1114    else
1115      CmdArgs.push_back("-fno-gnu-keywords");
1116  }
1117
1118  if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) {
1119    CmdArgs.push_back("-ftemplate-depth");
1120    CmdArgs.push_back(A->getValue(Args));
1121  }
1122
1123  if (Args.hasArg(options::OPT__relocatable_pch))
1124    CmdArgs.push_back("-relocatable-pch");
1125
1126  if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
1127    CmdArgs.push_back("-fconstant-string-class");
1128    CmdArgs.push_back(A->getValue(Args));
1129  }
1130
1131  if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
1132    CmdArgs.push_back("-ftabstop");
1133    CmdArgs.push_back(A->getValue(Args));
1134  }
1135
1136  CmdArgs.push_back("-ferror-limit");
1137  if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
1138    CmdArgs.push_back(A->getValue(Args));
1139  else
1140    CmdArgs.push_back("19");
1141
1142  if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
1143    CmdArgs.push_back("-fmacro-backtrace-limit");
1144    CmdArgs.push_back(A->getValue(Args));
1145  }
1146
1147  if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
1148    CmdArgs.push_back("-ftemplate-backtrace-limit");
1149    CmdArgs.push_back(A->getValue(Args));
1150  }
1151
1152  // Pass -fmessage-length=.
1153  CmdArgs.push_back("-fmessage-length");
1154  if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
1155    CmdArgs.push_back(A->getValue(Args));
1156  } else {
1157    // If -fmessage-length=N was not specified, determine whether this is a
1158    // terminal and, if so, implicitly define -fmessage-length appropriately.
1159    unsigned N = llvm::sys::Process::StandardErrColumns();
1160    CmdArgs.push_back(Args.MakeArgString(llvm::Twine(N)));
1161  }
1162
1163  if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
1164    CmdArgs.push_back("-fvisibility");
1165    CmdArgs.push_back(A->getValue(Args));
1166  }
1167
1168  Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
1169
1170  // -fhosted is default.
1171  if (KernelOrKext || Args.hasFlag(options::OPT_ffreestanding,
1172                                   options::OPT_fhosted,
1173                                   false))
1174    CmdArgs.push_back("-ffreestanding");
1175
1176  // Forward -f (flag) options which we can pass directly.
1177  Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
1178  Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
1179  Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
1180
1181  // -flax-vector-conversions is default.
1182  if (!Args.hasFlag(options::OPT_flax_vector_conversions,
1183                    options::OPT_fno_lax_vector_conversions))
1184    CmdArgs.push_back("-fno-lax-vector-conversions");
1185
1186  // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
1187  // takes precedence.
1188  const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
1189  if (!GCArg)
1190    GCArg = Args.getLastArg(options::OPT_fobjc_gc);
1191  if (GCArg) {
1192    if (getToolChain().SupportsObjCGC()) {
1193      GCArg->render(Args, CmdArgs);
1194    } else {
1195      // FIXME: We should move this to a hard error.
1196      D.Diag(clang::diag::warn_drv_objc_gc_unsupported)
1197        << GCArg->getAsString(Args);
1198    }
1199  }
1200
1201  Args.AddLastArg(CmdArgs, options::OPT_fno_show_column);
1202  Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
1203  Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
1204  Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
1205  Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
1206  Args.AddLastArg(CmdArgs, options::OPT_fwrapv);
1207  Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
1208
1209  Args.AddLastArg(CmdArgs, options::OPT_pthread);
1210
1211  // -stack-protector=0 is default.
1212  unsigned StackProtectorLevel = 0;
1213  if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
1214                               options::OPT_fstack_protector_all,
1215                               options::OPT_fstack_protector)) {
1216    if (A->getOption().matches(options::OPT_fstack_protector))
1217      StackProtectorLevel = 1;
1218    else if (A->getOption().matches(options::OPT_fstack_protector_all))
1219      StackProtectorLevel = 2;
1220  } else
1221    StackProtectorLevel = getToolChain().GetDefaultStackProtectorLevel();
1222  if (StackProtectorLevel) {
1223    CmdArgs.push_back("-stack-protector");
1224    CmdArgs.push_back(Args.MakeArgString(llvm::Twine(StackProtectorLevel)));
1225  }
1226
1227  // Forward -f options with positive and negative forms; we translate
1228  // these by hand.
1229
1230  // -fbuiltin is default.
1231  if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
1232    CmdArgs.push_back("-fno-builtin");
1233
1234  if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
1235                    options::OPT_fno_assume_sane_operator_new))
1236    CmdArgs.push_back("-fno-assume-sane-operator-new");
1237
1238  // -fblocks=0 is default.
1239  if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
1240                   getToolChain().IsBlocksDefault())) {
1241    CmdArgs.push_back("-fblocks");
1242  }
1243
1244  // -faccess-control is default.
1245  if (Args.hasFlag(options::OPT_fno_access_control,
1246                   options::OPT_faccess_control,
1247                   false))
1248    CmdArgs.push_back("-fno-access-control");
1249
1250  // -fexceptions=0 is default.
1251  if (needsExceptions(Args, InputType, getToolChain().getTriple()))
1252    CmdArgs.push_back("-fexceptions");
1253
1254  if (getToolChain().UseSjLjExceptions())
1255    CmdArgs.push_back("-fsjlj-exceptions");
1256
1257  // -frtti is default.
1258  if (KernelOrKext ||
1259      !Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti))
1260    CmdArgs.push_back("-fno-rtti");
1261
1262  // -fsigned-char is default.
1263  if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
1264                    isSignedCharDefault(getToolChain().getTriple())))
1265    CmdArgs.push_back("-fno-signed-char");
1266
1267  // -fthreadsafe-static is default.
1268  if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
1269                    options::OPT_fno_threadsafe_statics))
1270    CmdArgs.push_back("-fno-threadsafe-statics");
1271
1272  // -fuse-cxa-atexit is default.
1273  if (KernelOrKext || !Args.hasFlag(options::OPT_fuse_cxa_atexit,
1274                                    options::OPT_fno_use_cxa_atexit))
1275    CmdArgs.push_back("-fno-use-cxa-atexit");
1276
1277  // -fms-extensions=0 is default.
1278  if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
1279                   getToolChain().getTriple().getOS() == llvm::Triple::Win32))
1280    CmdArgs.push_back("-fms-extensions");
1281
1282  // -fgnu-keywords default varies depending on language; only pass if
1283  // specified.
1284  if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
1285                               options::OPT_fno_gnu_keywords))
1286    A->render(Args, CmdArgs);
1287
1288  // -fnext-runtime is default.
1289  if (!Args.hasFlag(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
1290                    getToolChain().getTriple().getOS() == llvm::Triple::Darwin))
1291    CmdArgs.push_back("-fgnu-runtime");
1292
1293  // -fobjc-nonfragile-abi=0 is default.
1294  if (types::isObjC(InputType)) {
1295    unsigned Version = 1;
1296    if (Args.hasArg(options::OPT_fobjc_nonfragile_abi) ||
1297        getToolChain().IsObjCNonFragileABIDefault())
1298      Version = 2;
1299    if (Arg *A = Args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
1300      if (llvm::StringRef(A->getValue(Args)) == "1")
1301        Version = 1;
1302      else if (llvm::StringRef(A->getValue(Args)) == "2")
1303        Version = 2;
1304      else
1305        D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
1306    }
1307
1308    if (Version == 2) {
1309      CmdArgs.push_back("-fobjc-nonfragile-abi");
1310
1311      // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
1312      // legacy is the default.
1313      if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
1314                        options::OPT_fno_objc_legacy_dispatch,
1315                        getToolChain().IsObjCLegacyDispatchDefault())) {
1316        if (getToolChain().UseObjCMixedDispatch())
1317          CmdArgs.push_back("-fobjc-dispatch-method=mixed");
1318        else
1319          CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
1320      }
1321    }
1322
1323    // FIXME: -fobjc-nonfragile-abi2 is a transient option meant to expose
1324    // features in testing.  It will eventually be removed.
1325    if (Args.hasArg(options::OPT_fobjc_nonfragile_abi2))
1326      CmdArgs.push_back("-fobjc-nonfragile-abi2");
1327  }
1328
1329  if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
1330                    options::OPT_fno_assume_sane_operator_new))
1331    CmdArgs.push_back("-fno-assume-sane-operator-new");
1332
1333  // -fconstant-cfstrings is default, and may be subject to argument translation
1334  // on Darwin.
1335  if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
1336                    options::OPT_fno_constant_cfstrings) ||
1337      !Args.hasFlag(options::OPT_mconstant_cfstrings,
1338                    options::OPT_mno_constant_cfstrings))
1339    CmdArgs.push_back("-fno-constant-cfstrings");
1340
1341  // -fshort-wchar default varies depending on platform; only
1342  // pass if specified.
1343  if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
1344    A->render(Args, CmdArgs);
1345
1346  // -fno-pascal-strings is default, only pass non-default. If the tool chain
1347  // happened to translate to -mpascal-strings, we want to back translate here.
1348  //
1349  // FIXME: This is gross; that translation should be pulled from the
1350  // tool chain.
1351  if (Args.hasFlag(options::OPT_fpascal_strings,
1352                   options::OPT_fno_pascal_strings,
1353                   false) ||
1354      Args.hasFlag(options::OPT_mpascal_strings,
1355                   options::OPT_mno_pascal_strings,
1356                   false))
1357    CmdArgs.push_back("-fpascal-strings");
1358
1359  // -fcommon is default, only pass non-default.
1360  if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
1361    CmdArgs.push_back("-fno-common");
1362
1363  // -fsigned-bitfields is default, and clang doesn't yet support
1364  // --funsigned-bitfields.
1365  if (!Args.hasFlag(options::OPT_fsigned_bitfields,
1366                    options::OPT_funsigned_bitfields))
1367    D.Diag(clang::diag::warn_drv_clang_unsupported)
1368      << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
1369
1370  // -fcaret-diagnostics is default.
1371  if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
1372                    options::OPT_fno_caret_diagnostics, true))
1373    CmdArgs.push_back("-fno-caret-diagnostics");
1374
1375  // -fdiagnostics-fixit-info is default, only pass non-default.
1376  if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
1377                    options::OPT_fno_diagnostics_fixit_info))
1378    CmdArgs.push_back("-fno-diagnostics-fixit-info");
1379
1380  Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_binary);
1381
1382  // Enable -fdiagnostics-show-option by default.
1383  if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
1384                   options::OPT_fno_diagnostics_show_option))
1385    CmdArgs.push_back("-fdiagnostics-show-option");
1386
1387  if (const Arg *A =
1388        Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
1389    CmdArgs.push_back("-fdiagnostics-show-category");
1390    CmdArgs.push_back(A->getValue(Args));
1391  }
1392
1393  // Color diagnostics are the default, unless the terminal doesn't support
1394  // them.
1395  if (Args.hasFlag(options::OPT_fcolor_diagnostics,
1396                   options::OPT_fno_color_diagnostics) &&
1397      llvm::sys::Process::StandardErrHasColors())
1398    CmdArgs.push_back("-fcolor-diagnostics");
1399
1400  if (!Args.hasFlag(options::OPT_fshow_source_location,
1401                    options::OPT_fno_show_source_location))
1402    CmdArgs.push_back("-fno-show-source-location");
1403
1404  if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
1405    A->render(Args, CmdArgs);
1406
1407  // -fdollars-in-identifiers default varies depending on platform and
1408  // language; only pass if specified.
1409  if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
1410                               options::OPT_fno_dollars_in_identifiers)) {
1411    if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
1412      CmdArgs.push_back("-fdollars-in-identifiers");
1413    else
1414      CmdArgs.push_back("-fno-dollars-in-identifiers");
1415  }
1416
1417  // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
1418  // practical purposes.
1419  if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
1420                               options::OPT_fno_unit_at_a_time)) {
1421    if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
1422      D.Diag(clang::diag::warn_drv_clang_unsupported) << A->getAsString(Args);
1423  }
1424
1425  // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
1426  //
1427  // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
1428#if 0
1429  if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin &&
1430      (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
1431       getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
1432    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
1433      CmdArgs.push_back("-fno-builtin-strcat");
1434    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
1435      CmdArgs.push_back("-fno-builtin-strcpy");
1436  }
1437#endif
1438
1439  if (Arg *A = Args.getLastArg(options::OPT_traditional,
1440                               options::OPT_traditional_cpp))
1441    D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
1442
1443  Args.AddLastArg(CmdArgs, options::OPT_dM);
1444  Args.AddLastArg(CmdArgs, options::OPT_dD);
1445
1446  // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
1447  // parser.
1448  Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
1449  for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
1450         ie = Args.filtered_end(); it != ie; ++it) {
1451    (*it)->claim();
1452
1453    // We translate this by hand to the -cc1 argument, since nightly test uses
1454    // it and developers have been trained to spell it with -mllvm.
1455    if (llvm::StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
1456      CmdArgs.push_back("-disable-llvm-optzns");
1457    else
1458      (*it)->render(Args, CmdArgs);
1459  }
1460
1461  if (Output.getType() == types::TY_Dependencies) {
1462    // Handled with other dependency code.
1463  } else if (Output.isPipe()) {
1464    CmdArgs.push_back("-o");
1465    CmdArgs.push_back("-");
1466  } else if (Output.isFilename()) {
1467    CmdArgs.push_back("-o");
1468    CmdArgs.push_back(Output.getFilename());
1469  } else {
1470    assert(Output.isNothing() && "Invalid output.");
1471  }
1472
1473  for (InputInfoList::const_iterator
1474         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1475    const InputInfo &II = *it;
1476    CmdArgs.push_back("-x");
1477    CmdArgs.push_back(types::getTypeName(II.getType()));
1478    if (II.isPipe())
1479      CmdArgs.push_back("-");
1480    else if (II.isFilename())
1481      CmdArgs.push_back(II.getFilename());
1482    else
1483      II.getInputArg().renderAsInput(Args, CmdArgs);
1484  }
1485
1486  Args.AddAllArgs(CmdArgs, options::OPT_undef);
1487
1488  const char *Exec =
1489    Args.MakeArgString(getToolChain().GetProgramPath(C, "clang"));
1490
1491  // Optionally embed the -cc1 level arguments into the debug info, for build
1492  // analysis.
1493  if (getToolChain().UseDwarfDebugFlags()) {
1494    ArgStringList OriginalArgs;
1495    for (ArgList::const_iterator it = Args.begin(),
1496           ie = Args.end(); it != ie; ++it)
1497      (*it)->render(Args, OriginalArgs);
1498
1499    llvm::SmallString<256> Flags;
1500    Flags += Exec;
1501    for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
1502      Flags += " ";
1503      Flags += OriginalArgs[i];
1504    }
1505    CmdArgs.push_back("-dwarf-debug-flags");
1506    CmdArgs.push_back(Args.MakeArgString(Flags.str()));
1507  }
1508
1509  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
1510
1511  // Explicitly warn that these options are unsupported, even though
1512  // we are allowing compilation to continue.
1513  for (arg_iterator it = Args.filtered_begin(options::OPT_pg),
1514         ie = Args.filtered_end(); it != ie; ++it) {
1515    (*it)->claim();
1516    D.Diag(clang::diag::warn_drv_clang_unsupported) << (*it)->getAsString(Args);
1517  }
1518
1519  // Claim some arguments which clang supports automatically.
1520
1521  // -fpch-preprocess is used with gcc to add a special marker in the output to
1522  // include the PCH file. Clang's PTH solution is completely transparent, so we
1523  // do not need to deal with it at all.
1524  Args.ClaimAllArgs(options::OPT_fpch_preprocess);
1525
1526  // Claim some arguments which clang doesn't support, but we don't
1527  // care to warn the user about.
1528  Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
1529  Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
1530}
1531
1532void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
1533                           Job &Dest,
1534                           const InputInfo &Output,
1535                           const InputInfoList &Inputs,
1536                           const ArgList &Args,
1537                           const char *LinkingOutput) const {
1538  const Driver &D = getToolChain().getDriver();
1539  ArgStringList CmdArgs;
1540
1541  assert(Inputs.size() == 1 && "Unexpected number of inputs.");
1542  const InputInfo &Input = Inputs[0];
1543
1544  // Invoke ourselves in -cc1as mode.
1545  //
1546  // FIXME: Implement custom jobs for internal actions.
1547  CmdArgs.push_back("-cc1as");
1548
1549  // Add the "effective" target triple.
1550  CmdArgs.push_back("-triple");
1551  std::string TripleStr = getEffectiveClangTriple(D, getToolChain(), Args);
1552  CmdArgs.push_back(Args.MakeArgString(TripleStr));
1553
1554  // Set the output mode, we currently only expect to be used as a real
1555  // assembler.
1556  CmdArgs.push_back("-filetype");
1557  CmdArgs.push_back("obj");
1558
1559  // At -O0, we use -mrelax-all by default.
1560  bool IsOpt = false;
1561  if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1562    IsOpt = !A->getOption().matches(options::OPT_O0);
1563  if (Args.hasFlag(options::OPT_mrelax_all,
1564                    options::OPT_mno_relax_all,
1565                    !IsOpt))
1566    CmdArgs.push_back("-relax-all");
1567
1568  // FIXME: Add -force_cpusubtype_ALL support, once we have it.
1569
1570  // FIXME: Add -g support, once we have it.
1571
1572  // FIXME: Add -static support, once we have it.
1573
1574  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
1575                       options::OPT_Xassembler);
1576
1577  assert(Output.isFilename() && "Unexpected lipo output.");
1578  CmdArgs.push_back("-o");
1579  CmdArgs.push_back(Output.getFilename());
1580
1581  if (Input.isPipe()) {
1582    CmdArgs.push_back("-");
1583  } else {
1584    assert(Input.isFilename() && "Invalid input.");
1585    CmdArgs.push_back(Input.getFilename());
1586  }
1587
1588  const char *Exec =
1589    Args.MakeArgString(getToolChain().GetProgramPath(C, "clang"));
1590  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
1591}
1592
1593void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
1594                               Job &Dest,
1595                               const InputInfo &Output,
1596                               const InputInfoList &Inputs,
1597                               const ArgList &Args,
1598                               const char *LinkingOutput) const {
1599  const Driver &D = getToolChain().getDriver();
1600  ArgStringList CmdArgs;
1601
1602  for (ArgList::const_iterator
1603         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
1604    Arg *A = *it;
1605    if (A->getOption().hasForwardToGCC()) {
1606      // It is unfortunate that we have to claim here, as this means
1607      // we will basically never report anything interesting for
1608      // platforms using a generic gcc, even if we are just using gcc
1609      // to get to the assembler.
1610      A->claim();
1611      A->render(Args, CmdArgs);
1612    }
1613  }
1614
1615  RenderExtraToolArgs(JA, CmdArgs);
1616
1617  // If using a driver driver, force the arch.
1618  const std::string &Arch = getToolChain().getArchName();
1619  if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin) {
1620    CmdArgs.push_back("-arch");
1621
1622    // FIXME: Remove these special cases.
1623    if (Arch == "powerpc")
1624      CmdArgs.push_back("ppc");
1625    else if (Arch == "powerpc64")
1626      CmdArgs.push_back("ppc64");
1627    else
1628      CmdArgs.push_back(Args.MakeArgString(Arch));
1629  }
1630
1631  // Try to force gcc to match the tool chain we want, if we recognize
1632  // the arch.
1633  //
1634  // FIXME: The triple class should directly provide the information we want
1635  // here.
1636  if (Arch == "i386" || Arch == "powerpc")
1637    CmdArgs.push_back("-m32");
1638  else if (Arch == "x86_64" || Arch == "powerpc64")
1639    CmdArgs.push_back("-m64");
1640
1641  if (Output.isPipe()) {
1642    CmdArgs.push_back("-o");
1643    CmdArgs.push_back("-");
1644  } else if (Output.isFilename()) {
1645    CmdArgs.push_back("-o");
1646    CmdArgs.push_back(Output.getFilename());
1647  } else {
1648    assert(Output.isNothing() && "Unexpected output");
1649    CmdArgs.push_back("-fsyntax-only");
1650  }
1651
1652
1653  // Only pass -x if gcc will understand it; otherwise hope gcc
1654  // understands the suffix correctly. The main use case this would go
1655  // wrong in is for linker inputs if they happened to have an odd
1656  // suffix; really the only way to get this to happen is a command
1657  // like '-x foobar a.c' which will treat a.c like a linker input.
1658  //
1659  // FIXME: For the linker case specifically, can we safely convert
1660  // inputs into '-Wl,' options?
1661  for (InputInfoList::const_iterator
1662         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1663    const InputInfo &II = *it;
1664
1665    // Don't try to pass LLVM or AST inputs to a generic gcc.
1666    if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
1667        II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
1668      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
1669        << getToolChain().getTripleString();
1670    else if (II.getType() == types::TY_AST)
1671      D.Diag(clang::diag::err_drv_no_ast_support)
1672        << getToolChain().getTripleString();
1673
1674    if (types::canTypeBeUserSpecified(II.getType())) {
1675      CmdArgs.push_back("-x");
1676      CmdArgs.push_back(types::getTypeName(II.getType()));
1677    }
1678
1679    if (II.isPipe())
1680      CmdArgs.push_back("-");
1681    else if (II.isFilename())
1682      CmdArgs.push_back(II.getFilename());
1683    else
1684      // Don't render as input, we need gcc to do the translations.
1685      II.getInputArg().render(Args, CmdArgs);
1686  }
1687
1688  const char *GCCName = getToolChain().getDriver().CCCGenericGCCName.c_str();
1689  const char *Exec =
1690    Args.MakeArgString(getToolChain().GetProgramPath(C, GCCName));
1691  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
1692}
1693
1694void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
1695                                          ArgStringList &CmdArgs) const {
1696  CmdArgs.push_back("-E");
1697}
1698
1699void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
1700                                          ArgStringList &CmdArgs) const {
1701  // The type is good enough.
1702}
1703
1704void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
1705                                       ArgStringList &CmdArgs) const {
1706  const Driver &D = getToolChain().getDriver();
1707
1708  // If -flto, etc. are present then make sure not to force assembly output.
1709  if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
1710      JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
1711    CmdArgs.push_back("-c");
1712  else {
1713    if (JA.getType() != types::TY_PP_Asm)
1714      D.Diag(clang::diag::err_drv_invalid_gcc_output_type)
1715        << getTypeName(JA.getType());
1716
1717    CmdArgs.push_back("-S");
1718  }
1719}
1720
1721void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
1722                                        ArgStringList &CmdArgs) const {
1723  CmdArgs.push_back("-c");
1724}
1725
1726void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
1727                                    ArgStringList &CmdArgs) const {
1728  // The types are (hopefully) good enough.
1729}
1730
1731const char *darwin::CC1::getCC1Name(types::ID Type) const {
1732  switch (Type) {
1733  default:
1734    assert(0 && "Unexpected type for Darwin CC1 tool.");
1735  case types::TY_Asm:
1736  case types::TY_C: case types::TY_CHeader:
1737  case types::TY_PP_C: case types::TY_PP_CHeader:
1738    return "cc1";
1739  case types::TY_ObjC: case types::TY_ObjCHeader:
1740  case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader:
1741    return "cc1obj";
1742  case types::TY_CXX: case types::TY_CXXHeader:
1743  case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
1744    return "cc1plus";
1745  case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
1746  case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader:
1747    return "cc1objplus";
1748  }
1749}
1750
1751const char *darwin::CC1::getBaseInputName(const ArgList &Args,
1752                                          const InputInfoList &Inputs) {
1753  llvm::sys::Path P(Inputs[0].getBaseInput());
1754  return Args.MakeArgString(P.getLast());
1755}
1756
1757const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
1758                                          const InputInfoList &Inputs) {
1759  const char *Str = getBaseInputName(Args, Inputs);
1760
1761  if (const char *End = strchr(Str, '.'))
1762    return Args.MakeArgString(std::string(Str, End));
1763
1764  return Str;
1765}
1766
1767const char *
1768darwin::CC1::getDependencyFileName(const ArgList &Args,
1769                                   const InputInfoList &Inputs) {
1770  // FIXME: Think about this more.
1771  std::string Res;
1772
1773  if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
1774    std::string Str(OutputOpt->getValue(Args));
1775
1776    Res = Str.substr(0, Str.rfind('.'));
1777  } else
1778    Res = darwin::CC1::getBaseInputStem(Args, Inputs);
1779
1780  return Args.MakeArgString(Res + ".d");
1781}
1782
1783void darwin::CC1::AddCC1Args(const ArgList &Args,
1784                             ArgStringList &CmdArgs) const {
1785  const Driver &D = getToolChain().getDriver();
1786
1787  CheckCodeGenerationOptions(D, Args);
1788
1789  // Derived from cc1 spec.
1790  if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
1791      !Args.hasArg(options::OPT_mdynamic_no_pic))
1792    CmdArgs.push_back("-fPIC");
1793
1794  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
1795      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
1796    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
1797      CmdArgs.push_back("-fno-builtin-strcat");
1798    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
1799      CmdArgs.push_back("-fno-builtin-strcpy");
1800  }
1801
1802  // gcc has some code here to deal with when no -mmacosx-version-min
1803  // and no -miphoneos-version-min is present, but this never happens
1804  // due to tool chain specific argument translation.
1805
1806  if (Args.hasArg(options::OPT_g_Flag) &&
1807      !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
1808    CmdArgs.push_back("-feliminate-unused-debug-symbols");
1809}
1810
1811void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
1812                                    const InputInfoList &Inputs,
1813                                    const ArgStringList &OutputArgs) const {
1814  const Driver &D = getToolChain().getDriver();
1815
1816  // Derived from cc1_options spec.
1817  if (Args.hasArg(options::OPT_fast) ||
1818      Args.hasArg(options::OPT_fastf) ||
1819      Args.hasArg(options::OPT_fastcp))
1820    CmdArgs.push_back("-O3");
1821
1822  if (Arg *A = Args.getLastArg(options::OPT_pg))
1823    if (Args.hasArg(options::OPT_fomit_frame_pointer))
1824      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
1825        << A->getAsString(Args) << "-fomit-frame-pointer";
1826
1827  AddCC1Args(Args, CmdArgs);
1828
1829  if (!Args.hasArg(options::OPT_Q))
1830    CmdArgs.push_back("-quiet");
1831
1832  CmdArgs.push_back("-dumpbase");
1833  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1834
1835  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
1836
1837  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
1838  Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
1839
1840  // FIXME: The goal is to use the user provided -o if that is our
1841  // final output, otherwise to drive from the original input
1842  // name. Find a clean way to go about this.
1843  if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
1844      Args.hasArg(options::OPT_o)) {
1845    Arg *OutputOpt = Args.getLastArg(options::OPT_o);
1846    CmdArgs.push_back("-auxbase-strip");
1847    CmdArgs.push_back(OutputOpt->getValue(Args));
1848  } else {
1849    CmdArgs.push_back("-auxbase");
1850    CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
1851  }
1852
1853  Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
1854
1855  Args.AddAllArgs(CmdArgs, options::OPT_O);
1856  // FIXME: -Wall is getting some special treatment. Investigate.
1857  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
1858  Args.AddLastArg(CmdArgs, options::OPT_w);
1859  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
1860                  options::OPT_trigraphs);
1861  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
1862    // Honor -std-default.
1863    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
1864                              "-std=", /*Joined=*/true);
1865  }
1866
1867  if (Args.hasArg(options::OPT_v))
1868    CmdArgs.push_back("-version");
1869  if (Args.hasArg(options::OPT_pg))
1870    CmdArgs.push_back("-p");
1871  Args.AddLastArg(CmdArgs, options::OPT_p);
1872
1873  // The driver treats -fsyntax-only specially.
1874  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
1875      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
1876    // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
1877    // used to inhibit the default -fno-builtin-str{cat,cpy}.
1878    //
1879    // FIXME: Should we grow a better way to deal with "removing" args?
1880    for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
1881                                               options::OPT_fsyntax_only),
1882           ie = Args.filtered_end(); it != ie; ++it) {
1883      if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
1884          !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
1885        (*it)->claim();
1886        (*it)->render(Args, CmdArgs);
1887      }
1888    }
1889  } else
1890    Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
1891
1892  Args.AddAllArgs(CmdArgs, options::OPT_undef);
1893  if (Args.hasArg(options::OPT_Qn))
1894    CmdArgs.push_back("-fno-ident");
1895
1896  // FIXME: This isn't correct.
1897  //Args.AddLastArg(CmdArgs, options::OPT__help)
1898  //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
1899
1900  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
1901
1902  // FIXME: Still don't get what is happening here. Investigate.
1903  Args.AddAllArgs(CmdArgs, options::OPT__param);
1904
1905  if (Args.hasArg(options::OPT_fmudflap) ||
1906      Args.hasArg(options::OPT_fmudflapth)) {
1907    CmdArgs.push_back("-fno-builtin");
1908    CmdArgs.push_back("-fno-merge-constants");
1909  }
1910
1911  if (Args.hasArg(options::OPT_coverage)) {
1912    CmdArgs.push_back("-fprofile-arcs");
1913    CmdArgs.push_back("-ftest-coverage");
1914  }
1915
1916  if (types::isCXX(Inputs[0].getType()))
1917    CmdArgs.push_back("-D__private_extern__=extern");
1918}
1919
1920void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
1921                                    const InputInfoList &Inputs,
1922                                    const ArgStringList &OutputArgs) const {
1923  // Derived from cpp_options
1924  AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
1925
1926  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
1927
1928  AddCC1Args(Args, CmdArgs);
1929
1930  // NOTE: The code below has some commonality with cpp_options, but
1931  // in classic gcc style ends up sending things in different
1932  // orders. This may be a good merge candidate once we drop pedantic
1933  // compatibility.
1934
1935  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
1936  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
1937                  options::OPT_trigraphs);
1938  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
1939    // Honor -std-default.
1940    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
1941                              "-std=", /*Joined=*/true);
1942  }
1943  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
1944  Args.AddLastArg(CmdArgs, options::OPT_w);
1945
1946  // The driver treats -fsyntax-only specially.
1947  Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
1948
1949  if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
1950      !Args.hasArg(options::OPT_fno_working_directory))
1951    CmdArgs.push_back("-fworking-directory");
1952
1953  Args.AddAllArgs(CmdArgs, options::OPT_O);
1954  Args.AddAllArgs(CmdArgs, options::OPT_undef);
1955  if (Args.hasArg(options::OPT_save_temps))
1956    CmdArgs.push_back("-fpch-preprocess");
1957}
1958
1959void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
1960                                          ArgStringList &CmdArgs,
1961                                          const InputInfoList &Inputs) const {
1962  const Driver &D = getToolChain().getDriver();
1963
1964  CheckPreprocessingOptions(D, Args);
1965
1966  // Derived from cpp_unique_options.
1967  // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
1968  Args.AddLastArg(CmdArgs, options::OPT_C);
1969  Args.AddLastArg(CmdArgs, options::OPT_CC);
1970  if (!Args.hasArg(options::OPT_Q))
1971    CmdArgs.push_back("-quiet");
1972  Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
1973  Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
1974  Args.AddLastArg(CmdArgs, options::OPT_v);
1975  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
1976  Args.AddLastArg(CmdArgs, options::OPT_P);
1977
1978  // FIXME: Handle %I properly.
1979  if (getToolChain().getArchName() == "x86_64") {
1980    CmdArgs.push_back("-imultilib");
1981    CmdArgs.push_back("x86_64");
1982  }
1983
1984  if (Args.hasArg(options::OPT_MD)) {
1985    CmdArgs.push_back("-MD");
1986    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
1987  }
1988
1989  if (Args.hasArg(options::OPT_MMD)) {
1990    CmdArgs.push_back("-MMD");
1991    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
1992  }
1993
1994  Args.AddLastArg(CmdArgs, options::OPT_M);
1995  Args.AddLastArg(CmdArgs, options::OPT_MM);
1996  Args.AddAllArgs(CmdArgs, options::OPT_MF);
1997  Args.AddLastArg(CmdArgs, options::OPT_MG);
1998  Args.AddLastArg(CmdArgs, options::OPT_MP);
1999  Args.AddAllArgs(CmdArgs, options::OPT_MQ);
2000  Args.AddAllArgs(CmdArgs, options::OPT_MT);
2001  if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
2002      (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
2003    if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
2004      CmdArgs.push_back("-MQ");
2005      CmdArgs.push_back(OutputOpt->getValue(Args));
2006    }
2007  }
2008
2009  Args.AddLastArg(CmdArgs, options::OPT_remap);
2010  if (Args.hasArg(options::OPT_g3))
2011    CmdArgs.push_back("-dD");
2012  Args.AddLastArg(CmdArgs, options::OPT_H);
2013
2014  AddCPPArgs(Args, CmdArgs);
2015
2016  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
2017  Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
2018
2019  for (InputInfoList::const_iterator
2020         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2021    const InputInfo &II = *it;
2022
2023    if (II.isPipe())
2024      CmdArgs.push_back("-");
2025    else
2026      CmdArgs.push_back(II.getFilename());
2027  }
2028
2029  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
2030                       options::OPT_Xpreprocessor);
2031
2032  if (Args.hasArg(options::OPT_fmudflap)) {
2033    CmdArgs.push_back("-D_MUDFLAP");
2034    CmdArgs.push_back("-include");
2035    CmdArgs.push_back("mf-runtime.h");
2036  }
2037
2038  if (Args.hasArg(options::OPT_fmudflapth)) {
2039    CmdArgs.push_back("-D_MUDFLAP");
2040    CmdArgs.push_back("-D_MUDFLAPTH");
2041    CmdArgs.push_back("-include");
2042    CmdArgs.push_back("mf-runtime.h");
2043  }
2044}
2045
2046void darwin::CC1::AddCPPArgs(const ArgList &Args,
2047                             ArgStringList &CmdArgs) const {
2048  // Derived from cpp spec.
2049
2050  if (Args.hasArg(options::OPT_static)) {
2051    // The gcc spec is broken here, it refers to dynamic but
2052    // that has been translated. Start by being bug compatible.
2053
2054    // if (!Args.hasArg(arglist.parser.dynamicOption))
2055    CmdArgs.push_back("-D__STATIC__");
2056  } else
2057    CmdArgs.push_back("-D__DYNAMIC__");
2058
2059  if (Args.hasArg(options::OPT_pthread))
2060    CmdArgs.push_back("-D_REENTRANT");
2061}
2062
2063void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
2064                                      Job &Dest, const InputInfo &Output,
2065                                      const InputInfoList &Inputs,
2066                                      const ArgList &Args,
2067                                      const char *LinkingOutput) const {
2068  ArgStringList CmdArgs;
2069
2070  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
2071
2072  CmdArgs.push_back("-E");
2073
2074  if (Args.hasArg(options::OPT_traditional) ||
2075      Args.hasArg(options::OPT_traditional_cpp))
2076    CmdArgs.push_back("-traditional-cpp");
2077
2078  ArgStringList OutputArgs;
2079  if (Output.isFilename()) {
2080    OutputArgs.push_back("-o");
2081    OutputArgs.push_back(Output.getFilename());
2082  } else {
2083    assert(Output.isPipe() && "Unexpected CC1 output.");
2084  }
2085
2086  if (Args.hasArg(options::OPT_E)) {
2087    AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
2088  } else {
2089    AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
2090    CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
2091  }
2092
2093  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
2094
2095  const char *CC1Name = getCC1Name(Inputs[0].getType());
2096  const char *Exec =
2097    Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name));
2098  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2099}
2100
2101void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
2102                                   Job &Dest, const InputInfo &Output,
2103                                   const InputInfoList &Inputs,
2104                                   const ArgList &Args,
2105                                   const char *LinkingOutput) const {
2106  const Driver &D = getToolChain().getDriver();
2107  ArgStringList CmdArgs;
2108
2109  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
2110
2111  types::ID InputType = Inputs[0].getType();
2112  const Arg *A;
2113  if ((A = Args.getLastArg(options::OPT_traditional)))
2114    D.Diag(clang::diag::err_drv_argument_only_allowed_with)
2115      << A->getAsString(Args) << "-E";
2116
2117  if (JA.getType() == types::TY_LLVM_IR ||
2118      JA.getType() == types::TY_LTO_IR)
2119    CmdArgs.push_back("-emit-llvm");
2120  else if (JA.getType() == types::TY_LLVM_BC ||
2121           JA.getType() == types::TY_LTO_BC)
2122    CmdArgs.push_back("-emit-llvm-bc");
2123  else if (Output.getType() == types::TY_AST)
2124    D.Diag(clang::diag::err_drv_no_ast_support)
2125      << getToolChain().getTripleString();
2126  else if (JA.getType() != types::TY_PP_Asm &&
2127           JA.getType() != types::TY_PCH)
2128    D.Diag(clang::diag::err_drv_invalid_gcc_output_type)
2129      << getTypeName(JA.getType());
2130
2131  ArgStringList OutputArgs;
2132  if (Output.getType() != types::TY_PCH) {
2133    OutputArgs.push_back("-o");
2134    if (Output.isPipe())
2135      OutputArgs.push_back("-");
2136    else if (Output.isNothing())
2137      OutputArgs.push_back("/dev/null");
2138    else
2139      OutputArgs.push_back(Output.getFilename());
2140  }
2141
2142  // There is no need for this level of compatibility, but it makes
2143  // diffing easier.
2144  bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
2145                          Args.hasArg(options::OPT_S));
2146
2147  if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
2148    AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
2149    if (OutputArgsEarly) {
2150      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
2151    } else {
2152      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
2153      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
2154    }
2155  } else {
2156    CmdArgs.push_back("-fpreprocessed");
2157
2158    for (InputInfoList::const_iterator
2159           it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2160      const InputInfo &II = *it;
2161
2162      // Reject AST inputs.
2163      if (II.getType() == types::TY_AST) {
2164        D.Diag(clang::diag::err_drv_no_ast_support)
2165          << getToolChain().getTripleString();
2166        return;
2167      }
2168
2169      if (II.isPipe())
2170        CmdArgs.push_back("-");
2171      else
2172        CmdArgs.push_back(II.getFilename());
2173    }
2174
2175    if (OutputArgsEarly) {
2176      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
2177    } else {
2178      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
2179      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
2180    }
2181  }
2182
2183  if (Output.getType() == types::TY_PCH) {
2184    assert(Output.isFilename() && "Invalid PCH output.");
2185
2186    CmdArgs.push_back("-o");
2187    // NOTE: gcc uses a temp .s file for this, but there doesn't seem
2188    // to be a good reason.
2189    CmdArgs.push_back("/dev/null");
2190
2191    CmdArgs.push_back("--output-pch=");
2192    CmdArgs.push_back(Output.getFilename());
2193  }
2194
2195  const char *CC1Name = getCC1Name(Inputs[0].getType());
2196  const char *Exec =
2197    Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name));
2198  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2199}
2200
2201void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2202                                    Job &Dest, const InputInfo &Output,
2203                                    const InputInfoList &Inputs,
2204                                    const ArgList &Args,
2205                                    const char *LinkingOutput) const {
2206  ArgStringList CmdArgs;
2207
2208  assert(Inputs.size() == 1 && "Unexpected number of inputs.");
2209  const InputInfo &Input = Inputs[0];
2210
2211  // Bit of a hack, this is only used for original inputs.
2212  //
2213  // FIXME: This is broken for preprocessed .s inputs.
2214  if (Input.isFilename() &&
2215      strcmp(Input.getFilename(), Input.getBaseInput()) == 0) {
2216    if (Args.hasArg(options::OPT_gstabs))
2217      CmdArgs.push_back("--gstabs");
2218    else if (Args.hasArg(options::OPT_g_Group))
2219      CmdArgs.push_back("--gdwarf2");
2220  }
2221
2222  // Derived from asm spec.
2223  AddDarwinArch(Args, CmdArgs);
2224
2225  if (!getDarwinToolChain().isTargetIPhoneOS() ||
2226      Args.hasArg(options::OPT_force__cpusubtype__ALL))
2227    CmdArgs.push_back("-force_cpusubtype_ALL");
2228
2229  if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
2230      (Args.hasArg(options::OPT_mkernel) ||
2231       Args.hasArg(options::OPT_static) ||
2232       Args.hasArg(options::OPT_fapple_kext)))
2233    CmdArgs.push_back("-static");
2234
2235  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
2236                       options::OPT_Xassembler);
2237
2238  assert(Output.isFilename() && "Unexpected lipo output.");
2239  CmdArgs.push_back("-o");
2240  CmdArgs.push_back(Output.getFilename());
2241
2242  if (Input.isPipe()) {
2243    CmdArgs.push_back("-");
2244  } else {
2245    assert(Input.isFilename() && "Invalid input.");
2246    CmdArgs.push_back(Input.getFilename());
2247  }
2248
2249  // asm_final spec is empty.
2250
2251  const char *Exec =
2252    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2253  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2254}
2255
2256void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
2257                                       ArgStringList &CmdArgs) const {
2258  llvm::StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
2259
2260  // Derived from darwin_arch spec.
2261  CmdArgs.push_back("-arch");
2262  CmdArgs.push_back(Args.MakeArgString(ArchName));
2263
2264  // FIXME: Is this needed anymore?
2265  if (ArchName == "arm")
2266    CmdArgs.push_back("-force_cpusubtype_ALL");
2267}
2268
2269void darwin::Link::AddLinkArgs(const ArgList &Args,
2270                               ArgStringList &CmdArgs) const {
2271  const Driver &D = getToolChain().getDriver();
2272
2273  // Derived from the "link" spec.
2274  Args.AddAllArgs(CmdArgs, options::OPT_static);
2275  if (!Args.hasArg(options::OPT_static))
2276    CmdArgs.push_back("-dynamic");
2277  if (Args.hasArg(options::OPT_fgnu_runtime)) {
2278    // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
2279    // here. How do we wish to handle such things?
2280  }
2281
2282  if (!Args.hasArg(options::OPT_dynamiclib)) {
2283    AddDarwinArch(Args, CmdArgs);
2284    // FIXME: Why do this only on this path?
2285    Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
2286
2287    Args.AddLastArg(CmdArgs, options::OPT_bundle);
2288    Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
2289    Args.AddAllArgs(CmdArgs, options::OPT_client__name);
2290
2291    Arg *A;
2292    if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
2293        (A = Args.getLastArg(options::OPT_current__version)) ||
2294        (A = Args.getLastArg(options::OPT_install__name)))
2295      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
2296        << A->getAsString(Args) << "-dynamiclib";
2297
2298    Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
2299    Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
2300    Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
2301  } else {
2302    CmdArgs.push_back("-dylib");
2303
2304    Arg *A;
2305    if ((A = Args.getLastArg(options::OPT_bundle)) ||
2306        (A = Args.getLastArg(options::OPT_bundle__loader)) ||
2307        (A = Args.getLastArg(options::OPT_client__name)) ||
2308        (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
2309        (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
2310        (A = Args.getLastArg(options::OPT_private__bundle)))
2311      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
2312        << A->getAsString(Args) << "-dynamiclib";
2313
2314    Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
2315                              "-dylib_compatibility_version");
2316    Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
2317                              "-dylib_current_version");
2318
2319    AddDarwinArch(Args, CmdArgs);
2320
2321    Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
2322                              "-dylib_install_name");
2323  }
2324
2325  Args.AddLastArg(CmdArgs, options::OPT_all__load);
2326  Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
2327  Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
2328  if (getDarwinToolChain().isTargetIPhoneOS())
2329    Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
2330  Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
2331  Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
2332  Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
2333  Args.AddLastArg(CmdArgs, options::OPT_dynamic);
2334  Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
2335  Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
2336  Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
2337  Args.AddAllArgs(CmdArgs, options::OPT_image__base);
2338  Args.AddAllArgs(CmdArgs, options::OPT_init);
2339
2340  // Adding all arguments doesn't make sense here but this is what gcc does. One
2341  // of this should always be present thanks to argument translation.
2342  assert((Args.hasArg(options::OPT_mmacosx_version_min_EQ) ||
2343          Args.hasArg(options::OPT_miphoneos_version_min_EQ)) &&
2344         "Missing version argument (lost in translation)?");
2345  Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ,
2346                            "-macosx_version_min");
2347  Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ,
2348                            "-iphoneos_version_min");
2349  Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
2350  Args.AddLastArg(CmdArgs, options::OPT_multi__module);
2351  Args.AddLastArg(CmdArgs, options::OPT_single__module);
2352  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
2353  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
2354
2355  if (Args.hasArg(options::OPT_fpie))
2356    CmdArgs.push_back("-pie");
2357
2358  Args.AddLastArg(CmdArgs, options::OPT_prebind);
2359  Args.AddLastArg(CmdArgs, options::OPT_noprebind);
2360  Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
2361  Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
2362  Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
2363  Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
2364  Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
2365  Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
2366  Args.AddAllArgs(CmdArgs, options::OPT_segprot);
2367  Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
2368  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
2369  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
2370  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
2371  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
2372  Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
2373  Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
2374
2375  Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot");
2376  if (getDarwinToolChain().isTargetIPhoneOS()) {
2377    if (!Args.hasArg(options::OPT_isysroot)) {
2378      CmdArgs.push_back("-syslibroot");
2379      CmdArgs.push_back("/Developer/SDKs/Extra");
2380    }
2381  }
2382
2383  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
2384  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
2385  Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
2386  Args.AddAllArgs(CmdArgs, options::OPT_undefined);
2387  Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
2388  Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
2389  Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
2390  Args.AddAllArgs(CmdArgs, options::OPT_y);
2391  Args.AddLastArg(CmdArgs, options::OPT_w);
2392  Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
2393  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
2394  Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
2395  Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
2396  Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
2397  Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
2398  Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
2399  Args.AddLastArg(CmdArgs, options::OPT_whyload);
2400  Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
2401  Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
2402  Args.AddLastArg(CmdArgs, options::OPT_dylinker);
2403  Args.AddLastArg(CmdArgs, options::OPT_Mach);
2404}
2405
2406void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
2407                                Job &Dest, const InputInfo &Output,
2408                                const InputInfoList &Inputs,
2409                                const ArgList &Args,
2410                                const char *LinkingOutput) const {
2411  assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
2412
2413  // The logic here is derived from gcc's behavior; most of which
2414  // comes from specs (starting with link_command). Consult gcc for
2415  // more information.
2416  ArgStringList CmdArgs;
2417
2418  // I'm not sure why this particular decomposition exists in gcc, but
2419  // we follow suite for ease of comparison.
2420  AddLinkArgs(Args, CmdArgs);
2421
2422  Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
2423  Args.AddAllArgs(CmdArgs, options::OPT_s);
2424  Args.AddAllArgs(CmdArgs, options::OPT_t);
2425  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
2426  Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
2427  Args.AddAllArgs(CmdArgs, options::OPT_A);
2428  Args.AddLastArg(CmdArgs, options::OPT_e);
2429  Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
2430  Args.AddAllArgs(CmdArgs, options::OPT_r);
2431
2432  CmdArgs.push_back("-o");
2433  CmdArgs.push_back(Output.getFilename());
2434
2435  if (!Args.hasArg(options::OPT_A) &&
2436      !Args.hasArg(options::OPT_nostdlib) &&
2437      !Args.hasArg(options::OPT_nostartfiles)) {
2438    // Derived from startfile spec.
2439    if (Args.hasArg(options::OPT_dynamiclib)) {
2440      // Derived from darwin_dylib1 spec.
2441      if (getDarwinToolChain().isTargetIPhoneOS()) {
2442        if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
2443          CmdArgs.push_back("-ldylib1.o");
2444      } else {
2445        if (getDarwinToolChain().isMacosxVersionLT(10, 5))
2446          CmdArgs.push_back("-ldylib1.o");
2447        else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
2448          CmdArgs.push_back("-ldylib1.10.5.o");
2449      }
2450    } else {
2451      if (Args.hasArg(options::OPT_bundle)) {
2452        if (!Args.hasArg(options::OPT_static)) {
2453          // Derived from darwin_bundle1 spec.
2454          if (getDarwinToolChain().isTargetIPhoneOS()) {
2455            if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
2456              CmdArgs.push_back("-lbundle1.o");
2457          } else {
2458            if (getDarwinToolChain().isMacosxVersionLT(10, 6))
2459              CmdArgs.push_back("-lbundle1.o");
2460          }
2461        }
2462      } else {
2463        if (Args.hasArg(options::OPT_pg)) {
2464          if (Args.hasArg(options::OPT_static) ||
2465              Args.hasArg(options::OPT_object) ||
2466              Args.hasArg(options::OPT_preload)) {
2467            CmdArgs.push_back("-lgcrt0.o");
2468          } else {
2469            CmdArgs.push_back("-lgcrt1.o");
2470
2471            // darwin_crt2 spec is empty.
2472          }
2473        } else {
2474          if (Args.hasArg(options::OPT_static) ||
2475              Args.hasArg(options::OPT_object) ||
2476              Args.hasArg(options::OPT_preload)) {
2477            CmdArgs.push_back("-lcrt0.o");
2478          } else {
2479            // Derived from darwin_crt1 spec.
2480            if (getDarwinToolChain().isTargetIPhoneOS()) {
2481              if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
2482                CmdArgs.push_back("-lcrt1.o");
2483              else
2484                CmdArgs.push_back("-lcrt1.3.1.o");
2485            } else {
2486              if (getDarwinToolChain().isMacosxVersionLT(10, 5))
2487                CmdArgs.push_back("-lcrt1.o");
2488              else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
2489                CmdArgs.push_back("-lcrt1.10.5.o");
2490              else
2491                CmdArgs.push_back("-lcrt1.10.6.o");
2492
2493              // darwin_crt2 spec is empty.
2494            }
2495          }
2496        }
2497      }
2498    }
2499
2500    if (!getDarwinToolChain().isTargetIPhoneOS() &&
2501        Args.hasArg(options::OPT_shared_libgcc) &&
2502        getDarwinToolChain().isMacosxVersionLT(10, 5)) {
2503      const char *Str =
2504        Args.MakeArgString(getToolChain().GetFilePath(C, "crt3.o"));
2505      CmdArgs.push_back(Str);
2506    }
2507  }
2508
2509  Args.AddAllArgs(CmdArgs, options::OPT_L);
2510
2511  if (Args.hasArg(options::OPT_fopenmp))
2512    // This is more complicated in gcc...
2513    CmdArgs.push_back("-lgomp");
2514
2515  getDarwinToolChain().AddLinkSearchPathArgs(Args, CmdArgs);
2516
2517  for (InputInfoList::const_iterator
2518         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2519    const InputInfo &II = *it;
2520    if (II.isFilename())
2521      CmdArgs.push_back(II.getFilename());
2522    else
2523      II.getInputArg().renderAsInput(Args, CmdArgs);
2524  }
2525
2526  if (LinkingOutput) {
2527    CmdArgs.push_back("-arch_multiple");
2528    CmdArgs.push_back("-final_output");
2529    CmdArgs.push_back(LinkingOutput);
2530  }
2531
2532  if (Args.hasArg(options::OPT_fprofile_arcs) ||
2533      Args.hasArg(options::OPT_fprofile_generate) ||
2534      Args.hasArg(options::OPT_fcreate_profile) ||
2535      Args.hasArg(options::OPT_coverage))
2536    CmdArgs.push_back("-lgcov");
2537
2538  if (Args.hasArg(options::OPT_fnested_functions))
2539    CmdArgs.push_back("-allow_stack_execute");
2540
2541  if (!Args.hasArg(options::OPT_nostdlib) &&
2542      !Args.hasArg(options::OPT_nodefaultlibs)) {
2543    // FIXME: g++ is more complicated here, it tries to put -lstdc++
2544    // before -lm, for example.
2545    if (getToolChain().getDriver().CCCIsCXX)
2546      CmdArgs.push_back("-lstdc++");
2547
2548    // link_ssp spec is empty.
2549
2550    // Let the tool chain choose which runtime library to link.
2551    getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
2552  }
2553
2554  if (!Args.hasArg(options::OPT_A) &&
2555      !Args.hasArg(options::OPT_nostdlib) &&
2556      !Args.hasArg(options::OPT_nostartfiles)) {
2557    // endfile_spec is empty.
2558  }
2559
2560  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2561  Args.AddAllArgs(CmdArgs, options::OPT_F);
2562
2563  const char *Exec =
2564    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2565  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2566}
2567
2568void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
2569                                Job &Dest, const InputInfo &Output,
2570                                const InputInfoList &Inputs,
2571                                const ArgList &Args,
2572                                const char *LinkingOutput) const {
2573  ArgStringList CmdArgs;
2574
2575  CmdArgs.push_back("-create");
2576  assert(Output.isFilename() && "Unexpected lipo output.");
2577
2578  CmdArgs.push_back("-output");
2579  CmdArgs.push_back(Output.getFilename());
2580
2581  for (InputInfoList::const_iterator
2582         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2583    const InputInfo &II = *it;
2584    assert(II.isFilename() && "Unexpected lipo input.");
2585    CmdArgs.push_back(II.getFilename());
2586  }
2587  const char *Exec =
2588    Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo"));
2589  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2590}
2591
2592void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
2593                                    Job &Dest, const InputInfo &Output,
2594                                    const InputInfoList &Inputs,
2595                                    const ArgList &Args,
2596                                    const char *LinkingOutput) const {
2597  ArgStringList CmdArgs;
2598
2599  assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2600  const InputInfo &Input = Inputs[0];
2601  assert(Input.isFilename() && "Unexpected dsymutil input.");
2602  CmdArgs.push_back(Input.getFilename());
2603
2604  CmdArgs.push_back("-o");
2605  CmdArgs.push_back(Output.getFilename());
2606
2607  const char *Exec =
2608    Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil"));
2609  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2610}
2611
2612void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2613                                      Job &Dest, const InputInfo &Output,
2614                                      const InputInfoList &Inputs,
2615                                      const ArgList &Args,
2616                                      const char *LinkingOutput) const {
2617  ArgStringList CmdArgs;
2618
2619  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
2620                       options::OPT_Xassembler);
2621
2622  CmdArgs.push_back("-o");
2623  if (Output.isPipe())
2624    CmdArgs.push_back("-");
2625  else
2626    CmdArgs.push_back(Output.getFilename());
2627
2628  for (InputInfoList::const_iterator
2629         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2630    const InputInfo &II = *it;
2631    if (II.isPipe())
2632      CmdArgs.push_back("-");
2633    else
2634      CmdArgs.push_back(II.getFilename());
2635  }
2636
2637  const char *Exec =
2638    Args.MakeArgString(getToolChain().GetProgramPath(C, "gas"));
2639  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2640}
2641
2642void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
2643                                  Job &Dest, const InputInfo &Output,
2644                                  const InputInfoList &Inputs,
2645                                  const ArgList &Args,
2646                                  const char *LinkingOutput) const {
2647  const Driver &D = getToolChain().getDriver();
2648  ArgStringList CmdArgs;
2649
2650  if ((!Args.hasArg(options::OPT_nostdlib)) &&
2651      (!Args.hasArg(options::OPT_shared))) {
2652    CmdArgs.push_back("-e");
2653    CmdArgs.push_back("_start");
2654  }
2655
2656  if (Args.hasArg(options::OPT_static)) {
2657    CmdArgs.push_back("-Bstatic");
2658    CmdArgs.push_back("-dn");
2659  } else {
2660//    CmdArgs.push_back("--eh-frame-hdr");
2661    CmdArgs.push_back("-Bdynamic");
2662    if (Args.hasArg(options::OPT_shared)) {
2663      CmdArgs.push_back("-shared");
2664    } else {
2665      CmdArgs.push_back("--dynamic-linker");
2666      CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
2667    }
2668  }
2669
2670  if (Output.isPipe()) {
2671    CmdArgs.push_back("-o");
2672    CmdArgs.push_back("-");
2673  } else if (Output.isFilename()) {
2674    CmdArgs.push_back("-o");
2675    CmdArgs.push_back(Output.getFilename());
2676  } else {
2677    assert(Output.isNothing() && "Invalid output.");
2678  }
2679
2680  if (!Args.hasArg(options::OPT_nostdlib) &&
2681      !Args.hasArg(options::OPT_nostartfiles)) {
2682    if (!Args.hasArg(options::OPT_shared)) {
2683      CmdArgs.push_back(Args.MakeArgString(
2684                                getToolChain().GetFilePath(C, "crt1.o")));
2685      CmdArgs.push_back(Args.MakeArgString(
2686                                getToolChain().GetFilePath(C, "crti.o")));
2687      CmdArgs.push_back(Args.MakeArgString(
2688                                getToolChain().GetFilePath(C, "crtbegin.o")));
2689    } else {
2690      CmdArgs.push_back(Args.MakeArgString(
2691                                getToolChain().GetFilePath(C, "crti.o")));
2692    }
2693    CmdArgs.push_back(Args.MakeArgString(
2694                                getToolChain().GetFilePath(C, "crtn.o")));
2695  }
2696
2697  CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
2698                                       + getToolChain().getTripleString()
2699                                       + "/4.2.4"));
2700
2701  Args.AddAllArgs(CmdArgs, options::OPT_L);
2702  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2703  Args.AddAllArgs(CmdArgs, options::OPT_e);
2704
2705  for (InputInfoList::const_iterator
2706         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2707    const InputInfo &II = *it;
2708
2709    // Don't try to pass LLVM inputs to a generic gcc.
2710    if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
2711        II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
2712      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2713        << getToolChain().getTripleString();
2714
2715    if (II.isPipe())
2716      CmdArgs.push_back("-");
2717    else if (II.isFilename())
2718      CmdArgs.push_back(II.getFilename());
2719    else
2720      II.getInputArg().renderAsInput(Args, CmdArgs);
2721  }
2722
2723  if (!Args.hasArg(options::OPT_nostdlib) &&
2724      !Args.hasArg(options::OPT_nodefaultlibs)) {
2725    // FIXME: For some reason GCC passes -lgcc before adding
2726    // the default system libraries. Just mimic this for now.
2727    CmdArgs.push_back("-lgcc");
2728
2729    if (Args.hasArg(options::OPT_pthread))
2730      CmdArgs.push_back("-pthread");
2731    if (!Args.hasArg(options::OPT_shared))
2732      CmdArgs.push_back("-lc");
2733    CmdArgs.push_back("-lgcc");
2734  }
2735
2736  if (!Args.hasArg(options::OPT_nostdlib) &&
2737      !Args.hasArg(options::OPT_nostartfiles)) {
2738    if (!Args.hasArg(options::OPT_shared))
2739      CmdArgs.push_back(Args.MakeArgString(
2740                                getToolChain().GetFilePath(C, "crtend.o")));
2741  }
2742
2743  const char *Exec =
2744    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2745  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2746}
2747
2748void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2749                                     Job &Dest, const InputInfo &Output,
2750                                     const InputInfoList &Inputs,
2751                                     const ArgList &Args,
2752                                     const char *LinkingOutput) const {
2753  ArgStringList CmdArgs;
2754
2755  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
2756                       options::OPT_Xassembler);
2757
2758  CmdArgs.push_back("-o");
2759  if (Output.isPipe())
2760    CmdArgs.push_back("-");
2761  else
2762    CmdArgs.push_back(Output.getFilename());
2763
2764  for (InputInfoList::const_iterator
2765         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2766    const InputInfo &II = *it;
2767    if (II.isPipe())
2768      CmdArgs.push_back("-");
2769    else
2770      CmdArgs.push_back(II.getFilename());
2771  }
2772
2773  const char *Exec =
2774    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2775  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2776}
2777
2778void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
2779                                 Job &Dest, const InputInfo &Output,
2780                                 const InputInfoList &Inputs,
2781                                 const ArgList &Args,
2782                                 const char *LinkingOutput) const {
2783  const Driver &D = getToolChain().getDriver();
2784  ArgStringList CmdArgs;
2785
2786  if ((!Args.hasArg(options::OPT_nostdlib)) &&
2787      (!Args.hasArg(options::OPT_shared))) {
2788    CmdArgs.push_back("-e");
2789    CmdArgs.push_back("__start");
2790  }
2791
2792  if (Args.hasArg(options::OPT_static)) {
2793    CmdArgs.push_back("-Bstatic");
2794  } else {
2795    CmdArgs.push_back("--eh-frame-hdr");
2796    CmdArgs.push_back("-Bdynamic");
2797    if (Args.hasArg(options::OPT_shared)) {
2798      CmdArgs.push_back("-shared");
2799    } else {
2800      CmdArgs.push_back("-dynamic-linker");
2801      CmdArgs.push_back("/usr/libexec/ld.so");
2802    }
2803  }
2804
2805  if (Output.isPipe()) {
2806    CmdArgs.push_back("-o");
2807    CmdArgs.push_back("-");
2808  } else if (Output.isFilename()) {
2809    CmdArgs.push_back("-o");
2810    CmdArgs.push_back(Output.getFilename());
2811  } else {
2812    assert(Output.isNothing() && "Invalid output.");
2813  }
2814
2815  if (!Args.hasArg(options::OPT_nostdlib) &&
2816      !Args.hasArg(options::OPT_nostartfiles)) {
2817    if (!Args.hasArg(options::OPT_shared)) {
2818      CmdArgs.push_back(Args.MakeArgString(
2819                              getToolChain().GetFilePath(C, "crt0.o")));
2820      CmdArgs.push_back(Args.MakeArgString(
2821                              getToolChain().GetFilePath(C, "crtbegin.o")));
2822    } else {
2823      CmdArgs.push_back(Args.MakeArgString(
2824                              getToolChain().GetFilePath(C, "crtbeginS.o")));
2825    }
2826  }
2827
2828  std::string Triple = getToolChain().getTripleString();
2829  if (Triple.substr(0, 6) == "x86_64")
2830    Triple.replace(0, 6, "amd64");
2831  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
2832                                       "/3.3.5"));
2833
2834  Args.AddAllArgs(CmdArgs, options::OPT_L);
2835  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2836  Args.AddAllArgs(CmdArgs, options::OPT_e);
2837
2838  for (InputInfoList::const_iterator
2839         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2840    const InputInfo &II = *it;
2841
2842    // Don't try to pass LLVM inputs to a generic gcc.
2843    if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
2844        II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
2845      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2846        << getToolChain().getTripleString();
2847
2848    if (II.isPipe())
2849      CmdArgs.push_back("-");
2850    else if (II.isFilename())
2851      CmdArgs.push_back(II.getFilename());
2852    else
2853      II.getInputArg().renderAsInput(Args, CmdArgs);
2854  }
2855
2856  if (!Args.hasArg(options::OPT_nostdlib) &&
2857      !Args.hasArg(options::OPT_nodefaultlibs)) {
2858    // FIXME: For some reason GCC passes -lgcc before adding
2859    // the default system libraries. Just mimic this for now.
2860    CmdArgs.push_back("-lgcc");
2861
2862    if (Args.hasArg(options::OPT_pthread))
2863      CmdArgs.push_back("-pthread");
2864    if (!Args.hasArg(options::OPT_shared))
2865      CmdArgs.push_back("-lc");
2866    CmdArgs.push_back("-lgcc");
2867  }
2868
2869  if (!Args.hasArg(options::OPT_nostdlib) &&
2870      !Args.hasArg(options::OPT_nostartfiles)) {
2871    if (!Args.hasArg(options::OPT_shared))
2872      CmdArgs.push_back(Args.MakeArgString(
2873                              getToolChain().GetFilePath(C, "crtend.o")));
2874    else
2875      CmdArgs.push_back(Args.MakeArgString(
2876                              getToolChain().GetFilePath(C, "crtendS.o")));
2877  }
2878
2879  const char *Exec =
2880    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2881  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2882}
2883
2884void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2885                                     Job &Dest, const InputInfo &Output,
2886                                     const InputInfoList &Inputs,
2887                                     const ArgList &Args,
2888                                     const char *LinkingOutput) const {
2889  ArgStringList CmdArgs;
2890
2891  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
2892  // instruct as in the base system to assemble 32-bit code.
2893  if (getToolChain().getArchName() == "i386")
2894    CmdArgs.push_back("--32");
2895
2896
2897  // Set byte order explicitly
2898  if (getToolChain().getArchName() == "mips")
2899    CmdArgs.push_back("-EB");
2900  else if (getToolChain().getArchName() == "mipsel")
2901    CmdArgs.push_back("-EL");
2902
2903  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
2904                       options::OPT_Xassembler);
2905
2906  CmdArgs.push_back("-o");
2907  if (Output.isPipe())
2908    CmdArgs.push_back("-");
2909  else
2910    CmdArgs.push_back(Output.getFilename());
2911
2912  for (InputInfoList::const_iterator
2913         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2914    const InputInfo &II = *it;
2915    if (II.isPipe())
2916      CmdArgs.push_back("-");
2917    else
2918      CmdArgs.push_back(II.getFilename());
2919  }
2920
2921  const char *Exec =
2922    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2923  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2924}
2925
2926void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
2927                                 Job &Dest, const InputInfo &Output,
2928                                 const InputInfoList &Inputs,
2929                                 const ArgList &Args,
2930                                 const char *LinkingOutput) const {
2931  const Driver &D = getToolChain().getDriver();
2932  ArgStringList CmdArgs;
2933
2934  if (Args.hasArg(options::OPT_static)) {
2935    CmdArgs.push_back("-Bstatic");
2936  } else {
2937    CmdArgs.push_back("--eh-frame-hdr");
2938    if (Args.hasArg(options::OPT_shared)) {
2939      CmdArgs.push_back("-Bshareable");
2940    } else {
2941      CmdArgs.push_back("-dynamic-linker");
2942      CmdArgs.push_back("/libexec/ld-elf.so.1");
2943    }
2944  }
2945
2946  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
2947  // instruct ld in the base system to link 32-bit code.
2948  if (getToolChain().getArchName() == "i386") {
2949    CmdArgs.push_back("-m");
2950    CmdArgs.push_back("elf_i386_fbsd");
2951  }
2952
2953  if (Output.isPipe()) {
2954    CmdArgs.push_back("-o");
2955    CmdArgs.push_back("-");
2956  } else if (Output.isFilename()) {
2957    CmdArgs.push_back("-o");
2958    CmdArgs.push_back(Output.getFilename());
2959  } else {
2960    assert(Output.isNothing() && "Invalid output.");
2961  }
2962
2963  if (!Args.hasArg(options::OPT_nostdlib) &&
2964      !Args.hasArg(options::OPT_nostartfiles)) {
2965    if (!Args.hasArg(options::OPT_shared)) {
2966      CmdArgs.push_back(Args.MakeArgString(
2967                              getToolChain().GetFilePath(C, "crt1.o")));
2968      CmdArgs.push_back(Args.MakeArgString(
2969                              getToolChain().GetFilePath(C, "crti.o")));
2970      CmdArgs.push_back(Args.MakeArgString(
2971                              getToolChain().GetFilePath(C, "crtbegin.o")));
2972    } else {
2973      CmdArgs.push_back(Args.MakeArgString(
2974                              getToolChain().GetFilePath(C, "crti.o")));
2975      CmdArgs.push_back(Args.MakeArgString(
2976                              getToolChain().GetFilePath(C, "crtbeginS.o")));
2977    }
2978  }
2979
2980  Args.AddAllArgs(CmdArgs, options::OPT_L);
2981  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2982  Args.AddAllArgs(CmdArgs, options::OPT_e);
2983
2984  for (InputInfoList::const_iterator
2985         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2986    const InputInfo &II = *it;
2987
2988    // Don't try to pass LLVM inputs to a generic gcc.
2989    if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
2990        II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
2991      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2992        << getToolChain().getTripleString();
2993
2994    if (II.isPipe())
2995      CmdArgs.push_back("-");
2996    else if (II.isFilename())
2997      CmdArgs.push_back(II.getFilename());
2998    else
2999      II.getInputArg().renderAsInput(Args, CmdArgs);
3000  }
3001
3002  if (!Args.hasArg(options::OPT_nostdlib) &&
3003      !Args.hasArg(options::OPT_nodefaultlibs)) {
3004    if (D.CCCIsCXX) {
3005      CmdArgs.push_back("-lstdc++");
3006      CmdArgs.push_back("-lm");
3007    }
3008    // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
3009    // the default system libraries. Just mimic this for now.
3010    CmdArgs.push_back("-lgcc");
3011    if (Args.hasArg(options::OPT_static)) {
3012      CmdArgs.push_back("-lgcc_eh");
3013    } else {
3014      CmdArgs.push_back("--as-needed");
3015      CmdArgs.push_back("-lgcc_s");
3016      CmdArgs.push_back("--no-as-needed");
3017    }
3018
3019    if (Args.hasArg(options::OPT_pthread))
3020      CmdArgs.push_back("-lpthread");
3021    CmdArgs.push_back("-lc");
3022
3023    CmdArgs.push_back("-lgcc");
3024    if (Args.hasArg(options::OPT_static)) {
3025      CmdArgs.push_back("-lgcc_eh");
3026    } else {
3027      CmdArgs.push_back("--as-needed");
3028      CmdArgs.push_back("-lgcc_s");
3029      CmdArgs.push_back("--no-as-needed");
3030    }
3031  }
3032
3033  if (!Args.hasArg(options::OPT_nostdlib) &&
3034      !Args.hasArg(options::OPT_nostartfiles)) {
3035    if (!Args.hasArg(options::OPT_shared))
3036      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C,
3037                                                                  "crtend.o")));
3038    else
3039      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C,
3040                                                                 "crtendS.o")));
3041    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C,
3042                                                                    "crtn.o")));
3043  }
3044
3045  const char *Exec =
3046    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
3047  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
3048}
3049
3050void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3051                                     Job &Dest, const InputInfo &Output,
3052                                     const InputInfoList &Inputs,
3053                                     const ArgList &Args,
3054                                     const char *LinkingOutput) const {
3055  ArgStringList CmdArgs;
3056
3057  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3058                       options::OPT_Xassembler);
3059
3060  CmdArgs.push_back("-o");
3061  if (Output.isPipe())
3062    CmdArgs.push_back("-");
3063  else
3064    CmdArgs.push_back(Output.getFilename());
3065
3066  for (InputInfoList::const_iterator
3067         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3068    const InputInfo &II = *it;
3069    if (II.isPipe())
3070      CmdArgs.push_back("-");
3071    else
3072      CmdArgs.push_back(II.getFilename());
3073  }
3074
3075  const char *Exec =
3076    Args.MakeArgString(getToolChain().GetProgramPath(C, "gas"));
3077  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
3078}
3079
3080void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
3081                                 Job &Dest, const InputInfo &Output,
3082                                 const InputInfoList &Inputs,
3083                                 const ArgList &Args,
3084                                 const char *LinkingOutput) const {
3085  const Driver &D = getToolChain().getDriver();
3086  ArgStringList CmdArgs;
3087
3088  if (Output.isPipe()) {
3089    CmdArgs.push_back("-o");
3090    CmdArgs.push_back("-");
3091  } else if (Output.isFilename()) {
3092    CmdArgs.push_back("-o");
3093    CmdArgs.push_back(Output.getFilename());
3094  } else {
3095    assert(Output.isNothing() && "Invalid output.");
3096  }
3097
3098  if (!Args.hasArg(options::OPT_nostdlib) &&
3099      !Args.hasArg(options::OPT_nostartfiles))
3100    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C,
3101                                                      "/usr/gnu/lib/crtso.o")));
3102
3103  Args.AddAllArgs(CmdArgs, options::OPT_L);
3104  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
3105  Args.AddAllArgs(CmdArgs, options::OPT_e);
3106
3107  for (InputInfoList::const_iterator
3108         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3109    const InputInfo &II = *it;
3110
3111    // Don't try to pass LLVM inputs to a generic gcc.
3112    if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3113        II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3114      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3115        << getToolChain().getTripleString();
3116
3117    if (II.isPipe())
3118      CmdArgs.push_back("-");
3119    else if (II.isFilename())
3120      CmdArgs.push_back(II.getFilename());
3121    else
3122      II.getInputArg().renderAsInput(Args, CmdArgs);
3123  }
3124
3125  if (!Args.hasArg(options::OPT_nostdlib) &&
3126      !Args.hasArg(options::OPT_nodefaultlibs)) {
3127    if (D.CCCIsCXX) {
3128      CmdArgs.push_back("-lstdc++");
3129      CmdArgs.push_back("-lm");
3130    }
3131
3132    if (Args.hasArg(options::OPT_pthread))
3133      CmdArgs.push_back("-lpthread");
3134    CmdArgs.push_back("-lc");
3135    CmdArgs.push_back("-lgcc");
3136    CmdArgs.push_back("-L/usr/gnu/lib");
3137    // FIXME: fill in the correct search path for the final
3138    // support libraries.
3139    CmdArgs.push_back("-L/usr/gnu/lib/gcc/i686-pc-minix/4.4.3");
3140  }
3141
3142  if (!Args.hasArg(options::OPT_nostdlib) &&
3143      !Args.hasArg(options::OPT_nostartfiles)) {
3144    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C,
3145                                              "/usr/gnu/lib/libend.a")));
3146  }
3147
3148  const char *Exec =
3149    Args.MakeArgString(getToolChain().GetProgramPath(C, "/usr/gnu/bin/gld"));
3150  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
3151}
3152
3153/// DragonFly Tools
3154
3155// For now, DragonFly Assemble does just about the same as for
3156// FreeBSD, but this may change soon.
3157void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3158                                       Job &Dest, const InputInfo &Output,
3159                                       const InputInfoList &Inputs,
3160                                       const ArgList &Args,
3161                                       const char *LinkingOutput) const {
3162  ArgStringList CmdArgs;
3163
3164  // When building 32-bit code on DragonFly/pc64, we have to explicitly
3165  // instruct as in the base system to assemble 32-bit code.
3166  if (getToolChain().getArchName() == "i386")
3167    CmdArgs.push_back("--32");
3168
3169  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3170                       options::OPT_Xassembler);
3171
3172  CmdArgs.push_back("-o");
3173  if (Output.isPipe())
3174    CmdArgs.push_back("-");
3175  else
3176    CmdArgs.push_back(Output.getFilename());
3177
3178  for (InputInfoList::const_iterator
3179         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3180    const InputInfo &II = *it;
3181    if (II.isPipe())
3182      CmdArgs.push_back("-");
3183    else
3184      CmdArgs.push_back(II.getFilename());
3185  }
3186
3187  const char *Exec =
3188    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
3189  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
3190}
3191
3192void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
3193                                 Job &Dest, const InputInfo &Output,
3194                                 const InputInfoList &Inputs,
3195                                 const ArgList &Args,
3196                                 const char *LinkingOutput) const {
3197  const Driver &D = getToolChain().getDriver();
3198  ArgStringList CmdArgs;
3199
3200  if (Args.hasArg(options::OPT_static)) {
3201    CmdArgs.push_back("-Bstatic");
3202  } else {
3203    if (Args.hasArg(options::OPT_shared))
3204      CmdArgs.push_back("-Bshareable");
3205    else {
3206      CmdArgs.push_back("-dynamic-linker");
3207      CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
3208    }
3209  }
3210
3211  // When building 32-bit code on DragonFly/pc64, we have to explicitly
3212  // instruct ld in the base system to link 32-bit code.
3213  if (getToolChain().getArchName() == "i386") {
3214    CmdArgs.push_back("-m");
3215    CmdArgs.push_back("elf_i386");
3216  }
3217
3218  if (Output.isPipe()) {
3219    CmdArgs.push_back("-o");
3220    CmdArgs.push_back("-");
3221  } else if (Output.isFilename()) {
3222    CmdArgs.push_back("-o");
3223    CmdArgs.push_back(Output.getFilename());
3224  } else {
3225    assert(Output.isNothing() && "Invalid output.");
3226  }
3227
3228  if (!Args.hasArg(options::OPT_nostdlib) &&
3229      !Args.hasArg(options::OPT_nostartfiles)) {
3230    if (!Args.hasArg(options::OPT_shared)) {
3231      CmdArgs.push_back(
3232            Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o")));
3233      CmdArgs.push_back(
3234            Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
3235      CmdArgs.push_back(
3236            Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
3237    } else {
3238      CmdArgs.push_back(
3239            Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
3240      CmdArgs.push_back(
3241            Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
3242    }
3243  }
3244
3245  Args.AddAllArgs(CmdArgs, options::OPT_L);
3246  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
3247  Args.AddAllArgs(CmdArgs, options::OPT_e);
3248
3249  for (InputInfoList::const_iterator
3250         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3251    const InputInfo &II = *it;
3252
3253    // Don't try to pass LLVM inputs to a generic gcc.
3254    if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3255        II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3256      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3257        << getToolChain().getTripleString();
3258
3259    if (II.isPipe())
3260      CmdArgs.push_back("-");
3261    else if (II.isFilename())
3262      CmdArgs.push_back(II.getFilename());
3263    else
3264      II.getInputArg().renderAsInput(Args, CmdArgs);
3265  }
3266
3267  if (!Args.hasArg(options::OPT_nostdlib) &&
3268      !Args.hasArg(options::OPT_nodefaultlibs)) {
3269    // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
3270    //         rpaths
3271    CmdArgs.push_back("-L/usr/lib/gcc41");
3272
3273    if (!Args.hasArg(options::OPT_static)) {
3274      CmdArgs.push_back("-rpath");
3275      CmdArgs.push_back("/usr/lib/gcc41");
3276
3277      CmdArgs.push_back("-rpath-link");
3278      CmdArgs.push_back("/usr/lib/gcc41");
3279
3280      CmdArgs.push_back("-rpath");
3281      CmdArgs.push_back("/usr/lib");
3282
3283      CmdArgs.push_back("-rpath-link");
3284      CmdArgs.push_back("/usr/lib");
3285    }
3286
3287    if (Args.hasArg(options::OPT_shared)) {
3288      CmdArgs.push_back("-lgcc_pic");
3289    } else {
3290      CmdArgs.push_back("-lgcc");
3291    }
3292
3293
3294    if (Args.hasArg(options::OPT_pthread))
3295      CmdArgs.push_back("-lpthread");
3296
3297    if (!Args.hasArg(options::OPT_nolibc)) {
3298      CmdArgs.push_back("-lc");
3299    }
3300
3301    if (Args.hasArg(options::OPT_shared)) {
3302      CmdArgs.push_back("-lgcc_pic");
3303    } else {
3304      CmdArgs.push_back("-lgcc");
3305    }
3306  }
3307
3308  if (!Args.hasArg(options::OPT_nostdlib) &&
3309      !Args.hasArg(options::OPT_nostartfiles)) {
3310    if (!Args.hasArg(options::OPT_shared))
3311      CmdArgs.push_back(Args.MakeArgString(
3312                              getToolChain().GetFilePath(C, "crtend.o")));
3313    else
3314      CmdArgs.push_back(Args.MakeArgString(
3315                              getToolChain().GetFilePath(C, "crtendS.o")));
3316    CmdArgs.push_back(Args.MakeArgString(
3317                              getToolChain().GetFilePath(C, "crtn.o")));
3318  }
3319
3320  const char *Exec =
3321    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
3322  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
3323}
3324