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/Config/config.h" // for GCC_INSTALL_PREFIX
14 #include "clang/Driver/Compilation.h"
15 #include "clang/Driver/Driver.h"
16 #include "clang/Driver/DriverDiagnostic.h"
17 #include "clang/Driver/Options.h"
18 #include "clang/Driver/SanitizerArgs.h"
19 #include "llvm/ADT/STLExtras.h"
20 #include "llvm/ADT/SmallString.h"
21 #include "llvm/ADT/StringExtras.h"
22 #include "llvm/ADT/StringSwitch.h"
23 #include "llvm/Option/Arg.h"
24 #include "llvm/Option/ArgList.h"
25 #include "llvm/Option/OptTable.h"
26 #include "llvm/Option/Option.h"
27 #include "llvm/Support/ErrorHandling.h"
28 #include "llvm/Support/FileSystem.h"
29 #include "llvm/Support/MemoryBuffer.h"
30 #include "llvm/Support/Path.h"
31 #include "llvm/Support/Program.h"
32 #include "llvm/Support/raw_ostream.h"
33 #include <cstdlib> // ::getenv
34 #include <system_error>
35 
36 using namespace clang::driver;
37 using namespace clang::driver::toolchains;
38 using namespace clang;
39 using namespace llvm::opt;
40 
MachO(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)41 MachO::MachO(const Driver &D, const llvm::Triple &Triple,
42                        const ArgList &Args)
43   : ToolChain(D, Triple, Args) {
44   getProgramPaths().push_back(getDriver().getInstalledDir());
45   if (getDriver().getInstalledDir() != getDriver().Dir)
46     getProgramPaths().push_back(getDriver().Dir);
47 
48   // We expect 'as', 'ld', etc. to be adjacent to our install dir.
49   getProgramPaths().push_back(getDriver().getInstalledDir());
50   if (getDriver().getInstalledDir() != getDriver().Dir)
51     getProgramPaths().push_back(getDriver().Dir);
52 }
53 
54 /// Darwin - Darwin tool chain for i386 and x86_64.
Darwin(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)55 Darwin::Darwin(const Driver & D, const llvm::Triple & Triple,
56                const ArgList & Args)
57   : MachO(D, Triple, Args), TargetInitialized(false) {
58   // Compute the initial Darwin version from the triple
59   unsigned Major, Minor, Micro;
60   if (!Triple.getMacOSXVersion(Major, Minor, Micro))
61     getDriver().Diag(diag::err_drv_invalid_darwin_version) <<
62       Triple.getOSName();
63   llvm::raw_string_ostream(MacosxVersionMin)
64     << Major << '.' << Minor << '.' << Micro;
65 
66   // FIXME: DarwinVersion is only used to find GCC's libexec directory.
67   // It should be removed when we stop supporting that.
68   DarwinVersion[0] = Minor + 4;
69   DarwinVersion[1] = Micro;
70   DarwinVersion[2] = 0;
71 
72   // Compute the initial iOS version from the triple
73   Triple.getiOSVersion(Major, Minor, Micro);
74   llvm::raw_string_ostream(iOSVersionMin)
75     << Major << '.' << Minor << '.' << Micro;
76 }
77 
LookupTypeForExtension(const char * Ext) const78 types::ID MachO::LookupTypeForExtension(const char *Ext) const {
79   types::ID Ty = types::lookupTypeForExtension(Ext);
80 
81   // Darwin always preprocesses assembly files (unless -x is used explicitly).
82   if (Ty == types::TY_PP_Asm)
83     return types::TY_Asm;
84 
85   return Ty;
86 }
87 
HasNativeLLVMSupport() const88 bool MachO::HasNativeLLVMSupport() const {
89   return true;
90 }
91 
92 /// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
getDefaultObjCRuntime(bool isNonFragile) const93 ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
94   if (isTargetIOSBased())
95     return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
96   if (isNonFragile)
97     return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
98   return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
99 }
100 
101 /// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
hasBlocksRuntime() const102 bool Darwin::hasBlocksRuntime() const {
103   if (isTargetIOSBased())
104     return !isIPhoneOSVersionLT(3, 2);
105   else {
106     assert(isTargetMacOS() && "unexpected darwin target");
107     return !isMacosxVersionLT(10, 6);
108   }
109 }
110 
GetArmArchForMArch(StringRef Value)111 static const char *GetArmArchForMArch(StringRef Value) {
112   return llvm::StringSwitch<const char*>(Value)
113     .Case("armv6k", "armv6")
114     .Case("armv6m", "armv6m")
115     .Case("armv5tej", "armv5")
116     .Case("xscale", "xscale")
117     .Case("armv4t", "armv4t")
118     .Case("armv7", "armv7")
119     .Cases("armv7a", "armv7-a", "armv7")
120     .Cases("armv7r", "armv7-r", "armv7")
121     .Cases("armv7em", "armv7e-m", "armv7em")
122     .Cases("armv7k", "armv7-k", "armv7k")
123     .Cases("armv7m", "armv7-m", "armv7m")
124     .Cases("armv7s", "armv7-s", "armv7s")
125     .Default(nullptr);
126 }
127 
GetArmArchForMCpu(StringRef Value)128 static const char *GetArmArchForMCpu(StringRef Value) {
129   return llvm::StringSwitch<const char *>(Value)
130     .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "arm926ej-s","armv5")
131     .Cases("arm10e", "arm10tdmi", "armv5")
132     .Cases("arm1020t", "arm1020e", "arm1022e", "arm1026ej-s", "armv5")
133     .Case("xscale", "xscale")
134     .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "arm1176jzf-s", "armv6")
135     .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "armv6m")
136     .Cases("cortex-a5", "cortex-a7", "cortex-a8", "armv7")
137     .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "armv7")
138     .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "armv7r")
139     .Cases("sc300", "cortex-m3", "armv7m")
140     .Cases("cortex-m4", "cortex-m7", "armv7em")
141     .Case("swift", "armv7s")
142     .Default(nullptr);
143 }
144 
isSoftFloatABI(const ArgList & Args)145 static bool isSoftFloatABI(const ArgList &Args) {
146   Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
147                            options::OPT_mfloat_abi_EQ);
148   if (!A)
149     return false;
150 
151   return A->getOption().matches(options::OPT_msoft_float) ||
152          (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
153           A->getValue() == StringRef("soft"));
154 }
155 
getMachOArchName(const ArgList & Args) const156 StringRef MachO::getMachOArchName(const ArgList &Args) const {
157   switch (getTriple().getArch()) {
158   default:
159     return getDefaultUniversalArchName();
160 
161   case llvm::Triple::aarch64:
162     return "arm64";
163 
164   case llvm::Triple::thumb:
165   case llvm::Triple::arm: {
166     if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
167       if (const char *Arch = GetArmArchForMArch(A->getValue()))
168         return Arch;
169 
170     if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
171       if (const char *Arch = GetArmArchForMCpu(A->getValue()))
172         return Arch;
173 
174     return "arm";
175   }
176   }
177 }
178 
~Darwin()179 Darwin::~Darwin() {
180 }
181 
~MachO()182 MachO::~MachO() {
183 }
184 
185 
ComputeEffectiveClangTriple(const ArgList & Args,types::ID InputType) const186 std::string MachO::ComputeEffectiveClangTriple(const ArgList &Args,
187                                                     types::ID InputType) const {
188   llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
189 
190   return Triple.getTriple();
191 }
192 
ComputeEffectiveClangTriple(const ArgList & Args,types::ID InputType) const193 std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
194                                                 types::ID InputType) const {
195   llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
196 
197   // If the target isn't initialized (e.g., an unknown Darwin platform, return
198   // the default triple).
199   if (!isTargetInitialized())
200     return Triple.getTriple();
201 
202   SmallString<16> Str;
203   Str += isTargetIOSBased() ? "ios" : "macosx";
204   Str += getTargetVersion().getAsString();
205   Triple.setOSName(Str);
206 
207   return Triple.getTriple();
208 }
209 
anchor()210 void Generic_ELF::anchor() {}
211 
getTool(Action::ActionClass AC) const212 Tool *MachO::getTool(Action::ActionClass AC) const {
213   switch (AC) {
214   case Action::LipoJobClass:
215     if (!Lipo)
216       Lipo.reset(new tools::darwin::Lipo(*this));
217     return Lipo.get();
218   case Action::DsymutilJobClass:
219     if (!Dsymutil)
220       Dsymutil.reset(new tools::darwin::Dsymutil(*this));
221     return Dsymutil.get();
222   case Action::VerifyDebugInfoJobClass:
223     if (!VerifyDebug)
224       VerifyDebug.reset(new tools::darwin::VerifyDebug(*this));
225     return VerifyDebug.get();
226   default:
227     return ToolChain::getTool(AC);
228   }
229 }
230 
buildLinker() const231 Tool *MachO::buildLinker() const {
232   return new tools::darwin::Link(*this);
233 }
234 
buildAssembler() const235 Tool *MachO::buildAssembler() const {
236   return new tools::darwin::Assemble(*this);
237 }
238 
DarwinClang(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)239 DarwinClang::DarwinClang(const Driver &D, const llvm::Triple& Triple,
240                          const ArgList &Args)
241   : Darwin(D, Triple, Args) {
242 }
243 
addClangWarningOptions(ArgStringList & CC1Args) const244 void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
245   // For iOS, 64-bit, promote certain warnings to errors.
246   if (!isTargetMacOS() && getTriple().isArch64Bit()) {
247     // Always enable -Wdeprecated-objc-isa-usage and promote it
248     // to an error.
249     CC1Args.push_back("-Wdeprecated-objc-isa-usage");
250     CC1Args.push_back("-Werror=deprecated-objc-isa-usage");
251 
252     // Also error about implicit function declarations, as that
253     // can impact calling conventions.
254     CC1Args.push_back("-Werror=implicit-function-declaration");
255   }
256 }
257 
258 /// \brief Determine whether Objective-C automated reference counting is
259 /// enabled.
isObjCAutoRefCount(const ArgList & Args)260 static bool isObjCAutoRefCount(const ArgList &Args) {
261   return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
262 }
263 
AddLinkARCArgs(const ArgList & Args,ArgStringList & CmdArgs) const264 void DarwinClang::AddLinkARCArgs(const ArgList &Args,
265                                  ArgStringList &CmdArgs) const {
266   // Avoid linking compatibility stubs on i386 mac.
267   if (isTargetMacOS() && getArch() == llvm::Triple::x86)
268     return;
269 
270   ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true);
271 
272   if ((runtime.hasNativeARC() || !isObjCAutoRefCount(Args)) &&
273       runtime.hasSubscripting())
274     return;
275 
276   CmdArgs.push_back("-force_load");
277   SmallString<128> P(getDriver().ClangExecutable);
278   llvm::sys::path::remove_filename(P); // 'clang'
279   llvm::sys::path::remove_filename(P); // 'bin'
280   llvm::sys::path::append(P, "lib", "arc", "libarclite_");
281   // Mash in the platform.
282   if (isTargetIOSSimulator())
283     P += "iphonesimulator";
284   else if (isTargetIPhoneOS())
285     P += "iphoneos";
286   else
287     P += "macosx";
288   P += ".a";
289 
290   CmdArgs.push_back(Args.MakeArgString(P));
291 }
292 
AddLinkRuntimeLib(const ArgList & Args,ArgStringList & CmdArgs,StringRef DarwinLibName,bool AlwaysLink,bool IsEmbedded,bool AddRPath) const293 void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
294                               StringRef DarwinLibName, bool AlwaysLink,
295                               bool IsEmbedded, bool AddRPath) const {
296   SmallString<128> Dir(getDriver().ResourceDir);
297   llvm::sys::path::append(Dir, "lib", IsEmbedded ? "macho_embedded" : "darwin");
298 
299   SmallString<128> P(Dir);
300   llvm::sys::path::append(P, DarwinLibName);
301 
302   // For now, allow missing resource libraries to support developers who may
303   // not have compiler-rt checked out or integrated into their build (unless
304   // we explicitly force linking with this library).
305   if (AlwaysLink || llvm::sys::fs::exists(P))
306     CmdArgs.push_back(Args.MakeArgString(P));
307 
308   // Adding the rpaths might negatively interact when other rpaths are involved,
309   // so we should make sure we add the rpaths last, after all user-specified
310   // rpaths. This is currently true from this place, but we need to be
311   // careful if this function is ever called before user's rpaths are emitted.
312   if (AddRPath) {
313     assert(DarwinLibName.endswith(".dylib") && "must be a dynamic library");
314 
315     // Add @executable_path to rpath to support having the dylib copied with
316     // the executable.
317     CmdArgs.push_back("-rpath");
318     CmdArgs.push_back("@executable_path");
319 
320     // Add the path to the resource dir to rpath to support using the dylib
321     // from the default location without copying.
322     CmdArgs.push_back("-rpath");
323     CmdArgs.push_back(Args.MakeArgString(Dir));
324   }
325 }
326 
AddLinkSanitizerLibArgs(const ArgList & Args,ArgStringList & CmdArgs,StringRef Sanitizer) const327 void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
328                                           ArgStringList &CmdArgs,
329                                           StringRef Sanitizer) const {
330   if (!Args.hasArg(options::OPT_dynamiclib) &&
331       !Args.hasArg(options::OPT_bundle)) {
332     // Sanitizer runtime libraries requires C++.
333     AddCXXStdlibLibArgs(Args, CmdArgs);
334   }
335   assert(isTargetMacOS() || isTargetIOSSimulator());
336   StringRef OS = isTargetMacOS() ? "osx" : "iossim";
337   AddLinkRuntimeLib(Args, CmdArgs, (Twine("libclang_rt.") + Sanitizer + "_" +
338                                     OS + "_dynamic.dylib").str(),
339                     /*AlwaysLink*/ true, /*IsEmbedded*/ false,
340                     /*AddRPath*/ true);
341 
342   if (GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) {
343     // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
344     // all RTTI-related symbols that UBSan uses.
345     CmdArgs.push_back("-lc++abi");
346   }
347 }
348 
AddLinkRuntimeLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const349 void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
350                                         ArgStringList &CmdArgs) const {
351   // Darwin only supports the compiler-rt based runtime libraries.
352   switch (GetRuntimeLibType(Args)) {
353   case ToolChain::RLT_CompilerRT:
354     break;
355   default:
356     getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
357       << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
358     return;
359   }
360 
361   // Darwin doesn't support real static executables, don't link any runtime
362   // libraries with -static.
363   if (Args.hasArg(options::OPT_static) ||
364       Args.hasArg(options::OPT_fapple_kext) ||
365       Args.hasArg(options::OPT_mkernel))
366     return;
367 
368   // Reject -static-libgcc for now, we can deal with this when and if someone
369   // cares. This is useful in situations where someone wants to statically link
370   // something like libstdc++, and needs its runtime support routines.
371   if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
372     getDriver().Diag(diag::err_drv_unsupported_opt)
373       << A->getAsString(Args);
374     return;
375   }
376 
377   // If we are building profile support, link that library in.
378   if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
379                    false) ||
380       Args.hasArg(options::OPT_fprofile_generate) ||
381       Args.hasArg(options::OPT_fprofile_instr_generate) ||
382       Args.hasArg(options::OPT_fcreate_profile) ||
383       Args.hasArg(options::OPT_coverage)) {
384     // Select the appropriate runtime library for the target.
385     if (isTargetIOSBased())
386       AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a");
387     else
388       AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a");
389   }
390 
391   const SanitizerArgs &Sanitize = getSanitizerArgs();
392 
393   if (Sanitize.needsAsanRt()) {
394     if (!isTargetMacOS() && !isTargetIOSSimulator()) {
395       // FIXME: Move this check to SanitizerArgs::filterUnsupportedKinds.
396       getDriver().Diag(diag::err_drv_clang_unsupported_per_platform)
397           << "-fsanitize=address";
398     } else {
399       AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
400     }
401   }
402 
403   if (Sanitize.needsUbsanRt()) {
404     if (!isTargetMacOS() && !isTargetIOSSimulator()) {
405       // FIXME: Move this check to SanitizerArgs::filterUnsupportedKinds.
406       getDriver().Diag(diag::err_drv_clang_unsupported_per_platform)
407           << "-fsanitize=undefined";
408     } else {
409       AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
410     }
411   }
412 
413   // Otherwise link libSystem, then the dynamic runtime library, and finally any
414   // target specific static runtime library.
415   CmdArgs.push_back("-lSystem");
416 
417   // Select the dynamic runtime library and the target specific static library.
418   if (isTargetIOSBased()) {
419     // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
420     // it never went into the SDK.
421     // Linking against libgcc_s.1 isn't needed for iOS 5.0+
422     if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
423         getTriple().getArch() != llvm::Triple::aarch64)
424       CmdArgs.push_back("-lgcc_s.1");
425 
426     // We currently always need a static runtime library for iOS.
427     AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
428   } else {
429     assert(isTargetMacOS() && "unexpected non MacOS platform");
430     // The dynamic runtime library was merged with libSystem for 10.6 and
431     // beyond; only 10.4 and 10.5 need an additional runtime library.
432     if (isMacosxVersionLT(10, 5))
433       CmdArgs.push_back("-lgcc_s.10.4");
434     else if (isMacosxVersionLT(10, 6))
435       CmdArgs.push_back("-lgcc_s.10.5");
436 
437     // For OS X, we thought we would only need a static runtime library when
438     // targeting 10.4, to provide versions of the static functions which were
439     // omitted from 10.4.dylib.
440     //
441     // Unfortunately, that turned out to not be true, because Darwin system
442     // headers can still use eprintf on i386, and it is not exported from
443     // libSystem. Therefore, we still must provide a runtime library just for
444     // the tiny tiny handful of projects that *might* use that symbol.
445     if (isMacosxVersionLT(10, 5)) {
446       AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
447     } else {
448       if (getTriple().getArch() == llvm::Triple::x86)
449         AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
450       AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
451     }
452   }
453 }
454 
AddDeploymentTarget(DerivedArgList & Args) const455 void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
456   const OptTable &Opts = getDriver().getOpts();
457 
458   // Support allowing the SDKROOT environment variable used by xcrun and other
459   // Xcode tools to define the default sysroot, by making it the default for
460   // isysroot.
461   if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
462     // Warn if the path does not exist.
463     if (!llvm::sys::fs::exists(A->getValue()))
464       getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
465   } else {
466     if (char *env = ::getenv("SDKROOT")) {
467       // We only use this value as the default if it is an absolute path,
468       // exists, and it is not the root path.
469       if (llvm::sys::path::is_absolute(env) && llvm::sys::fs::exists(env) &&
470           StringRef(env) != "/") {
471         Args.append(Args.MakeSeparateArg(
472                       nullptr, Opts.getOption(options::OPT_isysroot), env));
473       }
474     }
475   }
476 
477   Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
478   Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
479 
480   if (OSXVersion && iOSVersion) {
481     getDriver().Diag(diag::err_drv_argument_not_allowed_with)
482           << OSXVersion->getAsString(Args)
483           << iOSVersion->getAsString(Args);
484     iOSVersion = nullptr;
485   } else if (!OSXVersion && !iOSVersion) {
486     // If no deployment target was specified on the command line, check for
487     // environment defines.
488     StringRef OSXTarget;
489     StringRef iOSTarget;
490     if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
491       OSXTarget = env;
492     if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
493       iOSTarget = env;
494 
495     // If no '-miphoneos-version-min' specified on the command line and
496     // IPHONEOS_DEPLOYMENT_TARGET is not defined, see if we can set the default
497     // based on -isysroot.
498     if (iOSTarget.empty()) {
499       if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
500         StringRef first, second;
501         StringRef isysroot = A->getValue();
502         std::tie(first, second) = isysroot.split(StringRef("SDKs/iPhoneOS"));
503         if (second != "")
504           iOSTarget = second.substr(0,3);
505       }
506     }
507 
508     // If no OSX or iOS target has been specified and we're compiling for armv7,
509     // go ahead as assume we're targeting iOS.
510     StringRef MachOArchName = getMachOArchName(Args);
511     if (OSXTarget.empty() && iOSTarget.empty() &&
512         (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
513          MachOArchName == "arm64"))
514         iOSTarget = iOSVersionMin;
515 
516     // Allow conflicts among OSX and iOS for historical reasons, but choose the
517     // default platform.
518     if (!OSXTarget.empty() && !iOSTarget.empty()) {
519       if (getTriple().getArch() == llvm::Triple::arm ||
520           getTriple().getArch() == llvm::Triple::aarch64 ||
521           getTriple().getArch() == llvm::Triple::thumb)
522         OSXTarget = "";
523       else
524         iOSTarget = "";
525     }
526 
527     if (!OSXTarget.empty()) {
528       const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
529       OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
530       Args.append(OSXVersion);
531     } else if (!iOSTarget.empty()) {
532       const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
533       iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
534       Args.append(iOSVersion);
535     } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
536                MachOArchName != "armv7em") {
537       // Otherwise, assume we are targeting OS X.
538       const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
539       OSXVersion = Args.MakeJoinedArg(nullptr, O, MacosxVersionMin);
540       Args.append(OSXVersion);
541     }
542   }
543 
544   DarwinPlatformKind Platform;
545   if (OSXVersion)
546     Platform = MacOS;
547   else if (iOSVersion)
548     Platform = IPhoneOS;
549   else
550     llvm_unreachable("Unable to infer Darwin variant");
551 
552   // Set the tool chain target information.
553   unsigned Major, Minor, Micro;
554   bool HadExtra;
555   if (Platform == MacOS) {
556     assert(!iOSVersion && "Unknown target platform!");
557     if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor,
558                                    Micro, HadExtra) || HadExtra ||
559         Major != 10 || Minor >= 100 || Micro >= 100)
560       getDriver().Diag(diag::err_drv_invalid_version_number)
561         << OSXVersion->getAsString(Args);
562   } else if (Platform == IPhoneOS) {
563     assert(iOSVersion && "Unknown target platform!");
564     if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor,
565                                    Micro, HadExtra) || HadExtra ||
566         Major >= 10 || Minor >= 100 || Micro >= 100)
567       getDriver().Diag(diag::err_drv_invalid_version_number)
568         << iOSVersion->getAsString(Args);
569   } else
570     llvm_unreachable("unknown kind of Darwin platform");
571 
572   // Recognize iOS targets with an x86 architecture as the iOS simulator.
573   if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
574                      getTriple().getArch() == llvm::Triple::x86_64))
575     Platform = IPhoneOSSimulator;
576 
577   setTarget(Platform, Major, Minor, Micro);
578 }
579 
AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const580 void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
581                                       ArgStringList &CmdArgs) const {
582   CXXStdlibType Type = GetCXXStdlibType(Args);
583 
584   switch (Type) {
585   case ToolChain::CST_Libcxx:
586     CmdArgs.push_back("-lc++");
587     break;
588 
589   case ToolChain::CST_Libstdcxx: {
590     // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
591     // it was previously found in the gcc lib dir. However, for all the Darwin
592     // platforms we care about it was -lstdc++.6, so we search for that
593     // explicitly if we can't see an obvious -lstdc++ candidate.
594 
595     // Check in the sysroot first.
596     if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
597       SmallString<128> P(A->getValue());
598       llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
599 
600       if (!llvm::sys::fs::exists(P)) {
601         llvm::sys::path::remove_filename(P);
602         llvm::sys::path::append(P, "libstdc++.6.dylib");
603         if (llvm::sys::fs::exists(P)) {
604           CmdArgs.push_back(Args.MakeArgString(P));
605           return;
606         }
607       }
608     }
609 
610     // Otherwise, look in the root.
611     // FIXME: This should be removed someday when we don't have to care about
612     // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
613     if (!llvm::sys::fs::exists("/usr/lib/libstdc++.dylib") &&
614         llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib")) {
615       CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
616       return;
617     }
618 
619     // Otherwise, let the linker search.
620     CmdArgs.push_back("-lstdc++");
621     break;
622   }
623   }
624 }
625 
AddCCKextLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const626 void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
627                                    ArgStringList &CmdArgs) const {
628 
629   // For Darwin platforms, use the compiler-rt-based support library
630   // instead of the gcc-provided one (which is also incidentally
631   // only present in the gcc lib dir, which makes it hard to find).
632 
633   SmallString<128> P(getDriver().ResourceDir);
634   llvm::sys::path::append(P, "lib", "darwin");
635 
636   // Use the newer cc_kext for iOS ARM after 6.0.
637   if (!isTargetIPhoneOS() || isTargetIOSSimulator() ||
638       getTriple().getArch() == llvm::Triple::aarch64 ||
639       !isIPhoneOSVersionLT(6, 0)) {
640     llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
641   } else {
642     llvm::sys::path::append(P, "libclang_rt.cc_kext_ios5.a");
643   }
644 
645   // For now, allow missing resource libraries to support developers who may
646   // not have compiler-rt checked out or integrated into their build.
647   if (llvm::sys::fs::exists(P))
648     CmdArgs.push_back(Args.MakeArgString(P));
649 }
650 
TranslateArgs(const DerivedArgList & Args,const char * BoundArch) const651 DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
652                                      const char *BoundArch) const {
653   DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
654   const OptTable &Opts = getDriver().getOpts();
655 
656   // FIXME: We really want to get out of the tool chain level argument
657   // translation business, as it makes the driver functionality much
658   // more opaque. For now, we follow gcc closely solely for the
659   // purpose of easily achieving feature parity & testability. Once we
660   // have something that works, we should reevaluate each translation
661   // and try to push it down into tool specific logic.
662 
663   for (Arg *A : Args) {
664     if (A->getOption().matches(options::OPT_Xarch__)) {
665       // Skip this argument unless the architecture matches either the toolchain
666       // triple arch, or the arch being bound.
667       llvm::Triple::ArchType XarchArch =
668         tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
669       if (!(XarchArch == getArch()  ||
670             (BoundArch && XarchArch ==
671              tools::darwin::getArchTypeForMachOArchName(BoundArch))))
672         continue;
673 
674       Arg *OriginalArg = A;
675       unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
676       unsigned Prev = Index;
677       std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
678 
679       // If the argument parsing failed or more than one argument was
680       // consumed, the -Xarch_ argument's parameter tried to consume
681       // extra arguments. Emit an error and ignore.
682       //
683       // We also want to disallow any options which would alter the
684       // driver behavior; that isn't going to work in our model. We
685       // use isDriverOption() as an approximation, although things
686       // like -O4 are going to slip through.
687       if (!XarchArg || Index > Prev + 1) {
688         getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
689           << A->getAsString(Args);
690         continue;
691       } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
692         getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
693           << A->getAsString(Args);
694         continue;
695       }
696 
697       XarchArg->setBaseArg(A);
698 
699       A = XarchArg.release();
700       DAL->AddSynthesizedArg(A);
701 
702       // Linker input arguments require custom handling. The problem is that we
703       // have already constructed the phase actions, so we can not treat them as
704       // "input arguments".
705       if (A->getOption().hasFlag(options::LinkerInput)) {
706         // Convert the argument into individual Zlinker_input_args.
707         for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
708           DAL->AddSeparateArg(OriginalArg,
709                               Opts.getOption(options::OPT_Zlinker_input),
710                               A->getValue(i));
711 
712         }
713         continue;
714       }
715     }
716 
717     // Sob. These is strictly gcc compatible for the time being. Apple
718     // gcc translates options twice, which means that self-expanding
719     // options add duplicates.
720     switch ((options::ID) A->getOption().getID()) {
721     default:
722       DAL->append(A);
723       break;
724 
725     case options::OPT_mkernel:
726     case options::OPT_fapple_kext:
727       DAL->append(A);
728       DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
729       break;
730 
731     case options::OPT_dependency_file:
732       DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF),
733                           A->getValue());
734       break;
735 
736     case options::OPT_gfull:
737       DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
738       DAL->AddFlagArg(A,
739                Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
740       break;
741 
742     case options::OPT_gused:
743       DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
744       DAL->AddFlagArg(A,
745              Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
746       break;
747 
748     case options::OPT_shared:
749       DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
750       break;
751 
752     case options::OPT_fconstant_cfstrings:
753       DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
754       break;
755 
756     case options::OPT_fno_constant_cfstrings:
757       DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
758       break;
759 
760     case options::OPT_Wnonportable_cfstrings:
761       DAL->AddFlagArg(A,
762                       Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
763       break;
764 
765     case options::OPT_Wno_nonportable_cfstrings:
766       DAL->AddFlagArg(A,
767                    Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
768       break;
769 
770     case options::OPT_fpascal_strings:
771       DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
772       break;
773 
774     case options::OPT_fno_pascal_strings:
775       DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
776       break;
777     }
778   }
779 
780   if (getTriple().getArch() == llvm::Triple::x86 ||
781       getTriple().getArch() == llvm::Triple::x86_64)
782     if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
783       DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
784                         "core2");
785 
786   // Add the arch options based on the particular spelling of -arch, to match
787   // how the driver driver works.
788   if (BoundArch) {
789     StringRef Name = BoundArch;
790     const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
791     const Option MArch = Opts.getOption(options::OPT_march_EQ);
792 
793     // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
794     // which defines the list of which architectures we accept.
795     if (Name == "ppc")
796       ;
797     else if (Name == "ppc601")
798       DAL->AddJoinedArg(nullptr, MCpu, "601");
799     else if (Name == "ppc603")
800       DAL->AddJoinedArg(nullptr, MCpu, "603");
801     else if (Name == "ppc604")
802       DAL->AddJoinedArg(nullptr, MCpu, "604");
803     else if (Name == "ppc604e")
804       DAL->AddJoinedArg(nullptr, MCpu, "604e");
805     else if (Name == "ppc750")
806       DAL->AddJoinedArg(nullptr, MCpu, "750");
807     else if (Name == "ppc7400")
808       DAL->AddJoinedArg(nullptr, MCpu, "7400");
809     else if (Name == "ppc7450")
810       DAL->AddJoinedArg(nullptr, MCpu, "7450");
811     else if (Name == "ppc970")
812       DAL->AddJoinedArg(nullptr, MCpu, "970");
813 
814     else if (Name == "ppc64" || Name == "ppc64le")
815       DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
816 
817     else if (Name == "i386")
818       ;
819     else if (Name == "i486")
820       DAL->AddJoinedArg(nullptr, MArch, "i486");
821     else if (Name == "i586")
822       DAL->AddJoinedArg(nullptr, MArch, "i586");
823     else if (Name == "i686")
824       DAL->AddJoinedArg(nullptr, MArch, "i686");
825     else if (Name == "pentium")
826       DAL->AddJoinedArg(nullptr, MArch, "pentium");
827     else if (Name == "pentium2")
828       DAL->AddJoinedArg(nullptr, MArch, "pentium2");
829     else if (Name == "pentpro")
830       DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
831     else if (Name == "pentIIm3")
832       DAL->AddJoinedArg(nullptr, MArch, "pentium2");
833 
834     else if (Name == "x86_64")
835       DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
836     else if (Name == "x86_64h") {
837       DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
838       DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
839     }
840 
841     else if (Name == "arm")
842       DAL->AddJoinedArg(nullptr, MArch, "armv4t");
843     else if (Name == "armv4t")
844       DAL->AddJoinedArg(nullptr, MArch, "armv4t");
845     else if (Name == "armv5")
846       DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
847     else if (Name == "xscale")
848       DAL->AddJoinedArg(nullptr, MArch, "xscale");
849     else if (Name == "armv6")
850       DAL->AddJoinedArg(nullptr, MArch, "armv6k");
851     else if (Name == "armv6m")
852       DAL->AddJoinedArg(nullptr, MArch, "armv6m");
853     else if (Name == "armv7")
854       DAL->AddJoinedArg(nullptr, MArch, "armv7a");
855     else if (Name == "armv7em")
856       DAL->AddJoinedArg(nullptr, MArch, "armv7em");
857     else if (Name == "armv7k")
858       DAL->AddJoinedArg(nullptr, MArch, "armv7k");
859     else if (Name == "armv7m")
860       DAL->AddJoinedArg(nullptr, MArch, "armv7m");
861     else if (Name == "armv7s")
862       DAL->AddJoinedArg(nullptr, MArch, "armv7s");
863   }
864 
865   return DAL;
866 }
867 
AddLinkRuntimeLibArgs(const llvm::opt::ArgList & Args,llvm::opt::ArgStringList & CmdArgs) const868 void MachO::AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,
869                                   llvm::opt::ArgStringList &CmdArgs) const {
870   // Embedded targets are simple at the moment, not supporting sanitizers and
871   // with different libraries for each member of the product { static, PIC } x
872   // { hard-float, soft-float }
873   llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
874   CompilerRT +=
875       tools::arm::getARMFloatABI(getDriver(), Args, getTriple()) == "hard"
876           ? "hard"
877           : "soft";
878   CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
879 
880   AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
881 }
882 
883 
TranslateArgs(const DerivedArgList & Args,const char * BoundArch) const884 DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
885                                       const char *BoundArch) const {
886   // First get the generic Apple args, before moving onto Darwin-specific ones.
887   DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
888   const OptTable &Opts = getDriver().getOpts();
889 
890   // If no architecture is bound, none of the translations here are relevant.
891   if (!BoundArch)
892     return DAL;
893 
894   // Add an explicit version min argument for the deployment target. We do this
895   // after argument translation because -Xarch_ arguments may add a version min
896   // argument.
897   AddDeploymentTarget(*DAL);
898 
899   // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
900   // FIXME: It would be far better to avoid inserting those -static arguments,
901   // but we can't check the deployment target in the translation code until
902   // it is set here.
903   if (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0)) {
904     for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
905       Arg *A = *it;
906       ++it;
907       if (A->getOption().getID() != options::OPT_mkernel &&
908           A->getOption().getID() != options::OPT_fapple_kext)
909         continue;
910       assert(it != ie && "unexpected argument translation");
911       A = *it;
912       assert(A->getOption().getID() == options::OPT_static &&
913              "missing expected -static argument");
914       it = DAL->getArgs().erase(it);
915     }
916   }
917 
918   // Default to use libc++ on OS X 10.9+ and iOS 7+.
919   if (((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
920        (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0))) &&
921       !Args.getLastArg(options::OPT_stdlib_EQ))
922     DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
923                       "libc++");
924 
925   // Validate the C++ standard library choice.
926   CXXStdlibType Type = GetCXXStdlibType(*DAL);
927   if (Type == ToolChain::CST_Libcxx) {
928     // Check whether the target provides libc++.
929     StringRef where;
930 
931     // Complain about targeting iOS < 5.0 in any way.
932     if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
933       where = "iOS 5.0";
934 
935     if (where != StringRef()) {
936       getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment)
937         << where;
938     }
939   }
940 
941   return DAL;
942 }
943 
IsUnwindTablesDefault() const944 bool MachO::IsUnwindTablesDefault() const {
945   return getArch() == llvm::Triple::x86_64;
946 }
947 
UseDwarfDebugFlags() const948 bool MachO::UseDwarfDebugFlags() const {
949   if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
950     return S[0] != '\0';
951   return false;
952 }
953 
UseSjLjExceptions() const954 bool Darwin::UseSjLjExceptions() const {
955   // Darwin uses SjLj exceptions on ARM.
956   return (getTriple().getArch() == llvm::Triple::arm ||
957           getTriple().getArch() == llvm::Triple::thumb);
958 }
959 
isPICDefault() const960 bool MachO::isPICDefault() const {
961   return true;
962 }
963 
isPIEDefault() const964 bool MachO::isPIEDefault() const {
965   return false;
966 }
967 
isPICDefaultForced() const968 bool MachO::isPICDefaultForced() const {
969   return (getArch() == llvm::Triple::x86_64 ||
970           getArch() == llvm::Triple::aarch64);
971 }
972 
SupportsProfiling() const973 bool MachO::SupportsProfiling() const {
974   // Profiling instrumentation is only supported on x86.
975   return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
976 }
977 
addMinVersionArgs(const llvm::opt::ArgList & Args,llvm::opt::ArgStringList & CmdArgs) const978 void Darwin::addMinVersionArgs(const llvm::opt::ArgList &Args,
979                                llvm::opt::ArgStringList &CmdArgs) const {
980   VersionTuple TargetVersion = getTargetVersion();
981 
982   if (isTargetIOSSimulator())
983     CmdArgs.push_back("-ios_simulator_version_min");
984   else if (isTargetIOSBased())
985     CmdArgs.push_back("-iphoneos_version_min");
986   else {
987     assert(isTargetMacOS() && "unexpected target");
988     CmdArgs.push_back("-macosx_version_min");
989   }
990 
991   CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
992 }
993 
addStartObjectFileArgs(const llvm::opt::ArgList & Args,llvm::opt::ArgStringList & CmdArgs) const994 void Darwin::addStartObjectFileArgs(const llvm::opt::ArgList &Args,
995                                     llvm::opt::ArgStringList &CmdArgs) const {
996   // Derived from startfile spec.
997   if (Args.hasArg(options::OPT_dynamiclib)) {
998     // Derived from darwin_dylib1 spec.
999     if (isTargetIOSSimulator()) {
1000       ; // iOS simulator does not need dylib1.o.
1001     } else if (isTargetIPhoneOS()) {
1002       if (isIPhoneOSVersionLT(3, 1))
1003         CmdArgs.push_back("-ldylib1.o");
1004     } else {
1005       if (isMacosxVersionLT(10, 5))
1006         CmdArgs.push_back("-ldylib1.o");
1007       else if (isMacosxVersionLT(10, 6))
1008         CmdArgs.push_back("-ldylib1.10.5.o");
1009     }
1010   } else {
1011     if (Args.hasArg(options::OPT_bundle)) {
1012       if (!Args.hasArg(options::OPT_static)) {
1013         // Derived from darwin_bundle1 spec.
1014         if (isTargetIOSSimulator()) {
1015           ; // iOS simulator does not need bundle1.o.
1016         } else if (isTargetIPhoneOS()) {
1017           if (isIPhoneOSVersionLT(3, 1))
1018             CmdArgs.push_back("-lbundle1.o");
1019         } else {
1020           if (isMacosxVersionLT(10, 6))
1021             CmdArgs.push_back("-lbundle1.o");
1022         }
1023       }
1024     } else {
1025       if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1026         if (Args.hasArg(options::OPT_static) ||
1027             Args.hasArg(options::OPT_object) ||
1028             Args.hasArg(options::OPT_preload)) {
1029           CmdArgs.push_back("-lgcrt0.o");
1030         } else {
1031           CmdArgs.push_back("-lgcrt1.o");
1032 
1033           // darwin_crt2 spec is empty.
1034         }
1035         // By default on OS X 10.8 and later, we don't link with a crt1.o
1036         // file and the linker knows to use _main as the entry point.  But,
1037         // when compiling with -pg, we need to link with the gcrt1.o file,
1038         // so pass the -no_new_main option to tell the linker to use the
1039         // "start" symbol as the entry point.
1040         if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1041           CmdArgs.push_back("-no_new_main");
1042       } else {
1043         if (Args.hasArg(options::OPT_static) ||
1044             Args.hasArg(options::OPT_object) ||
1045             Args.hasArg(options::OPT_preload)) {
1046           CmdArgs.push_back("-lcrt0.o");
1047         } else {
1048           // Derived from darwin_crt1 spec.
1049           if (isTargetIOSSimulator()) {
1050             ; // iOS simulator does not need crt1.o.
1051           } else if (isTargetIPhoneOS()) {
1052             if (getArch() == llvm::Triple::aarch64)
1053               ; // iOS does not need any crt1 files for arm64
1054             else if (isIPhoneOSVersionLT(3, 1))
1055               CmdArgs.push_back("-lcrt1.o");
1056             else if (isIPhoneOSVersionLT(6, 0))
1057               CmdArgs.push_back("-lcrt1.3.1.o");
1058           } else {
1059             if (isMacosxVersionLT(10, 5))
1060               CmdArgs.push_back("-lcrt1.o");
1061             else if (isMacosxVersionLT(10, 6))
1062               CmdArgs.push_back("-lcrt1.10.5.o");
1063             else if (isMacosxVersionLT(10, 8))
1064               CmdArgs.push_back("-lcrt1.10.6.o");
1065 
1066             // darwin_crt2 spec is empty.
1067           }
1068         }
1069       }
1070     }
1071   }
1072 
1073   if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
1074       isMacosxVersionLT(10, 5)) {
1075     const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1076     CmdArgs.push_back(Str);
1077   }
1078 }
1079 
SupportsObjCGC() const1080 bool Darwin::SupportsObjCGC() const {
1081   return isTargetMacOS();
1082 }
1083 
CheckObjCARC() const1084 void Darwin::CheckObjCARC() const {
1085   if (isTargetIOSBased()|| (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
1086     return;
1087   getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
1088 }
1089 
1090 /// Generic_GCC - A tool chain using the 'gcc' command to perform
1091 /// all subcommands; this relies on gcc translating the majority of
1092 /// command line options.
1093 
1094 /// \brief Parse a GCCVersion object out of a string of text.
1095 ///
1096 /// This is the primary means of forming GCCVersion objects.
1097 /*static*/
Parse(StringRef VersionText)1098 Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
1099   const GCCVersion BadVersion = { VersionText.str(), -1, -1, -1, "", "", "" };
1100   std::pair<StringRef, StringRef> First = VersionText.split('.');
1101   std::pair<StringRef, StringRef> Second = First.second.split('.');
1102 
1103   GCCVersion GoodVersion = { VersionText.str(), -1, -1, -1, "", "", "" };
1104   if (First.first.getAsInteger(10, GoodVersion.Major) ||
1105       GoodVersion.Major < 0)
1106     return BadVersion;
1107   GoodVersion.MajorStr = First.first.str();
1108   if (Second.first.getAsInteger(10, GoodVersion.Minor) ||
1109       GoodVersion.Minor < 0)
1110     return BadVersion;
1111   GoodVersion.MinorStr = Second.first.str();
1112 
1113   // First look for a number prefix and parse that if present. Otherwise just
1114   // stash the entire patch string in the suffix, and leave the number
1115   // unspecified. This covers versions strings such as:
1116   //   4.4
1117   //   4.4.0
1118   //   4.4.x
1119   //   4.4.2-rc4
1120   //   4.4.x-patched
1121   // And retains any patch number it finds.
1122   StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1123   if (!PatchText.empty()) {
1124     if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
1125       // Try to parse the number and any suffix.
1126       if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1127           GoodVersion.Patch < 0)
1128         return BadVersion;
1129       GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
1130     }
1131   }
1132 
1133   return GoodVersion;
1134 }
1135 
1136 /// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
isOlderThan(int RHSMajor,int RHSMinor,int RHSPatch,StringRef RHSPatchSuffix) const1137 bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1138                                           int RHSPatch,
1139                                           StringRef RHSPatchSuffix) const {
1140   if (Major != RHSMajor)
1141     return Major < RHSMajor;
1142   if (Minor != RHSMinor)
1143     return Minor < RHSMinor;
1144   if (Patch != RHSPatch) {
1145     // Note that versions without a specified patch sort higher than those with
1146     // a patch.
1147     if (RHSPatch == -1)
1148       return true;
1149     if (Patch == -1)
1150       return false;
1151 
1152     // Otherwise just sort on the patch itself.
1153     return Patch < RHSPatch;
1154   }
1155   if (PatchSuffix != RHSPatchSuffix) {
1156     // Sort empty suffixes higher.
1157     if (RHSPatchSuffix.empty())
1158       return true;
1159     if (PatchSuffix.empty())
1160       return false;
1161 
1162     // Provide a lexicographic sort to make this a total ordering.
1163     return PatchSuffix < RHSPatchSuffix;
1164   }
1165 
1166   // The versions are equal.
1167   return false;
1168 }
1169 
getGCCToolchainDir(const ArgList & Args)1170 static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
1171   const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1172   if (A)
1173     return A->getValue();
1174   return GCC_INSTALL_PREFIX;
1175 }
1176 
1177 /// \brief Initialize a GCCInstallationDetector from the driver.
1178 ///
1179 /// This performs all of the autodetection and sets up the various paths.
1180 /// Once constructed, a GCCInstallationDetector is essentially immutable.
1181 ///
1182 /// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1183 /// should instead pull the target out of the driver. This is currently
1184 /// necessary because the driver doesn't store the final version of the target
1185 /// triple.
1186 void
init(const Driver & D,const llvm::Triple & TargetTriple,const ArgList & Args)1187 Generic_GCC::GCCInstallationDetector::init(
1188     const Driver &D, const llvm::Triple &TargetTriple, const ArgList &Args) {
1189   llvm::Triple BiarchVariantTriple =
1190       TargetTriple.isArch32Bit() ? TargetTriple.get64BitArchVariant()
1191                                  : TargetTriple.get32BitArchVariant();
1192   // The library directories which may contain GCC installations.
1193   SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
1194   // The compatible GCC triples for this particular architecture.
1195   SmallVector<StringRef, 16> CandidateTripleAliases;
1196   SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
1197   CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1198                            CandidateTripleAliases, CandidateBiarchLibDirs,
1199                            CandidateBiarchTripleAliases);
1200 
1201   // Compute the set of prefixes for our search.
1202   SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1203                                        D.PrefixDirs.end());
1204 
1205   StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1206   if (GCCToolchainDir != "") {
1207     if (GCCToolchainDir.back() == '/')
1208       GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
1209 
1210     Prefixes.push_back(GCCToolchainDir);
1211   } else {
1212     // If we have a SysRoot, try that first.
1213     if (!D.SysRoot.empty()) {
1214       Prefixes.push_back(D.SysRoot);
1215       Prefixes.push_back(D.SysRoot + "/usr");
1216     }
1217 
1218     // Then look for gcc installed alongside clang.
1219     Prefixes.push_back(D.InstalledDir + "/..");
1220 
1221     // And finally in /usr.
1222     if (D.SysRoot.empty())
1223       Prefixes.push_back("/usr");
1224   }
1225 
1226   // Loop over the various components which exist and select the best GCC
1227   // installation available. GCC installs are ranked by version number.
1228   Version = GCCVersion::Parse("0.0.0");
1229   for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) {
1230     if (!llvm::sys::fs::exists(Prefixes[i]))
1231       continue;
1232     for (unsigned j = 0, je = CandidateLibDirs.size(); j < je; ++j) {
1233       const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str();
1234       if (!llvm::sys::fs::exists(LibDir))
1235         continue;
1236       for (unsigned k = 0, ke = CandidateTripleAliases.size(); k < ke; ++k)
1237         ScanLibDirForGCCTriple(TargetTriple, Args, LibDir,
1238                                CandidateTripleAliases[k]);
1239     }
1240     for (unsigned j = 0, je = CandidateBiarchLibDirs.size(); j < je; ++j) {
1241       const std::string LibDir = Prefixes[i] + CandidateBiarchLibDirs[j].str();
1242       if (!llvm::sys::fs::exists(LibDir))
1243         continue;
1244       for (unsigned k = 0, ke = CandidateBiarchTripleAliases.size(); k < ke;
1245            ++k)
1246         ScanLibDirForGCCTriple(TargetTriple, Args, LibDir,
1247                                CandidateBiarchTripleAliases[k],
1248                                /*NeedsBiarchSuffix=*/ true);
1249     }
1250   }
1251 }
1252 
print(raw_ostream & OS) const1253 void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
1254   for (const auto &InstallPath : CandidateGCCInstallPaths)
1255     OS << "Found candidate GCC installation: " << InstallPath << "\n";
1256 
1257   if (!GCCInstallPath.empty())
1258     OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1259 
1260   for (const auto &Multilib : Multilibs)
1261     OS << "Candidate multilib: " << Multilib << "\n";
1262 
1263   if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1264     OS << "Selected multilib: " << SelectedMultilib << "\n";
1265 }
1266 
getBiarchSibling(Multilib & M) const1267 bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1268   if (BiarchSibling.hasValue()) {
1269     M = BiarchSibling.getValue();
1270     return true;
1271   }
1272   return false;
1273 }
1274 
CollectLibDirsAndTriples(const llvm::Triple & TargetTriple,const llvm::Triple & BiarchTriple,SmallVectorImpl<StringRef> & LibDirs,SmallVectorImpl<StringRef> & TripleAliases,SmallVectorImpl<StringRef> & BiarchLibDirs,SmallVectorImpl<StringRef> & BiarchTripleAliases)1275 /*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
1276     const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
1277     SmallVectorImpl<StringRef> &LibDirs,
1278     SmallVectorImpl<StringRef> &TripleAliases,
1279     SmallVectorImpl<StringRef> &BiarchLibDirs,
1280     SmallVectorImpl<StringRef> &BiarchTripleAliases) {
1281   // Declare a bunch of static data sets that we'll select between below. These
1282   // are specifically designed to always refer to string literals to avoid any
1283   // lifetime or initialization issues.
1284   static const char *const AArch64LibDirs[] = { "/lib64", "/lib" };
1285   static const char *const AArch64Triples[] = { "aarch64-none-linux-gnu",
1286                                                 "aarch64-linux-gnu",
1287                                                 "aarch64-linux-android",
1288                                                 "aarch64-redhat-linux" };
1289   static const char *const AArch64beLibDirs[] = { "/lib" };
1290   static const char *const AArch64beTriples[] = { "aarch64_be-none-linux-gnu",
1291                                                   "aarch64_be-linux-gnu" };
1292 
1293   static const char *const ARMLibDirs[] = { "/lib" };
1294   static const char *const ARMTriples[] = { "arm-linux-gnueabi",
1295                                             "arm-linux-androideabi" };
1296   static const char *const ARMHFTriples[] = { "arm-linux-gnueabihf",
1297                                               "armv7hl-redhat-linux-gnueabi" };
1298   static const char *const ARMebLibDirs[] = { "/lib" };
1299   static const char *const ARMebTriples[] = { "armeb-linux-gnueabi",
1300                                               "armeb-linux-androideabi" };
1301   static const char *const ARMebHFTriples[] = { "armeb-linux-gnueabihf",
1302                                                 "armebv7hl-redhat-linux-gnueabi" };
1303 
1304   static const char *const X86_64LibDirs[] = { "/lib64", "/lib" };
1305   static const char *const X86_64Triples[] = {
1306     "x86_64-linux-gnu", "x86_64-unknown-linux-gnu", "x86_64-pc-linux-gnu",
1307     "x86_64-redhat-linux6E", "x86_64-redhat-linux", "x86_64-suse-linux",
1308     "x86_64-manbo-linux-gnu", "x86_64-linux-gnu", "x86_64-slackware-linux",
1309     "x86_64-linux-android", "x86_64-unknown-linux"
1310   };
1311   static const char *const X32LibDirs[] = { "/libx32" };
1312   static const char *const X86LibDirs[] = { "/lib32", "/lib" };
1313   static const char *const X86Triples[] = {
1314     "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu", "i386-linux-gnu",
1315     "i386-redhat-linux6E", "i686-redhat-linux", "i586-redhat-linux",
1316     "i386-redhat-linux", "i586-suse-linux", "i486-slackware-linux",
1317     "i686-montavista-linux", "i686-linux-android", "i586-linux-gnu"
1318   };
1319 
1320   static const char *const MIPSLibDirs[] = { "/lib" };
1321   static const char *const MIPSTriples[] = { "mips-linux-gnu",
1322                                              "mips-mti-linux-gnu",
1323                                              "mips-img-linux-gnu" };
1324   static const char *const MIPSELLibDirs[] = { "/lib" };
1325   static const char *const MIPSELTriples[] = { "mipsel-linux-gnu",
1326                                                "mipsel-linux-android",
1327                                                "mips-img-linux-gnu" };
1328 
1329   static const char *const MIPS64LibDirs[] = { "/lib64", "/lib" };
1330   static const char *const MIPS64Triples[] = { "mips64-linux-gnu",
1331                                                "mips-mti-linux-gnu",
1332                                                "mips-img-linux-gnu",
1333                                                "mips64-linux-gnuabi64" };
1334   static const char *const MIPS64ELLibDirs[] = { "/lib64", "/lib" };
1335   static const char *const MIPS64ELTriples[] = { "mips64el-linux-gnu",
1336                                                  "mips-mti-linux-gnu",
1337                                                  "mips-img-linux-gnu",
1338                                                  "mips64el-linux-android",
1339                                                  "mips64el-linux-gnuabi64" };
1340 
1341   static const char *const PPCLibDirs[] = { "/lib32", "/lib" };
1342   static const char *const PPCTriples[] = {
1343     "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1344     "powerpc-suse-linux", "powerpc-montavista-linuxspe"
1345   };
1346   static const char *const PPC64LibDirs[] = { "/lib64", "/lib" };
1347   static const char *const PPC64Triples[] = { "powerpc64-linux-gnu",
1348                                               "powerpc64-unknown-linux-gnu",
1349                                               "powerpc64-suse-linux",
1350                                               "ppc64-redhat-linux" };
1351   static const char *const PPC64LELibDirs[] = { "/lib64", "/lib" };
1352   static const char *const PPC64LETriples[] = { "powerpc64le-linux-gnu",
1353                                                 "powerpc64le-unknown-linux-gnu",
1354                                                 "powerpc64le-suse-linux",
1355                                                 "ppc64le-redhat-linux" };
1356 
1357   static const char *const SPARCv8LibDirs[] = { "/lib32", "/lib" };
1358   static const char *const SPARCv8Triples[] = { "sparc-linux-gnu",
1359                                                 "sparcv8-linux-gnu" };
1360   static const char *const SPARCv9LibDirs[] = { "/lib64", "/lib" };
1361   static const char *const SPARCv9Triples[] = { "sparc64-linux-gnu",
1362                                                 "sparcv9-linux-gnu" };
1363 
1364   static const char *const SystemZLibDirs[] = { "/lib64", "/lib" };
1365   static const char *const SystemZTriples[] = {
1366     "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1367     "s390x-suse-linux", "s390x-redhat-linux"
1368   };
1369 
1370   using std::begin;
1371   using std::end;
1372 
1373   switch (TargetTriple.getArch()) {
1374   case llvm::Triple::aarch64:
1375     LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1376     TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1377     BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1378     BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1379     break;
1380   case llvm::Triple::aarch64_be:
1381     LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1382     TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1383     BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1384     BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1385     break;
1386   case llvm::Triple::arm:
1387   case llvm::Triple::thumb:
1388     LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
1389     if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
1390       TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
1391     } else {
1392       TripleAliases.append(begin(ARMTriples), end(ARMTriples));
1393     }
1394     break;
1395   case llvm::Triple::armeb:
1396   case llvm::Triple::thumbeb:
1397     LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
1398     if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
1399       TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
1400     } else {
1401       TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
1402     }
1403     break;
1404   case llvm::Triple::x86_64:
1405     LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1406     TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1407     // x32 is always available when x86_64 is available, so adding it as
1408     // secondary arch with x86_64 triples
1409     if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
1410       BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1411       BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1412     } else {
1413       BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1414       BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
1415     }
1416     break;
1417   case llvm::Triple::x86:
1418     LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1419     TripleAliases.append(begin(X86Triples), end(X86Triples));
1420     BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1421     BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1422     break;
1423   case llvm::Triple::mips:
1424     LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1425     TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1426     BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1427     BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1428     break;
1429   case llvm::Triple::mipsel:
1430     LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1431     TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1432     TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1433     BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1434     BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1435     break;
1436   case llvm::Triple::mips64:
1437     LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1438     TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1439     BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1440     BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1441     break;
1442   case llvm::Triple::mips64el:
1443     LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1444     TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1445     BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1446     BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1447     BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1448     break;
1449   case llvm::Triple::ppc:
1450     LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1451     TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1452     BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1453     BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1454     break;
1455   case llvm::Triple::ppc64:
1456     LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1457     TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1458     BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1459     BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
1460     break;
1461   case llvm::Triple::ppc64le:
1462     LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1463     TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
1464     break;
1465   case llvm::Triple::sparc:
1466     LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1467     TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1468     BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1469     BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1470     break;
1471   case llvm::Triple::sparcv9:
1472     LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1473     TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1474     BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1475     BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1476     break;
1477   case llvm::Triple::systemz:
1478     LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1479     TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
1480     break;
1481 
1482   default:
1483     // By default, just rely on the standard lib directories and the original
1484     // triple.
1485     break;
1486   }
1487 
1488   // Always append the drivers target triple to the end, in case it doesn't
1489   // match any of our aliases.
1490   TripleAliases.push_back(TargetTriple.str());
1491 
1492   // Also include the multiarch variant if it's different.
1493   if (TargetTriple.str() != BiarchTriple.str())
1494     BiarchTripleAliases.push_back(BiarchTriple.str());
1495 }
1496 
1497 namespace {
1498 // Filter to remove Multilibs that don't exist as a suffix to Path
1499 class FilterNonExistent {
1500   StringRef Base;
1501 
1502 public:
FilterNonExistent(StringRef Base)1503   FilterNonExistent(StringRef Base) : Base(Base) {}
operator ()(const Multilib & M)1504   bool operator()(const Multilib &M) {
1505     return !llvm::sys::fs::exists(Base + M.gccSuffix() + "/crtbegin.o");
1506   }
1507 };
1508 } // end anonymous namespace
1509 
addMultilibFlag(bool Enabled,const char * const Flag,std::vector<std::string> & Flags)1510 static void addMultilibFlag(bool Enabled, const char *const Flag,
1511                             std::vector<std::string> &Flags) {
1512   if (Enabled)
1513     Flags.push_back(std::string("+") + Flag);
1514   else
1515     Flags.push_back(std::string("-") + Flag);
1516 }
1517 
isMipsArch(llvm::Triple::ArchType Arch)1518 static bool isMipsArch(llvm::Triple::ArchType Arch) {
1519   return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1520          Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1521 }
1522 
isMips32(llvm::Triple::ArchType Arch)1523 static bool isMips32(llvm::Triple::ArchType Arch) {
1524   return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1525 }
1526 
isMips64(llvm::Triple::ArchType Arch)1527 static bool isMips64(llvm::Triple::ArchType Arch) {
1528   return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1529 }
1530 
isMipsEL(llvm::Triple::ArchType Arch)1531 static bool isMipsEL(llvm::Triple::ArchType Arch) {
1532   return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1533 }
1534 
isMips16(const ArgList & Args)1535 static bool isMips16(const ArgList &Args) {
1536   Arg *A = Args.getLastArg(options::OPT_mips16,
1537                            options::OPT_mno_mips16);
1538   return A && A->getOption().matches(options::OPT_mips16);
1539 }
1540 
isMicroMips(const ArgList & Args)1541 static bool isMicroMips(const ArgList &Args) {
1542   Arg *A = Args.getLastArg(options::OPT_mmicromips,
1543                            options::OPT_mno_micromips);
1544   return A && A->getOption().matches(options::OPT_mmicromips);
1545 }
1546 
1547 struct DetectedMultilibs {
1548   /// The set of multilibs that the detected installation supports.
1549   MultilibSet Multilibs;
1550 
1551   /// The primary multilib appropriate for the given flags.
1552   Multilib SelectedMultilib;
1553 
1554   /// On Biarch systems, this corresponds to the default multilib when
1555   /// targeting the non-default multilib. Otherwise, it is empty.
1556   llvm::Optional<Multilib> BiarchSibling;
1557 };
1558 
makeMultilib(StringRef commonSuffix)1559 static Multilib makeMultilib(StringRef commonSuffix) {
1560   return Multilib(commonSuffix, commonSuffix, commonSuffix);
1561 }
1562 
findMIPSMultilibs(const llvm::Triple & TargetTriple,StringRef Path,const llvm::opt::ArgList & Args,DetectedMultilibs & Result)1563 static bool findMIPSMultilibs(const llvm::Triple &TargetTriple, StringRef Path,
1564                               const llvm::opt::ArgList &Args,
1565                               DetectedMultilibs &Result) {
1566   // Some MIPS toolchains put libraries and object files compiled
1567   // using different options in to the sub-directoris which names
1568   // reflects the flags used for compilation. For example sysroot
1569   // directory might looks like the following examples:
1570   //
1571   // /usr
1572   //   /lib      <= crt*.o files compiled with '-mips32'
1573   // /mips16
1574   //   /usr
1575   //     /lib    <= crt*.o files compiled with '-mips16'
1576   //   /el
1577   //     /usr
1578   //       /lib  <= crt*.o files compiled with '-mips16 -EL'
1579   //
1580   // or
1581   //
1582   // /usr
1583   //   /lib      <= crt*.o files compiled with '-mips32r2'
1584   // /mips16
1585   //   /usr
1586   //     /lib    <= crt*.o files compiled with '-mips32r2 -mips16'
1587   // /mips32
1588   //     /usr
1589   //       /lib  <= crt*.o files compiled with '-mips32'
1590 
1591   FilterNonExistent NonExistent(Path);
1592 
1593   // Check for FSF toolchain multilibs
1594   MultilibSet FSFMipsMultilibs;
1595   {
1596     auto MArchMips32 = makeMultilib("/mips32")
1597       .flag("+m32").flag("-m64").flag("-mmicromips").flag("+march=mips32");
1598 
1599     auto MArchMicroMips = makeMultilib("/micromips")
1600       .flag("+m32").flag("-m64").flag("+mmicromips");
1601 
1602     auto MArchMips64r2 = makeMultilib("/mips64r2")
1603       .flag("-m32").flag("+m64").flag("+march=mips64r2");
1604 
1605     auto MArchMips64 = makeMultilib("/mips64")
1606       .flag("-m32").flag("+m64").flag("-march=mips64r2");
1607 
1608     auto MArchDefault = makeMultilib("")
1609       .flag("+m32").flag("-m64").flag("-mmicromips").flag("+march=mips32r2");
1610 
1611     auto Mips16 = makeMultilib("/mips16")
1612       .flag("+mips16");
1613 
1614     auto UCLibc = makeMultilib("/uclibc")
1615       .flag("+muclibc");
1616 
1617     auto MAbi64 = makeMultilib("/64")
1618       .flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
1619 
1620     auto BigEndian = makeMultilib("")
1621       .flag("+EB").flag("-EL");
1622 
1623     auto LittleEndian = makeMultilib("/el")
1624       .flag("+EL").flag("-EB");
1625 
1626     auto SoftFloat = makeMultilib("/sof")
1627       .flag("+msoft-float");
1628 
1629     auto Nan2008 = makeMultilib("/nan2008")
1630       .flag("+mnan=2008");
1631 
1632     FSFMipsMultilibs = MultilibSet()
1633       .Either(MArchMips32, MArchMicroMips,
1634               MArchMips64r2, MArchMips64, MArchDefault)
1635       .Maybe(UCLibc)
1636       .Maybe(Mips16)
1637       .FilterOut("/mips64/mips16")
1638       .FilterOut("/mips64r2/mips16")
1639       .FilterOut("/micromips/mips16")
1640       .Maybe(MAbi64)
1641       .FilterOut("/micromips/64")
1642       .FilterOut("/mips32/64")
1643       .FilterOut("^/64")
1644       .FilterOut("/mips16/64")
1645       .Either(BigEndian, LittleEndian)
1646       .Maybe(SoftFloat)
1647       .Maybe(Nan2008)
1648       .FilterOut(".*sof/nan2008")
1649       .FilterOut(NonExistent)
1650       .setIncludeDirsCallback([](
1651           StringRef InstallDir, StringRef TripleStr, const Multilib &M) {
1652         std::vector<std::string> Dirs;
1653         Dirs.push_back((InstallDir + "/include").str());
1654         std::string SysRootInc = InstallDir.str() + "/../../../../sysroot";
1655         if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1656           Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1657         else
1658           Dirs.push_back(SysRootInc + "/usr/include");
1659         return Dirs;
1660       });
1661   }
1662 
1663   // Check for Code Sourcery toolchain multilibs
1664   MultilibSet CSMipsMultilibs;
1665   {
1666     auto MArchMips16 = makeMultilib("/mips16")
1667       .flag("+m32").flag("+mips16");
1668 
1669     auto MArchMicroMips = makeMultilib("/micromips")
1670       .flag("+m32").flag("+mmicromips");
1671 
1672     auto MArchDefault = makeMultilib("")
1673       .flag("-mips16").flag("-mmicromips");
1674 
1675     auto UCLibc = makeMultilib("/uclibc")
1676       .flag("+muclibc");
1677 
1678     auto SoftFloat = makeMultilib("/soft-float")
1679       .flag("+msoft-float");
1680 
1681     auto Nan2008 = makeMultilib("/nan2008")
1682       .flag("+mnan=2008");
1683 
1684     auto DefaultFloat = makeMultilib("")
1685       .flag("-msoft-float").flag("-mnan=2008");
1686 
1687     auto BigEndian = makeMultilib("")
1688       .flag("+EB").flag("-EL");
1689 
1690     auto LittleEndian = makeMultilib("/el")
1691       .flag("+EL").flag("-EB");
1692 
1693     // Note that this one's osSuffix is ""
1694     auto MAbi64 = makeMultilib("")
1695       .gccSuffix("/64")
1696       .includeSuffix("/64")
1697       .flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
1698 
1699     CSMipsMultilibs = MultilibSet()
1700       .Either(MArchMips16, MArchMicroMips, MArchDefault)
1701       .Maybe(UCLibc)
1702       .Either(SoftFloat, Nan2008, DefaultFloat)
1703       .FilterOut("/micromips/nan2008")
1704       .FilterOut("/mips16/nan2008")
1705       .Either(BigEndian, LittleEndian)
1706       .Maybe(MAbi64)
1707       .FilterOut("/mips16.*/64")
1708       .FilterOut("/micromips.*/64")
1709       .FilterOut(NonExistent)
1710       .setIncludeDirsCallback([](
1711           StringRef InstallDir, StringRef TripleStr, const Multilib &M) {
1712         std::vector<std::string> Dirs;
1713         Dirs.push_back((InstallDir + "/include").str());
1714         std::string SysRootInc =
1715             InstallDir.str() + "/../../../../" + TripleStr.str();
1716         if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1717           Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1718         else
1719           Dirs.push_back(SysRootInc + "/libc/usr/include");
1720         return Dirs;
1721       });
1722   }
1723 
1724   MultilibSet AndroidMipsMultilibs = MultilibSet()
1725     .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1726     .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1727     .FilterOut(NonExistent);
1728 
1729   MultilibSet DebianMipsMultilibs;
1730   {
1731     Multilib MAbiN32 = Multilib()
1732       .gccSuffix("/n32")
1733       .includeSuffix("/n32")
1734       .flag("+mabi=n32");
1735 
1736     Multilib M64 = Multilib()
1737       .gccSuffix("/64")
1738       .includeSuffix("/64")
1739       .flag("+m64").flag("-m32").flag("-mabi=n32");
1740 
1741     Multilib M32 = Multilib()
1742       .flag("-m64").flag("+m32").flag("-mabi=n32");
1743 
1744     DebianMipsMultilibs = MultilibSet()
1745       .Either(M32, M64, MAbiN32)
1746       .FilterOut(NonExistent);
1747   }
1748 
1749   MultilibSet ImgMultilibs;
1750   {
1751     auto Mips64r6 = makeMultilib("/mips64r6")
1752       .flag("+m64").flag("-m32");
1753 
1754     auto LittleEndian = makeMultilib("/el")
1755       .flag("+EL").flag("-EB");
1756 
1757     auto MAbi64 = makeMultilib("/64")
1758       .flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
1759 
1760     ImgMultilibs = MultilibSet()
1761       .Maybe(Mips64r6)
1762       .Maybe(MAbi64)
1763       .Maybe(LittleEndian)
1764       .FilterOut(NonExistent)
1765       .setIncludeDirsCallback([](
1766           StringRef InstallDir, StringRef TripleStr, const Multilib &M) {
1767         std::vector<std::string> Dirs;
1768         Dirs.push_back((InstallDir + "/include").str());
1769         Dirs.push_back((InstallDir + "/../../../../sysroot/usr/include").str());
1770         return Dirs;
1771       });
1772   }
1773 
1774   StringRef CPUName;
1775   StringRef ABIName;
1776   tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
1777 
1778   llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1779 
1780   Multilib::flags_list Flags;
1781   addMultilibFlag(isMips32(TargetArch), "m32", Flags);
1782   addMultilibFlag(isMips64(TargetArch), "m64", Flags);
1783   addMultilibFlag(isMips16(Args), "mips16", Flags);
1784   addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
1785   addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
1786                       CPUName == "mips32r5",
1787                   "march=mips32r2", Flags);
1788   addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
1789   addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
1790   addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
1791                       CPUName == "mips64r5" || CPUName == "octeon",
1792                   "march=mips64r2", Flags);
1793   addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
1794   addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
1795   addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
1796                   Flags);
1797   addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
1798   addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
1799   addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
1800   addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
1801   addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
1802   addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
1803 
1804   if (TargetTriple.getEnvironment() == llvm::Triple::Android) {
1805     // Select Android toolchain. It's the only choice in that case.
1806     if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
1807       Result.Multilibs = AndroidMipsMultilibs;
1808       return true;
1809     }
1810     return false;
1811   }
1812 
1813   if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1814       TargetTriple.getOS() == llvm::Triple::Linux &&
1815       TargetTriple.getEnvironment() == llvm::Triple::GNU) {
1816     // Select mips-img-linux-gnu toolchain.
1817     if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
1818       Result.Multilibs = ImgMultilibs;
1819       return true;
1820     }
1821     return false;
1822   }
1823 
1824   // Sort candidates. Toolchain that best meets the directories goes first.
1825   // Then select the first toolchains matches command line flags.
1826   MultilibSet *candidates[] = { &DebianMipsMultilibs, &FSFMipsMultilibs,
1827                                 &CSMipsMultilibs };
1828   std::sort(
1829       std::begin(candidates), std::end(candidates),
1830       [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
1831   for (const auto &candidate : candidates) {
1832     if (candidate->select(Flags, Result.SelectedMultilib)) {
1833       if (candidate == &DebianMipsMultilibs)
1834         Result.BiarchSibling = Multilib();
1835       Result.Multilibs = *candidate;
1836       return true;
1837     }
1838   }
1839 
1840   {
1841     // Fallback to the regular toolchain-tree structure.
1842     Multilib Default;
1843     Result.Multilibs.push_back(Default);
1844     Result.Multilibs.FilterOut(NonExistent);
1845 
1846     if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
1847       Result.BiarchSibling = Multilib();
1848       return true;
1849     }
1850   }
1851 
1852   return false;
1853 }
1854 
findBiarchMultilibs(const llvm::Triple & TargetTriple,StringRef Path,const ArgList & Args,bool NeedsBiarchSuffix,DetectedMultilibs & Result)1855 static bool findBiarchMultilibs(const llvm::Triple &TargetTriple,
1856                                 StringRef Path, const ArgList &Args,
1857                                 bool NeedsBiarchSuffix,
1858                                 DetectedMultilibs &Result) {
1859 
1860   // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
1861   // in what would normally be GCCInstallPath and put the 64-bit
1862   // libs in a subdirectory named 64. The simple logic we follow is that
1863   // *if* there is a subdirectory of the right name with crtbegin.o in it,
1864   // we use that. If not, and if not a biarch triple alias, we look for
1865   // crtbegin.o without the subdirectory.
1866 
1867   Multilib Default;
1868   Multilib Alt64 = Multilib()
1869     .gccSuffix("/64")
1870     .includeSuffix("/64")
1871     .flag("-m32").flag("+m64").flag("-mx32");
1872   Multilib Alt32 = Multilib()
1873     .gccSuffix("/32")
1874     .includeSuffix("/32")
1875     .flag("+m32").flag("-m64").flag("-mx32");
1876   Multilib Altx32 = Multilib()
1877     .gccSuffix("/x32")
1878     .includeSuffix("/x32")
1879     .flag("-m32").flag("-m64").flag("+mx32");
1880 
1881   FilterNonExistent NonExistent(Path);
1882 
1883   // Determine default multilib from: 32, 64, x32
1884   // Also handle cases such as 64 on 32, 32 on 64, etc.
1885   enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
1886   const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
1887   if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
1888     Want = WANT64;
1889   else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
1890     Want = WANT64;
1891   else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
1892     Want = WANT32;
1893   else {
1894     if (TargetTriple.isArch32Bit())
1895       Want = NeedsBiarchSuffix ? WANT64 : WANT32;
1896     else if (IsX32)
1897       Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
1898     else
1899       Want = NeedsBiarchSuffix ? WANT32 : WANT64;
1900   }
1901 
1902   if (Want == WANT32)
1903     Default.flag("+m32").flag("-m64").flag("-mx32");
1904   else if (Want == WANT64)
1905     Default.flag("-m32").flag("+m64").flag("-mx32");
1906   else if (Want == WANTX32)
1907     Default.flag("-m32").flag("-m64").flag("+mx32");
1908   else
1909     return false;
1910 
1911   Result.Multilibs.push_back(Default);
1912   Result.Multilibs.push_back(Alt64);
1913   Result.Multilibs.push_back(Alt32);
1914   Result.Multilibs.push_back(Altx32);
1915 
1916   Result.Multilibs.FilterOut(NonExistent);
1917 
1918   Multilib::flags_list Flags;
1919   addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
1920   addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
1921   addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
1922 
1923   if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
1924     return false;
1925 
1926   if (Result.SelectedMultilib == Alt64 ||
1927       Result.SelectedMultilib == Alt32 ||
1928       Result.SelectedMultilib == Altx32)
1929     Result.BiarchSibling = Default;
1930 
1931   return true;
1932 }
1933 
ScanLibDirForGCCTriple(const llvm::Triple & TargetTriple,const ArgList & Args,const std::string & LibDir,StringRef CandidateTriple,bool NeedsBiarchSuffix)1934 void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
1935     const llvm::Triple &TargetTriple, const ArgList &Args,
1936     const std::string &LibDir, StringRef CandidateTriple,
1937     bool NeedsBiarchSuffix) {
1938   llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1939   // There are various different suffixes involving the triple we
1940   // check for. We also record what is necessary to walk from each back
1941   // up to the lib directory.
1942   const std::string LibSuffixes[] = {
1943     "/gcc/" + CandidateTriple.str(),
1944     // Debian puts cross-compilers in gcc-cross
1945     "/gcc-cross/" + CandidateTriple.str(),
1946     "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
1947 
1948     // The Freescale PPC SDK has the gcc libraries in
1949     // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
1950     "/" + CandidateTriple.str(),
1951 
1952     // Ubuntu has a strange mis-matched pair of triples that this happens to
1953     // match.
1954     // FIXME: It may be worthwhile to generalize this and look for a second
1955     // triple.
1956     "/i386-linux-gnu/gcc/" + CandidateTriple.str()
1957   };
1958   const std::string InstallSuffixes[] = {
1959     "/../../..",    // gcc/
1960     "/../../..",    // gcc-cross/
1961     "/../../../..", // <triple>/gcc/
1962     "/../..",       // <triple>/
1963     "/../../../.."  // i386-linux-gnu/gcc/<triple>/
1964   };
1965   // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
1966   const unsigned NumLibSuffixes =
1967       (llvm::array_lengthof(LibSuffixes) - (TargetArch != llvm::Triple::x86));
1968   for (unsigned i = 0; i < NumLibSuffixes; ++i) {
1969     StringRef LibSuffix = LibSuffixes[i];
1970     std::error_code EC;
1971     for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE;
1972          !EC && LI != LE; LI = LI.increment(EC)) {
1973       StringRef VersionText = llvm::sys::path::filename(LI->path());
1974       GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
1975       if (CandidateVersion.Major != -1) // Filter obviously bad entries.
1976         if (!CandidateGCCInstallPaths.insert(LI->path()).second)
1977           continue; // Saw this path before; no need to look at it again.
1978       if (CandidateVersion.isOlderThan(4, 1, 1))
1979         continue;
1980       if (CandidateVersion <= Version)
1981         continue;
1982 
1983       DetectedMultilibs Detected;
1984 
1985       // Debian mips multilibs behave more like the rest of the biarch ones,
1986       // so handle them there
1987       if (isMipsArch(TargetArch)) {
1988         if (!findMIPSMultilibs(TargetTriple, LI->path(), Args, Detected))
1989           continue;
1990       } else if (!findBiarchMultilibs(TargetTriple, LI->path(), Args,
1991                                       NeedsBiarchSuffix, Detected)) {
1992         continue;
1993       }
1994 
1995       Multilibs = Detected.Multilibs;
1996       SelectedMultilib = Detected.SelectedMultilib;
1997       BiarchSibling = Detected.BiarchSibling;
1998       Version = CandidateVersion;
1999       GCCTriple.setTriple(CandidateTriple);
2000       // FIXME: We hack together the directory name here instead of
2001       // using LI to ensure stable path separators across Windows and
2002       // Linux.
2003       GCCInstallPath = LibDir + LibSuffixes[i] + "/" + VersionText.str();
2004       GCCParentLibPath = GCCInstallPath + InstallSuffixes[i];
2005       IsValid = true;
2006     }
2007   }
2008 }
2009 
Generic_GCC(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2010 Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple,
2011                          const ArgList &Args)
2012   : ToolChain(D, Triple, Args), GCCInstallation() {
2013   getProgramPaths().push_back(getDriver().getInstalledDir());
2014   if (getDriver().getInstalledDir() != getDriver().Dir)
2015     getProgramPaths().push_back(getDriver().Dir);
2016 }
2017 
~Generic_GCC()2018 Generic_GCC::~Generic_GCC() {
2019 }
2020 
getTool(Action::ActionClass AC) const2021 Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
2022   switch (AC) {
2023   case Action::PreprocessJobClass:
2024     if (!Preprocess)
2025       Preprocess.reset(new tools::gcc::Preprocess(*this));
2026     return Preprocess.get();
2027   case Action::CompileJobClass:
2028     if (!Compile)
2029       Compile.reset(new tools::gcc::Compile(*this));
2030     return Compile.get();
2031   default:
2032     return ToolChain::getTool(AC);
2033   }
2034 }
2035 
buildAssembler() const2036 Tool *Generic_GCC::buildAssembler() const {
2037   return new tools::gnutools::Assemble(*this);
2038 }
2039 
buildLinker() const2040 Tool *Generic_GCC::buildLinker() const {
2041   return new tools::gcc::Link(*this);
2042 }
2043 
printVerboseInfo(raw_ostream & OS) const2044 void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2045   // Print the information about how we detected the GCC installation.
2046   GCCInstallation.print(OS);
2047 }
2048 
IsUnwindTablesDefault() const2049 bool Generic_GCC::IsUnwindTablesDefault() const {
2050   return getArch() == llvm::Triple::x86_64;
2051 }
2052 
isPICDefault() const2053 bool Generic_GCC::isPICDefault() const {
2054   return false;
2055 }
2056 
isPIEDefault() const2057 bool Generic_GCC::isPIEDefault() const {
2058   return false;
2059 }
2060 
isPICDefaultForced() const2061 bool Generic_GCC::isPICDefaultForced() const {
2062   return false;
2063 }
2064 
IsIntegratedAssemblerDefault() const2065 bool Generic_GCC::IsIntegratedAssemblerDefault() const {
2066   return getTriple().getArch() == llvm::Triple::x86 ||
2067          getTriple().getArch() == llvm::Triple::x86_64 ||
2068          getTriple().getArch() == llvm::Triple::aarch64 ||
2069          getTriple().getArch() == llvm::Triple::aarch64_be ||
2070          getTriple().getArch() == llvm::Triple::arm ||
2071          getTriple().getArch() == llvm::Triple::armeb ||
2072          getTriple().getArch() == llvm::Triple::thumb ||
2073          getTriple().getArch() == llvm::Triple::thumbeb ||
2074          getTriple().getArch() == llvm::Triple::ppc ||
2075          getTriple().getArch() == llvm::Triple::ppc64 ||
2076          getTriple().getArch() == llvm::Triple::ppc64le ||
2077          getTriple().getArch() == llvm::Triple::sparc ||
2078          getTriple().getArch() == llvm::Triple::sparcv9 ||
2079          getTriple().getArch() == llvm::Triple::systemz;
2080 }
2081 
addClangTargetOptions(const ArgList & DriverArgs,ArgStringList & CC1Args) const2082 void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2083                                         ArgStringList &CC1Args) const {
2084   const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
2085   bool UseInitArrayDefault =
2086       getTriple().getArch() == llvm::Triple::aarch64 ||
2087       getTriple().getArch() == llvm::Triple::aarch64_be ||
2088       (getTriple().getOS() == llvm::Triple::Linux &&
2089        (!V.isOlderThan(4, 7, 0) ||
2090         getTriple().getEnvironment() == llvm::Triple::Android)) ||
2091       getTriple().getOS() == llvm::Triple::NaCl;
2092 
2093   if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
2094                          options::OPT_fno_use_init_array,
2095                          UseInitArrayDefault))
2096     CC1Args.push_back("-fuse-init-array");
2097 }
2098 
2099 /// Hexagon Toolchain
2100 
GetGnuDir(const std::string & InstalledDir,const ArgList & Args)2101 std::string Hexagon_TC::GetGnuDir(const std::string &InstalledDir,
2102                                   const ArgList &Args) {
2103 
2104   // Locate the rest of the toolchain ...
2105   std::string GccToolchain = getGCCToolchainDir(Args);
2106 
2107   if (!GccToolchain.empty())
2108     return GccToolchain;
2109 
2110   std::string InstallRelDir = InstalledDir + "/../../gnu";
2111   if (llvm::sys::fs::exists(InstallRelDir))
2112     return InstallRelDir;
2113 
2114   std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
2115   if (llvm::sys::fs::exists(PrefixRelDir))
2116     return PrefixRelDir;
2117 
2118   return InstallRelDir;
2119 }
2120 
GetHexagonLibraryPaths(const ArgList & Args,const std::string & Ver,const std::string & MarchString,const std::string & InstalledDir,ToolChain::path_list * LibPaths)2121 static void GetHexagonLibraryPaths(
2122   const ArgList &Args,
2123   const std::string &Ver,
2124   const std::string &MarchString,
2125   const std::string &InstalledDir,
2126   ToolChain::path_list *LibPaths)
2127 {
2128   bool buildingLib = Args.hasArg(options::OPT_shared);
2129 
2130   //----------------------------------------------------------------------------
2131   // -L Args
2132   //----------------------------------------------------------------------------
2133   for (arg_iterator
2134          it = Args.filtered_begin(options::OPT_L),
2135          ie = Args.filtered_end();
2136        it != ie;
2137        ++it) {
2138     for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i)
2139       LibPaths->push_back((*it)->getValue(i));
2140   }
2141 
2142   //----------------------------------------------------------------------------
2143   // Other standard paths
2144   //----------------------------------------------------------------------------
2145   const std::string MarchSuffix = "/" + MarchString;
2146   const std::string G0Suffix = "/G0";
2147   const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
2148   const std::string RootDir = Hexagon_TC::GetGnuDir(InstalledDir, Args) + "/";
2149 
2150   // lib/gcc/hexagon/...
2151   std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
2152   if (buildingLib) {
2153     LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
2154     LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
2155   }
2156   LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
2157   LibPaths->push_back(LibGCCHexagonDir + Ver);
2158 
2159   // lib/gcc/...
2160   LibPaths->push_back(RootDir + "lib/gcc");
2161 
2162   // hexagon/lib/...
2163   std::string HexagonLibDir = RootDir + "hexagon/lib";
2164   if (buildingLib) {
2165     LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
2166     LibPaths->push_back(HexagonLibDir + G0Suffix);
2167   }
2168   LibPaths->push_back(HexagonLibDir + MarchSuffix);
2169   LibPaths->push_back(HexagonLibDir);
2170 }
2171 
Hexagon_TC(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2172 Hexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple &Triple,
2173                        const ArgList &Args)
2174   : Linux(D, Triple, Args) {
2175   const std::string InstalledDir(getDriver().getInstalledDir());
2176   const std::string GnuDir = Hexagon_TC::GetGnuDir(InstalledDir, Args);
2177 
2178   // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2179   // program paths
2180   const std::string BinDir(GnuDir + "/bin");
2181   if (llvm::sys::fs::exists(BinDir))
2182     getProgramPaths().push_back(BinDir);
2183 
2184   // Determine version of GCC libraries and headers to use.
2185   const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
2186   std::error_code ec;
2187   GCCVersion MaxVersion= GCCVersion::Parse("0.0.0");
2188   for (llvm::sys::fs::directory_iterator di(HexagonDir, ec), de;
2189        !ec && di != de; di = di.increment(ec)) {
2190     GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->path()));
2191     if (MaxVersion < cv)
2192       MaxVersion = cv;
2193   }
2194   GCCLibAndIncVersion = MaxVersion;
2195 
2196   ToolChain::path_list *LibPaths= &getFilePaths();
2197 
2198   // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2199   // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2200   // support 'linux' we'll need to fix this up
2201   LibPaths->clear();
2202 
2203   GetHexagonLibraryPaths(
2204     Args,
2205     GetGCCLibAndIncVersion(),
2206     GetTargetCPU(Args),
2207     InstalledDir,
2208     LibPaths);
2209 }
2210 
~Hexagon_TC()2211 Hexagon_TC::~Hexagon_TC() {
2212 }
2213 
buildAssembler() const2214 Tool *Hexagon_TC::buildAssembler() const {
2215   return new tools::hexagon::Assemble(*this);
2216 }
2217 
buildLinker() const2218 Tool *Hexagon_TC::buildLinker() const {
2219   return new tools::hexagon::Link(*this);
2220 }
2221 
AddClangSystemIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2222 void Hexagon_TC::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2223                                            ArgStringList &CC1Args) const {
2224   const Driver &D = getDriver();
2225 
2226   if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2227       DriverArgs.hasArg(options::OPT_nostdlibinc))
2228     return;
2229 
2230   std::string Ver(GetGCCLibAndIncVersion());
2231   std::string GnuDir = Hexagon_TC::GetGnuDir(D.InstalledDir, DriverArgs);
2232   std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
2233   addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
2234   addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
2235   addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
2236 }
2237 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2238 void Hexagon_TC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2239                                               ArgStringList &CC1Args) const {
2240 
2241   if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2242       DriverArgs.hasArg(options::OPT_nostdincxx))
2243     return;
2244 
2245   const Driver &D = getDriver();
2246   std::string Ver(GetGCCLibAndIncVersion());
2247   SmallString<128> IncludeDir(
2248       Hexagon_TC::GetGnuDir(D.InstalledDir, DriverArgs));
2249 
2250   llvm::sys::path::append(IncludeDir, "hexagon/include/c++/");
2251   llvm::sys::path::append(IncludeDir, Ver);
2252   addSystemInclude(DriverArgs, CC1Args, IncludeDir);
2253 }
2254 
2255 ToolChain::CXXStdlibType
GetCXXStdlibType(const ArgList & Args) const2256 Hexagon_TC::GetCXXStdlibType(const ArgList &Args) const {
2257   Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2258   if (!A)
2259     return ToolChain::CST_Libstdcxx;
2260 
2261   StringRef Value = A->getValue();
2262   if (Value != "libstdc++") {
2263     getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2264       << A->getAsString(Args);
2265   }
2266 
2267   return ToolChain::CST_Libstdcxx;
2268 }
2269 
getHexagonVersion(const ArgList & Args)2270 static int getHexagonVersion(const ArgList &Args) {
2271   Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ);
2272   // Select the default CPU (v4) if none was given.
2273   if (!A)
2274     return 4;
2275 
2276   // FIXME: produce errors if we cannot parse the version.
2277   StringRef WhichHexagon = A->getValue();
2278   if (WhichHexagon.startswith("hexagonv")) {
2279     int Val;
2280     if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val))
2281       return Val;
2282   }
2283   if (WhichHexagon.startswith("v")) {
2284     int Val;
2285     if (!WhichHexagon.substr(1).getAsInteger(10, Val))
2286       return Val;
2287   }
2288 
2289   // FIXME: should probably be an error.
2290   return 4;
2291 }
2292 
GetTargetCPU(const ArgList & Args)2293 StringRef Hexagon_TC::GetTargetCPU(const ArgList &Args)
2294 {
2295   int V = getHexagonVersion(Args);
2296   // FIXME: We don't support versions < 4. We should error on them.
2297   switch (V) {
2298   default:
2299     llvm_unreachable("Unexpected version");
2300   case 5:
2301     return "v5";
2302   case 4:
2303     return "v4";
2304   case 3:
2305     return "v3";
2306   case 2:
2307     return "v2";
2308   case 1:
2309     return "v1";
2310   }
2311 }
2312 // End Hexagon
2313 
2314 /// NaCl Toolchain
NaCl_TC(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2315 NaCl_TC::NaCl_TC(const Driver &D, const llvm::Triple &Triple,
2316                  const ArgList &Args)
2317   : Generic_ELF(D, Triple, Args) {
2318 
2319   // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2320   // default paths, and must instead only use the paths provided
2321   // with this toolchain based on architecture.
2322   path_list& file_paths = getFilePaths();
2323   path_list& prog_paths = getProgramPaths();
2324 
2325   file_paths.clear();
2326   prog_paths.clear();
2327 
2328   // Path for library files (libc.a, ...)
2329   std::string FilePath(getDriver().Dir + "/../");
2330 
2331   // Path for tools (clang, ld, etc..)
2332   std::string ProgPath(getDriver().Dir + "/../");
2333 
2334   // Path for toolchain libraries (libgcc.a, ...)
2335   std::string ToolPath(getDriver().ResourceDir + "/lib/");
2336 
2337   switch(Triple.getArch()) {
2338     case llvm::Triple::x86: {
2339       file_paths.push_back(FilePath + "x86_64-nacl/lib32");
2340       file_paths.push_back(FilePath + "x86_64-nacl/usr/lib32");
2341       prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2342       file_paths.push_back(ToolPath + "i686-nacl");
2343       break;
2344     }
2345     case llvm::Triple::x86_64: {
2346       file_paths.push_back(FilePath + "x86_64-nacl/lib");
2347       file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2348       prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2349       file_paths.push_back(ToolPath + "x86_64-nacl");
2350       break;
2351     }
2352     case llvm::Triple::arm: {
2353       file_paths.push_back(FilePath + "arm-nacl/lib");
2354       file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2355       prog_paths.push_back(ProgPath + "arm-nacl/bin");
2356       file_paths.push_back(ToolPath + "arm-nacl");
2357       break;
2358     }
2359     default:
2360       break;
2361   }
2362 
2363   // Use provided linker, not system linker
2364   Linker = GetProgramPath("ld");
2365   NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2366 }
2367 
AddClangSystemIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2368 void NaCl_TC::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2369                                         ArgStringList &CC1Args) const {
2370   const Driver &D = getDriver();
2371   if (DriverArgs.hasArg(options::OPT_nostdinc))
2372     return;
2373 
2374   if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2375     SmallString<128> P(D.ResourceDir);
2376     llvm::sys::path::append(P, "include");
2377     addSystemInclude(DriverArgs, CC1Args, P.str());
2378   }
2379 
2380   if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2381     return;
2382 
2383   SmallString<128> P(D.Dir + "/../");
2384   if (getTriple().getArch() == llvm::Triple::arm) {
2385     llvm::sys::path::append(P, "arm-nacl/usr/include");
2386   } else if (getTriple().getArch() == llvm::Triple::x86) {
2387     llvm::sys::path::append(P, "x86_64-nacl/usr/include");
2388   } else if (getTriple().getArch() == llvm::Triple::x86_64) {
2389     llvm::sys::path::append(P, "x86_64-nacl/usr/include");
2390   } else {
2391     return;
2392   }
2393 
2394   addSystemInclude(DriverArgs, CC1Args, P.str());
2395   llvm::sys::path::remove_filename(P);
2396   llvm::sys::path::remove_filename(P);
2397   llvm::sys::path::append(P, "include");
2398   addSystemInclude(DriverArgs, CC1Args, P.str());
2399 }
2400 
AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const2401 void NaCl_TC::AddCXXStdlibLibArgs(const ArgList &Args,
2402                                   ArgStringList &CmdArgs) const {
2403   // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2404   // if the value is libc++, and emits an error for other values.
2405   GetCXXStdlibType(Args);
2406   CmdArgs.push_back("-lc++");
2407 }
2408 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2409 void NaCl_TC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2410                                            ArgStringList &CC1Args) const {
2411   const Driver &D = getDriver();
2412   if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2413       DriverArgs.hasArg(options::OPT_nostdincxx))
2414     return;
2415 
2416   // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2417   // if the value is libc++, and emits an error for other values.
2418   GetCXXStdlibType(DriverArgs);
2419 
2420   if (getTriple().getArch() == llvm::Triple::arm) {
2421     SmallString<128> P(D.Dir + "/../");
2422     llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2423     addSystemInclude(DriverArgs, CC1Args, P.str());
2424   } else if (getTriple().getArch() == llvm::Triple::x86) {
2425     SmallString<128> P(D.Dir + "/../");
2426     llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2427     addSystemInclude(DriverArgs, CC1Args, P.str());
2428   } else if (getTriple().getArch() == llvm::Triple::x86_64) {
2429     SmallString<128> P(D.Dir + "/../");
2430     llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2431     addSystemInclude(DriverArgs, CC1Args, P.str());
2432   }
2433 }
2434 
GetCXXStdlibType(const ArgList & Args) const2435 ToolChain::CXXStdlibType NaCl_TC::GetCXXStdlibType(const ArgList &Args) const {
2436   if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2437     StringRef Value = A->getValue();
2438     if (Value == "libc++")
2439       return ToolChain::CST_Libcxx;
2440     getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2441       << A->getAsString(Args);
2442   }
2443 
2444   return ToolChain::CST_Libcxx;
2445 }
2446 
ComputeEffectiveClangTriple(const ArgList & Args,types::ID InputType) const2447 std::string NaCl_TC::ComputeEffectiveClangTriple(
2448     const ArgList &Args, types::ID InputType) const {
2449   llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2450   if (TheTriple.getArch() == llvm::Triple::arm &&
2451       TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2452     TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2453   return TheTriple.getTriple();
2454 }
2455 
buildLinker() const2456 Tool *NaCl_TC::buildLinker() const {
2457   return new tools::nacltools::Link(*this);
2458 }
2459 
buildAssembler() const2460 Tool *NaCl_TC::buildAssembler() const {
2461   if (getTriple().getArch() == llvm::Triple::arm)
2462     return new tools::nacltools::AssembleARM(*this);
2463   return new tools::gnutools::Assemble(*this);
2464 }
2465 // End NaCl
2466 
2467 /// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2468 /// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2469 /// Currently does not support anything else but compilation.
2470 
TCEToolChain(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2471 TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple& Triple,
2472                            const ArgList &Args)
2473   : ToolChain(D, Triple, Args) {
2474   // Path mangling to find libexec
2475   std::string Path(getDriver().Dir);
2476 
2477   Path += "/../libexec";
2478   getProgramPaths().push_back(Path);
2479 }
2480 
~TCEToolChain()2481 TCEToolChain::~TCEToolChain() {
2482 }
2483 
IsMathErrnoDefault() const2484 bool TCEToolChain::IsMathErrnoDefault() const {
2485   return true;
2486 }
2487 
isPICDefault() const2488 bool TCEToolChain::isPICDefault() const {
2489   return false;
2490 }
2491 
isPIEDefault() const2492 bool TCEToolChain::isPIEDefault() const {
2493   return false;
2494 }
2495 
isPICDefaultForced() const2496 bool TCEToolChain::isPICDefaultForced() const {
2497   return false;
2498 }
2499 
2500 // CloudABI - CloudABI tool chain which can call ld(1) directly.
2501 
CloudABI(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2502 CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2503                    const ArgList &Args)
2504     : Generic_ELF(D, Triple, Args) {
2505   SmallString<128> P(getDriver().Dir);
2506   llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2507   getFilePaths().push_back(P.str());
2508 }
2509 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2510 void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2511                                             ArgStringList &CC1Args) const {
2512   if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2513       DriverArgs.hasArg(options::OPT_nostdincxx))
2514     return;
2515 
2516   SmallString<128> P(getDriver().Dir);
2517   llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2518   addSystemInclude(DriverArgs, CC1Args, P.str());
2519 }
2520 
AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const2521 void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
2522                                    ArgStringList &CmdArgs) const {
2523   CmdArgs.push_back("-lc++");
2524   CmdArgs.push_back("-lc++abi");
2525   CmdArgs.push_back("-lunwind");
2526 }
2527 
buildLinker() const2528 Tool *CloudABI::buildLinker() const { return new tools::cloudabi::Link(*this); }
2529 
2530 /// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
2531 
OpenBSD(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2532 OpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
2533   : Generic_ELF(D, Triple, Args) {
2534   getFilePaths().push_back(getDriver().Dir + "/../lib");
2535   getFilePaths().push_back("/usr/lib");
2536 }
2537 
buildAssembler() const2538 Tool *OpenBSD::buildAssembler() const {
2539   return new tools::openbsd::Assemble(*this);
2540 }
2541 
buildLinker() const2542 Tool *OpenBSD::buildLinker() const {
2543   return new tools::openbsd::Link(*this);
2544 }
2545 
2546 /// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
2547 
Bitrig(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2548 Bitrig::Bitrig(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
2549   : Generic_ELF(D, Triple, Args) {
2550   getFilePaths().push_back(getDriver().Dir + "/../lib");
2551   getFilePaths().push_back("/usr/lib");
2552 }
2553 
buildAssembler() const2554 Tool *Bitrig::buildAssembler() const {
2555   return new tools::bitrig::Assemble(*this);
2556 }
2557 
buildLinker() const2558 Tool *Bitrig::buildLinker() const {
2559   return new tools::bitrig::Link(*this);
2560 }
2561 
2562 ToolChain::CXXStdlibType
GetCXXStdlibType(const ArgList & Args) const2563 Bitrig::GetCXXStdlibType(const ArgList &Args) const {
2564   if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2565     StringRef Value = A->getValue();
2566     if (Value == "libstdc++")
2567       return ToolChain::CST_Libstdcxx;
2568     if (Value == "libc++")
2569       return ToolChain::CST_Libcxx;
2570 
2571     getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2572       << A->getAsString(Args);
2573   }
2574   return ToolChain::CST_Libcxx;
2575 }
2576 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2577 void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2578                                           ArgStringList &CC1Args) const {
2579   if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2580       DriverArgs.hasArg(options::OPT_nostdincxx))
2581     return;
2582 
2583   switch (GetCXXStdlibType(DriverArgs)) {
2584   case ToolChain::CST_Libcxx:
2585     addSystemInclude(DriverArgs, CC1Args,
2586                      getDriver().SysRoot + "/usr/include/c++/v1");
2587     break;
2588   case ToolChain::CST_Libstdcxx:
2589     addSystemInclude(DriverArgs, CC1Args,
2590                      getDriver().SysRoot + "/usr/include/c++/stdc++");
2591     addSystemInclude(DriverArgs, CC1Args,
2592                      getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
2593 
2594     StringRef Triple = getTriple().str();
2595     if (Triple.startswith("amd64"))
2596       addSystemInclude(DriverArgs, CC1Args,
2597                        getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
2598                        Triple.substr(5));
2599     else
2600       addSystemInclude(DriverArgs, CC1Args,
2601                        getDriver().SysRoot + "/usr/include/c++/stdc++/" +
2602                        Triple);
2603     break;
2604   }
2605 }
2606 
AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const2607 void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
2608                                  ArgStringList &CmdArgs) const {
2609   switch (GetCXXStdlibType(Args)) {
2610   case ToolChain::CST_Libcxx:
2611     CmdArgs.push_back("-lc++");
2612     CmdArgs.push_back("-lc++abi");
2613     CmdArgs.push_back("-lpthread");
2614     break;
2615   case ToolChain::CST_Libstdcxx:
2616     CmdArgs.push_back("-lstdc++");
2617     break;
2618   }
2619 }
2620 
2621 /// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
2622 
FreeBSD(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2623 FreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
2624   : Generic_ELF(D, Triple, Args) {
2625 
2626   // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
2627   // back to '/usr/lib' if it doesn't exist.
2628   if ((Triple.getArch() == llvm::Triple::x86 ||
2629        Triple.getArch() == llvm::Triple::ppc) &&
2630       llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
2631     getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
2632   else
2633     getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
2634 }
2635 
2636 ToolChain::CXXStdlibType
GetCXXStdlibType(const ArgList & Args) const2637 FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
2638   if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2639     StringRef Value = A->getValue();
2640     if (Value == "libstdc++")
2641       return ToolChain::CST_Libstdcxx;
2642     if (Value == "libc++")
2643       return ToolChain::CST_Libcxx;
2644 
2645     getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2646       << A->getAsString(Args);
2647   }
2648   if (getTriple().getOSMajorVersion() >= 10)
2649     return ToolChain::CST_Libcxx;
2650   return ToolChain::CST_Libstdcxx;
2651 }
2652 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2653 void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2654                                            ArgStringList &CC1Args) const {
2655   if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2656       DriverArgs.hasArg(options::OPT_nostdincxx))
2657     return;
2658 
2659   switch (GetCXXStdlibType(DriverArgs)) {
2660   case ToolChain::CST_Libcxx:
2661     addSystemInclude(DriverArgs, CC1Args,
2662                      getDriver().SysRoot + "/usr/include/c++/v1");
2663     break;
2664   case ToolChain::CST_Libstdcxx:
2665     addSystemInclude(DriverArgs, CC1Args,
2666                      getDriver().SysRoot + "/usr/include/c++/4.2");
2667     addSystemInclude(DriverArgs, CC1Args,
2668                      getDriver().SysRoot + "/usr/include/c++/4.2/backward");
2669     break;
2670   }
2671 }
2672 
buildAssembler() const2673 Tool *FreeBSD::buildAssembler() const {
2674   return new tools::freebsd::Assemble(*this);
2675 }
2676 
buildLinker() const2677 Tool *FreeBSD::buildLinker() const {
2678   return new tools::freebsd::Link(*this);
2679 }
2680 
UseSjLjExceptions() const2681 bool FreeBSD::UseSjLjExceptions() const {
2682   // FreeBSD uses SjLj exceptions on ARM oabi.
2683   switch (getTriple().getEnvironment()) {
2684   case llvm::Triple::GNUEABIHF:
2685   case llvm::Triple::GNUEABI:
2686   case llvm::Triple::EABI:
2687     return false;
2688 
2689   default:
2690     return (getTriple().getArch() == llvm::Triple::arm ||
2691             getTriple().getArch() == llvm::Triple::thumb);
2692   }
2693 }
2694 
HasNativeLLVMSupport() const2695 bool FreeBSD::HasNativeLLVMSupport() const {
2696   return true;
2697 }
2698 
isPIEDefault() const2699 bool FreeBSD::isPIEDefault() const {
2700   return getSanitizerArgs().requiresPIE();
2701 }
2702 
2703 /// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
2704 
NetBSD(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2705 NetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
2706   : Generic_ELF(D, Triple, Args) {
2707 
2708   if (getDriver().UseStdLib) {
2709     // When targeting a 32-bit platform, try the special directory used on
2710     // 64-bit hosts, and only fall back to the main library directory if that
2711     // doesn't work.
2712     // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
2713     // what all logic is needed to emulate the '=' prefix here.
2714     switch (Triple.getArch()) {
2715     case llvm::Triple::x86:
2716       getFilePaths().push_back("=/usr/lib/i386");
2717       break;
2718     case llvm::Triple::arm:
2719     case llvm::Triple::armeb:
2720     case llvm::Triple::thumb:
2721     case llvm::Triple::thumbeb:
2722       switch (Triple.getEnvironment()) {
2723       case llvm::Triple::EABI:
2724       case llvm::Triple::GNUEABI:
2725         getFilePaths().push_back("=/usr/lib/eabi");
2726         break;
2727       case llvm::Triple::EABIHF:
2728       case llvm::Triple::GNUEABIHF:
2729         getFilePaths().push_back("=/usr/lib/eabihf");
2730         break;
2731       default:
2732         getFilePaths().push_back("=/usr/lib/oabi");
2733         break;
2734       }
2735       break;
2736     case llvm::Triple::mips64:
2737     case llvm::Triple::mips64el:
2738       if (tools::mips::hasMipsAbiArg(Args, "o32"))
2739         getFilePaths().push_back("=/usr/lib/o32");
2740       else if (tools::mips::hasMipsAbiArg(Args, "64"))
2741         getFilePaths().push_back("=/usr/lib/64");
2742       break;
2743     case llvm::Triple::ppc:
2744       getFilePaths().push_back("=/usr/lib/powerpc");
2745       break;
2746     case llvm::Triple::sparc:
2747       getFilePaths().push_back("=/usr/lib/sparc");
2748       break;
2749     default:
2750       break;
2751     }
2752 
2753     getFilePaths().push_back("=/usr/lib");
2754   }
2755 }
2756 
buildAssembler() const2757 Tool *NetBSD::buildAssembler() const {
2758   return new tools::netbsd::Assemble(*this);
2759 }
2760 
buildLinker() const2761 Tool *NetBSD::buildLinker() const {
2762   return new tools::netbsd::Link(*this);
2763 }
2764 
2765 ToolChain::CXXStdlibType
GetCXXStdlibType(const ArgList & Args) const2766 NetBSD::GetCXXStdlibType(const ArgList &Args) const {
2767   if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2768     StringRef Value = A->getValue();
2769     if (Value == "libstdc++")
2770       return ToolChain::CST_Libstdcxx;
2771     if (Value == "libc++")
2772       return ToolChain::CST_Libcxx;
2773 
2774     getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2775       << A->getAsString(Args);
2776   }
2777 
2778   unsigned Major, Minor, Micro;
2779   getTriple().getOSVersion(Major, Minor, Micro);
2780   if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
2781     switch (getArch()) {
2782     case llvm::Triple::aarch64:
2783     case llvm::Triple::arm:
2784     case llvm::Triple::armeb:
2785     case llvm::Triple::thumb:
2786     case llvm::Triple::thumbeb:
2787     case llvm::Triple::ppc:
2788     case llvm::Triple::ppc64:
2789     case llvm::Triple::ppc64le:
2790     case llvm::Triple::x86:
2791     case llvm::Triple::x86_64:
2792       return ToolChain::CST_Libcxx;
2793     default:
2794       break;
2795     }
2796   }
2797   return ToolChain::CST_Libstdcxx;
2798 }
2799 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2800 void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2801                                           ArgStringList &CC1Args) const {
2802   if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2803       DriverArgs.hasArg(options::OPT_nostdincxx))
2804     return;
2805 
2806   switch (GetCXXStdlibType(DriverArgs)) {
2807   case ToolChain::CST_Libcxx:
2808     addSystemInclude(DriverArgs, CC1Args,
2809                      getDriver().SysRoot + "/usr/include/c++/");
2810     break;
2811   case ToolChain::CST_Libstdcxx:
2812     addSystemInclude(DriverArgs, CC1Args,
2813                      getDriver().SysRoot + "/usr/include/g++");
2814     addSystemInclude(DriverArgs, CC1Args,
2815                      getDriver().SysRoot + "/usr/include/g++/backward");
2816     break;
2817   }
2818 }
2819 
2820 /// Minix - Minix tool chain which can call as(1) and ld(1) directly.
2821 
Minix(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2822 Minix::Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
2823   : Generic_ELF(D, Triple, Args) {
2824   getFilePaths().push_back(getDriver().Dir + "/../lib");
2825   getFilePaths().push_back("/usr/lib");
2826 }
2827 
buildAssembler() const2828 Tool *Minix::buildAssembler() const {
2829   return new tools::minix::Assemble(*this);
2830 }
2831 
buildLinker() const2832 Tool *Minix::buildLinker() const {
2833   return new tools::minix::Link(*this);
2834 }
2835 
2836 /// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
2837 
Solaris(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2838 Solaris::Solaris(const Driver &D, const llvm::Triple& Triple,
2839                  const ArgList &Args)
2840   : Generic_GCC(D, Triple, Args) {
2841 
2842   getProgramPaths().push_back(getDriver().getInstalledDir());
2843   if (getDriver().getInstalledDir() != getDriver().Dir)
2844     getProgramPaths().push_back(getDriver().Dir);
2845 
2846   getFilePaths().push_back(getDriver().Dir + "/../lib");
2847   getFilePaths().push_back("/usr/lib");
2848 }
2849 
buildAssembler() const2850 Tool *Solaris::buildAssembler() const {
2851   return new tools::solaris::Assemble(*this);
2852 }
2853 
buildLinker() const2854 Tool *Solaris::buildLinker() const {
2855   return new tools::solaris::Link(*this);
2856 }
2857 
2858 /// Distribution (very bare-bones at the moment).
2859 
2860 enum Distro {
2861   ArchLinux,
2862   DebianLenny,
2863   DebianSqueeze,
2864   DebianWheezy,
2865   DebianJessie,
2866   DebianStretch,
2867   Exherbo,
2868   RHEL4,
2869   RHEL5,
2870   RHEL6,
2871   RHEL7,
2872   Fedora,
2873   OpenSUSE,
2874   UbuntuHardy,
2875   UbuntuIntrepid,
2876   UbuntuJaunty,
2877   UbuntuKarmic,
2878   UbuntuLucid,
2879   UbuntuMaverick,
2880   UbuntuNatty,
2881   UbuntuOneiric,
2882   UbuntuPrecise,
2883   UbuntuQuantal,
2884   UbuntuRaring,
2885   UbuntuSaucy,
2886   UbuntuTrusty,
2887   UbuntuUtopic,
2888   UbuntuVivid,
2889   UnknownDistro
2890 };
2891 
IsRedhat(enum Distro Distro)2892 static bool IsRedhat(enum Distro Distro) {
2893   return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
2894 }
2895 
IsOpenSUSE(enum Distro Distro)2896 static bool IsOpenSUSE(enum Distro Distro) {
2897   return Distro == OpenSUSE;
2898 }
2899 
IsDebian(enum Distro Distro)2900 static bool IsDebian(enum Distro Distro) {
2901   return Distro >= DebianLenny && Distro <= DebianStretch;
2902 }
2903 
IsUbuntu(enum Distro Distro)2904 static bool IsUbuntu(enum Distro Distro) {
2905   return Distro >= UbuntuHardy && Distro <= UbuntuVivid;
2906 }
2907 
DetectDistro(llvm::Triple::ArchType Arch)2908 static Distro DetectDistro(llvm::Triple::ArchType Arch) {
2909   llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
2910       llvm::MemoryBuffer::getFile("/etc/lsb-release");
2911   if (File) {
2912     StringRef Data = File.get()->getBuffer();
2913     SmallVector<StringRef, 16> Lines;
2914     Data.split(Lines, "\n");
2915     Distro Version = UnknownDistro;
2916     for (unsigned i = 0, s = Lines.size(); i != s; ++i)
2917       if (Version == UnknownDistro && Lines[i].startswith("DISTRIB_CODENAME="))
2918         Version = llvm::StringSwitch<Distro>(Lines[i].substr(17))
2919           .Case("hardy", UbuntuHardy)
2920           .Case("intrepid", UbuntuIntrepid)
2921           .Case("jaunty", UbuntuJaunty)
2922           .Case("karmic", UbuntuKarmic)
2923           .Case("lucid", UbuntuLucid)
2924           .Case("maverick", UbuntuMaverick)
2925           .Case("natty", UbuntuNatty)
2926           .Case("oneiric", UbuntuOneiric)
2927           .Case("precise", UbuntuPrecise)
2928           .Case("quantal", UbuntuQuantal)
2929           .Case("raring", UbuntuRaring)
2930           .Case("saucy", UbuntuSaucy)
2931           .Case("trusty", UbuntuTrusty)
2932           .Case("utopic", UbuntuUtopic)
2933           .Case("vivid", UbuntuVivid)
2934           .Default(UnknownDistro);
2935     return Version;
2936   }
2937 
2938   File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
2939   if (File) {
2940     StringRef Data = File.get()->getBuffer();
2941     if (Data.startswith("Fedora release"))
2942       return Fedora;
2943     if (Data.startswith("Red Hat Enterprise Linux") ||
2944         Data.startswith("CentOS")) {
2945       if (Data.find("release 7") != StringRef::npos)
2946         return RHEL7;
2947       else if (Data.find("release 6") != StringRef::npos)
2948         return RHEL6;
2949       else if (Data.find("release 5") != StringRef::npos)
2950         return RHEL5;
2951       else if (Data.find("release 4") != StringRef::npos)
2952         return RHEL4;
2953     }
2954     return UnknownDistro;
2955   }
2956 
2957   File = llvm::MemoryBuffer::getFile("/etc/debian_version");
2958   if (File) {
2959     StringRef Data = File.get()->getBuffer();
2960     if (Data[0] == '5')
2961       return DebianLenny;
2962     else if (Data.startswith("squeeze/sid") || Data[0] == '6')
2963       return DebianSqueeze;
2964     else if (Data.startswith("wheezy/sid")  || Data[0] == '7')
2965       return DebianWheezy;
2966     else if (Data.startswith("jessie/sid")  || Data[0] == '8')
2967       return DebianJessie;
2968     else if (Data.startswith("stretch/sid") || Data[0] == '9')
2969       return DebianStretch;
2970     return UnknownDistro;
2971   }
2972 
2973   if (llvm::sys::fs::exists("/etc/SuSE-release"))
2974     return OpenSUSE;
2975 
2976   if (llvm::sys::fs::exists("/etc/exherbo-release"))
2977     return Exherbo;
2978 
2979   if (llvm::sys::fs::exists("/etc/arch-release"))
2980     return ArchLinux;
2981 
2982   return UnknownDistro;
2983 }
2984 
2985 /// \brief Get our best guess at the multiarch triple for a target.
2986 ///
2987 /// Debian-based systems are starting to use a multiarch setup where they use
2988 /// a target-triple directory in the library and header search paths.
2989 /// Unfortunately, this triple does not align with the vanilla target triple,
2990 /// so we provide a rough mapping here.
getMultiarchTriple(const llvm::Triple & TargetTriple,StringRef SysRoot)2991 static std::string getMultiarchTriple(const llvm::Triple &TargetTriple,
2992                                       StringRef SysRoot) {
2993   // For most architectures, just use whatever we have rather than trying to be
2994   // clever.
2995   switch (TargetTriple.getArch()) {
2996   default:
2997     return TargetTriple.str();
2998 
2999     // We use the existence of '/lib/<triple>' as a directory to detect some
3000     // common linux triples that don't quite match the Clang triple for both
3001     // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3002     // regardless of what the actual target triple is.
3003   case llvm::Triple::arm:
3004   case llvm::Triple::thumb:
3005     if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
3006       if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf"))
3007         return "arm-linux-gnueabihf";
3008     } else {
3009       if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi"))
3010         return "arm-linux-gnueabi";
3011     }
3012     return TargetTriple.str();
3013   case llvm::Triple::armeb:
3014   case llvm::Triple::thumbeb:
3015     if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
3016       if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
3017         return "armeb-linux-gnueabihf";
3018     } else {
3019       if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabi"))
3020         return "armeb-linux-gnueabi";
3021     }
3022     return TargetTriple.str();
3023   case llvm::Triple::x86:
3024     if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
3025       return "i386-linux-gnu";
3026     return TargetTriple.str();
3027   case llvm::Triple::x86_64:
3028     // We don't want this for x32, otherwise it will match x86_64 libs
3029     if (TargetTriple.getEnvironment() != llvm::Triple::GNUX32 &&
3030         llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
3031       return "x86_64-linux-gnu";
3032     return TargetTriple.str();
3033   case llvm::Triple::aarch64:
3034     if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64-linux-gnu"))
3035       return "aarch64-linux-gnu";
3036     return TargetTriple.str();
3037   case llvm::Triple::aarch64_be:
3038     if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
3039       return "aarch64_be-linux-gnu";
3040     return TargetTriple.str();
3041   case llvm::Triple::mips:
3042     if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu"))
3043       return "mips-linux-gnu";
3044     return TargetTriple.str();
3045   case llvm::Triple::mipsel:
3046     if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu"))
3047       return "mipsel-linux-gnu";
3048     return TargetTriple.str();
3049   case llvm::Triple::mips64:
3050     if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnu"))
3051       return "mips64-linux-gnu";
3052     if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
3053       return "mips64-linux-gnuabi64";
3054     return TargetTriple.str();
3055   case llvm::Triple::mips64el:
3056     if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnu"))
3057       return "mips64el-linux-gnu";
3058     if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
3059       return "mips64el-linux-gnuabi64";
3060     return TargetTriple.str();
3061   case llvm::Triple::ppc:
3062     if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
3063       return "powerpc-linux-gnuspe";
3064     if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu"))
3065       return "powerpc-linux-gnu";
3066     return TargetTriple.str();
3067   case llvm::Triple::ppc64:
3068     if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu"))
3069       return "powerpc64-linux-gnu";
3070   case llvm::Triple::ppc64le:
3071     if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
3072       return "powerpc64le-linux-gnu";
3073     return TargetTriple.str();
3074   }
3075 }
3076 
addPathIfExists(Twine Path,ToolChain::path_list & Paths)3077 static void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
3078   if (llvm::sys::fs::exists(Path)) Paths.push_back(Path.str());
3079 }
3080 
getOSLibDir(const llvm::Triple & Triple,const ArgList & Args)3081 static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
3082   if (isMipsArch(Triple.getArch())) {
3083     // lib32 directory has a special meaning on MIPS targets.
3084     // It contains N32 ABI binaries. Use this folder if produce
3085     // code for N32 ABI only.
3086     if (tools::mips::hasMipsAbiArg(Args, "n32"))
3087       return "lib32";
3088     return Triple.isArch32Bit() ? "lib" : "lib64";
3089   }
3090 
3091   // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
3092   // using that variant while targeting other architectures causes problems
3093   // because the libraries are laid out in shared system roots that can't cope
3094   // with a 'lib32' library search path being considered. So we only enable
3095   // them when we know we may need it.
3096   //
3097   // FIXME: This is a bit of a hack. We should really unify this code for
3098   // reasoning about oslibdir spellings with the lib dir spellings in the
3099   // GCCInstallationDetector, but that is a more significant refactoring.
3100   if (Triple.getArch() == llvm::Triple::x86 ||
3101       Triple.getArch() == llvm::Triple::ppc)
3102     return "lib32";
3103 
3104   if (Triple.getArch() == llvm::Triple::x86_64 &&
3105       Triple.getEnvironment() == llvm::Triple::GNUX32)
3106     return "libx32";
3107 
3108   return Triple.isArch32Bit() ? "lib" : "lib64";
3109 }
3110 
Linux(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)3111 Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3112   : Generic_ELF(D, Triple, Args) {
3113   GCCInstallation.init(D, Triple, Args);
3114   Multilibs = GCCInstallation.getMultilibs();
3115   llvm::Triple::ArchType Arch = Triple.getArch();
3116   std::string SysRoot = computeSysRoot();
3117 
3118   // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
3119   // least) put various tools in a triple-prefixed directory off of the parent
3120   // of the GCC installation. We use the GCC triple here to ensure that we end
3121   // up with tools that support the same amount of cross compiling as the
3122   // detected GCC installation. For example, if we find a GCC installation
3123   // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3124   // used to target i386.
3125   // FIXME: This seems unlikely to be Linux-specific.
3126   ToolChain::path_list &PPaths = getProgramPaths();
3127   PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
3128                          GCCInstallation.getTriple().str() + "/bin").str());
3129 
3130   Linker = GetLinkerPath();
3131 
3132   Distro Distro = DetectDistro(Arch);
3133 
3134   if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
3135     ExtraOpts.push_back("-z");
3136     ExtraOpts.push_back("relro");
3137   }
3138 
3139   if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
3140     ExtraOpts.push_back("-X");
3141 
3142   const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android;
3143   const bool IsMips = isMipsArch(Arch);
3144 
3145   if (IsMips && !SysRoot.empty())
3146     ExtraOpts.push_back("--sysroot=" + SysRoot);
3147 
3148   // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3149   // and the MIPS ABI require .dynsym to be sorted in different ways.
3150   // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3151   // ABI requires a mapping between the GOT and the symbol table.
3152   // Android loader does not support .gnu.hash.
3153   if (!IsMips && !IsAndroid) {
3154     if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
3155         (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
3156       ExtraOpts.push_back("--hash-style=gnu");
3157 
3158     if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
3159         Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3160       ExtraOpts.push_back("--hash-style=both");
3161   }
3162 
3163   if (IsRedhat(Distro))
3164     ExtraOpts.push_back("--no-add-needed");
3165 
3166   if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
3167       (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
3168       (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
3169     ExtraOpts.push_back("--build-id");
3170 
3171   if (IsOpenSUSE(Distro))
3172     ExtraOpts.push_back("--enable-new-dtags");
3173 
3174   // The selection of paths to try here is designed to match the patterns which
3175   // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3176   // This was determined by running GCC in a fake filesystem, creating all
3177   // possible permutations of these directories, and seeing which ones it added
3178   // to the link paths.
3179   path_list &Paths = getFilePaths();
3180 
3181   const std::string OSLibDir = getOSLibDir(Triple, Args);
3182   const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
3183 
3184   // Add the multilib suffixed paths where they are available.
3185   if (GCCInstallation.isValid()) {
3186     const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3187     const std::string &LibPath = GCCInstallation.getParentLibPath();
3188     const Multilib &Multilib = GCCInstallation.getMultilib();
3189 
3190     // Sourcery CodeBench MIPS toolchain holds some libraries under
3191     // a biarch-like suffix of the GCC installation.
3192     addPathIfExists((GCCInstallation.getInstallPath() +
3193                      Multilib.gccSuffix()),
3194                     Paths);
3195 
3196     // GCC cross compiling toolchains will install target libraries which ship
3197     // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3198     // any part of the GCC installation in
3199     // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3200     // debatable, but is the reality today. We need to search this tree even
3201     // when we have a sysroot somewhere else. It is the responsibility of
3202     // whomever is doing the cross build targeting a sysroot using a GCC
3203     // installation that is *not* within the system root to ensure two things:
3204     //
3205     //  1) Any DSOs that are linked in from this tree or from the install path
3206     //     above must be present on the system root and found via an
3207     //     appropriate rpath.
3208     //  2) There must not be libraries installed into
3209     //     <prefix>/<triple>/<libdir> unless they should be preferred over
3210     //     those within the system root.
3211     //
3212     // Note that this matches the GCC behavior. See the below comment for where
3213     // Clang diverges from GCC's behavior.
3214     addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + OSLibDir +
3215                     Multilib.osSuffix(),
3216                     Paths);
3217 
3218     // If the GCC installation we found is inside of the sysroot, we want to
3219     // prefer libraries installed in the parent prefix of the GCC installation.
3220     // It is important to *not* use these paths when the GCC installation is
3221     // outside of the system root as that can pick up unintended libraries.
3222     // This usually happens when there is an external cross compiler on the
3223     // host system, and a more minimal sysroot available that is the target of
3224     // the cross. Note that GCC does include some of these directories in some
3225     // configurations but this seems somewhere between questionable and simply
3226     // a bug.
3227     if (StringRef(LibPath).startswith(SysRoot)) {
3228       addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
3229       addPathIfExists(LibPath + "/../" + OSLibDir, Paths);
3230     }
3231   }
3232 
3233   // Similar to the logic for GCC above, if we currently running Clang inside
3234   // of the requested system root, add its parent library paths to
3235   // those searched.
3236   // FIXME: It's not clear whether we should use the driver's installed
3237   // directory ('Dir' below) or the ResourceDir.
3238   if (StringRef(D.Dir).startswith(SysRoot)) {
3239     addPathIfExists(D.Dir + "/../lib/" + MultiarchTriple, Paths);
3240     addPathIfExists(D.Dir + "/../" + OSLibDir, Paths);
3241   }
3242 
3243   addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
3244   addPathIfExists(SysRoot + "/lib/../" + OSLibDir, Paths);
3245   addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3246   addPathIfExists(SysRoot + "/usr/lib/../" + OSLibDir, Paths);
3247 
3248   // Try walking via the GCC triple path in case of biarch or multiarch GCC
3249   // installations with strange symlinks.
3250   if (GCCInstallation.isValid()) {
3251     addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
3252                     "/../../" + OSLibDir, Paths);
3253 
3254     // Add the 'other' biarch variant path
3255     Multilib BiarchSibling;
3256     if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
3257       addPathIfExists(GCCInstallation.getInstallPath() +
3258                       BiarchSibling.gccSuffix(), Paths);
3259     }
3260 
3261     // See comments above on the multilib variant for details of why this is
3262     // included even from outside the sysroot.
3263     const std::string &LibPath = GCCInstallation.getParentLibPath();
3264     const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3265     const Multilib &Multilib = GCCInstallation.getMultilib();
3266     addPathIfExists(LibPath + "/../" + GCCTriple.str() +
3267                     "/lib" + Multilib.osSuffix(), Paths);
3268 
3269     // See comments above on the multilib variant for details of why this is
3270     // only included from within the sysroot.
3271     if (StringRef(LibPath).startswith(SysRoot))
3272       addPathIfExists(LibPath, Paths);
3273   }
3274 
3275   // Similar to the logic for GCC above, if we are currently running Clang
3276   // inside of the requested system root, add its parent library path to those
3277   // searched.
3278   // FIXME: It's not clear whether we should use the driver's installed
3279   // directory ('Dir' below) or the ResourceDir.
3280   if (StringRef(D.Dir).startswith(SysRoot))
3281     addPathIfExists(D.Dir + "/../lib", Paths);
3282 
3283   addPathIfExists(SysRoot + "/lib", Paths);
3284   addPathIfExists(SysRoot + "/usr/lib", Paths);
3285 }
3286 
HasNativeLLVMSupport() const3287 bool Linux::HasNativeLLVMSupport() const {
3288   return true;
3289 }
3290 
buildLinker() const3291 Tool *Linux::buildLinker() const {
3292   return new tools::gnutools::Link(*this);
3293 }
3294 
buildAssembler() const3295 Tool *Linux::buildAssembler() const {
3296   return new tools::gnutools::Assemble(*this);
3297 }
3298 
computeSysRoot() const3299 std::string Linux::computeSysRoot() const {
3300   if (!getDriver().SysRoot.empty())
3301     return getDriver().SysRoot;
3302 
3303   if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3304     return std::string();
3305 
3306   // Standalone MIPS toolchains use different names for sysroot folder
3307   // and put it into different places. Here we try to check some known
3308   // variants.
3309 
3310   const StringRef InstallDir = GCCInstallation.getInstallPath();
3311   const StringRef TripleStr = GCCInstallation.getTriple().str();
3312   const Multilib &Multilib = GCCInstallation.getMultilib();
3313 
3314   std::string Path = (InstallDir + "/../../../../" + TripleStr + "/libc" +
3315                       Multilib.osSuffix()).str();
3316 
3317   if (llvm::sys::fs::exists(Path))
3318     return Path;
3319 
3320   Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
3321 
3322   if (llvm::sys::fs::exists(Path))
3323     return Path;
3324 
3325   return std::string();
3326 }
3327 
AddClangSystemIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const3328 void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3329                                       ArgStringList &CC1Args) const {
3330   const Driver &D = getDriver();
3331   std::string SysRoot = computeSysRoot();
3332 
3333   if (DriverArgs.hasArg(options::OPT_nostdinc))
3334     return;
3335 
3336   if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
3337     addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
3338 
3339   if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
3340     SmallString<128> P(D.ResourceDir);
3341     llvm::sys::path::append(P, "include");
3342     addSystemInclude(DriverArgs, CC1Args, P);
3343   }
3344 
3345   if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3346     return;
3347 
3348   // Check for configure-time C include directories.
3349   StringRef CIncludeDirs(C_INCLUDE_DIRS);
3350   if (CIncludeDirs != "") {
3351     SmallVector<StringRef, 5> dirs;
3352     CIncludeDirs.split(dirs, ":");
3353     for (StringRef dir : dirs) {
3354       StringRef Prefix =
3355           llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
3356       addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
3357     }
3358     return;
3359   }
3360 
3361   // Lacking those, try to detect the correct set of system includes for the
3362   // target triple.
3363 
3364   // Add include directories specific to the selected multilib set and multilib.
3365   if (GCCInstallation.isValid()) {
3366     const auto &Callback = Multilibs.includeDirsCallback();
3367     if (Callback) {
3368       const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3369                                          GCCInstallation.getTriple().str(),
3370                                          GCCInstallation.getMultilib());
3371       for (const auto &Path : IncludePaths)
3372         addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3373     }
3374   }
3375 
3376   // Implement generic Debian multiarch support.
3377   const StringRef X86_64MultiarchIncludeDirs[] = {
3378     "/usr/include/x86_64-linux-gnu",
3379 
3380     // FIXME: These are older forms of multiarch. It's not clear that they're
3381     // in use in any released version of Debian, so we should consider
3382     // removing them.
3383     "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"
3384   };
3385   const StringRef X86MultiarchIncludeDirs[] = {
3386     "/usr/include/i386-linux-gnu",
3387 
3388     // FIXME: These are older forms of multiarch. It's not clear that they're
3389     // in use in any released version of Debian, so we should consider
3390     // removing them.
3391     "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3392     "/usr/include/i486-linux-gnu"
3393   };
3394   const StringRef AArch64MultiarchIncludeDirs[] = {
3395     "/usr/include/aarch64-linux-gnu"
3396   };
3397   const StringRef ARMMultiarchIncludeDirs[] = {
3398     "/usr/include/arm-linux-gnueabi"
3399   };
3400   const StringRef ARMHFMultiarchIncludeDirs[] = {
3401     "/usr/include/arm-linux-gnueabihf"
3402   };
3403   const StringRef MIPSMultiarchIncludeDirs[] = {
3404     "/usr/include/mips-linux-gnu"
3405   };
3406   const StringRef MIPSELMultiarchIncludeDirs[] = {
3407     "/usr/include/mipsel-linux-gnu"
3408   };
3409   const StringRef MIPS64MultiarchIncludeDirs[] = {
3410     "/usr/include/mips64-linux-gnu",
3411     "/usr/include/mips64-linux-gnuabi64"
3412   };
3413   const StringRef MIPS64ELMultiarchIncludeDirs[] = {
3414     "/usr/include/mips64el-linux-gnu",
3415     "/usr/include/mips64el-linux-gnuabi64"
3416   };
3417   const StringRef PPCMultiarchIncludeDirs[] = {
3418     "/usr/include/powerpc-linux-gnu"
3419   };
3420   const StringRef PPC64MultiarchIncludeDirs[] = {
3421     "/usr/include/powerpc64-linux-gnu"
3422   };
3423   const StringRef PPC64LEMultiarchIncludeDirs[] = {
3424     "/usr/include/powerpc64le-linux-gnu"
3425   };
3426   ArrayRef<StringRef> MultiarchIncludeDirs;
3427   if (getTriple().getArch() == llvm::Triple::x86_64) {
3428     MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
3429   } else if (getTriple().getArch() == llvm::Triple::x86) {
3430     MultiarchIncludeDirs = X86MultiarchIncludeDirs;
3431   } else if (getTriple().getArch() == llvm::Triple::aarch64 ||
3432              getTriple().getArch() == llvm::Triple::aarch64_be) {
3433     MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
3434   } else if (getTriple().getArch() == llvm::Triple::arm) {
3435     if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3436       MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3437     else
3438       MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
3439   } else if (getTriple().getArch() == llvm::Triple::mips) {
3440     MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
3441   } else if (getTriple().getArch() == llvm::Triple::mipsel) {
3442     MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
3443   } else if (getTriple().getArch() == llvm::Triple::mips64) {
3444     MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
3445   } else if (getTriple().getArch() == llvm::Triple::mips64el) {
3446     MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
3447   } else if (getTriple().getArch() == llvm::Triple::ppc) {
3448     MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
3449   } else if (getTriple().getArch() == llvm::Triple::ppc64) {
3450     MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
3451   } else if (getTriple().getArch() == llvm::Triple::ppc64le) {
3452     MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
3453   }
3454   for (StringRef Dir : MultiarchIncludeDirs) {
3455     if (llvm::sys::fs::exists(SysRoot + Dir)) {
3456       addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
3457       break;
3458     }
3459   }
3460 
3461   if (getTriple().getOS() == llvm::Triple::RTEMS)
3462     return;
3463 
3464   // Add an include of '/include' directly. This isn't provided by default by
3465   // system GCCs, but is often used with cross-compiling GCCs, and harmless to
3466   // add even when Clang is acting as-if it were a system compiler.
3467   addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
3468 
3469   addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
3470 }
3471 
3472 /// \brief Helper to add the variant paths of a libstdc++ installation.
addLibStdCXXIncludePaths(Twine Base,Twine Suffix,StringRef GCCTriple,StringRef GCCMultiarchTriple,StringRef TargetMultiarchTriple,Twine IncludeSuffix,const ArgList & DriverArgs,ArgStringList & CC1Args)3473 /*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine Suffix,
3474                                                 StringRef GCCTriple,
3475                                                 StringRef GCCMultiarchTriple,
3476                                                 StringRef TargetMultiarchTriple,
3477                                                 Twine IncludeSuffix,
3478                                                 const ArgList &DriverArgs,
3479                                                 ArgStringList &CC1Args) {
3480   if (!llvm::sys::fs::exists(Base + Suffix))
3481     return false;
3482 
3483   addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
3484 
3485   // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
3486   // that path exists or we have neither a GCC nor target multiarch triple, use
3487   // this vanilla search path.
3488   if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
3489       llvm::sys::fs::exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
3490     addSystemInclude(DriverArgs, CC1Args,
3491                      Base + Suffix + "/" + GCCTriple + IncludeSuffix);
3492   } else {
3493     // Otherwise try to use multiarch naming schemes which have normalized the
3494     // triples and put the triple before the suffix.
3495     //
3496     // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
3497     // the target triple, so we support that here.
3498     addSystemInclude(DriverArgs, CC1Args,
3499                      Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
3500     addSystemInclude(DriverArgs, CC1Args,
3501                      Base + "/" + TargetMultiarchTriple + Suffix);
3502   }
3503 
3504   addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
3505   return true;
3506 }
3507 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const3508 void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3509                                          ArgStringList &CC1Args) const {
3510   if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3511       DriverArgs.hasArg(options::OPT_nostdincxx))
3512     return;
3513 
3514   // Check if libc++ has been enabled and provide its include paths if so.
3515   if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
3516     const std::string LibCXXIncludePathCandidates[] = {
3517       // The primary location is within the Clang installation.
3518       // FIXME: We shouldn't hard code 'v1' here to make Clang future proof to
3519       // newer ABI versions.
3520       getDriver().Dir + "/../include/c++/v1",
3521 
3522       // We also check the system as for a long time this is the only place Clang looked.
3523       // FIXME: We should really remove this. It doesn't make any sense.
3524       getDriver().SysRoot + "/usr/include/c++/v1"
3525     };
3526     for (const auto &IncludePath : LibCXXIncludePathCandidates) {
3527       if (!llvm::sys::fs::exists(IncludePath))
3528         continue;
3529       // Add the first candidate that exists.
3530       addSystemInclude(DriverArgs, CC1Args, IncludePath);
3531       break;
3532     }
3533     return;
3534   }
3535 
3536   // We need a detected GCC installation on Linux to provide libstdc++'s
3537   // headers. We handled the libc++ case above.
3538   if (!GCCInstallation.isValid())
3539     return;
3540 
3541   // By default, look for the C++ headers in an include directory adjacent to
3542   // the lib directory of the GCC installation. Note that this is expect to be
3543   // equivalent to '/usr/include/c++/X.Y' in almost all cases.
3544   StringRef LibDir = GCCInstallation.getParentLibPath();
3545   StringRef InstallDir = GCCInstallation.getInstallPath();
3546   StringRef TripleStr = GCCInstallation.getTriple().str();
3547   const Multilib &Multilib = GCCInstallation.getMultilib();
3548   const std::string GCCMultiarchTriple =
3549       getMultiarchTriple(GCCInstallation.getTriple(), getDriver().SysRoot);
3550   const std::string TargetMultiarchTriple =
3551       getMultiarchTriple(getTriple(), getDriver().SysRoot);
3552   const GCCVersion &Version = GCCInstallation.getVersion();
3553 
3554   // The primary search for libstdc++ supports multiarch variants.
3555   if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
3556                                "/c++/" + Version.Text, TripleStr, GCCMultiarchTriple,
3557                                TargetMultiarchTriple,
3558                                Multilib.includeSuffix(), DriverArgs, CC1Args))
3559     return;
3560 
3561   // Otherwise, fall back on a bunch of options which don't use multiarch
3562   // layouts for simplicity.
3563   const std::string LibStdCXXIncludePathCandidates[] = {
3564     // Gentoo is weird and places its headers inside the GCC install, so if the
3565     // first attempt to find the headers fails, try these patterns.
3566     InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
3567         Version.MinorStr,
3568     InstallDir.str() + "/include/g++-v" + Version.MajorStr,
3569     // Android standalone toolchain has C++ headers in yet another place.
3570     LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
3571     // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
3572     // without a subdirectory corresponding to the gcc version.
3573     LibDir.str() + "/../include/c++",
3574   };
3575 
3576   for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
3577     if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
3578                                  /*GCCMultiarchTriple*/ "",
3579                                  /*TargetMultiarchTriple*/ "",
3580                                  Multilib.includeSuffix(), DriverArgs, CC1Args))
3581       break;
3582   }
3583 }
3584 
isPIEDefault() const3585 bool Linux::isPIEDefault() const {
3586   return getSanitizerArgs().requiresPIE();
3587 }
3588 
3589 /// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
3590 
DragonFly(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)3591 DragonFly::DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
3592   : Generic_ELF(D, Triple, Args) {
3593 
3594   // Path mangling to find libexec
3595   getProgramPaths().push_back(getDriver().getInstalledDir());
3596   if (getDriver().getInstalledDir() != getDriver().Dir)
3597     getProgramPaths().push_back(getDriver().Dir);
3598 
3599   getFilePaths().push_back(getDriver().Dir + "/../lib");
3600   getFilePaths().push_back("/usr/lib");
3601   if (llvm::sys::fs::exists("/usr/lib/gcc47"))
3602     getFilePaths().push_back("/usr/lib/gcc47");
3603   else
3604     getFilePaths().push_back("/usr/lib/gcc44");
3605 }
3606 
buildAssembler() const3607 Tool *DragonFly::buildAssembler() const {
3608   return new tools::dragonfly::Assemble(*this);
3609 }
3610 
buildLinker() const3611 Tool *DragonFly::buildLinker() const {
3612   return new tools::dragonfly::Link(*this);
3613 }
3614 
3615 
3616 /// XCore tool chain
XCore(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)3617 XCore::XCore(const Driver &D, const llvm::Triple &Triple,
3618              const ArgList &Args) : ToolChain(D, Triple, Args) {
3619   // ProgramPaths are found via 'PATH' environment variable.
3620 }
3621 
buildAssembler() const3622 Tool *XCore::buildAssembler() const {
3623   return new tools::XCore::Assemble(*this);
3624 }
3625 
buildLinker() const3626 Tool *XCore::buildLinker() const {
3627   return new tools::XCore::Link(*this);
3628 }
3629 
isPICDefault() const3630 bool XCore::isPICDefault() const {
3631   return false;
3632 }
3633 
isPIEDefault() const3634 bool XCore::isPIEDefault() const {
3635   return false;
3636 }
3637 
isPICDefaultForced() const3638 bool XCore::isPICDefaultForced() const {
3639   return false;
3640 }
3641 
SupportsProfiling() const3642 bool XCore::SupportsProfiling() const {
3643   return false;
3644 }
3645 
hasBlocksRuntime() const3646 bool XCore::hasBlocksRuntime() const {
3647   return false;
3648 }
3649 
AddClangSystemIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const3650 void XCore::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3651                                       ArgStringList &CC1Args) const {
3652   if (DriverArgs.hasArg(options::OPT_nostdinc) ||
3653       DriverArgs.hasArg(options::OPT_nostdlibinc))
3654     return;
3655   if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
3656     SmallVector<StringRef, 4> Dirs;
3657     const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,'\0'};
3658     StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3659     ArrayRef<StringRef> DirVec(Dirs);
3660     addSystemIncludes(DriverArgs, CC1Args, DirVec);
3661   }
3662 }
3663 
addClangTargetOptions(const llvm::opt::ArgList & DriverArgs,llvm::opt::ArgStringList & CC1Args) const3664 void XCore::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
3665                                      llvm::opt::ArgStringList &CC1Args) const {
3666   CC1Args.push_back("-nostdsysteminc");
3667 }
3668 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const3669 void XCore::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3670                                          ArgStringList &CC1Args) const {
3671   if (DriverArgs.hasArg(options::OPT_nostdinc) ||
3672       DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3673       DriverArgs.hasArg(options::OPT_nostdincxx))
3674     return;
3675   if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
3676     SmallVector<StringRef, 4> Dirs;
3677     const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,'\0'};
3678     StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3679     ArrayRef<StringRef> DirVec(Dirs);
3680     addSystemIncludes(DriverArgs, CC1Args, DirVec);
3681   }
3682 }
3683 
AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const3684 void XCore::AddCXXStdlibLibArgs(const ArgList &Args,
3685                                 ArgStringList &CmdArgs) const {
3686   // We don't output any lib args. This is handled by xcc.
3687 }
3688