ToolChains.cpp revision 87d52eb5ae91f4b5f1ce8c9ee747217843d4ffcf
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-a5", "cortex-a7", "cortex-a8", "armv7")
128    .Cases("cortex-a9", "cortex-a12", "cortex-a15", "armv7")
129    .Cases("cortex-r4", "cortex-r5", "armv7r")
130    .Case("cortex-a9-mp", "armv7f")
131    .Case("cortex-m3", "armv7m")
132    .Case("cortex-m4", "armv7em")
133    .Case("swift", "armv7s")
134    .Default(0);
135}
136
137StringRef Darwin::getDarwinArchName(const ArgList &Args) const {
138  switch (getTriple().getArch()) {
139  default:
140    return getArchName();
141
142  case llvm::Triple::thumb:
143  case llvm::Triple::arm: {
144    if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
145      if (const char *Arch = GetArmArchForMArch(A->getValue()))
146        return Arch;
147
148    if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
149      if (const char *Arch = GetArmArchForMCpu(A->getValue()))
150        return Arch;
151
152    return "arm";
153  }
154  }
155}
156
157Darwin::~Darwin() {
158}
159
160std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
161                                                types::ID InputType) const {
162  llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
163
164  // If the target isn't initialized (e.g., an unknown Darwin platform, return
165  // the default triple).
166  if (!isTargetInitialized())
167    return Triple.getTriple();
168
169  SmallString<16> Str;
170  Str += isTargetIPhoneOS() ? "ios" : "macosx";
171  Str += getTargetVersion().getAsString();
172  Triple.setOSName(Str);
173
174  return Triple.getTriple();
175}
176
177void Generic_ELF::anchor() {}
178
179Tool *Darwin::getTool(Action::ActionClass AC) const {
180  switch (AC) {
181  case Action::LipoJobClass:
182    if (!Lipo)
183      Lipo.reset(new tools::darwin::Lipo(*this));
184    return Lipo.get();
185  case Action::DsymutilJobClass:
186    if (!Dsymutil)
187      Dsymutil.reset(new tools::darwin::Dsymutil(*this));
188    return Dsymutil.get();
189  case Action::VerifyJobClass:
190    if (!VerifyDebug)
191      VerifyDebug.reset(new tools::darwin::VerifyDebug(*this));
192    return VerifyDebug.get();
193  default:
194    return ToolChain::getTool(AC);
195  }
196}
197
198Tool *Darwin::buildLinker() const {
199  return new tools::darwin::Link(*this);
200}
201
202Tool *Darwin::buildAssembler() const {
203  return new tools::darwin::Assemble(*this);
204}
205
206DarwinClang::DarwinClang(const Driver &D, const llvm::Triple& Triple,
207                         const ArgList &Args)
208  : Darwin(D, Triple, Args)
209{
210  getProgramPaths().push_back(getDriver().getInstalledDir());
211  if (getDriver().getInstalledDir() != getDriver().Dir)
212    getProgramPaths().push_back(getDriver().Dir);
213
214  // We expect 'as', 'ld', etc. to be adjacent to our install dir.
215  getProgramPaths().push_back(getDriver().getInstalledDir());
216  if (getDriver().getInstalledDir() != getDriver().Dir)
217    getProgramPaths().push_back(getDriver().Dir);
218}
219
220void DarwinClang::AddLinkARCArgs(const ArgList &Args,
221                                 ArgStringList &CmdArgs) const {
222
223  CmdArgs.push_back("-force_load");
224  SmallString<128> P(getDriver().ClangExecutable);
225  llvm::sys::path::remove_filename(P); // 'clang'
226  llvm::sys::path::remove_filename(P); // 'bin'
227  llvm::sys::path::append(P, "lib", "arc", "libarclite_");
228  // Mash in the platform.
229  if (isTargetIOSSimulator())
230    P += "iphonesimulator";
231  else if (isTargetIPhoneOS())
232    P += "iphoneos";
233  else
234    P += "macosx";
235  P += ".a";
236
237  CmdArgs.push_back(Args.MakeArgString(P));
238}
239
240void DarwinClang::AddLinkRuntimeLib(const ArgList &Args,
241                                    ArgStringList &CmdArgs,
242                                    const char *DarwinStaticLib,
243                                    bool AlwaysLink) const {
244  SmallString<128> P(getDriver().ResourceDir);
245  llvm::sys::path::append(P, "lib", "darwin", DarwinStaticLib);
246
247  // For now, allow missing resource libraries to support developers who may
248  // not have compiler-rt checked out or integrated into their build (unless
249  // we explicitly force linking with this library).
250  if (AlwaysLink || llvm::sys::fs::exists(P.str()))
251    CmdArgs.push_back(Args.MakeArgString(P.str()));
252}
253
254void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
255                                        ArgStringList &CmdArgs) const {
256  // Darwin only supports the compiler-rt based runtime libraries.
257  switch (GetRuntimeLibType(Args)) {
258  case ToolChain::RLT_CompilerRT:
259    break;
260  default:
261    getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
262      << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
263    return;
264  }
265
266  // Darwin doesn't support real static executables, don't link any runtime
267  // libraries with -static.
268  if (Args.hasArg(options::OPT_static) ||
269      Args.hasArg(options::OPT_fapple_kext) ||
270      Args.hasArg(options::OPT_mkernel))
271    return;
272
273  // Reject -static-libgcc for now, we can deal with this when and if someone
274  // cares. This is useful in situations where someone wants to statically link
275  // something like libstdc++, and needs its runtime support routines.
276  if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
277    getDriver().Diag(diag::err_drv_unsupported_opt)
278      << A->getAsString(Args);
279    return;
280  }
281
282  // If we are building profile support, link that library in.
283  if (Args.hasArg(options::OPT_fprofile_arcs) ||
284      Args.hasArg(options::OPT_fprofile_generate) ||
285      Args.hasArg(options::OPT_fcreate_profile) ||
286      Args.hasArg(options::OPT_coverage)) {
287    // Select the appropriate runtime library for the target.
288    if (isTargetIPhoneOS()) {
289      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a");
290    } else {
291      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a");
292    }
293  }
294
295  const SanitizerArgs &Sanitize = getDriver().getOrParseSanitizerArgs(Args);
296
297  // Add Ubsan runtime library, if required.
298  if (Sanitize.needsUbsanRt()) {
299    if (isTargetIPhoneOS()) {
300      getDriver().Diag(diag::err_drv_clang_unsupported_per_platform)
301        << "-fsanitize=undefined";
302    } else {
303      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ubsan_osx.a", true);
304
305      // The Ubsan runtime library requires C++.
306      AddCXXStdlibLibArgs(Args, CmdArgs);
307    }
308  }
309
310  // Add ASAN runtime library, if required. Dynamic libraries and bundles
311  // should not be linked with the runtime library.
312  if (Sanitize.needsAsanRt()) {
313    if (isTargetIPhoneOS() && !isTargetIOSSimulator()) {
314      getDriver().Diag(diag::err_drv_clang_unsupported_per_platform)
315        << "-fsanitize=address";
316    } else {
317      if (!Args.hasArg(options::OPT_dynamiclib) &&
318          !Args.hasArg(options::OPT_bundle)) {
319        // The ASAN runtime library requires C++.
320        AddCXXStdlibLibArgs(Args, CmdArgs);
321      }
322      AddLinkRuntimeLib(Args, CmdArgs,
323                        "libclang_rt.asan_osx_dynamic.dylib", true);
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 isMips32r2(const ArgList &Args) {
1298  Arg *A = Args.getLastArg(options::OPT_march_EQ,
1299                           options::OPT_mcpu_EQ);
1300
1301  return A && A->getValue() == StringRef("mips32r2");
1302}
1303
1304static bool isMicroMips(const ArgList &Args) {
1305  Arg *A = Args.getLastArg(options::OPT_mmicromips,
1306                           options::OPT_mno_micromips);
1307  return A && A->getOption().matches(options::OPT_mmicromips);
1308}
1309
1310// FIXME: There is the same routine in the Tools.cpp.
1311static bool hasMipsN32ABIArg(const ArgList &Args) {
1312  Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1313  return A && (A->getValue() == StringRef("n32"));
1314}
1315
1316static bool hasCrtBeginObj(Twine Path) {
1317  return llvm::sys::fs::exists(Path + "/crtbegin.o");
1318}
1319
1320static bool findTargetBiarchSuffix(std::string &Suffix, StringRef Path,
1321                                   llvm::Triple::ArchType TargetArch,
1322                                   const ArgList &Args) {
1323  // FIXME: This routine was only intended to model bi-arch toolchains which
1324  // use -m32 and -m64 to swap between variants of a target. It shouldn't be
1325  // doing ABI-based builtin location for MIPS.
1326  if (hasMipsN32ABIArg(Args))
1327    Suffix = "/n32";
1328  else if (TargetArch == llvm::Triple::x86_64 ||
1329           TargetArch == llvm::Triple::ppc64 ||
1330           TargetArch == llvm::Triple::systemz ||
1331           TargetArch == llvm::Triple::mips64 ||
1332           TargetArch == llvm::Triple::mips64el)
1333    Suffix = "/64";
1334  else
1335    Suffix = "/32";
1336
1337  return hasCrtBeginObj(Path + Suffix);
1338}
1339
1340static void findMultiLibSuffix(std::string &Suffix,
1341                               llvm::Triple::ArchType TargetArch,
1342                               StringRef Path,
1343                               const ArgList &Args) {
1344  if (!isMipsArch(TargetArch))
1345    return;
1346
1347  if (isMips16(Args))
1348    Suffix += "/mips16";
1349  else if (isMicroMips(Args))
1350    Suffix += "/micromips";
1351
1352  if (isSoftFloatABI(Args))
1353    Suffix += "/soft-float";
1354
1355  if (TargetArch == llvm::Triple::mipsel ||
1356      TargetArch == llvm::Triple::mips64el)
1357    Suffix += "/el";
1358
1359  if (!hasCrtBeginObj(Path + Suffix))
1360    Suffix.clear();
1361}
1362
1363void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
1364    llvm::Triple::ArchType TargetArch, const ArgList &Args,
1365    const std::string &LibDir, StringRef CandidateTriple,
1366    bool NeedsBiarchSuffix) {
1367  // There are various different suffixes involving the triple we
1368  // check for. We also record what is necessary to walk from each back
1369  // up to the lib directory.
1370  const std::string LibSuffixes[] = {
1371    "/gcc/" + CandidateTriple.str(),
1372    // Debian puts cross-compilers in gcc-cross
1373    "/gcc-cross/" + CandidateTriple.str(),
1374    "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
1375
1376    // The Freescale PPC SDK has the gcc libraries in
1377    // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
1378    "/" + CandidateTriple.str(),
1379
1380    // Ubuntu has a strange mis-matched pair of triples that this happens to
1381    // match.
1382    // FIXME: It may be worthwhile to generalize this and look for a second
1383    // triple.
1384    "/i386-linux-gnu/gcc/" + CandidateTriple.str()
1385  };
1386  const std::string InstallSuffixes[] = {
1387    "/../../..",    // gcc/
1388    "/../../..",    // gcc-cross/
1389    "/../../../..", // <triple>/gcc/
1390    "/../..",       // <triple>/
1391    "/../../../.."  // i386-linux-gnu/gcc/<triple>/
1392  };
1393  // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
1394  const unsigned NumLibSuffixes =
1395      (llvm::array_lengthof(LibSuffixes) - (TargetArch != llvm::Triple::x86));
1396  for (unsigned i = 0; i < NumLibSuffixes; ++i) {
1397    StringRef LibSuffix = LibSuffixes[i];
1398    llvm::error_code EC;
1399    for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE;
1400         !EC && LI != LE; LI = LI.increment(EC)) {
1401      StringRef VersionText = llvm::sys::path::filename(LI->path());
1402      GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
1403      if (CandidateVersion.Major != -1) // Filter obviously bad entries.
1404        if (!CandidateGCCInstallPaths.insert(LI->path()).second)
1405          continue; // Saw this path before; no need to look at it again.
1406      if (CandidateVersion.isOlderThan(4, 1, 1))
1407        continue;
1408      if (CandidateVersion <= Version)
1409        continue;
1410
1411      std::string MultiLibSuffix;
1412      findMultiLibSuffix(MultiLibSuffix, TargetArch, LI->path(), Args);
1413
1414      // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
1415      // in what would normally be GCCInstallPath and put the 64-bit
1416      // libs in a subdirectory named 64. The simple logic we follow is that
1417      // *if* there is a subdirectory of the right name with crtbegin.o in it,
1418      // we use that. If not, and if not a biarch triple alias, we look for
1419      // crtbegin.o without the subdirectory.
1420
1421      std::string BiarchSuffix;
1422      if (findTargetBiarchSuffix(BiarchSuffix,
1423                                 LI->path() + MultiLibSuffix,
1424                                 TargetArch, Args)) {
1425        GCCBiarchSuffix = BiarchSuffix;
1426      } else if (NeedsBiarchSuffix ||
1427                 !hasCrtBeginObj(LI->path() + MultiLibSuffix)) {
1428        continue;
1429      } else {
1430        GCCBiarchSuffix.clear();
1431      }
1432
1433      Version = CandidateVersion;
1434      GCCTriple.setTriple(CandidateTriple);
1435      // FIXME: We hack together the directory name here instead of
1436      // using LI to ensure stable path separators across Windows and
1437      // Linux.
1438      GCCInstallPath = LibDir + LibSuffixes[i] + "/" + VersionText.str();
1439      GCCParentLibPath = GCCInstallPath + InstallSuffixes[i];
1440      GCCMultiLibSuffix = MultiLibSuffix;
1441      IsValid = true;
1442    }
1443  }
1444}
1445
1446Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple,
1447                         const ArgList &Args)
1448  : ToolChain(D, Triple, Args), GCCInstallation(getDriver(), Triple, Args) {
1449  getProgramPaths().push_back(getDriver().getInstalledDir());
1450  if (getDriver().getInstalledDir() != getDriver().Dir)
1451    getProgramPaths().push_back(getDriver().Dir);
1452}
1453
1454Generic_GCC::~Generic_GCC() {
1455}
1456
1457Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
1458  switch (AC) {
1459  case Action::PreprocessJobClass:
1460    if (!Preprocess)
1461      Preprocess.reset(new tools::gcc::Preprocess(*this));
1462    return Preprocess.get();
1463  case Action::PrecompileJobClass:
1464    if (!Precompile)
1465      Precompile.reset(new tools::gcc::Precompile(*this));
1466    return Precompile.get();
1467  case Action::CompileJobClass:
1468    if (!Compile)
1469      Compile.reset(new tools::gcc::Compile(*this));
1470    return Compile.get();
1471  default:
1472    return ToolChain::getTool(AC);
1473  }
1474}
1475
1476Tool *Generic_GCC::buildAssembler() const {
1477  return new tools::gcc::Assemble(*this);
1478}
1479
1480Tool *Generic_GCC::buildLinker() const {
1481  return new tools::gcc::Link(*this);
1482}
1483
1484void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
1485  // Print the information about how we detected the GCC installation.
1486  GCCInstallation.print(OS);
1487}
1488
1489bool Generic_GCC::IsUnwindTablesDefault() const {
1490  return getArch() == llvm::Triple::x86_64;
1491}
1492
1493bool Generic_GCC::isPICDefault() const {
1494  return false;
1495}
1496
1497bool Generic_GCC::isPIEDefault() const {
1498  return false;
1499}
1500
1501bool Generic_GCC::isPICDefaultForced() const {
1502  return false;
1503}
1504
1505/// Hexagon Toolchain
1506
1507std::string Hexagon_TC::GetGnuDir(const std::string &InstalledDir) {
1508
1509  // Locate the rest of the toolchain ...
1510  if (strlen(GCC_INSTALL_PREFIX))
1511    return std::string(GCC_INSTALL_PREFIX);
1512
1513  std::string InstallRelDir = InstalledDir + "/../../gnu";
1514  if (llvm::sys::fs::exists(InstallRelDir))
1515    return InstallRelDir;
1516
1517  std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
1518  if (llvm::sys::fs::exists(PrefixRelDir))
1519    return PrefixRelDir;
1520
1521  return InstallRelDir;
1522}
1523
1524static void GetHexagonLibraryPaths(
1525  const ArgList &Args,
1526  const std::string Ver,
1527  const std::string MarchString,
1528  const std::string &InstalledDir,
1529  ToolChain::path_list *LibPaths)
1530{
1531  bool buildingLib = Args.hasArg(options::OPT_shared);
1532
1533  //----------------------------------------------------------------------------
1534  // -L Args
1535  //----------------------------------------------------------------------------
1536  for (arg_iterator
1537         it = Args.filtered_begin(options::OPT_L),
1538         ie = Args.filtered_end();
1539       it != ie;
1540       ++it) {
1541    for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i)
1542      LibPaths->push_back((*it)->getValue(i));
1543  }
1544
1545  //----------------------------------------------------------------------------
1546  // Other standard paths
1547  //----------------------------------------------------------------------------
1548  const std::string MarchSuffix = "/" + MarchString;
1549  const std::string G0Suffix = "/G0";
1550  const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
1551  const std::string RootDir = Hexagon_TC::GetGnuDir(InstalledDir) + "/";
1552
1553  // lib/gcc/hexagon/...
1554  std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
1555  if (buildingLib) {
1556    LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
1557    LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
1558  }
1559  LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
1560  LibPaths->push_back(LibGCCHexagonDir + Ver);
1561
1562  // lib/gcc/...
1563  LibPaths->push_back(RootDir + "lib/gcc");
1564
1565  // hexagon/lib/...
1566  std::string HexagonLibDir = RootDir + "hexagon/lib";
1567  if (buildingLib) {
1568    LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
1569    LibPaths->push_back(HexagonLibDir + G0Suffix);
1570  }
1571  LibPaths->push_back(HexagonLibDir + MarchSuffix);
1572  LibPaths->push_back(HexagonLibDir);
1573}
1574
1575Hexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple &Triple,
1576                       const ArgList &Args)
1577  : Linux(D, Triple, Args) {
1578  const std::string InstalledDir(getDriver().getInstalledDir());
1579  const std::string GnuDir = Hexagon_TC::GetGnuDir(InstalledDir);
1580
1581  // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
1582  // program paths
1583  const std::string BinDir(GnuDir + "/bin");
1584  if (llvm::sys::fs::exists(BinDir))
1585    getProgramPaths().push_back(BinDir);
1586
1587  // Determine version of GCC libraries and headers to use.
1588  const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
1589  llvm::error_code ec;
1590  GCCVersion MaxVersion= GCCVersion::Parse("0.0.0");
1591  for (llvm::sys::fs::directory_iterator di(HexagonDir, ec), de;
1592       !ec && di != de; di = di.increment(ec)) {
1593    GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->path()));
1594    if (MaxVersion < cv)
1595      MaxVersion = cv;
1596  }
1597  GCCLibAndIncVersion = MaxVersion;
1598
1599  ToolChain::path_list *LibPaths= &getFilePaths();
1600
1601  // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
1602  // 'elf' OS type, so the Linux paths are not appropriate. When we actually
1603  // support 'linux' we'll need to fix this up
1604  LibPaths->clear();
1605
1606  GetHexagonLibraryPaths(
1607    Args,
1608    GetGCCLibAndIncVersion(),
1609    GetTargetCPU(Args),
1610    InstalledDir,
1611    LibPaths);
1612}
1613
1614Hexagon_TC::~Hexagon_TC() {
1615}
1616
1617Tool *Hexagon_TC::buildAssembler() const {
1618  return new tools::hexagon::Assemble(*this);
1619}
1620
1621Tool *Hexagon_TC::buildLinker() const {
1622  return new tools::hexagon::Link(*this);
1623}
1624
1625void Hexagon_TC::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
1626                                           ArgStringList &CC1Args) const {
1627  const Driver &D = getDriver();
1628
1629  if (DriverArgs.hasArg(options::OPT_nostdinc) ||
1630      DriverArgs.hasArg(options::OPT_nostdlibinc))
1631    return;
1632
1633  std::string Ver(GetGCCLibAndIncVersion());
1634  std::string GnuDir = Hexagon_TC::GetGnuDir(D.InstalledDir);
1635  std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
1636  addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
1637  addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
1638  addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
1639}
1640
1641void Hexagon_TC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1642                                              ArgStringList &CC1Args) const {
1643
1644  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
1645      DriverArgs.hasArg(options::OPT_nostdincxx))
1646    return;
1647
1648  const Driver &D = getDriver();
1649  std::string Ver(GetGCCLibAndIncVersion());
1650  SmallString<128> IncludeDir(Hexagon_TC::GetGnuDir(D.InstalledDir));
1651
1652  llvm::sys::path::append(IncludeDir, "hexagon/include/c++/");
1653  llvm::sys::path::append(IncludeDir, Ver);
1654  addSystemInclude(DriverArgs, CC1Args, IncludeDir.str());
1655}
1656
1657ToolChain::CXXStdlibType
1658Hexagon_TC::GetCXXStdlibType(const ArgList &Args) const {
1659  Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
1660  if (!A)
1661    return ToolChain::CST_Libstdcxx;
1662
1663  StringRef Value = A->getValue();
1664  if (Value != "libstdc++") {
1665    getDriver().Diag(diag::err_drv_invalid_stdlib_name)
1666      << A->getAsString(Args);
1667  }
1668
1669  return ToolChain::CST_Libstdcxx;
1670}
1671
1672static int getHexagonVersion(const ArgList &Args) {
1673  Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ);
1674  // Select the default CPU (v4) if none was given.
1675  if (!A)
1676    return 4;
1677
1678  // FIXME: produce errors if we cannot parse the version.
1679  StringRef WhichHexagon = A->getValue();
1680  if (WhichHexagon.startswith("hexagonv")) {
1681    int Val;
1682    if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val))
1683      return Val;
1684  }
1685  if (WhichHexagon.startswith("v")) {
1686    int Val;
1687    if (!WhichHexagon.substr(1).getAsInteger(10, Val))
1688      return Val;
1689  }
1690
1691  // FIXME: should probably be an error.
1692  return 4;
1693}
1694
1695StringRef Hexagon_TC::GetTargetCPU(const ArgList &Args)
1696{
1697  int V = getHexagonVersion(Args);
1698  // FIXME: We don't support versions < 4. We should error on them.
1699  switch (V) {
1700  default:
1701    llvm_unreachable("Unexpected version");
1702  case 5:
1703    return "v5";
1704  case 4:
1705    return "v4";
1706  case 3:
1707    return "v3";
1708  case 2:
1709    return "v2";
1710  case 1:
1711    return "v1";
1712  }
1713}
1714// End Hexagon
1715
1716/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
1717/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
1718/// Currently does not support anything else but compilation.
1719
1720TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple& Triple,
1721                           const ArgList &Args)
1722  : ToolChain(D, Triple, Args) {
1723  // Path mangling to find libexec
1724  std::string Path(getDriver().Dir);
1725
1726  Path += "/../libexec";
1727  getProgramPaths().push_back(Path);
1728}
1729
1730TCEToolChain::~TCEToolChain() {
1731}
1732
1733bool TCEToolChain::IsMathErrnoDefault() const {
1734  return true;
1735}
1736
1737bool TCEToolChain::isPICDefault() const {
1738  return false;
1739}
1740
1741bool TCEToolChain::isPIEDefault() const {
1742  return false;
1743}
1744
1745bool TCEToolChain::isPICDefaultForced() const {
1746  return false;
1747}
1748
1749/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
1750
1751OpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1752  : Generic_ELF(D, Triple, Args) {
1753  getFilePaths().push_back(getDriver().Dir + "/../lib");
1754  getFilePaths().push_back("/usr/lib");
1755}
1756
1757Tool *OpenBSD::buildAssembler() const {
1758  return new tools::openbsd::Assemble(*this);
1759}
1760
1761Tool *OpenBSD::buildLinker() const {
1762  return new tools::openbsd::Link(*this);
1763}
1764
1765/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
1766
1767Bitrig::Bitrig(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1768  : Generic_ELF(D, Triple, Args) {
1769  getFilePaths().push_back(getDriver().Dir + "/../lib");
1770  getFilePaths().push_back("/usr/lib");
1771}
1772
1773Tool *Bitrig::buildAssembler() const {
1774  return new tools::bitrig::Assemble(*this);
1775}
1776
1777Tool *Bitrig::buildLinker() const {
1778  return new tools::bitrig::Link(*this);
1779}
1780
1781void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1782                                          ArgStringList &CC1Args) const {
1783  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
1784      DriverArgs.hasArg(options::OPT_nostdincxx))
1785    return;
1786
1787  switch (GetCXXStdlibType(DriverArgs)) {
1788  case ToolChain::CST_Libcxx:
1789    addSystemInclude(DriverArgs, CC1Args,
1790                     getDriver().SysRoot + "/usr/include/c++/");
1791    break;
1792  case ToolChain::CST_Libstdcxx:
1793    addSystemInclude(DriverArgs, CC1Args,
1794                     getDriver().SysRoot + "/usr/include/c++/stdc++");
1795    addSystemInclude(DriverArgs, CC1Args,
1796                     getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
1797
1798    StringRef Triple = getTriple().str();
1799    if (Triple.startswith("amd64"))
1800      addSystemInclude(DriverArgs, CC1Args,
1801                       getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
1802                       Triple.substr(5));
1803    else
1804      addSystemInclude(DriverArgs, CC1Args,
1805                       getDriver().SysRoot + "/usr/include/c++/stdc++/" +
1806                       Triple);
1807    break;
1808  }
1809}
1810
1811void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
1812                                 ArgStringList &CmdArgs) const {
1813  switch (GetCXXStdlibType(Args)) {
1814  case ToolChain::CST_Libcxx:
1815    CmdArgs.push_back("-lc++");
1816    CmdArgs.push_back("-lcxxrt");
1817    // Include supc++ to provide Unwind until provided by libcxx.
1818    CmdArgs.push_back("-lgcc");
1819    break;
1820  case ToolChain::CST_Libstdcxx:
1821    CmdArgs.push_back("-lstdc++");
1822    break;
1823  }
1824}
1825
1826/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
1827
1828FreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1829  : Generic_ELF(D, Triple, Args) {
1830
1831  // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
1832  // back to '/usr/lib' if it doesn't exist.
1833  if ((Triple.getArch() == llvm::Triple::x86 ||
1834       Triple.getArch() == llvm::Triple::ppc) &&
1835      llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
1836    getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
1837  else
1838    getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
1839}
1840
1841Tool *FreeBSD::buildAssembler() const {
1842  return new tools::freebsd::Assemble(*this);
1843}
1844
1845Tool *FreeBSD::buildLinker() const {
1846  return new tools::freebsd::Link(*this);
1847}
1848
1849bool FreeBSD::UseSjLjExceptions() const {
1850  // FreeBSD uses SjLj exceptions on ARM oabi.
1851  switch (getTriple().getEnvironment()) {
1852  case llvm::Triple::GNUEABI:
1853  case llvm::Triple::EABI:
1854    return false;
1855
1856  default:
1857    return (getTriple().getArch() == llvm::Triple::arm ||
1858            getTriple().getArch() == llvm::Triple::thumb);
1859  }
1860}
1861
1862/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
1863
1864NetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1865  : Generic_ELF(D, Triple, Args) {
1866
1867  if (getDriver().UseStdLib) {
1868    // When targeting a 32-bit platform, try the special directory used on
1869    // 64-bit hosts, and only fall back to the main library directory if that
1870    // doesn't work.
1871    // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
1872    // what all logic is needed to emulate the '=' prefix here.
1873    if (Triple.getArch() == llvm::Triple::x86)
1874      getFilePaths().push_back("=/usr/lib/i386");
1875
1876    getFilePaths().push_back("=/usr/lib");
1877  }
1878}
1879
1880Tool *NetBSD::buildAssembler() const {
1881  return new tools::netbsd::Assemble(*this);
1882}
1883
1884Tool *NetBSD::buildLinker() const {
1885  return new tools::netbsd::Link(*this);
1886}
1887
1888ToolChain::CXXStdlibType
1889NetBSD::GetCXXStdlibType(const ArgList &Args) const {
1890  if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
1891    StringRef Value = A->getValue();
1892    if (Value == "libstdc++")
1893      return ToolChain::CST_Libstdcxx;
1894    if (Value == "libc++")
1895      return ToolChain::CST_Libcxx;
1896
1897    getDriver().Diag(diag::err_drv_invalid_stdlib_name)
1898      << A->getAsString(Args);
1899  }
1900
1901  return ToolChain::CST_Libstdcxx;
1902}
1903
1904void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1905                                          ArgStringList &CC1Args) const {
1906  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
1907      DriverArgs.hasArg(options::OPT_nostdincxx))
1908    return;
1909
1910  switch (GetCXXStdlibType(DriverArgs)) {
1911  case ToolChain::CST_Libcxx:
1912    addSystemInclude(DriverArgs, CC1Args,
1913                     getDriver().SysRoot + "/usr/include/c++/");
1914    break;
1915  case ToolChain::CST_Libstdcxx:
1916    addSystemInclude(DriverArgs, CC1Args,
1917                     getDriver().SysRoot + "/usr/include/g++");
1918    addSystemInclude(DriverArgs, CC1Args,
1919                     getDriver().SysRoot + "/usr/include/g++/backward");
1920    break;
1921  }
1922}
1923
1924/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
1925
1926Minix::Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1927  : Generic_ELF(D, Triple, Args) {
1928  getFilePaths().push_back(getDriver().Dir + "/../lib");
1929  getFilePaths().push_back("/usr/lib");
1930}
1931
1932Tool *Minix::buildAssembler() const {
1933  return new tools::minix::Assemble(*this);
1934}
1935
1936Tool *Minix::buildLinker() const {
1937  return new tools::minix::Link(*this);
1938}
1939
1940/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
1941
1942AuroraUX::AuroraUX(const Driver &D, const llvm::Triple& Triple,
1943                   const ArgList &Args)
1944  : Generic_GCC(D, Triple, Args) {
1945
1946  getProgramPaths().push_back(getDriver().getInstalledDir());
1947  if (getDriver().getInstalledDir() != getDriver().Dir)
1948    getProgramPaths().push_back(getDriver().Dir);
1949
1950  getFilePaths().push_back(getDriver().Dir + "/../lib");
1951  getFilePaths().push_back("/usr/lib");
1952  getFilePaths().push_back("/usr/sfw/lib");
1953  getFilePaths().push_back("/opt/gcc4/lib");
1954  getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
1955
1956}
1957
1958Tool *AuroraUX::buildAssembler() const {
1959  return new tools::auroraux::Assemble(*this);
1960}
1961
1962Tool *AuroraUX::buildLinker() const {
1963  return new tools::auroraux::Link(*this);
1964}
1965
1966/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
1967
1968Solaris::Solaris(const Driver &D, const llvm::Triple& Triple,
1969                 const ArgList &Args)
1970  : Generic_GCC(D, Triple, Args) {
1971
1972  getProgramPaths().push_back(getDriver().getInstalledDir());
1973  if (getDriver().getInstalledDir() != getDriver().Dir)
1974    getProgramPaths().push_back(getDriver().Dir);
1975
1976  getFilePaths().push_back(getDriver().Dir + "/../lib");
1977  getFilePaths().push_back("/usr/lib");
1978}
1979
1980Tool *Solaris::buildAssembler() const {
1981  return new tools::solaris::Assemble(*this);
1982}
1983
1984Tool *Solaris::buildLinker() const {
1985  return new tools::solaris::Link(*this);
1986}
1987
1988/// Distribution (very bare-bones at the moment).
1989
1990enum Distro {
1991  ArchLinux,
1992  DebianLenny,
1993  DebianSqueeze,
1994  DebianWheezy,
1995  DebianJessie,
1996  Exherbo,
1997  RHEL4,
1998  RHEL5,
1999  RHEL6,
2000  Fedora13,
2001  Fedora14,
2002  Fedora15,
2003  Fedora16,
2004  FedoraRawhide,
2005  OpenSUSE,
2006  UbuntuHardy,
2007  UbuntuIntrepid,
2008  UbuntuJaunty,
2009  UbuntuKarmic,
2010  UbuntuLucid,
2011  UbuntuMaverick,
2012  UbuntuNatty,
2013  UbuntuOneiric,
2014  UbuntuPrecise,
2015  UbuntuQuantal,
2016  UbuntuRaring,
2017  UbuntuSaucy,
2018  UnknownDistro
2019};
2020
2021static bool IsRedhat(enum Distro Distro) {
2022  return (Distro >= Fedora13 && Distro <= FedoraRawhide) ||
2023         (Distro >= RHEL4    && Distro <= RHEL6);
2024}
2025
2026static bool IsOpenSUSE(enum Distro Distro) {
2027  return Distro == OpenSUSE;
2028}
2029
2030static bool IsDebian(enum Distro Distro) {
2031  return Distro >= DebianLenny && Distro <= DebianJessie;
2032}
2033
2034static bool IsUbuntu(enum Distro Distro) {
2035  return Distro >= UbuntuHardy && Distro <= UbuntuSaucy;
2036}
2037
2038static Distro DetectDistro(llvm::Triple::ArchType Arch) {
2039  OwningPtr<llvm::MemoryBuffer> File;
2040  if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) {
2041    StringRef Data = File.get()->getBuffer();
2042    SmallVector<StringRef, 8> Lines;
2043    Data.split(Lines, "\n");
2044    Distro Version = UnknownDistro;
2045    for (unsigned i = 0, s = Lines.size(); i != s; ++i)
2046      if (Version == UnknownDistro && Lines[i].startswith("DISTRIB_CODENAME="))
2047        Version = llvm::StringSwitch<Distro>(Lines[i].substr(17))
2048          .Case("hardy", UbuntuHardy)
2049          .Case("intrepid", UbuntuIntrepid)
2050          .Case("jaunty", UbuntuJaunty)
2051          .Case("karmic", UbuntuKarmic)
2052          .Case("lucid", UbuntuLucid)
2053          .Case("maverick", UbuntuMaverick)
2054          .Case("natty", UbuntuNatty)
2055          .Case("oneiric", UbuntuOneiric)
2056          .Case("precise", UbuntuPrecise)
2057          .Case("quantal", UbuntuQuantal)
2058          .Case("raring", UbuntuRaring)
2059          .Case("saucy", UbuntuSaucy)
2060          .Default(UnknownDistro);
2061    return Version;
2062  }
2063
2064  if (!llvm::MemoryBuffer::getFile("/etc/redhat-release", File)) {
2065    StringRef Data = File.get()->getBuffer();
2066    if (Data.startswith("Fedora release 16"))
2067      return Fedora16;
2068    else if (Data.startswith("Fedora release 15"))
2069      return Fedora15;
2070    else if (Data.startswith("Fedora release 14"))
2071      return Fedora14;
2072    else if (Data.startswith("Fedora release 13"))
2073      return Fedora13;
2074    else if (Data.startswith("Fedora release") &&
2075             Data.find("Rawhide") != StringRef::npos)
2076      return FedoraRawhide;
2077    else if (Data.startswith("Red Hat Enterprise Linux") &&
2078             Data.find("release 6") != StringRef::npos)
2079      return RHEL6;
2080    else if ((Data.startswith("Red Hat Enterprise Linux") ||
2081              Data.startswith("CentOS")) &&
2082             Data.find("release 5") != StringRef::npos)
2083      return RHEL5;
2084    else if ((Data.startswith("Red Hat Enterprise Linux") ||
2085              Data.startswith("CentOS")) &&
2086             Data.find("release 4") != StringRef::npos)
2087      return RHEL4;
2088    return UnknownDistro;
2089  }
2090
2091  if (!llvm::MemoryBuffer::getFile("/etc/debian_version", File)) {
2092    StringRef Data = File.get()->getBuffer();
2093    if (Data[0] == '5')
2094      return DebianLenny;
2095    else if (Data.startswith("squeeze/sid") || Data[0] == '6')
2096      return DebianSqueeze;
2097    else if (Data.startswith("wheezy/sid")  || Data[0] == '7')
2098      return DebianWheezy;
2099    else if (Data.startswith("jessie/sid")  || Data[0] == '8')
2100      return DebianJessie;
2101    return UnknownDistro;
2102  }
2103
2104  if (llvm::sys::fs::exists("/etc/SuSE-release"))
2105    return OpenSUSE;
2106
2107  if (llvm::sys::fs::exists("/etc/exherbo-release"))
2108    return Exherbo;
2109
2110  if (llvm::sys::fs::exists("/etc/arch-release"))
2111    return ArchLinux;
2112
2113  return UnknownDistro;
2114}
2115
2116/// \brief Get our best guess at the multiarch triple for a target.
2117///
2118/// Debian-based systems are starting to use a multiarch setup where they use
2119/// a target-triple directory in the library and header search paths.
2120/// Unfortunately, this triple does not align with the vanilla target triple,
2121/// so we provide a rough mapping here.
2122static std::string getMultiarchTriple(const llvm::Triple TargetTriple,
2123                                      StringRef SysRoot) {
2124  // For most architectures, just use whatever we have rather than trying to be
2125  // clever.
2126  switch (TargetTriple.getArch()) {
2127  default:
2128    return TargetTriple.str();
2129
2130    // We use the existence of '/lib/<triple>' as a directory to detect some
2131    // common linux triples that don't quite match the Clang triple for both
2132    // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
2133    // regardless of what the actual target triple is.
2134  case llvm::Triple::arm:
2135  case llvm::Triple::thumb:
2136    if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
2137      if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf"))
2138        return "arm-linux-gnueabihf";
2139    } else {
2140      if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi"))
2141        return "arm-linux-gnueabi";
2142    }
2143    return TargetTriple.str();
2144  case llvm::Triple::x86:
2145    if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
2146      return "i386-linux-gnu";
2147    return TargetTriple.str();
2148  case llvm::Triple::x86_64:
2149    if (llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
2150      return "x86_64-linux-gnu";
2151    return TargetTriple.str();
2152  case llvm::Triple::aarch64:
2153    if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64-linux-gnu"))
2154      return "aarch64-linux-gnu";
2155    return TargetTriple.str();
2156  case llvm::Triple::mips:
2157    if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu"))
2158      return "mips-linux-gnu";
2159    return TargetTriple.str();
2160  case llvm::Triple::mipsel:
2161    if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu"))
2162      return "mipsel-linux-gnu";
2163    return TargetTriple.str();
2164  case llvm::Triple::ppc:
2165    if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
2166      return "powerpc-linux-gnuspe";
2167    if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu"))
2168      return "powerpc-linux-gnu";
2169    return TargetTriple.str();
2170  case llvm::Triple::ppc64:
2171    if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu"))
2172      return "powerpc64-linux-gnu";
2173  case llvm::Triple::ppc64le:
2174    if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
2175      return "powerpc64le-linux-gnu";
2176    return TargetTriple.str();
2177  }
2178}
2179
2180static void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
2181  if (llvm::sys::fs::exists(Path)) Paths.push_back(Path.str());
2182}
2183
2184static StringRef getMultilibDir(const llvm::Triple &Triple,
2185                                const ArgList &Args) {
2186  if (!isMipsArch(Triple.getArch()))
2187    return Triple.isArch32Bit() ? "lib32" : "lib64";
2188
2189  // lib32 directory has a special meaning on MIPS targets.
2190  // It contains N32 ABI binaries. Use this folder if produce
2191  // code for N32 ABI only.
2192  if (hasMipsN32ABIArg(Args))
2193    return "lib32";
2194
2195  return Triple.isArch32Bit() ? "lib" : "lib64";
2196}
2197
2198Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2199  : Generic_ELF(D, Triple, Args) {
2200  llvm::Triple::ArchType Arch = Triple.getArch();
2201  std::string SysRoot = computeSysRoot();
2202
2203  // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
2204  // least) put various tools in a triple-prefixed directory off of the parent
2205  // of the GCC installation. We use the GCC triple here to ensure that we end
2206  // up with tools that support the same amount of cross compiling as the
2207  // detected GCC installation. For example, if we find a GCC installation
2208  // targeting x86_64, but it is a bi-arch GCC installation, it can also be
2209  // used to target i386.
2210  // FIXME: This seems unlikely to be Linux-specific.
2211  ToolChain::path_list &PPaths = getProgramPaths();
2212  PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
2213                         GCCInstallation.getTriple().str() + "/bin").str());
2214
2215  Linker = GetProgramPath("ld");
2216
2217  Distro Distro = DetectDistro(Arch);
2218
2219  if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
2220    ExtraOpts.push_back("-z");
2221    ExtraOpts.push_back("relro");
2222  }
2223
2224  if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
2225    ExtraOpts.push_back("-X");
2226
2227  const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android;
2228  const bool IsMips = isMipsArch(Arch);
2229
2230  if (IsMips && !SysRoot.empty())
2231    ExtraOpts.push_back("--sysroot=" + SysRoot);
2232
2233  // Do not use 'gnu' hash style for Mips targets because .gnu.hash
2234  // and the MIPS ABI require .dynsym to be sorted in different ways.
2235  // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
2236  // ABI requires a mapping between the GOT and the symbol table.
2237  // Android loader does not support .gnu.hash.
2238  if (!IsMips && !IsAndroid) {
2239    if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
2240        (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
2241      ExtraOpts.push_back("--hash-style=gnu");
2242
2243    if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
2244        Distro == UbuntuJaunty || Distro == UbuntuKarmic)
2245      ExtraOpts.push_back("--hash-style=both");
2246  }
2247
2248  if (IsRedhat(Distro))
2249    ExtraOpts.push_back("--no-add-needed");
2250
2251  if (Distro == DebianSqueeze || Distro == DebianWheezy ||
2252      Distro == DebianJessie || IsOpenSUSE(Distro) ||
2253      (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
2254      (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
2255    ExtraOpts.push_back("--build-id");
2256
2257  if (IsOpenSUSE(Distro))
2258    ExtraOpts.push_back("--enable-new-dtags");
2259
2260  // The selection of paths to try here is designed to match the patterns which
2261  // the GCC driver itself uses, as this is part of the GCC-compatible driver.
2262  // This was determined by running GCC in a fake filesystem, creating all
2263  // possible permutations of these directories, and seeing which ones it added
2264  // to the link paths.
2265  path_list &Paths = getFilePaths();
2266
2267  const std::string Multilib = getMultilibDir(Triple, Args);
2268  const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
2269
2270  // Add the multilib suffixed paths where they are available.
2271  if (GCCInstallation.isValid()) {
2272    const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
2273    const std::string &LibPath = GCCInstallation.getParentLibPath();
2274
2275    // Sourcery CodeBench MIPS toolchain holds some libraries under
2276    // the parent prefix of the GCC installation.
2277    // FIXME: It would be cleaner to model this as a variant of multilib. IE,
2278    // instead of 'lib64' it would be 'lib/el'.
2279    if (IsAndroid && IsMips && isMips32r2(Args)) {
2280      assert(GCCInstallation.getBiarchSuffix().empty() &&
2281             "Unexpected bi-arch suffix");
2282      addPathIfExists(GCCInstallation.getInstallPath() + "/mips-r2", Paths);
2283    } else
2284      addPathIfExists((GCCInstallation.getInstallPath() +
2285                       GCCInstallation.getMultiLibSuffix() +
2286                       GCCInstallation.getBiarchSuffix()),
2287                      Paths);
2288
2289    // GCC cross compiling toolchains will install target libraries which ship
2290    // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
2291    // any part of the GCC installation in
2292    // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
2293    // debatable, but is the reality today. We need to search this tree even
2294    // when we have a sysroot somewhere else. It is the responsibility of
2295    // whomever is doing the cross build targetting a sysroot using a GCC
2296    // installation that is *not* within the system root to ensure two things:
2297    //
2298    //  1) Any DSOs that are linked in from this tree or from the install path
2299    //     above must be preasant on the system root and found via an
2300    //     appropriate rpath.
2301    //  2) There must not be libraries installed into
2302    //     <prefix>/<triple>/<libdir> unless they should be preferred over
2303    //     those within the system root.
2304    //
2305    // Note that this matches the GCC behavior. See the below comment for where
2306    // Clang diverges from GCC's behavior.
2307    addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + Multilib +
2308                    GCCInstallation.getMultiLibSuffix(),
2309                    Paths);
2310
2311    // If the GCC installation we found is inside of the sysroot, we want to
2312    // prefer libraries installed in the parent prefix of the GCC installation.
2313    // It is important to *not* use these paths when the GCC installation is
2314    // outside of the system root as that can pick up unintended libraries.
2315    // This usually happens when there is an external cross compiler on the
2316    // host system, and a more minimal sysroot available that is the target of
2317    // the cross. Note that GCC does include some of these directories in some
2318    // configurations but this seems somewhere between questionable and simply
2319    // a bug.
2320    if (StringRef(LibPath).startswith(SysRoot)) {
2321      addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
2322      addPathIfExists(LibPath + "/../" + Multilib, Paths);
2323    }
2324  }
2325  addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
2326  addPathIfExists(SysRoot + "/lib/../" + Multilib, Paths);
2327  addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
2328  addPathIfExists(SysRoot + "/usr/lib/../" + Multilib, Paths);
2329
2330  // Try walking via the GCC triple path in case of biarch or multiarch GCC
2331  // installations with strange symlinks.
2332  if (GCCInstallation.isValid())
2333    addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
2334                    "/../../" + Multilib, Paths);
2335
2336  // Add the non-multilib suffixed paths (if potentially different).
2337  if (GCCInstallation.isValid()) {
2338    const std::string &LibPath = GCCInstallation.getParentLibPath();
2339    const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
2340    if (!GCCInstallation.getBiarchSuffix().empty())
2341      addPathIfExists(GCCInstallation.getInstallPath(), Paths);
2342
2343    // See comments above on the multilib variant for details of why this is
2344    // included even from outside the sysroot.
2345    addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib", Paths);
2346
2347    // See comments above on the multilib variant for details of why this is
2348    // only included from within the sysroot.
2349    if (StringRef(LibPath).startswith(SysRoot))
2350      addPathIfExists(LibPath, Paths);
2351  }
2352  addPathIfExists(SysRoot + "/lib", Paths);
2353  addPathIfExists(SysRoot + "/usr/lib", Paths);
2354}
2355
2356bool Linux::HasNativeLLVMSupport() const {
2357  return true;
2358}
2359
2360Tool *Linux::buildLinker() const {
2361  return new tools::gnutools::Link(*this);
2362}
2363
2364Tool *Linux::buildAssembler() const {
2365  return new tools::gnutools::Assemble(*this);
2366}
2367
2368void Linux::addClangTargetOptions(const ArgList &DriverArgs,
2369                                  ArgStringList &CC1Args) const {
2370  const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
2371  bool UseInitArrayDefault =
2372      !V.isOlderThan(4, 7, 0) ||
2373      getTriple().getArch() == llvm::Triple::aarch64 ||
2374      getTriple().getEnvironment() == llvm::Triple::Android;
2375  if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
2376                         options::OPT_fno_use_init_array,
2377                         UseInitArrayDefault))
2378    CC1Args.push_back("-fuse-init-array");
2379}
2380
2381std::string Linux::computeSysRoot() const {
2382  if (!getDriver().SysRoot.empty())
2383    return getDriver().SysRoot;
2384
2385  if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
2386    return std::string();
2387
2388  std::string Path =
2389    (GCCInstallation.getInstallPath() +
2390     "/../../../../" + GCCInstallation.getTriple().str() +
2391     "/libc" + GCCInstallation.getMultiLibSuffix()).str();
2392
2393  return llvm::sys::fs::exists(Path) ? Path : "";
2394}
2395
2396void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2397                                      ArgStringList &CC1Args) const {
2398  const Driver &D = getDriver();
2399  std::string SysRoot = computeSysRoot();
2400
2401  if (DriverArgs.hasArg(options::OPT_nostdinc))
2402    return;
2403
2404  if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
2405    addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
2406
2407  if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2408    SmallString<128> P(D.ResourceDir);
2409    llvm::sys::path::append(P, "include");
2410    addSystemInclude(DriverArgs, CC1Args, P.str());
2411  }
2412
2413  if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2414    return;
2415
2416  // Check for configure-time C include directories.
2417  StringRef CIncludeDirs(C_INCLUDE_DIRS);
2418  if (CIncludeDirs != "") {
2419    SmallVector<StringRef, 5> dirs;
2420    CIncludeDirs.split(dirs, ":");
2421    for (SmallVectorImpl<StringRef>::iterator I = dirs.begin(), E = dirs.end();
2422         I != E; ++I) {
2423      StringRef Prefix = llvm::sys::path::is_absolute(*I) ? SysRoot : "";
2424      addExternCSystemInclude(DriverArgs, CC1Args, Prefix + *I);
2425    }
2426    return;
2427  }
2428
2429  // Lacking those, try to detect the correct set of system includes for the
2430  // target triple.
2431
2432  // Sourcery CodeBench and modern FSF Mips toolchains put extern C
2433  // system includes under three additional directories.
2434  if (GCCInstallation.isValid() && isMipsArch(getTriple().getArch())) {
2435    addExternCSystemIncludeIfExists(
2436        DriverArgs, CC1Args, GCCInstallation.getInstallPath() + "/include");
2437
2438    addExternCSystemIncludeIfExists(
2439        DriverArgs, CC1Args,
2440        GCCInstallation.getInstallPath() + "/../../../../" +
2441            GCCInstallation.getTriple().str() + "/libc/usr/include");
2442  }
2443
2444  // Implement generic Debian multiarch support.
2445  const StringRef X86_64MultiarchIncludeDirs[] = {
2446    "/usr/include/x86_64-linux-gnu",
2447
2448    // FIXME: These are older forms of multiarch. It's not clear that they're
2449    // in use in any released version of Debian, so we should consider
2450    // removing them.
2451    "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"
2452  };
2453  const StringRef X86MultiarchIncludeDirs[] = {
2454    "/usr/include/i386-linux-gnu",
2455
2456    // FIXME: These are older forms of multiarch. It's not clear that they're
2457    // in use in any released version of Debian, so we should consider
2458    // removing them.
2459    "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
2460    "/usr/include/i486-linux-gnu"
2461  };
2462  const StringRef AArch64MultiarchIncludeDirs[] = {
2463    "/usr/include/aarch64-linux-gnu"
2464  };
2465  const StringRef ARMMultiarchIncludeDirs[] = {
2466    "/usr/include/arm-linux-gnueabi"
2467  };
2468  const StringRef ARMHFMultiarchIncludeDirs[] = {
2469    "/usr/include/arm-linux-gnueabihf"
2470  };
2471  const StringRef MIPSMultiarchIncludeDirs[] = {
2472    "/usr/include/mips-linux-gnu"
2473  };
2474  const StringRef MIPSELMultiarchIncludeDirs[] = {
2475    "/usr/include/mipsel-linux-gnu"
2476  };
2477  const StringRef PPCMultiarchIncludeDirs[] = {
2478    "/usr/include/powerpc-linux-gnu"
2479  };
2480  const StringRef PPC64MultiarchIncludeDirs[] = {
2481    "/usr/include/powerpc64-linux-gnu"
2482  };
2483  ArrayRef<StringRef> MultiarchIncludeDirs;
2484  if (getTriple().getArch() == llvm::Triple::x86_64) {
2485    MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
2486  } else if (getTriple().getArch() == llvm::Triple::x86) {
2487    MultiarchIncludeDirs = X86MultiarchIncludeDirs;
2488  } else if (getTriple().getArch() == llvm::Triple::aarch64) {
2489    MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
2490  } else if (getTriple().getArch() == llvm::Triple::arm) {
2491    if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
2492      MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
2493    else
2494      MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
2495  } else if (getTriple().getArch() == llvm::Triple::mips) {
2496    MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
2497  } else if (getTriple().getArch() == llvm::Triple::mipsel) {
2498    MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
2499  } else if (getTriple().getArch() == llvm::Triple::ppc) {
2500    MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
2501  } else if (getTriple().getArch() == llvm::Triple::ppc64) {
2502    MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
2503  }
2504  for (ArrayRef<StringRef>::iterator I = MultiarchIncludeDirs.begin(),
2505                                     E = MultiarchIncludeDirs.end();
2506       I != E; ++I) {
2507    if (llvm::sys::fs::exists(SysRoot + *I)) {
2508      addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + *I);
2509      break;
2510    }
2511  }
2512
2513  if (getTriple().getOS() == llvm::Triple::RTEMS)
2514    return;
2515
2516  // Add an include of '/include' directly. This isn't provided by default by
2517  // system GCCs, but is often used with cross-compiling GCCs, and harmless to
2518  // add even when Clang is acting as-if it were a system compiler.
2519  addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
2520
2521  addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
2522}
2523
2524/// \brief Helper to add the three variant paths for a libstdc++ installation.
2525/*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir,
2526                                                const ArgList &DriverArgs,
2527                                                ArgStringList &CC1Args) {
2528  if (!llvm::sys::fs::exists(Base))
2529    return false;
2530  addSystemInclude(DriverArgs, CC1Args, Base);
2531  addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir);
2532  addSystemInclude(DriverArgs, CC1Args, Base + "/backward");
2533  return true;
2534}
2535
2536/// \brief Helper to add an extra variant path for an (Ubuntu) multilib
2537/// libstdc++ installation.
2538/*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine Suffix,
2539                                                Twine TargetArchDir,
2540                                                Twine MultiLibSuffix,
2541                                                const ArgList &DriverArgs,
2542                                                ArgStringList &CC1Args) {
2543  if (!addLibStdCXXIncludePaths(Base+Suffix, TargetArchDir + MultiLibSuffix,
2544                                DriverArgs, CC1Args))
2545    return false;
2546
2547  addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir + Suffix
2548                   + MultiLibSuffix);
2549  return true;
2550}
2551
2552void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2553                                         ArgStringList &CC1Args) const {
2554  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2555      DriverArgs.hasArg(options::OPT_nostdincxx))
2556    return;
2557
2558  // Check if libc++ has been enabled and provide its include paths if so.
2559  if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
2560    // libc++ is always installed at a fixed path on Linux currently.
2561    addSystemInclude(DriverArgs, CC1Args,
2562                     getDriver().SysRoot + "/usr/include/c++/v1");
2563    return;
2564  }
2565
2566  // We need a detected GCC installation on Linux to provide libstdc++'s
2567  // headers. We handled the libc++ case above.
2568  if (!GCCInstallation.isValid())
2569    return;
2570
2571  // By default, look for the C++ headers in an include directory adjacent to
2572  // the lib directory of the GCC installation. Note that this is expect to be
2573  // equivalent to '/usr/include/c++/X.Y' in almost all cases.
2574  StringRef LibDir = GCCInstallation.getParentLibPath();
2575  StringRef InstallDir = GCCInstallation.getInstallPath();
2576  StringRef TripleStr = GCCInstallation.getTriple().str();
2577  StringRef MultiLibSuffix = GCCInstallation.getMultiLibSuffix();
2578  StringRef BiarchSuffix = GCCInstallation.getBiarchSuffix();
2579  const GCCVersion &Version = GCCInstallation.getVersion();
2580
2581  if (addLibStdCXXIncludePaths(
2582          LibDir.str() + "/../include", "/c++/" + Version.Text, TripleStr,
2583          MultiLibSuffix + BiarchSuffix, DriverArgs, CC1Args))
2584    return;
2585
2586  const std::string IncludePathCandidates[] = {
2587    // Gentoo is weird and places its headers inside the GCC install, so if the
2588    // first attempt to find the headers fails, try these patterns.
2589    InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
2590        Version.MinorStr,
2591    InstallDir.str() + "/include/g++-v" + Version.MajorStr,
2592    // Android standalone toolchain has C++ headers in yet another place.
2593    LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
2594    // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
2595    // without a subdirectory corresponding to the gcc version.
2596    LibDir.str() + "/../include/c++",
2597  };
2598
2599  for (unsigned i = 0; i < llvm::array_lengthof(IncludePathCandidates); ++i) {
2600    if (addLibStdCXXIncludePaths(
2601            IncludePathCandidates[i],
2602            TripleStr + MultiLibSuffix + BiarchSuffix, DriverArgs, CC1Args))
2603      break;
2604  }
2605}
2606
2607bool Linux::isPIEDefault() const {
2608  return getSanitizerArgs().hasZeroBaseShadow(*this);
2609}
2610
2611/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
2612
2613DragonFly::DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
2614  : Generic_ELF(D, Triple, Args) {
2615
2616  // Path mangling to find libexec
2617  getProgramPaths().push_back(getDriver().getInstalledDir());
2618  if (getDriver().getInstalledDir() != getDriver().Dir)
2619    getProgramPaths().push_back(getDriver().Dir);
2620
2621  getFilePaths().push_back(getDriver().Dir + "/../lib");
2622  getFilePaths().push_back("/usr/lib");
2623  if (llvm::sys::fs::exists("/usr/lib/gcc47"))
2624    getFilePaths().push_back("/usr/lib/gcc47");
2625  else
2626    getFilePaths().push_back("/usr/lib/gcc44");
2627}
2628
2629Tool *DragonFly::buildAssembler() const {
2630  return new tools::dragonfly::Assemble(*this);
2631}
2632
2633Tool *DragonFly::buildLinker() const {
2634  return new tools::dragonfly::Link(*this);
2635}
2636