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