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