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/OptTable.h"
18#include "clang/Driver/Option.h"
19#include "clang/Driver/Options.h"
20#include "clang/Basic/ObjCRuntime.h"
21#include "clang/Basic/Version.h"
22
23#include "llvm/ADT/SmallString.h"
24#include "llvm/ADT/StringExtras.h"
25#include "llvm/ADT/StringSwitch.h"
26#include "llvm/ADT/STLExtras.h"
27#include "llvm/Support/ErrorHandling.h"
28#include "llvm/Support/FileSystem.h"
29#include "llvm/Support/MemoryBuffer.h"
30#include "llvm/Support/raw_ostream.h"
31#include "llvm/Support/Path.h"
32#include "llvm/Support/system_error.h"
33
34#include <cstdlib> // ::getenv
35
36#include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
37
38using namespace clang::driver;
39using namespace clang::driver::toolchains;
40using namespace clang;
41
42/// Darwin - Darwin tool chain for i386 and x86_64.
43
44Darwin::Darwin(const Driver &D, const llvm::Triple& Triple)
45  : ToolChain(D, Triple), TargetInitialized(false)
46{
47  // Compute the initial Darwin version from the triple
48  unsigned Major, Minor, Micro;
49  if (!Triple.getMacOSXVersion(Major, Minor, Micro))
50    getDriver().Diag(diag::err_drv_invalid_darwin_version) <<
51      Triple.getOSName();
52  llvm::raw_string_ostream(MacosxVersionMin)
53    << Major << '.' << Minor << '.' << Micro;
54
55  // FIXME: DarwinVersion is only used to find GCC's libexec directory.
56  // It should be removed when we stop supporting that.
57  DarwinVersion[0] = Minor + 4;
58  DarwinVersion[1] = Micro;
59  DarwinVersion[2] = 0;
60
61  // Compute the initial iOS version from the triple
62  Triple.getiOSVersion(Major, Minor, Micro);
63  llvm::raw_string_ostream(iOSVersionMin)
64    << Major << '.' << Minor << '.' << Micro;
65}
66
67types::ID Darwin::LookupTypeForExtension(const char *Ext) const {
68  types::ID Ty = types::lookupTypeForExtension(Ext);
69
70  // Darwin always preprocesses assembly files (unless -x is used explicitly).
71  if (Ty == types::TY_PP_Asm)
72    return types::TY_Asm;
73
74  return Ty;
75}
76
77bool Darwin::HasNativeLLVMSupport() const {
78  return true;
79}
80
81/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
82ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
83  if (isTargetIPhoneOS()) {
84    return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
85  } else if (TargetSimulatorVersionFromDefines != VersionTuple()) {
86    return ObjCRuntime(ObjCRuntime::iOS, TargetSimulatorVersionFromDefines);
87  } else {
88    if (isNonFragile) {
89      return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
90    } else {
91      return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
92    }
93  }
94}
95
96/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
97bool Darwin::hasBlocksRuntime() const {
98  if (isTargetIPhoneOS())
99    return !isIPhoneOSVersionLT(3, 2);
100  else
101    return !isMacosxVersionLT(10, 6);
102}
103
104static const char *GetArmArchForMArch(StringRef Value) {
105  return llvm::StringSwitch<const char*>(Value)
106    .Case("armv6k", "armv6")
107    .Case("armv5tej", "armv5")
108    .Case("xscale", "xscale")
109    .Case("armv4t", "armv4t")
110    .Case("armv7", "armv7")
111    .Cases("armv7a", "armv7-a", "armv7")
112    .Cases("armv7r", "armv7-r", "armv7")
113    .Cases("armv7m", "armv7-m", "armv7")
114    .Default(0);
115}
116
117static const char *GetArmArchForMCpu(StringRef Value) {
118  return llvm::StringSwitch<const char *>(Value)
119    .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "arm926ej-s","armv5")
120    .Cases("arm10e", "arm10tdmi", "armv5")
121    .Cases("arm1020t", "arm1020e", "arm1022e", "arm1026ej-s", "armv5")
122    .Case("xscale", "xscale")
123    .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s",
124           "arm1176jzf-s", "cortex-m0", "armv6")
125    .Cases("cortex-a8", "cortex-r4", "cortex-m3", "cortex-a9", "armv7")
126    .Default(0);
127}
128
129StringRef Darwin::getDarwinArchName(const ArgList &Args) const {
130  switch (getTriple().getArch()) {
131  default:
132    return getArchName();
133
134  case llvm::Triple::thumb:
135  case llvm::Triple::arm: {
136    if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
137      if (const char *Arch = GetArmArchForMArch(A->getValue(Args)))
138        return Arch;
139
140    if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
141      if (const char *Arch = GetArmArchForMCpu(A->getValue(Args)))
142        return Arch;
143
144    return "arm";
145  }
146  }
147}
148
149Darwin::~Darwin() {
150  // Free tool implementations.
151  for (llvm::DenseMap<unsigned, Tool*>::iterator
152         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
153    delete it->second;
154}
155
156std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
157                                                types::ID InputType) const {
158  llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
159
160  // If the target isn't initialized (e.g., an unknown Darwin platform, return
161  // the default triple).
162  if (!isTargetInitialized())
163    return Triple.getTriple();
164
165  SmallString<16> Str;
166  Str += isTargetIPhoneOS() ? "ios" : "macosx";
167  Str += getTargetVersion().getAsString();
168  Triple.setOSName(Str);
169
170  return Triple.getTriple();
171}
172
173void Generic_ELF::anchor() {}
174
175Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA,
176                         const ActionList &Inputs) const {
177  Action::ActionClass Key = JA.getKind();
178  bool useClang = false;
179
180  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) {
181    useClang = true;
182    // Fallback to llvm-gcc for i386 kext compiles, we don't support that ABI.
183    if (!getDriver().shouldForceClangUse() &&
184        Inputs.size() == 1 &&
185        types::isCXX(Inputs[0]->getType()) &&
186        getTriple().isOSDarwin() &&
187        getTriple().getArch() == llvm::Triple::x86 &&
188        (C.getArgs().getLastArg(options::OPT_fapple_kext) ||
189         C.getArgs().getLastArg(options::OPT_mkernel)))
190      useClang = false;
191  }
192
193  // FIXME: This seems like a hacky way to choose clang frontend.
194  if (useClang)
195    Key = Action::AnalyzeJobClass;
196
197  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
198                                             options::OPT_no_integrated_as,
199                                             IsIntegratedAssemblerDefault());
200
201  Tool *&T = Tools[Key];
202  if (!T) {
203    switch (Key) {
204    case Action::InputClass:
205    case Action::BindArchClass:
206      llvm_unreachable("Invalid tool kind.");
207    case Action::PreprocessJobClass:
208      T = new tools::darwin::Preprocess(*this); break;
209    case Action::AnalyzeJobClass:
210    case Action::MigrateJobClass:
211      T = new tools::Clang(*this); break;
212    case Action::PrecompileJobClass:
213    case Action::CompileJobClass:
214      T = new tools::darwin::Compile(*this); break;
215    case Action::AssembleJobClass: {
216      if (UseIntegratedAs)
217        T = new tools::ClangAs(*this);
218      else
219        T = new tools::darwin::Assemble(*this);
220      break;
221    }
222    case Action::LinkJobClass:
223      T = new tools::darwin::Link(*this); break;
224    case Action::LipoJobClass:
225      T = new tools::darwin::Lipo(*this); break;
226    case Action::DsymutilJobClass:
227      T = new tools::darwin::Dsymutil(*this); break;
228    case Action::VerifyJobClass:
229      T = new tools::darwin::VerifyDebug(*this); break;
230    }
231  }
232
233  return *T;
234}
235
236
237DarwinClang::DarwinClang(const Driver &D, const llvm::Triple& Triple)
238  : Darwin(D, Triple)
239{
240  getProgramPaths().push_back(getDriver().getInstalledDir());
241  if (getDriver().getInstalledDir() != getDriver().Dir)
242    getProgramPaths().push_back(getDriver().Dir);
243
244  // We expect 'as', 'ld', etc. to be adjacent to our install dir.
245  getProgramPaths().push_back(getDriver().getInstalledDir());
246  if (getDriver().getInstalledDir() != getDriver().Dir)
247    getProgramPaths().push_back(getDriver().Dir);
248
249  // For fallback, we need to know how to find the GCC cc1 executables, so we
250  // also add the GCC libexec paths. This is legacy code that can be removed
251  // once fallback is no longer useful.
252  AddGCCLibexecPath(DarwinVersion[0]);
253  AddGCCLibexecPath(DarwinVersion[0] - 2);
254  AddGCCLibexecPath(DarwinVersion[0] - 1);
255  AddGCCLibexecPath(DarwinVersion[0] + 1);
256  AddGCCLibexecPath(DarwinVersion[0] + 2);
257}
258
259void DarwinClang::AddGCCLibexecPath(unsigned darwinVersion) {
260  std::string ToolChainDir = "i686-apple-darwin";
261  ToolChainDir += llvm::utostr(darwinVersion);
262  ToolChainDir += "/4.2.1";
263
264  std::string Path = getDriver().Dir;
265  Path += "/../llvm-gcc-4.2/libexec/gcc/";
266  Path += ToolChainDir;
267  getProgramPaths().push_back(Path);
268
269  Path = "/usr/llvm-gcc-4.2/libexec/gcc/";
270  Path += ToolChainDir;
271  getProgramPaths().push_back(Path);
272}
273
274void DarwinClang::AddLinkARCArgs(const ArgList &Args,
275                                 ArgStringList &CmdArgs) const {
276
277  CmdArgs.push_back("-force_load");
278  llvm::sys::Path P(getDriver().ClangExecutable);
279  P.eraseComponent(); // 'clang'
280  P.eraseComponent(); // 'bin'
281  P.appendComponent("lib");
282  P.appendComponent("arc");
283  P.appendComponent("libarclite_");
284  std::string s = P.str();
285  // Mash in the platform.
286  if (isTargetIOSSimulator())
287    s += "iphonesimulator";
288  else if (isTargetIPhoneOS())
289    s += "iphoneos";
290  // FIXME: Remove this once we depend fully on -mios-simulator-version-min.
291  else if (TargetSimulatorVersionFromDefines != VersionTuple())
292    s += "iphonesimulator";
293  else
294    s += "macosx";
295  s += ".a";
296
297  CmdArgs.push_back(Args.MakeArgString(s));
298}
299
300void DarwinClang::AddLinkRuntimeLib(const ArgList &Args,
301                                    ArgStringList &CmdArgs,
302                                    const char *DarwinStaticLib) const {
303  llvm::sys::Path P(getDriver().ResourceDir);
304  P.appendComponent("lib");
305  P.appendComponent("darwin");
306  P.appendComponent(DarwinStaticLib);
307
308  // For now, allow missing resource libraries to support developers who may
309  // not have compiler-rt checked out or integrated into their build.
310  bool Exists;
311  if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
312    CmdArgs.push_back(Args.MakeArgString(P.str()));
313}
314
315void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
316                                        ArgStringList &CmdArgs) const {
317  // Darwin only supports the compiler-rt based runtime libraries.
318  switch (GetRuntimeLibType(Args)) {
319  case ToolChain::RLT_CompilerRT:
320    break;
321  default:
322    getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
323      << Args.getLastArg(options::OPT_rtlib_EQ)->getValue(Args) << "darwin";
324    return;
325  }
326
327  // Darwin doesn't support real static executables, don't link any runtime
328  // libraries with -static.
329  if (Args.hasArg(options::OPT_static))
330    return;
331
332  // Reject -static-libgcc for now, we can deal with this when and if someone
333  // cares. This is useful in situations where someone wants to statically link
334  // something like libstdc++, and needs its runtime support routines.
335  if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
336    getDriver().Diag(diag::err_drv_unsupported_opt)
337      << A->getAsString(Args);
338    return;
339  }
340
341  // If we are building profile support, link that library in.
342  if (Args.hasArg(options::OPT_fprofile_arcs) ||
343      Args.hasArg(options::OPT_fprofile_generate) ||
344      Args.hasArg(options::OPT_fcreate_profile) ||
345      Args.hasArg(options::OPT_coverage)) {
346    // Select the appropriate runtime library for the target.
347    if (isTargetIPhoneOS()) {
348      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a");
349    } else {
350      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a");
351    }
352  }
353
354  // Add ASAN runtime library, if required. Dynamic libraries and bundles
355  // should not be linked with the runtime library.
356  if (Args.hasFlag(options::OPT_faddress_sanitizer,
357                   options::OPT_fno_address_sanitizer, false)) {
358    if (Args.hasArg(options::OPT_dynamiclib) ||
359        Args.hasArg(options::OPT_bundle)) return;
360    if (isTargetIPhoneOS()) {
361      getDriver().Diag(diag::err_drv_clang_unsupported_per_platform)
362        << "-faddress-sanitizer";
363    } else {
364      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.asan_osx.a");
365
366      // The ASAN runtime library requires C++ and CoreFoundation.
367      AddCXXStdlibLibArgs(Args, CmdArgs);
368      CmdArgs.push_back("-framework");
369      CmdArgs.push_back("CoreFoundation");
370    }
371  }
372
373  // Otherwise link libSystem, then the dynamic runtime library, and finally any
374  // target specific static runtime library.
375  CmdArgs.push_back("-lSystem");
376
377  // Select the dynamic runtime library and the target specific static library.
378  if (isTargetIPhoneOS()) {
379    // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
380    // it never went into the SDK.
381    // Linking against libgcc_s.1 isn't needed for iOS 5.0+
382    if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator())
383      CmdArgs.push_back("-lgcc_s.1");
384
385    // We currently always need a static runtime library for iOS.
386    AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
387  } else {
388    // The dynamic runtime library was merged with libSystem for 10.6 and
389    // beyond; only 10.4 and 10.5 need an additional runtime library.
390    if (isMacosxVersionLT(10, 5))
391      CmdArgs.push_back("-lgcc_s.10.4");
392    else if (isMacosxVersionLT(10, 6))
393      CmdArgs.push_back("-lgcc_s.10.5");
394
395    // For OS X, we thought we would only need a static runtime library when
396    // targeting 10.4, to provide versions of the static functions which were
397    // omitted from 10.4.dylib.
398    //
399    // Unfortunately, that turned out to not be true, because Darwin system
400    // headers can still use eprintf on i386, and it is not exported from
401    // libSystem. Therefore, we still must provide a runtime library just for
402    // the tiny tiny handful of projects that *might* use that symbol.
403    if (isMacosxVersionLT(10, 5)) {
404      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
405    } else {
406      if (getTriple().getArch() == llvm::Triple::x86)
407        AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
408      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
409    }
410  }
411}
412
413static inline StringRef SimulatorVersionDefineName() {
414  return "__IPHONE_OS_VERSION_MIN_REQUIRED";
415}
416
417/// \brief Parse the simulator version define:
418/// __IPHONE_OS_VERSION_MIN_REQUIRED=([0-9])([0-9][0-9])([0-9][0-9])
419// and return the grouped values as integers, e.g:
420//   __IPHONE_OS_VERSION_MIN_REQUIRED=40201
421// will return Major=4, Minor=2, Micro=1.
422static bool GetVersionFromSimulatorDefine(StringRef define,
423                                          unsigned &Major, unsigned &Minor,
424                                          unsigned &Micro) {
425  assert(define.startswith(SimulatorVersionDefineName()));
426  StringRef name, version;
427  llvm::tie(name, version) = define.split('=');
428  if (version.empty())
429    return false;
430  std::string verstr = version.str();
431  char *end;
432  unsigned num = (unsigned) strtol(verstr.c_str(), &end, 10);
433  if (*end != '\0')
434    return false;
435  Major = num / 10000;
436  num = num % 10000;
437  Minor = num / 100;
438  Micro = num % 100;
439  return true;
440}
441
442void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
443  const OptTable &Opts = getDriver().getOpts();
444
445  // Support allowing the SDKROOT environment variable used by xcrun and other
446  // Xcode tools to define the default sysroot, by making it the default for
447  // isysroot.
448  if (!Args.hasArg(options::OPT_isysroot)) {
449    if (char *env = ::getenv("SDKROOT")) {
450      // We only use this value as the default if it is an absolute path and
451      // exists.
452      if (llvm::sys::path::is_absolute(env) && llvm::sys::fs::exists(env)) {
453        Args.append(Args.MakeSeparateArg(
454                      0, Opts.getOption(options::OPT_isysroot), env));
455      }
456    }
457  }
458
459  Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
460  Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
461  Arg *iOSSimVersion = Args.getLastArg(
462    options::OPT_mios_simulator_version_min_EQ);
463
464  // FIXME: HACK! When compiling for the simulator we don't get a
465  // '-miphoneos-version-min' to help us know whether there is an ARC runtime
466  // or not; try to parse a __IPHONE_OS_VERSION_MIN_REQUIRED
467  // define passed in command-line.
468  if (!iOSVersion && !iOSSimVersion) {
469    for (arg_iterator it = Args.filtered_begin(options::OPT_D),
470           ie = Args.filtered_end(); it != ie; ++it) {
471      StringRef define = (*it)->getValue(Args);
472      if (define.startswith(SimulatorVersionDefineName())) {
473        unsigned Major = 0, Minor = 0, Micro = 0;
474        if (GetVersionFromSimulatorDefine(define, Major, Minor, Micro) &&
475            Major < 10 && Minor < 100 && Micro < 100) {
476          TargetSimulatorVersionFromDefines = VersionTuple(Major, Minor, Micro);
477        }
478        // When using the define to indicate the simulator, we force
479        // 10.6 macosx target.
480        const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
481        OSXVersion = Args.MakeJoinedArg(0, O, "10.6");
482        Args.append(OSXVersion);
483        break;
484      }
485    }
486  }
487
488  if (OSXVersion && (iOSVersion || iOSSimVersion)) {
489    getDriver().Diag(diag::err_drv_argument_not_allowed_with)
490          << OSXVersion->getAsString(Args)
491          << (iOSVersion ? iOSVersion : iOSSimVersion)->getAsString(Args);
492    iOSVersion = iOSSimVersion = 0;
493  } else if (iOSVersion && iOSSimVersion) {
494    getDriver().Diag(diag::err_drv_argument_not_allowed_with)
495          << iOSVersion->getAsString(Args)
496          << iOSSimVersion->getAsString(Args);
497    iOSSimVersion = 0;
498  } else if (!OSXVersion && !iOSVersion && !iOSSimVersion) {
499    // If no deployment target was specified on the command line, check for
500    // environment defines.
501    StringRef OSXTarget;
502    StringRef iOSTarget;
503    StringRef iOSSimTarget;
504    if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
505      OSXTarget = env;
506    if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
507      iOSTarget = env;
508    if (char *env = ::getenv("IOS_SIMULATOR_DEPLOYMENT_TARGET"))
509      iOSSimTarget = env;
510
511    // If no '-miphoneos-version-min' specified on the command line and
512    // IPHONEOS_DEPLOYMENT_TARGET is not defined, see if we can set the default
513    // based on -isysroot.
514    if (iOSTarget.empty()) {
515      if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
516        StringRef first, second;
517        StringRef isysroot = A->getValue(Args);
518        llvm::tie(first, second) = isysroot.split(StringRef("SDKs/iPhoneOS"));
519        if (second != "")
520          iOSTarget = second.substr(0,3);
521      }
522    }
523
524    // If no OSX or iOS target has been specified and we're compiling for armv7,
525    // go ahead as assume we're targeting iOS.
526    if (OSXTarget.empty() && iOSTarget.empty() &&
527        getDarwinArchName(Args) == "armv7")
528        iOSTarget = iOSVersionMin;
529
530    // Handle conflicting deployment targets
531    //
532    // FIXME: Don't hardcode default here.
533
534    // Do not allow conflicts with the iOS simulator target.
535    if (!iOSSimTarget.empty() && (!OSXTarget.empty() || !iOSTarget.empty())) {
536      getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
537        << "IOS_SIMULATOR_DEPLOYMENT_TARGET"
538        << (!OSXTarget.empty() ? "MACOSX_DEPLOYMENT_TARGET" :
539            "IPHONEOS_DEPLOYMENT_TARGET");
540    }
541
542    // Allow conflicts among OSX and iOS for historical reasons, but choose the
543    // default platform.
544    if (!OSXTarget.empty() && !iOSTarget.empty()) {
545      if (getTriple().getArch() == llvm::Triple::arm ||
546          getTriple().getArch() == llvm::Triple::thumb)
547        OSXTarget = "";
548      else
549        iOSTarget = "";
550    }
551
552    if (!OSXTarget.empty()) {
553      const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
554      OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget);
555      Args.append(OSXVersion);
556    } else if (!iOSTarget.empty()) {
557      const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
558      iOSVersion = Args.MakeJoinedArg(0, O, iOSTarget);
559      Args.append(iOSVersion);
560    } else if (!iOSSimTarget.empty()) {
561      const Option *O = Opts.getOption(
562        options::OPT_mios_simulator_version_min_EQ);
563      iOSSimVersion = Args.MakeJoinedArg(0, O, iOSSimTarget);
564      Args.append(iOSSimVersion);
565    } else {
566      // Otherwise, assume we are targeting OS X.
567      const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
568      OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin);
569      Args.append(OSXVersion);
570    }
571  }
572
573  // Reject invalid architecture combinations.
574  if (iOSSimVersion && (getTriple().getArch() != llvm::Triple::x86 &&
575                        getTriple().getArch() != llvm::Triple::x86_64)) {
576    getDriver().Diag(diag::err_drv_invalid_arch_for_deployment_target)
577      << getTriple().getArchName() << iOSSimVersion->getAsString(Args);
578  }
579
580  // Set the tool chain target information.
581  unsigned Major, Minor, Micro;
582  bool HadExtra;
583  if (OSXVersion) {
584    assert((!iOSVersion && !iOSSimVersion) && "Unknown target platform!");
585    if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor,
586                                   Micro, HadExtra) || HadExtra ||
587        Major != 10 || Minor >= 100 || Micro >= 100)
588      getDriver().Diag(diag::err_drv_invalid_version_number)
589        << OSXVersion->getAsString(Args);
590  } else {
591    const Arg *Version = iOSVersion ? iOSVersion : iOSSimVersion;
592    assert(Version && "Unknown target platform!");
593    if (!Driver::GetReleaseVersion(Version->getValue(Args), Major, Minor,
594                                   Micro, HadExtra) || HadExtra ||
595        Major >= 10 || Minor >= 100 || Micro >= 100)
596      getDriver().Diag(diag::err_drv_invalid_version_number)
597        << Version->getAsString(Args);
598  }
599
600  bool IsIOSSim = bool(iOSSimVersion);
601
602  // In GCC, the simulator historically was treated as being OS X in some
603  // contexts, like determining the link logic, despite generally being called
604  // with an iOS deployment target. For compatibility, we detect the
605  // simulator as iOS + x86, and treat it differently in a few contexts.
606  if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
607                     getTriple().getArch() == llvm::Triple::x86_64))
608    IsIOSSim = true;
609
610  setTarget(/*IsIPhoneOS=*/ !OSXVersion, Major, Minor, Micro, IsIOSSim);
611}
612
613void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
614                                      ArgStringList &CmdArgs) const {
615  CXXStdlibType Type = GetCXXStdlibType(Args);
616
617  switch (Type) {
618  case ToolChain::CST_Libcxx:
619    CmdArgs.push_back("-lc++");
620    break;
621
622  case ToolChain::CST_Libstdcxx: {
623    // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
624    // it was previously found in the gcc lib dir. However, for all the Darwin
625    // platforms we care about it was -lstdc++.6, so we search for that
626    // explicitly if we can't see an obvious -lstdc++ candidate.
627
628    // Check in the sysroot first.
629    bool Exists;
630    if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
631      llvm::sys::Path P(A->getValue(Args));
632      P.appendComponent("usr");
633      P.appendComponent("lib");
634      P.appendComponent("libstdc++.dylib");
635
636      if (llvm::sys::fs::exists(P.str(), Exists) || !Exists) {
637        P.eraseComponent();
638        P.appendComponent("libstdc++.6.dylib");
639        if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
640          CmdArgs.push_back(Args.MakeArgString(P.str()));
641          return;
642        }
643      }
644    }
645
646    // Otherwise, look in the root.
647    // FIXME: This should be removed someday when we don't have to care about
648    // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
649    if ((llvm::sys::fs::exists("/usr/lib/libstdc++.dylib", Exists) || !Exists)&&
650      (!llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib", Exists) && Exists)){
651      CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
652      return;
653    }
654
655    // Otherwise, let the linker search.
656    CmdArgs.push_back("-lstdc++");
657    break;
658  }
659  }
660}
661
662void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
663                                   ArgStringList &CmdArgs) const {
664
665  // For Darwin platforms, use the compiler-rt-based support library
666  // instead of the gcc-provided one (which is also incidentally
667  // only present in the gcc lib dir, which makes it hard to find).
668
669  llvm::sys::Path P(getDriver().ResourceDir);
670  P.appendComponent("lib");
671  P.appendComponent("darwin");
672  P.appendComponent("libclang_rt.cc_kext.a");
673
674  // For now, allow missing resource libraries to support developers who may
675  // not have compiler-rt checked out or integrated into their build.
676  bool Exists;
677  if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
678    CmdArgs.push_back(Args.MakeArgString(P.str()));
679}
680
681DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
682                                      const char *BoundArch) const {
683  DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
684  const OptTable &Opts = getDriver().getOpts();
685
686  // FIXME: We really want to get out of the tool chain level argument
687  // translation business, as it makes the driver functionality much
688  // more opaque. For now, we follow gcc closely solely for the
689  // purpose of easily achieving feature parity & testability. Once we
690  // have something that works, we should reevaluate each translation
691  // and try to push it down into tool specific logic.
692
693  for (ArgList::const_iterator it = Args.begin(),
694         ie = Args.end(); it != ie; ++it) {
695    Arg *A = *it;
696
697    if (A->getOption().matches(options::OPT_Xarch__)) {
698      // Skip this argument unless the architecture matches either the toolchain
699      // triple arch, or the arch being bound.
700      //
701      // FIXME: Canonicalize name.
702      StringRef XarchArch = A->getValue(Args, 0);
703      if (!(XarchArch == getArchName()  ||
704            (BoundArch && XarchArch == BoundArch)))
705        continue;
706
707      Arg *OriginalArg = A;
708      unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(Args, 1));
709      unsigned Prev = Index;
710      Arg *XarchArg = Opts.ParseOneArg(Args, Index);
711
712      // If the argument parsing failed or more than one argument was
713      // consumed, the -Xarch_ argument's parameter tried to consume
714      // extra arguments. Emit an error and ignore.
715      //
716      // We also want to disallow any options which would alter the
717      // driver behavior; that isn't going to work in our model. We
718      // use isDriverOption() as an approximation, although things
719      // like -O4 are going to slip through.
720      if (!XarchArg || Index > Prev + 1) {
721        getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
722          << A->getAsString(Args);
723        continue;
724      } else if (XarchArg->getOption().isDriverOption()) {
725        getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
726          << A->getAsString(Args);
727        continue;
728      }
729
730      XarchArg->setBaseArg(A);
731      A = XarchArg;
732
733      DAL->AddSynthesizedArg(A);
734
735      // Linker input arguments require custom handling. The problem is that we
736      // have already constructed the phase actions, so we can not treat them as
737      // "input arguments".
738      if (A->getOption().isLinkerInput()) {
739        // Convert the argument into individual Zlinker_input_args.
740        for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
741          DAL->AddSeparateArg(OriginalArg,
742                              Opts.getOption(options::OPT_Zlinker_input),
743                              A->getValue(Args, i));
744
745        }
746        continue;
747      }
748    }
749
750    // Sob. These is strictly gcc compatible for the time being. Apple
751    // gcc translates options twice, which means that self-expanding
752    // options add duplicates.
753    switch ((options::ID) A->getOption().getID()) {
754    default:
755      DAL->append(A);
756      break;
757
758    case options::OPT_mkernel:
759    case options::OPT_fapple_kext:
760      DAL->append(A);
761      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
762      break;
763
764    case options::OPT_dependency_file:
765      DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF),
766                          A->getValue(Args));
767      break;
768
769    case options::OPT_gfull:
770      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
771      DAL->AddFlagArg(A,
772               Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
773      break;
774
775    case options::OPT_gused:
776      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
777      DAL->AddFlagArg(A,
778             Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
779      break;
780
781    case options::OPT_shared:
782      DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
783      break;
784
785    case options::OPT_fconstant_cfstrings:
786      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
787      break;
788
789    case options::OPT_fno_constant_cfstrings:
790      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
791      break;
792
793    case options::OPT_Wnonportable_cfstrings:
794      DAL->AddFlagArg(A,
795                      Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
796      break;
797
798    case options::OPT_Wno_nonportable_cfstrings:
799      DAL->AddFlagArg(A,
800                   Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
801      break;
802
803    case options::OPT_fpascal_strings:
804      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
805      break;
806
807    case options::OPT_fno_pascal_strings:
808      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
809      break;
810    }
811  }
812
813  if (getTriple().getArch() == llvm::Triple::x86 ||
814      getTriple().getArch() == llvm::Triple::x86_64)
815    if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
816      DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2");
817
818  // Add the arch options based on the particular spelling of -arch, to match
819  // how the driver driver works.
820  if (BoundArch) {
821    StringRef Name = BoundArch;
822    const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ);
823    const Option *MArch = Opts.getOption(options::OPT_march_EQ);
824
825    // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
826    // which defines the list of which architectures we accept.
827    if (Name == "ppc")
828      ;
829    else if (Name == "ppc601")
830      DAL->AddJoinedArg(0, MCpu, "601");
831    else if (Name == "ppc603")
832      DAL->AddJoinedArg(0, MCpu, "603");
833    else if (Name == "ppc604")
834      DAL->AddJoinedArg(0, MCpu, "604");
835    else if (Name == "ppc604e")
836      DAL->AddJoinedArg(0, MCpu, "604e");
837    else if (Name == "ppc750")
838      DAL->AddJoinedArg(0, MCpu, "750");
839    else if (Name == "ppc7400")
840      DAL->AddJoinedArg(0, MCpu, "7400");
841    else if (Name == "ppc7450")
842      DAL->AddJoinedArg(0, MCpu, "7450");
843    else if (Name == "ppc970")
844      DAL->AddJoinedArg(0, MCpu, "970");
845
846    else if (Name == "ppc64")
847      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
848
849    else if (Name == "i386")
850      ;
851    else if (Name == "i486")
852      DAL->AddJoinedArg(0, MArch, "i486");
853    else if (Name == "i586")
854      DAL->AddJoinedArg(0, MArch, "i586");
855    else if (Name == "i686")
856      DAL->AddJoinedArg(0, MArch, "i686");
857    else if (Name == "pentium")
858      DAL->AddJoinedArg(0, MArch, "pentium");
859    else if (Name == "pentium2")
860      DAL->AddJoinedArg(0, MArch, "pentium2");
861    else if (Name == "pentpro")
862      DAL->AddJoinedArg(0, MArch, "pentiumpro");
863    else if (Name == "pentIIm3")
864      DAL->AddJoinedArg(0, MArch, "pentium2");
865
866    else if (Name == "x86_64")
867      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
868
869    else if (Name == "arm")
870      DAL->AddJoinedArg(0, MArch, "armv4t");
871    else if (Name == "armv4t")
872      DAL->AddJoinedArg(0, MArch, "armv4t");
873    else if (Name == "armv5")
874      DAL->AddJoinedArg(0, MArch, "armv5tej");
875    else if (Name == "xscale")
876      DAL->AddJoinedArg(0, MArch, "xscale");
877    else if (Name == "armv6")
878      DAL->AddJoinedArg(0, MArch, "armv6k");
879    else if (Name == "armv7")
880      DAL->AddJoinedArg(0, MArch, "armv7a");
881
882    else
883      llvm_unreachable("invalid Darwin arch");
884  }
885
886  // Add an explicit version min argument for the deployment target. We do this
887  // after argument translation because -Xarch_ arguments may add a version min
888  // argument.
889  if (BoundArch)
890    AddDeploymentTarget(*DAL);
891
892  // Validate the C++ standard library choice.
893  CXXStdlibType Type = GetCXXStdlibType(*DAL);
894  if (Type == ToolChain::CST_Libcxx) {
895    // Check whether the target provides libc++.
896    StringRef where;
897
898    // Complain about targetting iOS < 5.0 in any way.
899    if (TargetSimulatorVersionFromDefines != VersionTuple()) {
900      if (TargetSimulatorVersionFromDefines < VersionTuple(5, 0))
901        where = "iOS 5.0";
902    } else if (isTargetIPhoneOS()) {
903      if (isIPhoneOSVersionLT(5, 0))
904        where = "iOS 5.0";
905    }
906
907    if (where != StringRef()) {
908      getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment)
909        << where;
910    }
911  }
912
913  return DAL;
914}
915
916bool Darwin::IsUnwindTablesDefault() const {
917  // FIXME: Gross; we should probably have some separate target
918  // definition, possibly even reusing the one in clang.
919  return getArchName() == "x86_64";
920}
921
922bool Darwin::UseDwarfDebugFlags() const {
923  if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
924    return S[0] != '\0';
925  return false;
926}
927
928bool Darwin::UseSjLjExceptions() const {
929  // Darwin uses SjLj exceptions on ARM.
930  return (getTriple().getArch() == llvm::Triple::arm ||
931          getTriple().getArch() == llvm::Triple::thumb);
932}
933
934const char *Darwin::GetDefaultRelocationModel() const {
935  return "pic";
936}
937
938const char *Darwin::GetForcedPicModel() const {
939  if (getArchName() == "x86_64")
940    return "pic";
941  return 0;
942}
943
944bool Darwin::SupportsProfiling() const {
945  // Profiling instrumentation is only supported on x86.
946  return getArchName() == "i386" || getArchName() == "x86_64";
947}
948
949bool Darwin::SupportsObjCGC() const {
950  // Garbage collection is supported everywhere except on iPhone OS.
951  return !isTargetIPhoneOS();
952}
953
954void Darwin::CheckObjCARC() const {
955  if (isTargetIPhoneOS() || !isMacosxVersionLT(10, 6))
956    return;
957  getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
958}
959
960std::string
961Darwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args,
962                                                types::ID InputType) const {
963  return ComputeLLVMTriple(Args, InputType);
964}
965
966/// Generic_GCC - A tool chain using the 'gcc' command to perform
967/// all subcommands; this relies on gcc translating the majority of
968/// command line options.
969
970/// \brief Parse a GCCVersion object out of a string of text.
971///
972/// This is the primary means of forming GCCVersion objects.
973/*static*/
974Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
975  const GCCVersion BadVersion = { VersionText.str(), -1, -1, -1, "" };
976  std::pair<StringRef, StringRef> First = VersionText.split('.');
977  std::pair<StringRef, StringRef> Second = First.second.split('.');
978
979  GCCVersion GoodVersion = { VersionText.str(), -1, -1, -1, "" };
980  if (First.first.getAsInteger(10, GoodVersion.Major) ||
981      GoodVersion.Major < 0)
982    return BadVersion;
983  if (Second.first.getAsInteger(10, GoodVersion.Minor) ||
984      GoodVersion.Minor < 0)
985    return BadVersion;
986
987  // First look for a number prefix and parse that if present. Otherwise just
988  // stash the entire patch string in the suffix, and leave the number
989  // unspecified. This covers versions strings such as:
990  //   4.4
991  //   4.4.0
992  //   4.4.x
993  //   4.4.2-rc4
994  //   4.4.x-patched
995  // And retains any patch number it finds.
996  StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
997  if (!PatchText.empty()) {
998    if (unsigned EndNumber = PatchText.find_first_not_of("0123456789")) {
999      // Try to parse the number and any suffix.
1000      if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1001          GoodVersion.Patch < 0)
1002        return BadVersion;
1003      GoodVersion.PatchSuffix = PatchText.substr(EndNumber).str();
1004    }
1005  }
1006
1007  return GoodVersion;
1008}
1009
1010/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
1011bool Generic_GCC::GCCVersion::operator<(const GCCVersion &RHS) const {
1012  if (Major < RHS.Major) return true; if (Major > RHS.Major) return false;
1013  if (Minor < RHS.Minor) return true; if (Minor > RHS.Minor) return false;
1014
1015  // Note that we rank versions with *no* patch specified is better than ones
1016  // hard-coding a patch version. Thus if the RHS has no patch, it always
1017  // wins, and the LHS only wins if it has no patch and the RHS does have
1018  // a patch.
1019  if (RHS.Patch == -1) return true;   if (Patch == -1) return false;
1020  if (Patch < RHS.Patch) return true; if (Patch > RHS.Patch) return false;
1021  if (PatchSuffix == RHS.PatchSuffix) return false;
1022
1023  // Finally, between completely tied version numbers, the version with the
1024  // suffix loses as we prefer full releases.
1025  if (RHS.PatchSuffix.empty()) return true;
1026  return false;
1027}
1028
1029static StringRef getGCCToolchainDir(const ArgList &Args) {
1030  const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1031  if (A)
1032    return A->getValue(Args);
1033  return GCC_INSTALL_PREFIX;
1034}
1035
1036/// \brief Construct a GCCInstallationDetector from the driver.
1037///
1038/// This performs all of the autodetection and sets up the various paths.
1039/// Once constructed, a GCCInstallationDetector is essentially immutable.
1040///
1041/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1042/// should instead pull the target out of the driver. This is currently
1043/// necessary because the driver doesn't store the final version of the target
1044/// triple.
1045Generic_GCC::GCCInstallationDetector::GCCInstallationDetector(
1046    const Driver &D,
1047    const llvm::Triple &TargetTriple,
1048    const ArgList &Args)
1049    : IsValid(false) {
1050  llvm::Triple MultiarchTriple
1051    = TargetTriple.isArch32Bit() ? TargetTriple.get64BitArchVariant()
1052                                 : TargetTriple.get32BitArchVariant();
1053  llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1054  // The library directories which may contain GCC installations.
1055  SmallVector<StringRef, 4> CandidateLibDirs, CandidateMultiarchLibDirs;
1056  // The compatible GCC triples for this particular architecture.
1057  SmallVector<StringRef, 10> CandidateTripleAliases;
1058  SmallVector<StringRef, 10> CandidateMultiarchTripleAliases;
1059  CollectLibDirsAndTriples(TargetTriple, MultiarchTriple, CandidateLibDirs,
1060                           CandidateTripleAliases,
1061                           CandidateMultiarchLibDirs,
1062                           CandidateMultiarchTripleAliases);
1063
1064  // Compute the set of prefixes for our search.
1065  SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1066                                       D.PrefixDirs.end());
1067
1068  StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1069  if (GCCToolchainDir != "") {
1070    if (GCCToolchainDir.back() == '/')
1071      GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
1072
1073    Prefixes.push_back(GCCToolchainDir);
1074  } else {
1075    Prefixes.push_back(D.SysRoot);
1076    Prefixes.push_back(D.SysRoot + "/usr");
1077    Prefixes.push_back(D.InstalledDir + "/..");
1078  }
1079
1080  // Loop over the various components which exist and select the best GCC
1081  // installation available. GCC installs are ranked by version number.
1082  Version = GCCVersion::Parse("0.0.0");
1083  for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) {
1084    if (!llvm::sys::fs::exists(Prefixes[i]))
1085      continue;
1086    for (unsigned j = 0, je = CandidateLibDirs.size(); j < je; ++j) {
1087      const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str();
1088      if (!llvm::sys::fs::exists(LibDir))
1089        continue;
1090      for (unsigned k = 0, ke = CandidateTripleAliases.size(); k < ke; ++k)
1091        ScanLibDirForGCCTriple(TargetArch, LibDir, CandidateTripleAliases[k]);
1092    }
1093    for (unsigned j = 0, je = CandidateMultiarchLibDirs.size(); j < je; ++j) {
1094      const std::string LibDir
1095        = Prefixes[i] + CandidateMultiarchLibDirs[j].str();
1096      if (!llvm::sys::fs::exists(LibDir))
1097        continue;
1098      for (unsigned k = 0, ke = CandidateMultiarchTripleAliases.size(); k < ke;
1099           ++k)
1100        ScanLibDirForGCCTriple(TargetArch, LibDir,
1101                               CandidateMultiarchTripleAliases[k],
1102                               /*NeedsMultiarchSuffix=*/true);
1103    }
1104  }
1105}
1106
1107/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
1108    const llvm::Triple &TargetTriple,
1109    const llvm::Triple &MultiarchTriple,
1110    SmallVectorImpl<StringRef> &LibDirs,
1111    SmallVectorImpl<StringRef> &TripleAliases,
1112    SmallVectorImpl<StringRef> &MultiarchLibDirs,
1113    SmallVectorImpl<StringRef> &MultiarchTripleAliases) {
1114  // Declare a bunch of static data sets that we'll select between below. These
1115  // are specifically designed to always refer to string literals to avoid any
1116  // lifetime or initialization issues.
1117  static const char *const ARMLibDirs[] = { "/lib" };
1118  static const char *const ARMTriples[] = {
1119    "arm-linux-gnueabi",
1120    "arm-linux-androideabi"
1121  };
1122  static const char *const ARMHFTriples[] = {
1123    "arm-linux-gnueabihf",
1124  };
1125
1126  static const char *const X86_64LibDirs[] = { "/lib64", "/lib" };
1127  static const char *const X86_64Triples[] = {
1128    "x86_64-linux-gnu",
1129    "x86_64-unknown-linux-gnu",
1130    "x86_64-pc-linux-gnu",
1131    "x86_64-redhat-linux6E",
1132    "x86_64-redhat-linux",
1133    "x86_64-suse-linux",
1134    "x86_64-manbo-linux-gnu",
1135    "x86_64-linux-gnu",
1136    "x86_64-slackware-linux"
1137  };
1138  static const char *const X86LibDirs[] = { "/lib32", "/lib" };
1139  static const char *const X86Triples[] = {
1140    "i686-linux-gnu",
1141    "i686-pc-linux-gnu",
1142    "i486-linux-gnu",
1143    "i386-linux-gnu",
1144    "i686-redhat-linux",
1145    "i586-redhat-linux",
1146    "i386-redhat-linux",
1147    "i586-suse-linux",
1148    "i486-slackware-linux",
1149    "i686-montavista-linux"
1150  };
1151
1152  static const char *const MIPSLibDirs[] = { "/lib" };
1153  static const char *const MIPSTriples[] = { "mips-linux-gnu" };
1154  static const char *const MIPSELLibDirs[] = { "/lib" };
1155  static const char *const MIPSELTriples[] = { "mipsel-linux-gnu" };
1156
1157  static const char *const MIPS64LibDirs[] = { "/lib64", "/lib" };
1158  static const char *const MIPS64Triples[] = { "mips64-linux-gnu" };
1159  static const char *const MIPS64ELLibDirs[] = { "/lib64", "/lib" };
1160  static const char *const MIPS64ELTriples[] = { "mips64el-linux-gnu" };
1161
1162  static const char *const PPCLibDirs[] = { "/lib32", "/lib" };
1163  static const char *const PPCTriples[] = {
1164    "powerpc-linux-gnu",
1165    "powerpc-unknown-linux-gnu",
1166    "powerpc-suse-linux",
1167    "powerpc-montavista-linuxspe"
1168  };
1169  static const char *const PPC64LibDirs[] = { "/lib64", "/lib" };
1170  static const char *const PPC64Triples[] = {
1171    "powerpc64-linux-gnu",
1172    "powerpc64-unknown-linux-gnu",
1173    "powerpc64-suse-linux",
1174    "ppc64-redhat-linux"
1175  };
1176
1177  switch (TargetTriple.getArch()) {
1178  case llvm::Triple::arm:
1179  case llvm::Triple::thumb:
1180    LibDirs.append(ARMLibDirs, ARMLibDirs + llvm::array_lengthof(ARMLibDirs));
1181    if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
1182      TripleAliases.append(
1183        ARMHFTriples, ARMHFTriples + llvm::array_lengthof(ARMHFTriples));
1184    } else {
1185      TripleAliases.append(
1186        ARMTriples, ARMTriples + llvm::array_lengthof(ARMTriples));
1187    }
1188    break;
1189  case llvm::Triple::x86_64:
1190    LibDirs.append(
1191      X86_64LibDirs, X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
1192    TripleAliases.append(
1193      X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples));
1194    MultiarchLibDirs.append(
1195      X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
1196    MultiarchTripleAliases.append(
1197      X86Triples, X86Triples + llvm::array_lengthof(X86Triples));
1198    break;
1199  case llvm::Triple::x86:
1200    LibDirs.append(X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
1201    TripleAliases.append(
1202      X86Triples, X86Triples + llvm::array_lengthof(X86Triples));
1203    MultiarchLibDirs.append(
1204      X86_64LibDirs, X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
1205    MultiarchTripleAliases.append(
1206      X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples));
1207    break;
1208  case llvm::Triple::mips:
1209    LibDirs.append(
1210      MIPSLibDirs, MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs));
1211    TripleAliases.append(
1212      MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples));
1213    MultiarchLibDirs.append(
1214      MIPS64LibDirs, MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs));
1215    MultiarchTripleAliases.append(
1216      MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples));
1217    break;
1218  case llvm::Triple::mipsel:
1219    LibDirs.append(
1220      MIPSELLibDirs, MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs));
1221    TripleAliases.append(
1222      MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples));
1223    MultiarchLibDirs.append(
1224      MIPS64ELLibDirs, MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs));
1225    MultiarchTripleAliases.append(
1226      MIPS64ELTriples, MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples));
1227    break;
1228  case llvm::Triple::mips64:
1229    LibDirs.append(
1230      MIPS64LibDirs, MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs));
1231    TripleAliases.append(
1232      MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples));
1233    MultiarchLibDirs.append(
1234      MIPSLibDirs, MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs));
1235    MultiarchTripleAliases.append(
1236      MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples));
1237    break;
1238  case llvm::Triple::mips64el:
1239    LibDirs.append(
1240      MIPS64ELLibDirs, MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs));
1241    TripleAliases.append(
1242      MIPS64ELTriples, MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples));
1243    MultiarchLibDirs.append(
1244      MIPSELLibDirs, MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs));
1245    MultiarchTripleAliases.append(
1246      MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples));
1247    break;
1248  case llvm::Triple::ppc:
1249    LibDirs.append(PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
1250    TripleAliases.append(
1251      PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples));
1252    MultiarchLibDirs.append(
1253      PPC64LibDirs, PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
1254    MultiarchTripleAliases.append(
1255      PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples));
1256    break;
1257  case llvm::Triple::ppc64:
1258    LibDirs.append(
1259      PPC64LibDirs, PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
1260    TripleAliases.append(
1261      PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples));
1262    MultiarchLibDirs.append(
1263      PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
1264    MultiarchTripleAliases.append(
1265      PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples));
1266    break;
1267
1268  default:
1269    // By default, just rely on the standard lib directories and the original
1270    // triple.
1271    break;
1272  }
1273
1274  // Always append the drivers target triple to the end, in case it doesn't
1275  // match any of our aliases.
1276  TripleAliases.push_back(TargetTriple.str());
1277
1278  // Also include the multiarch variant if it's different.
1279  if (TargetTriple.str() != MultiarchTriple.str())
1280    MultiarchTripleAliases.push_back(MultiarchTriple.str());
1281}
1282
1283void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
1284    llvm::Triple::ArchType TargetArch, const std::string &LibDir,
1285    StringRef CandidateTriple, bool NeedsMultiarchSuffix) {
1286  // There are various different suffixes involving the triple we
1287  // check for. We also record what is necessary to walk from each back
1288  // up to the lib directory.
1289  const std::string LibSuffixes[] = {
1290    "/gcc/" + CandidateTriple.str(),
1291    "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
1292
1293    // Ubuntu has a strange mis-matched pair of triples that this happens to
1294    // match.
1295    // FIXME: It may be worthwhile to generalize this and look for a second
1296    // triple.
1297    "/i386-linux-gnu/gcc/" + CandidateTriple.str()
1298  };
1299  const std::string InstallSuffixes[] = {
1300    "/../../..",
1301    "/../../../..",
1302    "/../../../.."
1303  };
1304  // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
1305  const unsigned NumLibSuffixes = (llvm::array_lengthof(LibSuffixes) -
1306                                   (TargetArch != llvm::Triple::x86));
1307  for (unsigned i = 0; i < NumLibSuffixes; ++i) {
1308    StringRef LibSuffix = LibSuffixes[i];
1309    llvm::error_code EC;
1310    for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE;
1311         !EC && LI != LE; LI = LI.increment(EC)) {
1312      StringRef VersionText = llvm::sys::path::filename(LI->path());
1313      GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
1314      static const GCCVersion MinVersion = { "4.1.1", 4, 1, 1, "" };
1315      if (CandidateVersion < MinVersion)
1316        continue;
1317      if (CandidateVersion <= Version)
1318        continue;
1319
1320      // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
1321      // in what would normally be GCCInstallPath and put the 64-bit
1322      // libs in a subdirectory named 64. The simple logic we follow is that
1323      // *if* there is a subdirectory of the right name with crtbegin.o in it,
1324      // we use that. If not, and if not a multiarch triple, we look for
1325      // crtbegin.o without the subdirectory.
1326      StringRef MultiarchSuffix
1327        = (TargetArch == llvm::Triple::x86_64 ||
1328           TargetArch == llvm::Triple::ppc64 ||
1329           TargetArch == llvm::Triple::mips64 ||
1330           TargetArch == llvm::Triple::mips64el) ? "/64" : "/32";
1331      if (llvm::sys::fs::exists(LI->path() + MultiarchSuffix + "/crtbegin.o")) {
1332        GCCMultiarchSuffix = MultiarchSuffix.str();
1333      } else {
1334        if (NeedsMultiarchSuffix ||
1335            !llvm::sys::fs::exists(LI->path() + "/crtbegin.o"))
1336          continue;
1337        GCCMultiarchSuffix.clear();
1338      }
1339
1340      Version = CandidateVersion;
1341      GCCTriple.setTriple(CandidateTriple);
1342      // FIXME: We hack together the directory name here instead of
1343      // using LI to ensure stable path separators across Windows and
1344      // Linux.
1345      GCCInstallPath = LibDir + LibSuffixes[i] + "/" + VersionText.str();
1346      GCCParentLibPath = GCCInstallPath + InstallSuffixes[i];
1347      IsValid = true;
1348    }
1349  }
1350}
1351
1352Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple,
1353                         const ArgList &Args)
1354  : ToolChain(D, Triple), GCCInstallation(getDriver(), Triple, Args) {
1355  getProgramPaths().push_back(getDriver().getInstalledDir());
1356  if (getDriver().getInstalledDir() != getDriver().Dir)
1357    getProgramPaths().push_back(getDriver().Dir);
1358}
1359
1360Generic_GCC::~Generic_GCC() {
1361  // Free tool implementations.
1362  for (llvm::DenseMap<unsigned, Tool*>::iterator
1363         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
1364    delete it->second;
1365}
1366
1367Tool &Generic_GCC::SelectTool(const Compilation &C,
1368                              const JobAction &JA,
1369                              const ActionList &Inputs) const {
1370  Action::ActionClass Key;
1371  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1372    Key = Action::AnalyzeJobClass;
1373  else
1374    Key = JA.getKind();
1375
1376  Tool *&T = Tools[Key];
1377  if (!T) {
1378    switch (Key) {
1379    case Action::InputClass:
1380    case Action::BindArchClass:
1381      llvm_unreachable("Invalid tool kind.");
1382    case Action::PreprocessJobClass:
1383      T = new tools::gcc::Preprocess(*this); break;
1384    case Action::PrecompileJobClass:
1385      T = new tools::gcc::Precompile(*this); break;
1386    case Action::AnalyzeJobClass:
1387    case Action::MigrateJobClass:
1388      T = new tools::Clang(*this); break;
1389    case Action::CompileJobClass:
1390      T = new tools::gcc::Compile(*this); break;
1391    case Action::AssembleJobClass:
1392      T = new tools::gcc::Assemble(*this); break;
1393    case Action::LinkJobClass:
1394      T = new tools::gcc::Link(*this); break;
1395
1396      // This is a bit ungeneric, but the only platform using a driver
1397      // driver is Darwin.
1398    case Action::LipoJobClass:
1399      T = new tools::darwin::Lipo(*this); break;
1400    case Action::DsymutilJobClass:
1401      T = new tools::darwin::Dsymutil(*this); break;
1402    case Action::VerifyJobClass:
1403      T = new tools::darwin::VerifyDebug(*this); break;
1404    }
1405  }
1406
1407  return *T;
1408}
1409
1410bool Generic_GCC::IsUnwindTablesDefault() const {
1411  // FIXME: Gross; we should probably have some separate target
1412  // definition, possibly even reusing the one in clang.
1413  return getArchName() == "x86_64";
1414}
1415
1416const char *Generic_GCC::GetDefaultRelocationModel() const {
1417  return "static";
1418}
1419
1420const char *Generic_GCC::GetForcedPicModel() const {
1421  return 0;
1422}
1423/// Hexagon Toolchain
1424
1425Hexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple& Triple)
1426  : ToolChain(D, Triple) {
1427  getProgramPaths().push_back(getDriver().getInstalledDir());
1428  if (getDriver().getInstalledDir() != getDriver().Dir.c_str())
1429    getProgramPaths().push_back(getDriver().Dir);
1430}
1431
1432Hexagon_TC::~Hexagon_TC() {
1433  // Free tool implementations.
1434  for (llvm::DenseMap<unsigned, Tool*>::iterator
1435         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
1436    delete it->second;
1437}
1438
1439Tool &Hexagon_TC::SelectTool(const Compilation &C,
1440                             const JobAction &JA,
1441                             const ActionList &Inputs) const {
1442  Action::ActionClass Key;
1443  //   if (JA.getKind () == Action::CompileJobClass)
1444  //     Key = JA.getKind ();
1445  //     else
1446
1447  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1448    Key = Action::AnalyzeJobClass;
1449  else
1450    Key = JA.getKind();
1451  //   if ((JA.getKind () == Action::CompileJobClass)
1452  //     && (JA.getType () != types::TY_LTO_BC)) {
1453  //     Key = JA.getKind ();
1454  //   }
1455
1456  Tool *&T = Tools[Key];
1457  if (!T) {
1458    switch (Key) {
1459    case Action::InputClass:
1460    case Action::BindArchClass:
1461      assert(0 && "Invalid tool kind.");
1462    case Action::AnalyzeJobClass:
1463      T = new tools::Clang(*this); break;
1464    case Action::AssembleJobClass:
1465      T = new tools::hexagon::Assemble(*this); break;
1466    case Action::LinkJobClass:
1467      T = new tools::hexagon::Link(*this); break;
1468    default:
1469      assert(false && "Unsupported action for Hexagon target.");
1470    }
1471  }
1472
1473  return *T;
1474}
1475
1476bool Hexagon_TC::IsUnwindTablesDefault() const {
1477  // FIXME: Gross; we should probably have some separate target
1478  // definition, possibly even reusing the one in clang.
1479  return getArchName() == "x86_64";
1480}
1481
1482const char *Hexagon_TC::GetDefaultRelocationModel() const {
1483  return "static";
1484}
1485
1486const char *Hexagon_TC::GetForcedPicModel() const {
1487  return 0;
1488} // End Hexagon
1489
1490
1491/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
1492/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
1493/// Currently does not support anything else but compilation.
1494
1495TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple& Triple)
1496  : ToolChain(D, Triple) {
1497  // Path mangling to find libexec
1498  std::string Path(getDriver().Dir);
1499
1500  Path += "/../libexec";
1501  getProgramPaths().push_back(Path);
1502}
1503
1504TCEToolChain::~TCEToolChain() {
1505  for (llvm::DenseMap<unsigned, Tool*>::iterator
1506           it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
1507      delete it->second;
1508}
1509
1510bool TCEToolChain::IsMathErrnoDefault() const {
1511  return true;
1512}
1513
1514bool TCEToolChain::IsUnwindTablesDefault() const {
1515  return false;
1516}
1517
1518const char *TCEToolChain::GetDefaultRelocationModel() const {
1519  return "static";
1520}
1521
1522const char *TCEToolChain::GetForcedPicModel() const {
1523  return 0;
1524}
1525
1526Tool &TCEToolChain::SelectTool(const Compilation &C,
1527                            const JobAction &JA,
1528                               const ActionList &Inputs) const {
1529  Action::ActionClass Key;
1530  Key = Action::AnalyzeJobClass;
1531
1532  Tool *&T = Tools[Key];
1533  if (!T) {
1534    switch (Key) {
1535    case Action::PreprocessJobClass:
1536      T = new tools::gcc::Preprocess(*this); break;
1537    case Action::AnalyzeJobClass:
1538      T = new tools::Clang(*this); break;
1539    default:
1540     llvm_unreachable("Unsupported action for TCE target.");
1541    }
1542  }
1543  return *T;
1544}
1545
1546/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
1547
1548OpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1549  : Generic_ELF(D, Triple, Args) {
1550  getFilePaths().push_back(getDriver().Dir + "/../lib");
1551  getFilePaths().push_back("/usr/lib");
1552}
1553
1554Tool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA,
1555                          const ActionList &Inputs) const {
1556  Action::ActionClass Key;
1557  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1558    Key = Action::AnalyzeJobClass;
1559  else
1560    Key = JA.getKind();
1561
1562  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1563                                             options::OPT_no_integrated_as,
1564                                             IsIntegratedAssemblerDefault());
1565
1566  Tool *&T = Tools[Key];
1567  if (!T) {
1568    switch (Key) {
1569    case Action::AssembleJobClass: {
1570      if (UseIntegratedAs)
1571        T = new tools::ClangAs(*this);
1572      else
1573        T = new tools::openbsd::Assemble(*this);
1574      break;
1575    }
1576    case Action::LinkJobClass:
1577      T = new tools::openbsd::Link(*this); break;
1578    default:
1579      T = &Generic_GCC::SelectTool(C, JA, Inputs);
1580    }
1581  }
1582
1583  return *T;
1584}
1585
1586/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
1587
1588Bitrig::Bitrig(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1589  : Generic_ELF(D, Triple, Args) {
1590  getFilePaths().push_back(getDriver().Dir + "/../lib");
1591  getFilePaths().push_back("/usr/lib");
1592}
1593
1594Tool &Bitrig::SelectTool(const Compilation &C, const JobAction &JA,
1595                         const ActionList &Inputs) const {
1596  Action::ActionClass Key;
1597  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1598    Key = Action::AnalyzeJobClass;
1599  else
1600    Key = JA.getKind();
1601
1602  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1603                                             options::OPT_no_integrated_as,
1604                                             IsIntegratedAssemblerDefault());
1605
1606  Tool *&T = Tools[Key];
1607  if (!T) {
1608    switch (Key) {
1609    case Action::AssembleJobClass: {
1610      if (UseIntegratedAs)
1611        T = new tools::ClangAs(*this);
1612      else
1613        T = new tools::bitrig::Assemble(*this);
1614      break;
1615    }
1616    case Action::LinkJobClass:
1617      T = new tools::bitrig::Link(*this); break;
1618    default:
1619      T = &Generic_GCC::SelectTool(C, JA, Inputs);
1620    }
1621  }
1622
1623  return *T;
1624}
1625
1626void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1627                                          ArgStringList &CC1Args) const {
1628  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
1629      DriverArgs.hasArg(options::OPT_nostdincxx))
1630    return;
1631
1632  std::string Triple = getTriple().str();
1633  if (Triple.substr(0, 5) == "amd64")
1634    Triple.replace(0, 5, "x86_64");
1635
1636  addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/4.6.2");
1637  addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/4.6.2/backward");
1638  addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/4.6.2/" + Triple);
1639
1640}
1641
1642void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
1643                                 ArgStringList &CmdArgs) const {
1644  CmdArgs.push_back("-lstdc++");
1645}
1646
1647/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
1648
1649FreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1650  : Generic_ELF(D, Triple, Args) {
1651
1652  // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
1653  // back to '/usr/lib' if it doesn't exist.
1654  if ((Triple.getArch() == llvm::Triple::x86 ||
1655       Triple.getArch() == llvm::Triple::ppc) &&
1656      llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
1657    getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
1658  else
1659    getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
1660}
1661
1662Tool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA,
1663                          const ActionList &Inputs) const {
1664  Action::ActionClass Key;
1665  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1666    Key = Action::AnalyzeJobClass;
1667  else
1668    Key = JA.getKind();
1669
1670  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1671                                             options::OPT_no_integrated_as,
1672                                             IsIntegratedAssemblerDefault());
1673
1674  Tool *&T = Tools[Key];
1675  if (!T) {
1676    switch (Key) {
1677    case Action::AssembleJobClass:
1678      if (UseIntegratedAs)
1679        T = new tools::ClangAs(*this);
1680      else
1681        T = new tools::freebsd::Assemble(*this);
1682      break;
1683    case Action::LinkJobClass:
1684      T = new tools::freebsd::Link(*this); break;
1685    default:
1686      T = &Generic_GCC::SelectTool(C, JA, Inputs);
1687    }
1688  }
1689
1690  return *T;
1691}
1692
1693/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
1694
1695NetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1696  : Generic_ELF(D, Triple, Args) {
1697
1698  if (getDriver().UseStdLib) {
1699    // When targeting a 32-bit platform, try the special directory used on
1700    // 64-bit hosts, and only fall back to the main library directory if that
1701    // doesn't work.
1702    // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
1703    // what all logic is needed to emulate the '=' prefix here.
1704    if (Triple.getArch() == llvm::Triple::x86)
1705      getFilePaths().push_back("=/usr/lib/i386");
1706
1707    getFilePaths().push_back("=/usr/lib");
1708  }
1709}
1710
1711Tool &NetBSD::SelectTool(const Compilation &C, const JobAction &JA,
1712                         const ActionList &Inputs) const {
1713  Action::ActionClass Key;
1714  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1715    Key = Action::AnalyzeJobClass;
1716  else
1717    Key = JA.getKind();
1718
1719  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1720                                             options::OPT_no_integrated_as,
1721                                             IsIntegratedAssemblerDefault());
1722
1723  Tool *&T = Tools[Key];
1724  if (!T) {
1725    switch (Key) {
1726    case Action::AssembleJobClass:
1727      if (UseIntegratedAs)
1728        T = new tools::ClangAs(*this);
1729      else
1730        T = new tools::netbsd::Assemble(*this);
1731      break;
1732    case Action::LinkJobClass:
1733      T = new tools::netbsd::Link(*this);
1734      break;
1735    default:
1736      T = &Generic_GCC::SelectTool(C, JA, Inputs);
1737    }
1738  }
1739
1740  return *T;
1741}
1742
1743/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
1744
1745Minix::Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1746  : Generic_ELF(D, Triple, Args) {
1747  getFilePaths().push_back(getDriver().Dir + "/../lib");
1748  getFilePaths().push_back("/usr/lib");
1749}
1750
1751Tool &Minix::SelectTool(const Compilation &C, const JobAction &JA,
1752                        const ActionList &Inputs) const {
1753  Action::ActionClass Key;
1754  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1755    Key = Action::AnalyzeJobClass;
1756  else
1757    Key = JA.getKind();
1758
1759  Tool *&T = Tools[Key];
1760  if (!T) {
1761    switch (Key) {
1762    case Action::AssembleJobClass:
1763      T = new tools::minix::Assemble(*this); break;
1764    case Action::LinkJobClass:
1765      T = new tools::minix::Link(*this); break;
1766    default:
1767      T = &Generic_GCC::SelectTool(C, JA, Inputs);
1768    }
1769  }
1770
1771  return *T;
1772}
1773
1774/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
1775
1776AuroraUX::AuroraUX(const Driver &D, const llvm::Triple& Triple,
1777                   const ArgList &Args)
1778  : Generic_GCC(D, Triple, Args) {
1779
1780  getProgramPaths().push_back(getDriver().getInstalledDir());
1781  if (getDriver().getInstalledDir() != getDriver().Dir)
1782    getProgramPaths().push_back(getDriver().Dir);
1783
1784  getFilePaths().push_back(getDriver().Dir + "/../lib");
1785  getFilePaths().push_back("/usr/lib");
1786  getFilePaths().push_back("/usr/sfw/lib");
1787  getFilePaths().push_back("/opt/gcc4/lib");
1788  getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
1789
1790}
1791
1792Tool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA,
1793                           const ActionList &Inputs) const {
1794  Action::ActionClass Key;
1795  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1796    Key = Action::AnalyzeJobClass;
1797  else
1798    Key = JA.getKind();
1799
1800  Tool *&T = Tools[Key];
1801  if (!T) {
1802    switch (Key) {
1803    case Action::AssembleJobClass:
1804      T = new tools::auroraux::Assemble(*this); break;
1805    case Action::LinkJobClass:
1806      T = new tools::auroraux::Link(*this); break;
1807    default:
1808      T = &Generic_GCC::SelectTool(C, JA, Inputs);
1809    }
1810  }
1811
1812  return *T;
1813}
1814
1815/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
1816
1817Solaris::Solaris(const Driver &D, const llvm::Triple& Triple,
1818                 const ArgList &Args)
1819  : Generic_GCC(D, Triple, Args) {
1820
1821  getProgramPaths().push_back(getDriver().getInstalledDir());
1822  if (getDriver().getInstalledDir() != getDriver().Dir)
1823    getProgramPaths().push_back(getDriver().Dir);
1824
1825  getFilePaths().push_back(getDriver().Dir + "/../lib");
1826  getFilePaths().push_back("/usr/lib");
1827}
1828
1829Tool &Solaris::SelectTool(const Compilation &C, const JobAction &JA,
1830                           const ActionList &Inputs) const {
1831  Action::ActionClass Key;
1832  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1833    Key = Action::AnalyzeJobClass;
1834  else
1835    Key = JA.getKind();
1836
1837  Tool *&T = Tools[Key];
1838  if (!T) {
1839    switch (Key) {
1840    case Action::AssembleJobClass:
1841      T = new tools::solaris::Assemble(*this); break;
1842    case Action::LinkJobClass:
1843      T = new tools::solaris::Link(*this); break;
1844    default:
1845      T = &Generic_GCC::SelectTool(C, JA, Inputs);
1846    }
1847  }
1848
1849  return *T;
1850}
1851
1852/// Linux toolchain (very bare-bones at the moment).
1853
1854enum LinuxDistro {
1855  ArchLinux,
1856  DebianLenny,
1857  DebianSqueeze,
1858  DebianWheezy,
1859  Exherbo,
1860  RHEL4,
1861  RHEL5,
1862  RHEL6,
1863  Fedora13,
1864  Fedora14,
1865  Fedora15,
1866  Fedora16,
1867  FedoraRawhide,
1868  OpenSuse11_3,
1869  OpenSuse11_4,
1870  OpenSuse12_1,
1871  OpenSuse12_2,
1872  UbuntuHardy,
1873  UbuntuIntrepid,
1874  UbuntuJaunty,
1875  UbuntuKarmic,
1876  UbuntuLucid,
1877  UbuntuMaverick,
1878  UbuntuNatty,
1879  UbuntuOneiric,
1880  UbuntuPrecise,
1881  UnknownDistro
1882};
1883
1884static bool IsRedhat(enum LinuxDistro Distro) {
1885  return (Distro >= Fedora13 && Distro <= FedoraRawhide) ||
1886         (Distro >= RHEL4    && Distro <= RHEL6);
1887}
1888
1889static bool IsOpenSuse(enum LinuxDistro Distro) {
1890  return Distro >= OpenSuse11_3 && Distro <= OpenSuse12_2;
1891}
1892
1893static bool IsDebian(enum LinuxDistro Distro) {
1894  return Distro >= DebianLenny && Distro <= DebianWheezy;
1895}
1896
1897static bool IsUbuntu(enum LinuxDistro Distro) {
1898  return Distro >= UbuntuHardy && Distro <= UbuntuPrecise;
1899}
1900
1901static LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) {
1902  OwningPtr<llvm::MemoryBuffer> File;
1903  if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) {
1904    StringRef Data = File.get()->getBuffer();
1905    SmallVector<StringRef, 8> Lines;
1906    Data.split(Lines, "\n");
1907    LinuxDistro Version = UnknownDistro;
1908    for (unsigned i = 0, s = Lines.size(); i != s; ++i)
1909      if (Version == UnknownDistro && Lines[i].startswith("DISTRIB_CODENAME="))
1910        Version = llvm::StringSwitch<LinuxDistro>(Lines[i].substr(17))
1911          .Case("hardy", UbuntuHardy)
1912          .Case("intrepid", UbuntuIntrepid)
1913          .Case("jaunty", UbuntuJaunty)
1914          .Case("karmic", UbuntuKarmic)
1915          .Case("lucid", UbuntuLucid)
1916          .Case("maverick", UbuntuMaverick)
1917          .Case("natty", UbuntuNatty)
1918          .Case("oneiric", UbuntuOneiric)
1919          .Case("precise", UbuntuPrecise)
1920          .Default(UnknownDistro);
1921    return Version;
1922  }
1923
1924  if (!llvm::MemoryBuffer::getFile("/etc/redhat-release", File)) {
1925    StringRef Data = File.get()->getBuffer();
1926    if (Data.startswith("Fedora release 16"))
1927      return Fedora16;
1928    else if (Data.startswith("Fedora release 15"))
1929      return Fedora15;
1930    else if (Data.startswith("Fedora release 14"))
1931      return Fedora14;
1932    else if (Data.startswith("Fedora release 13"))
1933      return Fedora13;
1934    else if (Data.startswith("Fedora release") &&
1935             Data.find("Rawhide") != StringRef::npos)
1936      return FedoraRawhide;
1937    else if (Data.startswith("Red Hat Enterprise Linux") &&
1938             Data.find("release 6") != StringRef::npos)
1939      return RHEL6;
1940    else if ((Data.startswith("Red Hat Enterprise Linux") ||
1941	      Data.startswith("CentOS")) &&
1942             Data.find("release 5") != StringRef::npos)
1943      return RHEL5;
1944    else if ((Data.startswith("Red Hat Enterprise Linux") ||
1945	      Data.startswith("CentOS")) &&
1946             Data.find("release 4") != StringRef::npos)
1947      return RHEL4;
1948    return UnknownDistro;
1949  }
1950
1951  if (!llvm::MemoryBuffer::getFile("/etc/debian_version", File)) {
1952    StringRef Data = File.get()->getBuffer();
1953    if (Data[0] == '5')
1954      return DebianLenny;
1955    else if (Data.startswith("squeeze/sid") || Data[0] == '6')
1956      return DebianSqueeze;
1957    else if (Data.startswith("wheezy/sid")  || Data[0] == '7')
1958      return DebianWheezy;
1959    return UnknownDistro;
1960  }
1961
1962  if (!llvm::MemoryBuffer::getFile("/etc/SuSE-release", File))
1963    return llvm::StringSwitch<LinuxDistro>(File.get()->getBuffer())
1964      .StartsWith("openSUSE 11.3", OpenSuse11_3)
1965      .StartsWith("openSUSE 11.4", OpenSuse11_4)
1966      .StartsWith("openSUSE 12.1", OpenSuse12_1)
1967      .StartsWith("openSUSE 12.2", OpenSuse12_2)
1968      .Default(UnknownDistro);
1969
1970  bool Exists;
1971  if (!llvm::sys::fs::exists("/etc/exherbo-release", Exists) && Exists)
1972    return Exherbo;
1973
1974  if (!llvm::sys::fs::exists("/etc/arch-release", Exists) && Exists)
1975    return ArchLinux;
1976
1977  return UnknownDistro;
1978}
1979
1980/// \brief Get our best guess at the multiarch triple for a target.
1981///
1982/// Debian-based systems are starting to use a multiarch setup where they use
1983/// a target-triple directory in the library and header search paths.
1984/// Unfortunately, this triple does not align with the vanilla target triple,
1985/// so we provide a rough mapping here.
1986static std::string getMultiarchTriple(const llvm::Triple TargetTriple,
1987                                      StringRef SysRoot) {
1988  // For most architectures, just use whatever we have rather than trying to be
1989  // clever.
1990  switch (TargetTriple.getArch()) {
1991  default:
1992    return TargetTriple.str();
1993
1994    // We use the existence of '/lib/<triple>' as a directory to detect some
1995    // common linux triples that don't quite match the Clang triple for both
1996    // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
1997    // regardless of what the actual target triple is.
1998  case llvm::Triple::arm:
1999  case llvm::Triple::thumb:
2000    if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
2001      if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf"))
2002        return "arm-linux-gnueabihf";
2003    } else {
2004      if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi"))
2005        return "arm-linux-gnueabi";
2006    }
2007    return TargetTriple.str();
2008  case llvm::Triple::x86:
2009    if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
2010      return "i386-linux-gnu";
2011    return TargetTriple.str();
2012  case llvm::Triple::x86_64:
2013    if (llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
2014      return "x86_64-linux-gnu";
2015    return TargetTriple.str();
2016  case llvm::Triple::mips:
2017    if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu"))
2018      return "mips-linux-gnu";
2019    return TargetTriple.str();
2020  case llvm::Triple::mipsel:
2021    if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu"))
2022      return "mipsel-linux-gnu";
2023    return TargetTriple.str();
2024  case llvm::Triple::ppc:
2025    if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu"))
2026      return "powerpc-linux-gnu";
2027    return TargetTriple.str();
2028  case llvm::Triple::ppc64:
2029    if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu"))
2030      return "powerpc64-linux-gnu";
2031    return TargetTriple.str();
2032  }
2033}
2034
2035static void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
2036  if (llvm::sys::fs::exists(Path)) Paths.push_back(Path.str());
2037}
2038
2039Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2040  : Generic_ELF(D, Triple, Args) {
2041  llvm::Triple::ArchType Arch = Triple.getArch();
2042  const std::string &SysRoot = getDriver().SysRoot;
2043
2044  // OpenSuse stores the linker with the compiler, add that to the search
2045  // path.
2046  ToolChain::path_list &PPaths = getProgramPaths();
2047  PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
2048                         GCCInstallation.getTriple().str() + "/bin").str());
2049
2050  Linker = GetProgramPath("ld");
2051
2052  LinuxDistro Distro = DetectLinuxDistro(Arch);
2053
2054  if (IsOpenSuse(Distro) || IsUbuntu(Distro)) {
2055    ExtraOpts.push_back("-z");
2056    ExtraOpts.push_back("relro");
2057  }
2058
2059  if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
2060    ExtraOpts.push_back("-X");
2061
2062  const bool IsMips = Arch == llvm::Triple::mips ||
2063                      Arch == llvm::Triple::mipsel ||
2064                      Arch == llvm::Triple::mips64 ||
2065                      Arch == llvm::Triple::mips64el;
2066
2067  const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android;
2068
2069  // Do not use 'gnu' hash style for Mips targets because .gnu.hash
2070  // and the MIPS ABI require .dynsym to be sorted in different ways.
2071  // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
2072  // ABI requires a mapping between the GOT and the symbol table.
2073  // Android loader does not support .gnu.hash.
2074  if (!IsMips && !IsAndroid) {
2075    if (IsRedhat(Distro) || IsOpenSuse(Distro) ||
2076        (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
2077      ExtraOpts.push_back("--hash-style=gnu");
2078
2079    if (IsDebian(Distro) || IsOpenSuse(Distro) || Distro == UbuntuLucid ||
2080        Distro == UbuntuJaunty || Distro == UbuntuKarmic)
2081      ExtraOpts.push_back("--hash-style=both");
2082  }
2083
2084  if (IsRedhat(Distro))
2085    ExtraOpts.push_back("--no-add-needed");
2086
2087  if (Distro == DebianSqueeze || Distro == DebianWheezy ||
2088      IsOpenSuse(Distro) ||
2089      (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
2090      (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
2091    ExtraOpts.push_back("--build-id");
2092
2093  if (IsOpenSuse(Distro))
2094    ExtraOpts.push_back("--enable-new-dtags");
2095
2096  // The selection of paths to try here is designed to match the patterns which
2097  // the GCC driver itself uses, as this is part of the GCC-compatible driver.
2098  // This was determined by running GCC in a fake filesystem, creating all
2099  // possible permutations of these directories, and seeing which ones it added
2100  // to the link paths.
2101  path_list &Paths = getFilePaths();
2102
2103  const std::string Multilib = Triple.isArch32Bit() ? "lib32" : "lib64";
2104  const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
2105
2106  // Add the multilib suffixed paths where they are available.
2107  if (GCCInstallation.isValid()) {
2108    const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
2109    const std::string &LibPath = GCCInstallation.getParentLibPath();
2110    addPathIfExists((GCCInstallation.getInstallPath() +
2111                     GCCInstallation.getMultiarchSuffix()),
2112                    Paths);
2113
2114    // If the GCC installation we found is inside of the sysroot, we want to
2115    // prefer libraries installed in the parent prefix of the GCC installation.
2116    // It is important to *not* use these paths when the GCC installation is
2117    // outside of the system root as that can pick up unintended libraries.
2118    // This usually happens when there is an external cross compiler on the
2119    // host system, and a more minimal sysroot available that is the target of
2120    // the cross.
2121    if (StringRef(LibPath).startswith(SysRoot)) {
2122      addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + Multilib,
2123                      Paths);
2124      addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
2125      addPathIfExists(LibPath + "/../" + Multilib, Paths);
2126    }
2127    // On Android, libraries in the parent prefix of the GCC installation are
2128    // preferred to the ones under sysroot.
2129    if (IsAndroid) {
2130      addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib", Paths);
2131    }
2132  }
2133  addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
2134  addPathIfExists(SysRoot + "/lib/../" + Multilib, Paths);
2135  addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
2136  addPathIfExists(SysRoot + "/usr/lib/../" + Multilib, Paths);
2137
2138  // Try walking via the GCC triple path in case of multiarch GCC
2139  // installations with strange symlinks.
2140  if (GCCInstallation.isValid())
2141    addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
2142                    "/../../" + Multilib, Paths);
2143
2144  // Add the non-multilib suffixed paths (if potentially different).
2145  if (GCCInstallation.isValid()) {
2146    const std::string &LibPath = GCCInstallation.getParentLibPath();
2147    const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
2148    if (!GCCInstallation.getMultiarchSuffix().empty())
2149      addPathIfExists(GCCInstallation.getInstallPath(), Paths);
2150
2151    if (StringRef(LibPath).startswith(SysRoot)) {
2152      addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib", Paths);
2153      addPathIfExists(LibPath, Paths);
2154    }
2155  }
2156  addPathIfExists(SysRoot + "/lib", Paths);
2157  addPathIfExists(SysRoot + "/usr/lib", Paths);
2158}
2159
2160bool Linux::HasNativeLLVMSupport() const {
2161  return true;
2162}
2163
2164Tool &Linux::SelectTool(const Compilation &C, const JobAction &JA,
2165                        const ActionList &Inputs) const {
2166  Action::ActionClass Key;
2167  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
2168    Key = Action::AnalyzeJobClass;
2169  else
2170    Key = JA.getKind();
2171
2172  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
2173                                             options::OPT_no_integrated_as,
2174                                             IsIntegratedAssemblerDefault());
2175
2176  Tool *&T = Tools[Key];
2177  if (!T) {
2178    switch (Key) {
2179    case Action::AssembleJobClass:
2180      if (UseIntegratedAs)
2181        T = new tools::ClangAs(*this);
2182      else
2183        T = new tools::linuxtools::Assemble(*this);
2184      break;
2185    case Action::LinkJobClass:
2186      T = new tools::linuxtools::Link(*this); break;
2187    default:
2188      T = &Generic_GCC::SelectTool(C, JA, Inputs);
2189    }
2190  }
2191
2192  return *T;
2193}
2194
2195void Linux::addClangTargetOptions(ArgStringList &CC1Args) const {
2196  const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
2197  if (V >= Generic_GCC::GCCVersion::Parse("4.7.0"))
2198    CC1Args.push_back("-fuse-init-array");
2199}
2200
2201void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2202                                      ArgStringList &CC1Args) const {
2203  const Driver &D = getDriver();
2204
2205  if (DriverArgs.hasArg(options::OPT_nostdinc))
2206    return;
2207
2208  if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
2209    addSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/local/include");
2210
2211  if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2212    llvm::sys::Path P(D.ResourceDir);
2213    P.appendComponent("include");
2214    addSystemInclude(DriverArgs, CC1Args, P.str());
2215  }
2216
2217  if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2218    return;
2219
2220  // Check for configure-time C include directories.
2221  StringRef CIncludeDirs(C_INCLUDE_DIRS);
2222  if (CIncludeDirs != "") {
2223    SmallVector<StringRef, 5> dirs;
2224    CIncludeDirs.split(dirs, ":");
2225    for (SmallVectorImpl<StringRef>::iterator I = dirs.begin(), E = dirs.end();
2226         I != E; ++I) {
2227      StringRef Prefix = llvm::sys::path::is_absolute(*I) ? D.SysRoot : "";
2228      addExternCSystemInclude(DriverArgs, CC1Args, Prefix + *I);
2229    }
2230    return;
2231  }
2232
2233  // Lacking those, try to detect the correct set of system includes for the
2234  // target triple.
2235
2236  // Implement generic Debian multiarch support.
2237  const StringRef X86_64MultiarchIncludeDirs[] = {
2238    "/usr/include/x86_64-linux-gnu",
2239
2240    // FIXME: These are older forms of multiarch. It's not clear that they're
2241    // in use in any released version of Debian, so we should consider
2242    // removing them.
2243    "/usr/include/i686-linux-gnu/64",
2244    "/usr/include/i486-linux-gnu/64"
2245  };
2246  const StringRef X86MultiarchIncludeDirs[] = {
2247    "/usr/include/i386-linux-gnu",
2248
2249    // FIXME: These are older forms of multiarch. It's not clear that they're
2250    // in use in any released version of Debian, so we should consider
2251    // removing them.
2252    "/usr/include/x86_64-linux-gnu/32",
2253    "/usr/include/i686-linux-gnu",
2254    "/usr/include/i486-linux-gnu"
2255  };
2256  const StringRef ARMMultiarchIncludeDirs[] = {
2257    "/usr/include/arm-linux-gnueabi"
2258  };
2259  const StringRef ARMHFMultiarchIncludeDirs[] = {
2260    "/usr/include/arm-linux-gnueabihf"
2261  };
2262  const StringRef MIPSMultiarchIncludeDirs[] = {
2263    "/usr/include/mips-linux-gnu"
2264  };
2265  const StringRef MIPSELMultiarchIncludeDirs[] = {
2266    "/usr/include/mipsel-linux-gnu"
2267  };
2268  const StringRef PPCMultiarchIncludeDirs[] = {
2269    "/usr/include/powerpc-linux-gnu"
2270  };
2271  const StringRef PPC64MultiarchIncludeDirs[] = {
2272    "/usr/include/powerpc64-linux-gnu"
2273  };
2274  ArrayRef<StringRef> MultiarchIncludeDirs;
2275  if (getTriple().getArch() == llvm::Triple::x86_64) {
2276    MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
2277  } else if (getTriple().getArch() == llvm::Triple::x86) {
2278    MultiarchIncludeDirs = X86MultiarchIncludeDirs;
2279  } else if (getTriple().getArch() == llvm::Triple::arm) {
2280    if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
2281      MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
2282    else
2283      MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
2284  } else if (getTriple().getArch() == llvm::Triple::mips) {
2285    MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
2286  } else if (getTriple().getArch() == llvm::Triple::mipsel) {
2287    MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
2288  } else if (getTriple().getArch() == llvm::Triple::ppc) {
2289    MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
2290  } else if (getTriple().getArch() == llvm::Triple::ppc64) {
2291    MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
2292  }
2293  for (ArrayRef<StringRef>::iterator I = MultiarchIncludeDirs.begin(),
2294                                     E = MultiarchIncludeDirs.end();
2295       I != E; ++I) {
2296    if (llvm::sys::fs::exists(D.SysRoot + *I)) {
2297      addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + *I);
2298      break;
2299    }
2300  }
2301
2302  if (getTriple().getOS() == llvm::Triple::RTEMS)
2303    return;
2304
2305  // Add an include of '/include' directly. This isn't provided by default by
2306  // system GCCs, but is often used with cross-compiling GCCs, and harmless to
2307  // add even when Clang is acting as-if it were a system compiler.
2308  addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/include");
2309
2310  addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/include");
2311}
2312
2313/// \brief Helper to add the thre variant paths for a libstdc++ installation.
2314/*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir,
2315                                                const ArgList &DriverArgs,
2316                                                ArgStringList &CC1Args) {
2317  if (!llvm::sys::fs::exists(Base))
2318    return false;
2319  addSystemInclude(DriverArgs, CC1Args, Base);
2320  addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir);
2321  addSystemInclude(DriverArgs, CC1Args, Base + "/backward");
2322  return true;
2323}
2324
2325void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2326                                         ArgStringList &CC1Args) const {
2327  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2328      DriverArgs.hasArg(options::OPT_nostdincxx))
2329    return;
2330
2331  // Check if libc++ has been enabled and provide its include paths if so.
2332  if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
2333    // libc++ is always installed at a fixed path on Linux currently.
2334    addSystemInclude(DriverArgs, CC1Args,
2335                     getDriver().SysRoot + "/usr/include/c++/v1");
2336    return;
2337  }
2338
2339  // We need a detected GCC installation on Linux to provide libstdc++'s
2340  // headers. We handled the libc++ case above.
2341  if (!GCCInstallation.isValid())
2342    return;
2343
2344  // By default, look for the C++ headers in an include directory adjacent to
2345  // the lib directory of the GCC installation. Note that this is expect to be
2346  // equivalent to '/usr/include/c++/X.Y' in almost all cases.
2347  StringRef LibDir = GCCInstallation.getParentLibPath();
2348  StringRef InstallDir = GCCInstallation.getInstallPath();
2349  StringRef Version = GCCInstallation.getVersion().Text;
2350  StringRef TripleStr = GCCInstallation.getTriple().str();
2351
2352  const std::string IncludePathCandidates[] = {
2353    LibDir.str() + "/../include/c++/" + Version.str(),
2354    // Gentoo is weird and places its headers inside the GCC install, so if the
2355    // first attempt to find the headers fails, try this pattern.
2356    InstallDir.str() + "/include/g++-v4",
2357    // Android standalone toolchain has C++ headers in yet another place.
2358    LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.str(),
2359  };
2360
2361  for (unsigned i = 0; i < llvm::array_lengthof(IncludePathCandidates); ++i) {
2362    if (addLibStdCXXIncludePaths(IncludePathCandidates[i], (TripleStr +
2363                GCCInstallation.getMultiarchSuffix()),
2364            DriverArgs, CC1Args))
2365      break;
2366  }
2367}
2368
2369/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
2370
2371DragonFly::DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
2372  : Generic_ELF(D, Triple, Args) {
2373
2374  // Path mangling to find libexec
2375  getProgramPaths().push_back(getDriver().getInstalledDir());
2376  if (getDriver().getInstalledDir() != getDriver().Dir)
2377    getProgramPaths().push_back(getDriver().Dir);
2378
2379  getFilePaths().push_back(getDriver().Dir + "/../lib");
2380  getFilePaths().push_back("/usr/lib");
2381  getFilePaths().push_back("/usr/lib/gcc41");
2382}
2383
2384Tool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA,
2385                            const ActionList &Inputs) const {
2386  Action::ActionClass Key;
2387  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
2388    Key = Action::AnalyzeJobClass;
2389  else
2390    Key = JA.getKind();
2391
2392  Tool *&T = Tools[Key];
2393  if (!T) {
2394    switch (Key) {
2395    case Action::AssembleJobClass:
2396      T = new tools::dragonfly::Assemble(*this); break;
2397    case Action::LinkJobClass:
2398      T = new tools::dragonfly::Link(*this); break;
2399    default:
2400      T = &Generic_GCC::SelectTool(C, JA, Inputs);
2401    }
2402  }
2403
2404  return *T;
2405}
2406