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