ToolChains.cpp revision 9d0863b22faef1678eb191bbab7268809be60a96
1//===--- ToolChains.cpp - ToolChain 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 "ToolChains.h"
11
12#include "clang/Driver/Arg.h"
13#include "clang/Driver/ArgList.h"
14#include "clang/Driver/Compilation.h"
15#include "clang/Driver/Driver.h"
16#include "clang/Driver/DriverDiagnostic.h"
17#include "clang/Driver/HostInfo.h"
18#include "clang/Driver/OptTable.h"
19#include "clang/Driver/Option.h"
20#include "clang/Driver/Options.h"
21
22#include "llvm/ADT/StringExtras.h"
23#include "llvm/Support/ErrorHandling.h"
24#include "llvm/Support/raw_ostream.h"
25#include "llvm/System/Path.h"
26
27#include <cstdlib> // ::getenv
28
29using namespace clang::driver;
30using namespace clang::driver::toolchains;
31
32/// Darwin - Darwin tool chain for i386 and x86_64.
33
34Darwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple,
35               const unsigned (&_DarwinVersion)[3])
36  : ToolChain(Host, Triple), TargetInitialized(false)
37{
38  llvm::raw_string_ostream(MacosxVersionMin)
39    << "10." << std::max(0, (int)_DarwinVersion[0] - 4) << '.'
40    << _DarwinVersion[1];
41}
42
43// FIXME: Can we tablegen this?
44static const char *GetArmArchForMArch(llvm::StringRef Value) {
45  if (Value == "armv6k")
46    return "armv6";
47
48  if (Value == "armv5tej")
49    return "armv5";
50
51  if (Value == "xscale")
52    return "xscale";
53
54  if (Value == "armv4t")
55    return "armv4t";
56
57  if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" ||
58      Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" ||
59      Value == "armv7m")
60    return "armv7";
61
62  return 0;
63}
64
65// FIXME: Can we tablegen this?
66static const char *GetArmArchForMCpu(llvm::StringRef Value) {
67  if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" ||
68      Value == "arm946e-s" || Value == "arm966e-s" ||
69      Value == "arm968e-s" || Value == "arm10e" ||
70      Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" ||
71      Value == "arm1026ej-s")
72    return "armv5";
73
74  if (Value == "xscale")
75    return "xscale";
76
77  if (Value == "arm1136j-s" || Value == "arm1136jf-s" ||
78      Value == "arm1176jz-s" || Value == "arm1176jzf-s")
79    return "armv6";
80
81  if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3")
82    return "armv7";
83
84  return 0;
85}
86
87llvm::StringRef Darwin::getDarwinArchName(const ArgList &Args) const {
88  switch (getTriple().getArch()) {
89  default:
90    return getArchName();
91
92  case llvm::Triple::arm: {
93    if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
94      if (const char *Arch = GetArmArchForMArch(A->getValue(Args)))
95        return Arch;
96
97    if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
98      if (const char *Arch = GetArmArchForMCpu(A->getValue(Args)))
99        return Arch;
100
101    return "arm";
102  }
103  }
104}
105
106DarwinGCC::DarwinGCC(const HostInfo &Host, const llvm::Triple& Triple,
107                     const unsigned (&DarwinVersion)[3],
108                     const unsigned (&_GCCVersion)[3])
109  : Darwin(Host, Triple, DarwinVersion)
110{
111  GCCVersion[0] = _GCCVersion[0];
112  GCCVersion[1] = _GCCVersion[1];
113  GCCVersion[2] = _GCCVersion[2];
114
115  // Set up the tool chain paths to match gcc.
116  ToolChainDir = "i686-apple-darwin";
117  ToolChainDir += llvm::utostr(DarwinVersion[0]);
118  ToolChainDir += "/";
119  ToolChainDir += llvm::utostr(GCCVersion[0]);
120  ToolChainDir += '.';
121  ToolChainDir += llvm::utostr(GCCVersion[1]);
122  ToolChainDir += '.';
123  ToolChainDir += llvm::utostr(GCCVersion[2]);
124
125  // Try the next major version if that tool chain dir is invalid.
126  std::string Tmp = "/usr/lib/gcc/" + ToolChainDir;
127  if (!llvm::sys::Path(Tmp).exists()) {
128    std::string Next = "i686-apple-darwin";
129    Next += llvm::utostr(DarwinVersion[0] + 1);
130    Next += "/";
131    Next += llvm::utostr(GCCVersion[0]);
132    Next += '.';
133    Next += llvm::utostr(GCCVersion[1]);
134    Next += '.';
135    Next += llvm::utostr(GCCVersion[2]);
136
137    // Use that if it exists, otherwise hope the user isn't linking.
138    //
139    // FIXME: Drop dependency on gcc's tool chain.
140    Tmp = "/usr/lib/gcc/" + Next;
141    if (llvm::sys::Path(Tmp).exists())
142      ToolChainDir = Next;
143  }
144
145  std::string Path;
146  if (getArchName() == "x86_64") {
147    Path = getDriver().Dir;
148    Path += "/../lib/gcc/";
149    Path += ToolChainDir;
150    Path += "/x86_64";
151    getFilePaths().push_back(Path);
152
153    Path = "/usr/lib/gcc/";
154    Path += ToolChainDir;
155    Path += "/x86_64";
156    getFilePaths().push_back(Path);
157  }
158
159  Path = getDriver().Dir;
160  Path += "/../lib/gcc/";
161  Path += ToolChainDir;
162  getFilePaths().push_back(Path);
163
164  Path = "/usr/lib/gcc/";
165  Path += ToolChainDir;
166  getFilePaths().push_back(Path);
167
168  Path = getDriver().Dir;
169  Path += "/../libexec/gcc/";
170  Path += ToolChainDir;
171  getProgramPaths().push_back(Path);
172
173  Path = "/usr/libexec/gcc/";
174  Path += ToolChainDir;
175  getProgramPaths().push_back(Path);
176
177  getProgramPaths().push_back(getDriver().Dir);
178}
179
180Darwin::~Darwin() {
181  // Free tool implementations.
182  for (llvm::DenseMap<unsigned, Tool*>::iterator
183         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
184    delete it->second;
185}
186
187Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA) const {
188  Action::ActionClass Key;
189  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
190    Key = Action::AnalyzeJobClass;
191  else
192    Key = JA.getKind();
193
194  // FIXME: This doesn't belong here, but ideally we will support static soon
195  // anyway.
196  bool HasStatic = (C.getArgs().hasArg(options::OPT_mkernel) ||
197                    C.getArgs().hasArg(options::OPT_static) ||
198                    C.getArgs().hasArg(options::OPT_fapple_kext));
199  bool IsIADefault = IsIntegratedAssemblerDefault() && !HasStatic;
200  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
201                                             options::OPT_no_integrated_as,
202                                             IsIADefault);
203
204  Tool *&T = Tools[Key];
205  if (!T) {
206    switch (Key) {
207    case Action::InputClass:
208    case Action::BindArchClass:
209      assert(0 && "Invalid tool kind.");
210    case Action::PreprocessJobClass:
211      T = new tools::darwin::Preprocess(*this); break;
212    case Action::AnalyzeJobClass:
213      T = new tools::Clang(*this); break;
214    case Action::PrecompileJobClass:
215    case Action::CompileJobClass:
216      T = new tools::darwin::Compile(*this); break;
217    case Action::AssembleJobClass: {
218      if (UseIntegratedAs)
219        T = new tools::ClangAs(*this);
220      else
221        T = new tools::darwin::Assemble(*this);
222      break;
223    }
224    case Action::LinkJobClass:
225      T = new tools::darwin::Link(*this); break;
226    case Action::LipoJobClass:
227      T = new tools::darwin::Lipo(*this); break;
228    case Action::DsymutilJobClass:
229      T = new tools::darwin::Dsymutil(*this); break;
230    }
231  }
232
233  return *T;
234}
235
236void DarwinGCC::AddLinkSearchPathArgs(const ArgList &Args,
237                                      ArgStringList &CmdArgs) const {
238  std::string Tmp;
239
240  // FIXME: Derive these correctly.
241  if (getArchName() == "x86_64") {
242    CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
243                                         "/x86_64"));
244    // Intentionally duplicated for (temporary) gcc bug compatibility.
245    CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
246                                         "/x86_64"));
247  }
248
249  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/" + ToolChainDir));
250
251  Tmp = getDriver().Dir + "/../lib/gcc/" + ToolChainDir;
252  if (llvm::sys::Path(Tmp).exists())
253    CmdArgs.push_back(Args.MakeArgString("-L" + Tmp));
254  Tmp = getDriver().Dir + "/../lib/gcc";
255  if (llvm::sys::Path(Tmp).exists())
256    CmdArgs.push_back(Args.MakeArgString("-L" + Tmp));
257  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir));
258  // Intentionally duplicated for (temporary) gcc bug compatibility.
259  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir));
260  Tmp = getDriver().Dir + "/../lib/" + ToolChainDir;
261  if (llvm::sys::Path(Tmp).exists())
262    CmdArgs.push_back(Args.MakeArgString("-L" + Tmp));
263  Tmp = getDriver().Dir + "/../lib";
264  if (llvm::sys::Path(Tmp).exists())
265    CmdArgs.push_back(Args.MakeArgString("-L" + Tmp));
266  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
267                                       "/../../../" + ToolChainDir));
268  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
269                                       "/../../.."));
270}
271
272void DarwinGCC::AddLinkRuntimeLibArgs(const ArgList &Args,
273                                      ArgStringList &CmdArgs) const {
274  // Note that this routine is only used for targetting OS X.
275
276  // Derived from libgcc and lib specs but refactored.
277  if (Args.hasArg(options::OPT_static)) {
278    CmdArgs.push_back("-lgcc_static");
279  } else {
280    if (Args.hasArg(options::OPT_static_libgcc)) {
281      CmdArgs.push_back("-lgcc_eh");
282    } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) {
283      // Derived from darwin_iphoneos_libgcc spec.
284      if (isTargetIPhoneOS()) {
285        CmdArgs.push_back("-lgcc_s.1");
286      } else {
287        CmdArgs.push_back("-lgcc_s.10.5");
288      }
289    } else if (Args.hasArg(options::OPT_shared_libgcc) ||
290               Args.hasFlag(options::OPT_fexceptions,
291                            options::OPT_fno_exceptions) ||
292               Args.hasArg(options::OPT_fgnu_runtime)) {
293      // FIXME: This is probably broken on 10.3?
294      if (isMacosxVersionLT(10, 5))
295        CmdArgs.push_back("-lgcc_s.10.4");
296      else if (isMacosxVersionLT(10, 6))
297        CmdArgs.push_back("-lgcc_s.10.5");
298    } else {
299      if (isMacosxVersionLT(10, 3, 9))
300        ; // Do nothing.
301      else if (isMacosxVersionLT(10, 5))
302        CmdArgs.push_back("-lgcc_s.10.4");
303      else if (isMacosxVersionLT(10, 6))
304        CmdArgs.push_back("-lgcc_s.10.5");
305    }
306
307    if (isTargetIPhoneOS() || isMacosxVersionLT(10, 6)) {
308      CmdArgs.push_back("-lgcc");
309      CmdArgs.push_back("-lSystem");
310    } else {
311      CmdArgs.push_back("-lSystem");
312      CmdArgs.push_back("-lgcc");
313    }
314  }
315}
316
317DarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple,
318                         const unsigned (&DarwinVersion)[3])
319  : Darwin(Host, Triple, DarwinVersion)
320{
321  // We expect 'as', 'ld', etc. to be adjacent to our install dir.
322  getProgramPaths().push_back(getDriver().Dir);
323}
324
325void DarwinClang::AddLinkSearchPathArgs(const ArgList &Args,
326                                       ArgStringList &CmdArgs) const {
327  // The Clang toolchain uses explicit paths for internal libraries.
328}
329
330void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
331                                        ArgStringList &CmdArgs) const {
332  // Darwin doesn't support real static executables, don't link any runtime
333  // libraries with -static.
334  if (Args.hasArg(options::OPT_static))
335    return;
336
337  // Reject -static-libgcc for now, we can deal with this when and if someone
338  // cares. This is useful in situations where someone wants to statically link
339  // something like libstdc++, and needs its runtime support routines.
340  if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
341    getDriver().Diag(clang::diag::err_drv_unsupported_opt)
342      << A->getAsString(Args);
343    return;
344  }
345
346  // Otherwise link libSystem, then the dynamic runtime library, and finally any
347  // target specific static runtime library.
348  CmdArgs.push_back("-lSystem");
349
350  // Select the dynamic runtime library and the target specific static library.
351  const char *DarwinStaticLib = 0;
352  if (isTargetIPhoneOS()) {
353    CmdArgs.push_back("-lgcc_s.1");
354
355    // We may need some static functions for armv6/thumb which are required to
356    // be in the same linkage unit as their caller.
357    if (getDarwinArchName(Args) == "armv6")
358      DarwinStaticLib = "libclang_rt.armv6.a";
359  } else {
360    // The dynamic runtime library was merged with libSystem for 10.6 and
361    // beyond; only 10.4 and 10.5 need an additional runtime library.
362    if (isMacosxVersionLT(10, 5))
363      CmdArgs.push_back("-lgcc_s.10.4");
364    else if (isMacosxVersionLT(10, 6))
365      CmdArgs.push_back("-lgcc_s.10.5");
366
367    // For OS X, we only need a static runtime library when targetting 10.4, to
368    // provide versions of the static functions which were omitted from
369    // 10.4.dylib.
370    if (isMacosxVersionLT(10, 5))
371      DarwinStaticLib = "libclang_rt.10.4.a";
372  }
373
374  /// Add the target specific static library, if needed.
375  if (DarwinStaticLib) {
376    llvm::sys::Path P(getDriver().ResourceDir);
377    P.appendComponent("lib");
378    P.appendComponent("darwin");
379    P.appendComponent(DarwinStaticLib);
380
381    // For now, allow missing resource libraries to support developers who may
382    // not have compiler-rt checked out or integrated into their build.
383    if (!P.exists())
384      getDriver().Diag(clang::diag::warn_drv_missing_resource_library)
385        << P.str();
386    else
387      CmdArgs.push_back(Args.MakeArgString(P.str()));
388  }
389}
390
391DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
392                                      const char *BoundArch) const {
393  DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
394  const OptTable &Opts = getDriver().getOpts();
395
396  // FIXME: We really want to get out of the tool chain level argument
397  // translation business, as it makes the driver functionality much
398  // more opaque. For now, we follow gcc closely solely for the
399  // purpose of easily achieving feature parity & testability. Once we
400  // have something that works, we should reevaluate each translation
401  // and try to push it down into tool specific logic.
402
403  Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
404  Arg *iPhoneVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
405  if (OSXVersion && iPhoneVersion) {
406    getDriver().Diag(clang::diag::err_drv_argument_not_allowed_with)
407          << OSXVersion->getAsString(Args)
408          << iPhoneVersion->getAsString(Args);
409    iPhoneVersion = 0;
410  } else if (!OSXVersion && !iPhoneVersion) {
411    // If neither OS X nor iPhoneOS targets were specified, check for
412    // environment defines.
413    const char *OSXTarget = ::getenv("MACOSX_DEPLOYMENT_TARGET");
414    const char *iPhoneOSTarget = ::getenv("IPHONEOS_DEPLOYMENT_TARGET");
415
416    // Ignore empty strings.
417    if (OSXTarget && OSXTarget[0] == '\0')
418      OSXTarget = 0;
419    if (iPhoneOSTarget && iPhoneOSTarget[0] == '\0')
420      iPhoneOSTarget = 0;
421
422    // Diagnose conflicting deployment targets, and choose default platform
423    // based on the tool chain.
424    //
425    // FIXME: Don't hardcode default here.
426    if (OSXTarget && iPhoneOSTarget) {
427      // FIXME: We should see if we can get away with warning or erroring on
428      // this. Perhaps put under -pedantic?
429      if (getTriple().getArch() == llvm::Triple::arm ||
430          getTriple().getArch() == llvm::Triple::thumb)
431        OSXTarget = 0;
432      else
433        iPhoneOSTarget = 0;
434    }
435
436    if (OSXTarget) {
437      const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
438      OSXVersion = DAL->MakeJoinedArg(0, O, OSXTarget);
439      DAL->append(OSXVersion);
440    } else if (iPhoneOSTarget) {
441      const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
442      iPhoneVersion = DAL->MakeJoinedArg(0, O, iPhoneOSTarget);
443      DAL->append(iPhoneVersion);
444    } else {
445      // Otherwise, choose a default platform based on the tool chain.
446      //
447      // FIXME: Don't hardcode default here.
448      if (getTriple().getArch() == llvm::Triple::arm ||
449          getTriple().getArch() == llvm::Triple::thumb) {
450        const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
451        iPhoneVersion = DAL->MakeJoinedArg(0, O, "3.0");
452        DAL->append(iPhoneVersion);
453      } else {
454        const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
455        OSXVersion = DAL->MakeJoinedArg(0, O, MacosxVersionMin);
456        DAL->append(OSXVersion);
457      }
458    }
459  }
460
461  // Set the tool chain target information.
462  unsigned Major, Minor, Micro;
463  bool HadExtra;
464  if (OSXVersion) {
465    assert(!iPhoneVersion && "Unknown target platform!");
466    if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor,
467                                   Micro, HadExtra) || HadExtra ||
468        Major != 10 || Minor >= 10 || Micro >= 10)
469      getDriver().Diag(clang::diag::err_drv_invalid_version_number)
470        << OSXVersion->getAsString(Args);
471  } else {
472    assert(iPhoneVersion && "Unknown target platform!");
473    if (!Driver::GetReleaseVersion(iPhoneVersion->getValue(Args), Major, Minor,
474                                   Micro, HadExtra) || HadExtra ||
475        Major >= 10 || Minor >= 100 || Micro >= 100)
476      getDriver().Diag(clang::diag::err_drv_invalid_version_number)
477        << iPhoneVersion->getAsString(Args);
478  }
479  setTarget(iPhoneVersion, Major, Minor, Micro);
480
481  for (ArgList::const_iterator it = Args.begin(),
482         ie = Args.end(); it != ie; ++it) {
483    Arg *A = *it;
484
485    if (A->getOption().matches(options::OPT_Xarch__)) {
486      // FIXME: Canonicalize name.
487      if (getArchName() != A->getValue(Args, 0))
488        continue;
489
490      // FIXME: The arg is leaked here, and we should have a nicer
491      // interface for this.
492      unsigned Prev, Index = Prev = A->getIndex() + 1;
493      Arg *XarchArg = Opts.ParseOneArg(Args, Index);
494
495      // If the argument parsing failed or more than one argument was
496      // consumed, the -Xarch_ argument's parameter tried to consume
497      // extra arguments. Emit an error and ignore.
498      //
499      // We also want to disallow any options which would alter the
500      // driver behavior; that isn't going to work in our model. We
501      // use isDriverOption() as an approximation, although things
502      // like -O4 are going to slip through.
503      if (!XarchArg || Index > Prev + 1 ||
504          XarchArg->getOption().isDriverOption()) {
505       getDriver().Diag(clang::diag::err_drv_invalid_Xarch_argument)
506          << A->getAsString(Args);
507        continue;
508      }
509
510      XarchArg->setBaseArg(A);
511      A = XarchArg;
512    }
513
514    // Sob. These is strictly gcc compatible for the time being. Apple
515    // gcc translates options twice, which means that self-expanding
516    // options add duplicates.
517    switch ((options::ID) A->getOption().getID()) {
518    default:
519      DAL->append(A);
520      break;
521
522    case options::OPT_mkernel:
523    case options::OPT_fapple_kext:
524      DAL->append(A);
525      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
526      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
527      break;
528
529    case options::OPT_dependency_file:
530      DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF),
531                          A->getValue(Args));
532      break;
533
534    case options::OPT_gfull:
535      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
536      DAL->AddFlagArg(A,
537               Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
538      break;
539
540    case options::OPT_gused:
541      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
542      DAL->AddFlagArg(A,
543             Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
544      break;
545
546    case options::OPT_fterminated_vtables:
547    case options::OPT_findirect_virtual_calls:
548      DAL->AddFlagArg(A, Opts.getOption(options::OPT_fapple_kext));
549      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
550      break;
551
552    case options::OPT_shared:
553      DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
554      break;
555
556    case options::OPT_fconstant_cfstrings:
557      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
558      break;
559
560    case options::OPT_fno_constant_cfstrings:
561      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
562      break;
563
564    case options::OPT_Wnonportable_cfstrings:
565      DAL->AddFlagArg(A,
566                      Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
567      break;
568
569    case options::OPT_Wno_nonportable_cfstrings:
570      DAL->AddFlagArg(A,
571                   Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
572      break;
573
574    case options::OPT_fpascal_strings:
575      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
576      break;
577
578    case options::OPT_fno_pascal_strings:
579      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
580      break;
581    }
582  }
583
584  if (getTriple().getArch() == llvm::Triple::x86 ||
585      getTriple().getArch() == llvm::Triple::x86_64)
586    if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
587      DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2");
588
589  // Add the arch options based on the particular spelling of -arch, to match
590  // how the driver driver works.
591  if (BoundArch) {
592    llvm::StringRef Name = BoundArch;
593    const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ);
594    const Option *MArch = Opts.getOption(options::OPT_march_EQ);
595
596    // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
597    // which defines the list of which architectures we accept.
598    if (Name == "ppc")
599      ;
600    else if (Name == "ppc601")
601      DAL->AddJoinedArg(0, MCpu, "601");
602    else if (Name == "ppc603")
603      DAL->AddJoinedArg(0, MCpu, "603");
604    else if (Name == "ppc604")
605      DAL->AddJoinedArg(0, MCpu, "604");
606    else if (Name == "ppc604e")
607      DAL->AddJoinedArg(0, MCpu, "604e");
608    else if (Name == "ppc750")
609      DAL->AddJoinedArg(0, MCpu, "750");
610    else if (Name == "ppc7400")
611      DAL->AddJoinedArg(0, MCpu, "7400");
612    else if (Name == "ppc7450")
613      DAL->AddJoinedArg(0, MCpu, "7450");
614    else if (Name == "ppc970")
615      DAL->AddJoinedArg(0, MCpu, "970");
616
617    else if (Name == "ppc64")
618      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
619
620    else if (Name == "i386")
621      ;
622    else if (Name == "i486")
623      DAL->AddJoinedArg(0, MArch, "i486");
624    else if (Name == "i586")
625      DAL->AddJoinedArg(0, MArch, "i586");
626    else if (Name == "i686")
627      DAL->AddJoinedArg(0, MArch, "i686");
628    else if (Name == "pentium")
629      DAL->AddJoinedArg(0, MArch, "pentium");
630    else if (Name == "pentium2")
631      DAL->AddJoinedArg(0, MArch, "pentium2");
632    else if (Name == "pentpro")
633      DAL->AddJoinedArg(0, MArch, "pentiumpro");
634    else if (Name == "pentIIm3")
635      DAL->AddJoinedArg(0, MArch, "pentium2");
636
637    else if (Name == "x86_64")
638      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
639
640    else if (Name == "arm")
641      DAL->AddJoinedArg(0, MArch, "armv4t");
642    else if (Name == "armv4t")
643      DAL->AddJoinedArg(0, MArch, "armv4t");
644    else if (Name == "armv5")
645      DAL->AddJoinedArg(0, MArch, "armv5tej");
646    else if (Name == "xscale")
647      DAL->AddJoinedArg(0, MArch, "xscale");
648    else if (Name == "armv6")
649      DAL->AddJoinedArg(0, MArch, "armv6k");
650    else if (Name == "armv7")
651      DAL->AddJoinedArg(0, MArch, "armv7a");
652
653    else
654      llvm_unreachable("invalid Darwin arch");
655  }
656
657  return DAL;
658}
659
660bool Darwin::IsUnwindTablesDefault() const {
661  // FIXME: Gross; we should probably have some separate target
662  // definition, possibly even reusing the one in clang.
663  return getArchName() == "x86_64";
664}
665
666bool Darwin::UseDwarfDebugFlags() const {
667  if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
668    return S[0] != '\0';
669  return false;
670}
671
672bool Darwin::UseSjLjExceptions() const {
673  // Darwin uses SjLj exceptions on ARM.
674  return (getTriple().getArch() == llvm::Triple::arm ||
675          getTriple().getArch() == llvm::Triple::thumb);
676}
677
678const char *Darwin::GetDefaultRelocationModel() const {
679  return "pic";
680}
681
682const char *Darwin::GetForcedPicModel() const {
683  if (getArchName() == "x86_64")
684    return "pic";
685  return 0;
686}
687
688bool Darwin::SupportsObjCGC() const {
689  // Garbage collection is supported everywhere except on iPhone OS.
690  return !isTargetIPhoneOS();
691}
692
693/// Generic_GCC - A tool chain using the 'gcc' command to perform
694/// all subcommands; this relies on gcc translating the majority of
695/// command line options.
696
697Generic_GCC::Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple)
698  : ToolChain(Host, Triple) {
699  getProgramPaths().push_back(getDriver().Dir);
700}
701
702Generic_GCC::~Generic_GCC() {
703  // Free tool implementations.
704  for (llvm::DenseMap<unsigned, Tool*>::iterator
705         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
706    delete it->second;
707}
708
709Tool &Generic_GCC::SelectTool(const Compilation &C,
710                              const JobAction &JA) const {
711  Action::ActionClass Key;
712  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
713    Key = Action::AnalyzeJobClass;
714  else
715    Key = JA.getKind();
716
717  Tool *&T = Tools[Key];
718  if (!T) {
719    switch (Key) {
720    case Action::InputClass:
721    case Action::BindArchClass:
722      assert(0 && "Invalid tool kind.");
723    case Action::PreprocessJobClass:
724      T = new tools::gcc::Preprocess(*this); break;
725    case Action::PrecompileJobClass:
726      T = new tools::gcc::Precompile(*this); break;
727    case Action::AnalyzeJobClass:
728      T = new tools::Clang(*this); break;
729    case Action::CompileJobClass:
730      T = new tools::gcc::Compile(*this); break;
731    case Action::AssembleJobClass:
732      T = new tools::gcc::Assemble(*this); break;
733    case Action::LinkJobClass:
734      T = new tools::gcc::Link(*this); break;
735
736      // This is a bit ungeneric, but the only platform using a driver
737      // driver is Darwin.
738    case Action::LipoJobClass:
739      T = new tools::darwin::Lipo(*this); break;
740    case Action::DsymutilJobClass:
741      T = new tools::darwin::Dsymutil(*this); break;
742    }
743  }
744
745  return *T;
746}
747
748bool Generic_GCC::IsUnwindTablesDefault() const {
749  // FIXME: Gross; we should probably have some separate target
750  // definition, possibly even reusing the one in clang.
751  return getArchName() == "x86_64";
752}
753
754const char *Generic_GCC::GetDefaultRelocationModel() const {
755  return "static";
756}
757
758const char *Generic_GCC::GetForcedPicModel() const {
759  return 0;
760}
761
762/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
763/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
764/// Currently does not support anything else but compilation.
765
766TCEToolChain::TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple)
767  : ToolChain(Host, Triple) {
768  // Path mangling to find libexec
769  std::string Path(getDriver().Dir);
770
771  Path += "/../libexec";
772  getProgramPaths().push_back(Path);
773}
774
775TCEToolChain::~TCEToolChain() {
776  for (llvm::DenseMap<unsigned, Tool*>::iterator
777           it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
778      delete it->second;
779}
780
781bool TCEToolChain::IsMathErrnoDefault() const {
782  return true;
783}
784
785bool TCEToolChain::IsUnwindTablesDefault() const {
786  return false;
787}
788
789const char *TCEToolChain::GetDefaultRelocationModel() const {
790  return "static";
791}
792
793const char *TCEToolChain::GetForcedPicModel() const {
794  return 0;
795}
796
797Tool &TCEToolChain::SelectTool(const Compilation &C,
798                            const JobAction &JA) const {
799  Action::ActionClass Key;
800  Key = Action::AnalyzeJobClass;
801
802  Tool *&T = Tools[Key];
803  if (!T) {
804    switch (Key) {
805    case Action::PreprocessJobClass:
806      T = new tools::gcc::Preprocess(*this); break;
807    case Action::AnalyzeJobClass:
808      T = new tools::Clang(*this); break;
809    default:
810     assert(false && "Unsupported action for TCE target.");
811    }
812  }
813  return *T;
814}
815
816/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
817
818OpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple)
819  : Generic_GCC(Host, Triple) {
820  getFilePaths().push_back(getDriver().Dir + "/../lib");
821  getFilePaths().push_back("/usr/lib");
822}
823
824Tool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA) const {
825  Action::ActionClass Key;
826  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
827    Key = Action::AnalyzeJobClass;
828  else
829    Key = JA.getKind();
830
831  Tool *&T = Tools[Key];
832  if (!T) {
833    switch (Key) {
834    case Action::AssembleJobClass:
835      T = new tools::openbsd::Assemble(*this); break;
836    case Action::LinkJobClass:
837      T = new tools::openbsd::Link(*this); break;
838    default:
839      T = &Generic_GCC::SelectTool(C, JA);
840    }
841  }
842
843  return *T;
844}
845
846/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
847
848FreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple, bool Lib32)
849  : Generic_GCC(Host, Triple) {
850  if (Lib32) {
851    getFilePaths().push_back(getDriver().Dir + "/../lib32");
852    getFilePaths().push_back("/usr/lib32");
853  } else {
854    getFilePaths().push_back(getDriver().Dir + "/../lib");
855    getFilePaths().push_back("/usr/lib");
856  }
857}
858
859Tool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA) const {
860  Action::ActionClass Key;
861  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
862    Key = Action::AnalyzeJobClass;
863  else
864    Key = JA.getKind();
865
866  Tool *&T = Tools[Key];
867  if (!T) {
868    switch (Key) {
869    case Action::AssembleJobClass:
870      T = new tools::freebsd::Assemble(*this); break;
871    case Action::LinkJobClass:
872      T = new tools::freebsd::Link(*this); break;
873    default:
874      T = &Generic_GCC::SelectTool(C, JA);
875    }
876  }
877
878  return *T;
879}
880
881/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
882
883AuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple)
884  : Generic_GCC(Host, Triple) {
885
886  getProgramPaths().push_back(getDriver().Dir);
887
888  getFilePaths().push_back(getDriver().Dir + "/../lib");
889  getFilePaths().push_back("/usr/lib");
890  getFilePaths().push_back("/usr/sfw/lib");
891  getFilePaths().push_back("/opt/gcc4/lib");
892  getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
893
894}
895
896Tool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA) const {
897  Action::ActionClass Key;
898  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
899    Key = Action::AnalyzeJobClass;
900  else
901    Key = JA.getKind();
902
903  Tool *&T = Tools[Key];
904  if (!T) {
905    switch (Key) {
906    case Action::AssembleJobClass:
907      T = new tools::auroraux::Assemble(*this); break;
908    case Action::LinkJobClass:
909      T = new tools::auroraux::Link(*this); break;
910    default:
911      T = &Generic_GCC::SelectTool(C, JA);
912    }
913  }
914
915  return *T;
916}
917
918
919/// Linux toolchain (very bare-bones at the moment).
920
921Linux::Linux(const HostInfo &Host, const llvm::Triple& Triple)
922  : Generic_GCC(Host, Triple) {
923  getFilePaths().push_back(getDriver().Dir + "/../lib/clang/1.0/");
924  getFilePaths().push_back("/lib/");
925  getFilePaths().push_back("/usr/lib/");
926
927  // Depending on the Linux distribution, any combination of lib{,32,64} is
928  // possible. E.g. Debian uses lib and lib32 for mixed i386/x86-64 systems,
929  // openSUSE uses lib and lib64 for the same purpose.
930  getFilePaths().push_back("/lib32/");
931  getFilePaths().push_back("/usr/lib32/");
932  getFilePaths().push_back("/lib64/");
933  getFilePaths().push_back("/usr/lib64/");
934
935  // FIXME: Figure out some way to get gcc's libdir
936  // (e.g. /usr/lib/gcc/i486-linux-gnu/4.3/ for Ubuntu 32-bit); we need
937  // crtbegin.o/crtend.o/etc., and want static versions of various
938  // libraries. If we had our own crtbegin.o/crtend.o/etc, we could probably
939  // get away with using shared versions in /usr/lib, though.
940  // We could fall back to the approach we used for includes (a massive
941  // list), but that's messy at best.
942}
943
944/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
945
946DragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple)
947  : Generic_GCC(Host, Triple) {
948
949  // Path mangling to find libexec
950  getProgramPaths().push_back(getDriver().Dir);
951
952  getFilePaths().push_back(getDriver().Dir + "/../lib");
953  getFilePaths().push_back("/usr/lib");
954  getFilePaths().push_back("/usr/lib/gcc41");
955}
956
957Tool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA) const {
958  Action::ActionClass Key;
959  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
960    Key = Action::AnalyzeJobClass;
961  else
962    Key = JA.getKind();
963
964  Tool *&T = Tools[Key];
965  if (!T) {
966    switch (Key) {
967    case Action::AssembleJobClass:
968      T = new tools::dragonfly::Assemble(*this); break;
969    case Action::LinkJobClass:
970      T = new tools::dragonfly::Link(*this); break;
971    default:
972      T = &Generic_GCC::SelectTool(C, JA);
973    }
974  }
975
976  return *T;
977}
978