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