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