1 //===--- ToolChains.cpp - ToolChain Implementations -------------*- C++ -*-===//
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/Basic/VirtualFileSystem.h"
14 #include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
15 #include "clang/Driver/Compilation.h"
16 #include "clang/Driver/Driver.h"
17 #include "clang/Driver/DriverDiagnostic.h"
18 #include "clang/Driver/Options.h"
19 #include "clang/Driver/SanitizerArgs.h"
20 #include "llvm/ADT/STLExtras.h"
21 #include "llvm/ADT/SmallString.h"
22 #include "llvm/ADT/StringExtras.h"
23 #include "llvm/ADT/StringSwitch.h"
24 #include "llvm/Option/Arg.h"
25 #include "llvm/Option/ArgList.h"
26 #include "llvm/Option/OptTable.h"
27 #include "llvm/Option/Option.h"
28 #include "llvm/ProfileData/InstrProf.h"
29 #include "llvm/Support/ErrorHandling.h"
30 #include "llvm/Support/FileSystem.h"
31 #include "llvm/Support/MemoryBuffer.h"
32 #include "llvm/Support/Path.h"
33 #include "llvm/Support/Program.h"
34 #include "llvm/Support/TargetParser.h"
35 #include "llvm/Support/raw_ostream.h"
36 #include <cstdlib> // ::getenv
37 #include <system_error>
38 
39 using namespace clang::driver;
40 using namespace clang::driver::toolchains;
41 using namespace clang;
42 using namespace llvm::opt;
43 
MachO(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)44 MachO::MachO(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
45     : ToolChain(D, Triple, Args) {
46   // We expect 'as', 'ld', etc. to be adjacent to our install dir.
47   getProgramPaths().push_back(getDriver().getInstalledDir());
48   if (getDriver().getInstalledDir() != getDriver().Dir)
49     getProgramPaths().push_back(getDriver().Dir);
50 }
51 
52 /// Darwin - Darwin tool chain for i386 and x86_64.
Darwin(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)53 Darwin::Darwin(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
54     : MachO(D, Triple, Args), TargetInitialized(false) {}
55 
LookupTypeForExtension(const char * Ext) const56 types::ID MachO::LookupTypeForExtension(const char *Ext) const {
57   types::ID Ty = types::lookupTypeForExtension(Ext);
58 
59   // Darwin always preprocesses assembly files (unless -x is used explicitly).
60   if (Ty == types::TY_PP_Asm)
61     return types::TY_Asm;
62 
63   return Ty;
64 }
65 
HasNativeLLVMSupport() const66 bool MachO::HasNativeLLVMSupport() const { return true; }
67 
68 /// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
getDefaultObjCRuntime(bool isNonFragile) const69 ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
70   if (isTargetWatchOSBased())
71     return ObjCRuntime(ObjCRuntime::WatchOS, TargetVersion);
72   if (isTargetIOSBased())
73     return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
74   if (isNonFragile)
75     return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
76   return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
77 }
78 
79 /// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
hasBlocksRuntime() const80 bool Darwin::hasBlocksRuntime() const {
81   if (isTargetWatchOSBased())
82     return true;
83   else if (isTargetIOSBased())
84     return !isIPhoneOSVersionLT(3, 2);
85   else {
86     assert(isTargetMacOS() && "unexpected darwin target");
87     return !isMacosxVersionLT(10, 6);
88   }
89 }
90 
91 // This is just a MachO name translation routine and there's no
92 // way to join this into ARMTargetParser without breaking all
93 // other assumptions. Maybe MachO should consider standardising
94 // their nomenclature.
ArmMachOArchName(StringRef Arch)95 static const char *ArmMachOArchName(StringRef Arch) {
96   return llvm::StringSwitch<const char *>(Arch)
97       .Case("armv6k", "armv6")
98       .Case("armv6m", "armv6m")
99       .Case("armv5tej", "armv5")
100       .Case("xscale", "xscale")
101       .Case("armv4t", "armv4t")
102       .Case("armv7", "armv7")
103       .Cases("armv7a", "armv7-a", "armv7")
104       .Cases("armv7r", "armv7-r", "armv7")
105       .Cases("armv7em", "armv7e-m", "armv7em")
106       .Cases("armv7k", "armv7-k", "armv7k")
107       .Cases("armv7m", "armv7-m", "armv7m")
108       .Cases("armv7s", "armv7-s", "armv7s")
109       .Default(nullptr);
110 }
111 
ArmMachOArchNameCPU(StringRef CPU)112 static const char *ArmMachOArchNameCPU(StringRef CPU) {
113   unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
114   if (ArchKind == llvm::ARM::AK_INVALID)
115     return nullptr;
116   StringRef Arch = llvm::ARM::getArchName(ArchKind);
117 
118   // FIXME: Make sure this MachO triple mangling is really necessary.
119   // ARMv5* normalises to ARMv5.
120   if (Arch.startswith("armv5"))
121     Arch = Arch.substr(0, 5);
122   // ARMv6*, except ARMv6M, normalises to ARMv6.
123   else if (Arch.startswith("armv6") && !Arch.endswith("6m"))
124     Arch = Arch.substr(0, 5);
125   // ARMv7A normalises to ARMv7.
126   else if (Arch.endswith("v7a"))
127     Arch = Arch.substr(0, 5);
128   return Arch.data();
129 }
130 
isSoftFloatABI(const ArgList & Args)131 static bool isSoftFloatABI(const ArgList &Args) {
132   Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
133                            options::OPT_mfloat_abi_EQ);
134   if (!A)
135     return false;
136 
137   return A->getOption().matches(options::OPT_msoft_float) ||
138          (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
139           A->getValue() == StringRef("soft"));
140 }
141 
getMachOArchName(const ArgList & Args) const142 StringRef MachO::getMachOArchName(const ArgList &Args) const {
143   switch (getTriple().getArch()) {
144   default:
145     return getDefaultUniversalArchName();
146 
147   case llvm::Triple::aarch64:
148     return "arm64";
149 
150   case llvm::Triple::thumb:
151   case llvm::Triple::arm:
152     if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
153       if (const char *Arch = ArmMachOArchName(A->getValue()))
154         return Arch;
155 
156     if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
157       if (const char *Arch = ArmMachOArchNameCPU(A->getValue()))
158         return Arch;
159 
160     return "arm";
161   }
162 }
163 
~Darwin()164 Darwin::~Darwin() {}
165 
~MachO()166 MachO::~MachO() {}
167 
ComputeEffectiveClangTriple(const ArgList & Args,types::ID InputType) const168 std::string MachO::ComputeEffectiveClangTriple(const ArgList &Args,
169                                                types::ID InputType) const {
170   llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
171 
172   return Triple.getTriple();
173 }
174 
ComputeEffectiveClangTriple(const ArgList & Args,types::ID InputType) const175 std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
176                                                 types::ID InputType) const {
177   llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
178 
179   // If the target isn't initialized (e.g., an unknown Darwin platform, return
180   // the default triple).
181   if (!isTargetInitialized())
182     return Triple.getTriple();
183 
184   SmallString<16> Str;
185   if (isTargetWatchOSBased())
186     Str += "watchos";
187   else if (isTargetTvOSBased())
188     Str += "tvos";
189   else if (isTargetIOSBased())
190     Str += "ios";
191   else
192     Str += "macosx";
193   Str += getTargetVersion().getAsString();
194   Triple.setOSName(Str);
195 
196   return Triple.getTriple();
197 }
198 
anchor()199 void Generic_ELF::anchor() {}
200 
getTool(Action::ActionClass AC) const201 Tool *MachO::getTool(Action::ActionClass AC) const {
202   switch (AC) {
203   case Action::LipoJobClass:
204     if (!Lipo)
205       Lipo.reset(new tools::darwin::Lipo(*this));
206     return Lipo.get();
207   case Action::DsymutilJobClass:
208     if (!Dsymutil)
209       Dsymutil.reset(new tools::darwin::Dsymutil(*this));
210     return Dsymutil.get();
211   case Action::VerifyDebugInfoJobClass:
212     if (!VerifyDebug)
213       VerifyDebug.reset(new tools::darwin::VerifyDebug(*this));
214     return VerifyDebug.get();
215   default:
216     return ToolChain::getTool(AC);
217   }
218 }
219 
buildLinker() const220 Tool *MachO::buildLinker() const { return new tools::darwin::Linker(*this); }
221 
buildAssembler() const222 Tool *MachO::buildAssembler() const {
223   return new tools::darwin::Assembler(*this);
224 }
225 
DarwinClang(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)226 DarwinClang::DarwinClang(const Driver &D, const llvm::Triple &Triple,
227                          const ArgList &Args)
228     : Darwin(D, Triple, Args) {}
229 
addClangWarningOptions(ArgStringList & CC1Args) const230 void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
231   // For modern targets, promote certain warnings to errors.
232   if (isTargetWatchOSBased() || getTriple().isArch64Bit()) {
233     // Always enable -Wdeprecated-objc-isa-usage and promote it
234     // to an error.
235     CC1Args.push_back("-Wdeprecated-objc-isa-usage");
236     CC1Args.push_back("-Werror=deprecated-objc-isa-usage");
237 
238     // For iOS and watchOS, also error about implicit function declarations,
239     // as that can impact calling conventions.
240     if (!isTargetMacOS())
241       CC1Args.push_back("-Werror=implicit-function-declaration");
242   }
243 }
244 
245 /// \brief Determine whether Objective-C automated reference counting is
246 /// enabled.
isObjCAutoRefCount(const ArgList & Args)247 static bool isObjCAutoRefCount(const ArgList &Args) {
248   return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
249 }
250 
AddLinkARCArgs(const ArgList & Args,ArgStringList & CmdArgs) const251 void DarwinClang::AddLinkARCArgs(const ArgList &Args,
252                                  ArgStringList &CmdArgs) const {
253   // Avoid linking compatibility stubs on i386 mac.
254   if (isTargetMacOS() && getArch() == llvm::Triple::x86)
255     return;
256 
257   ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true);
258 
259   if ((runtime.hasNativeARC() || !isObjCAutoRefCount(Args)) &&
260       runtime.hasSubscripting())
261     return;
262 
263   CmdArgs.push_back("-force_load");
264   SmallString<128> P(getDriver().ClangExecutable);
265   llvm::sys::path::remove_filename(P); // 'clang'
266   llvm::sys::path::remove_filename(P); // 'bin'
267   llvm::sys::path::append(P, "lib", "arc", "libarclite_");
268   // Mash in the platform.
269   if (isTargetWatchOSSimulator())
270     P += "watchsimulator";
271   else if (isTargetWatchOS())
272     P += "watchos";
273   else if (isTargetTvOSSimulator())
274     P += "appletvsimulator";
275   else if (isTargetTvOS())
276     P += "appletvos";
277   else if (isTargetIOSSimulator())
278     P += "iphonesimulator";
279   else if (isTargetIPhoneOS())
280     P += "iphoneos";
281   else
282     P += "macosx";
283   P += ".a";
284 
285   CmdArgs.push_back(Args.MakeArgString(P));
286 }
287 
AddLinkRuntimeLib(const ArgList & Args,ArgStringList & CmdArgs,StringRef DarwinLibName,bool AlwaysLink,bool IsEmbedded,bool AddRPath) const288 void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
289                               StringRef DarwinLibName, bool AlwaysLink,
290                               bool IsEmbedded, bool AddRPath) const {
291   SmallString<128> Dir(getDriver().ResourceDir);
292   llvm::sys::path::append(Dir, "lib", IsEmbedded ? "macho_embedded" : "darwin");
293 
294   SmallString<128> P(Dir);
295   llvm::sys::path::append(P, DarwinLibName);
296 
297   // For now, allow missing resource libraries to support developers who may
298   // not have compiler-rt checked out or integrated into their build (unless
299   // we explicitly force linking with this library).
300   if (AlwaysLink || getVFS().exists(P))
301     CmdArgs.push_back(Args.MakeArgString(P));
302 
303   // Adding the rpaths might negatively interact when other rpaths are involved,
304   // so we should make sure we add the rpaths last, after all user-specified
305   // rpaths. This is currently true from this place, but we need to be
306   // careful if this function is ever called before user's rpaths are emitted.
307   if (AddRPath) {
308     assert(DarwinLibName.endswith(".dylib") && "must be a dynamic library");
309 
310     // Add @executable_path to rpath to support having the dylib copied with
311     // the executable.
312     CmdArgs.push_back("-rpath");
313     CmdArgs.push_back("@executable_path");
314 
315     // Add the path to the resource dir to rpath to support using the dylib
316     // from the default location without copying.
317     CmdArgs.push_back("-rpath");
318     CmdArgs.push_back(Args.MakeArgString(Dir));
319   }
320 }
321 
addProfileRTLibs(const ArgList & Args,ArgStringList & CmdArgs) const322 void Darwin::addProfileRTLibs(const ArgList &Args,
323                               ArgStringList &CmdArgs) const {
324   if (!needsProfileRT(Args)) return;
325 
326   // TODO: Clean this up once autoconf is gone
327   SmallString<128> P(getDriver().ResourceDir);
328   llvm::sys::path::append(P, "lib", "darwin");
329   const char *Library = "libclang_rt.profile_osx.a";
330 
331   // Select the appropriate runtime library for the target.
332   if (isTargetWatchOS()) {
333     Library = "libclang_rt.profile_watchos.a";
334   } else if (isTargetWatchOSSimulator()) {
335     llvm::sys::path::append(P, "libclang_rt.profile_watchossim.a");
336     Library = getVFS().exists(P) ? "libclang_rt.profile_watchossim.a"
337                                  : "libclang_rt.profile_watchos.a";
338   } else if (isTargetTvOS()) {
339     Library = "libclang_rt.profile_tvos.a";
340   } else if (isTargetTvOSSimulator()) {
341     llvm::sys::path::append(P, "libclang_rt.profile_tvossim.a");
342     Library = getVFS().exists(P) ? "libclang_rt.profile_tvossim.a"
343                                  : "libclang_rt.profile_tvos.a";
344   } else if (isTargetIPhoneOS()) {
345     Library = "libclang_rt.profile_ios.a";
346   } else if (isTargetIOSSimulator()) {
347     llvm::sys::path::append(P, "libclang_rt.profile_iossim.a");
348     Library = getVFS().exists(P) ? "libclang_rt.profile_iossim.a"
349                                  : "libclang_rt.profile_ios.a";
350   } else {
351     assert(isTargetMacOS() && "unexpected non MacOS platform");
352   }
353   AddLinkRuntimeLib(Args, CmdArgs, Library,
354                     /*AlwaysLink*/ true);
355   return;
356 }
357 
AddLinkSanitizerLibArgs(const ArgList & Args,ArgStringList & CmdArgs,StringRef Sanitizer) const358 void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
359                                           ArgStringList &CmdArgs,
360                                           StringRef Sanitizer) const {
361   if (!Args.hasArg(options::OPT_dynamiclib) &&
362       !Args.hasArg(options::OPT_bundle)) {
363     // Sanitizer runtime libraries requires C++.
364     AddCXXStdlibLibArgs(Args, CmdArgs);
365   }
366   // ASan is not supported on watchOS.
367   assert(isTargetMacOS() || isTargetIOSSimulator());
368   StringRef OS = isTargetMacOS() ? "osx" : "iossim";
369   AddLinkRuntimeLib(
370       Args, CmdArgs,
371       (Twine("libclang_rt.") + Sanitizer + "_" + OS + "_dynamic.dylib").str(),
372       /*AlwaysLink*/ true, /*IsEmbedded*/ false,
373       /*AddRPath*/ true);
374 
375   if (GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) {
376     // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
377     // all RTTI-related symbols that UBSan uses.
378     CmdArgs.push_back("-lc++abi");
379   }
380 }
381 
AddLinkRuntimeLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const382 void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
383                                         ArgStringList &CmdArgs) const {
384   // Darwin only supports the compiler-rt based runtime libraries.
385   switch (GetRuntimeLibType(Args)) {
386   case ToolChain::RLT_CompilerRT:
387     break;
388   default:
389     getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
390         << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
391     return;
392   }
393 
394   // Darwin doesn't support real static executables, don't link any runtime
395   // libraries with -static.
396   if (Args.hasArg(options::OPT_static) ||
397       Args.hasArg(options::OPT_fapple_kext) ||
398       Args.hasArg(options::OPT_mkernel))
399     return;
400 
401   // Reject -static-libgcc for now, we can deal with this when and if someone
402   // cares. This is useful in situations where someone wants to statically link
403   // something like libstdc++, and needs its runtime support routines.
404   if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
405     getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
406     return;
407   }
408 
409   const SanitizerArgs &Sanitize = getSanitizerArgs();
410   if (Sanitize.needsAsanRt())
411     AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
412   if (Sanitize.needsUbsanRt())
413     AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
414   if (Sanitize.needsTsanRt())
415     AddLinkSanitizerLibArgs(Args, CmdArgs, "tsan");
416 
417   // Otherwise link libSystem, then the dynamic runtime library, and finally any
418   // target specific static runtime library.
419   CmdArgs.push_back("-lSystem");
420 
421   // Select the dynamic runtime library and the target specific static library.
422   if (isTargetWatchOSBased()) {
423     // We currently always need a static runtime library for watchOS.
424     AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.watchos.a");
425   } else if (isTargetTvOSBased()) {
426     // We currently always need a static runtime library for tvOS.
427     AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.tvos.a");
428   } else if (isTargetIOSBased()) {
429     // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
430     // it never went into the SDK.
431     // Linking against libgcc_s.1 isn't needed for iOS 5.0+
432     if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
433         getTriple().getArch() != llvm::Triple::aarch64)
434       CmdArgs.push_back("-lgcc_s.1");
435 
436     // We currently always need a static runtime library for iOS.
437     AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
438   } else {
439     assert(isTargetMacOS() && "unexpected non MacOS platform");
440     // The dynamic runtime library was merged with libSystem for 10.6 and
441     // beyond; only 10.4 and 10.5 need an additional runtime library.
442     if (isMacosxVersionLT(10, 5))
443       CmdArgs.push_back("-lgcc_s.10.4");
444     else if (isMacosxVersionLT(10, 6))
445       CmdArgs.push_back("-lgcc_s.10.5");
446 
447     // For OS X, we thought we would only need a static runtime library when
448     // targeting 10.4, to provide versions of the static functions which were
449     // omitted from 10.4.dylib.
450     //
451     // Unfortunately, that turned out to not be true, because Darwin system
452     // headers can still use eprintf on i386, and it is not exported from
453     // libSystem. Therefore, we still must provide a runtime library just for
454     // the tiny tiny handful of projects that *might* use that symbol.
455     if (isMacosxVersionLT(10, 5)) {
456       AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
457     } else {
458       if (getTriple().getArch() == llvm::Triple::x86)
459         AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
460       AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
461     }
462   }
463 }
464 
AddDeploymentTarget(DerivedArgList & Args) const465 void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
466   const OptTable &Opts = getDriver().getOpts();
467 
468   // Support allowing the SDKROOT environment variable used by xcrun and other
469   // Xcode tools to define the default sysroot, by making it the default for
470   // isysroot.
471   if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
472     // Warn if the path does not exist.
473     if (!getVFS().exists(A->getValue()))
474       getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
475   } else {
476     if (char *env = ::getenv("SDKROOT")) {
477       // We only use this value as the default if it is an absolute path,
478       // exists, and it is not the root path.
479       if (llvm::sys::path::is_absolute(env) && getVFS().exists(env) &&
480           StringRef(env) != "/") {
481         Args.append(Args.MakeSeparateArg(
482             nullptr, Opts.getOption(options::OPT_isysroot), env));
483       }
484     }
485   }
486 
487   Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
488   Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
489   Arg *TvOSVersion = Args.getLastArg(options::OPT_mtvos_version_min_EQ);
490   Arg *WatchOSVersion = Args.getLastArg(options::OPT_mwatchos_version_min_EQ);
491 
492   if (OSXVersion && (iOSVersion || TvOSVersion || WatchOSVersion)) {
493     getDriver().Diag(diag::err_drv_argument_not_allowed_with)
494         << OSXVersion->getAsString(Args)
495         << (iOSVersion ? iOSVersion :
496             TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
497     iOSVersion = TvOSVersion = WatchOSVersion = nullptr;
498   } else if (iOSVersion && (TvOSVersion || WatchOSVersion)) {
499     getDriver().Diag(diag::err_drv_argument_not_allowed_with)
500         << iOSVersion->getAsString(Args)
501         << (TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
502     TvOSVersion = WatchOSVersion = nullptr;
503   } else if (TvOSVersion && WatchOSVersion) {
504      getDriver().Diag(diag::err_drv_argument_not_allowed_with)
505         << TvOSVersion->getAsString(Args)
506         << WatchOSVersion->getAsString(Args);
507     WatchOSVersion = nullptr;
508   } else if (!OSXVersion && !iOSVersion && !TvOSVersion && !WatchOSVersion) {
509     // If no deployment target was specified on the command line, check for
510     // environment defines.
511     std::string OSXTarget;
512     std::string iOSTarget;
513     std::string TvOSTarget;
514     std::string WatchOSTarget;
515 
516     if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
517       OSXTarget = env;
518     if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
519       iOSTarget = env;
520     if (char *env = ::getenv("TVOS_DEPLOYMENT_TARGET"))
521       TvOSTarget = env;
522     if (char *env = ::getenv("WATCHOS_DEPLOYMENT_TARGET"))
523       WatchOSTarget = env;
524 
525     // If there is no command-line argument to specify the Target version and
526     // no environment variable defined, see if we can set the default based
527     // on -isysroot.
528     if (OSXTarget.empty() && iOSTarget.empty() && WatchOSTarget.empty() &&
529         Args.hasArg(options::OPT_isysroot)) {
530       if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
531         StringRef isysroot = A->getValue();
532         // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
533         size_t BeginSDK = isysroot.rfind("SDKs/");
534         size_t EndSDK = isysroot.rfind(".sdk");
535         if (BeginSDK != StringRef::npos && EndSDK != StringRef::npos) {
536           StringRef SDK = isysroot.slice(BeginSDK + 5, EndSDK);
537           // Slice the version number out.
538           // Version number is between the first and the last number.
539           size_t StartVer = SDK.find_first_of("0123456789");
540           size_t EndVer = SDK.find_last_of("0123456789");
541           if (StartVer != StringRef::npos && EndVer > StartVer) {
542             StringRef Version = SDK.slice(StartVer, EndVer + 1);
543             if (SDK.startswith("iPhoneOS") ||
544                 SDK.startswith("iPhoneSimulator"))
545               iOSTarget = Version;
546             else if (SDK.startswith("MacOSX"))
547               OSXTarget = Version;
548             else if (SDK.startswith("WatchOS") ||
549                      SDK.startswith("WatchSimulator"))
550               WatchOSTarget = Version;
551             else if (SDK.startswith("AppleTVOS") ||
552                      SDK.startswith("AppleTVSimulator"))
553               TvOSTarget = Version;
554           }
555         }
556       }
557     }
558 
559     // If no OSX or iOS target has been specified, try to guess platform
560     // from arch name and compute the version from the triple.
561     if (OSXTarget.empty() && iOSTarget.empty() && TvOSTarget.empty() &&
562         WatchOSTarget.empty()) {
563       StringRef MachOArchName = getMachOArchName(Args);
564       unsigned Major, Minor, Micro;
565       if (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
566           MachOArchName == "arm64") {
567         getTriple().getiOSVersion(Major, Minor, Micro);
568         llvm::raw_string_ostream(iOSTarget) << Major << '.' << Minor << '.'
569                                             << Micro;
570       } else if (MachOArchName == "armv7k") {
571         getTriple().getWatchOSVersion(Major, Minor, Micro);
572         llvm::raw_string_ostream(WatchOSTarget) << Major << '.' << Minor << '.'
573                                                 << Micro;
574       } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
575                  MachOArchName != "armv7em") {
576         if (!getTriple().getMacOSXVersion(Major, Minor, Micro)) {
577           getDriver().Diag(diag::err_drv_invalid_darwin_version)
578               << getTriple().getOSName();
579         }
580         llvm::raw_string_ostream(OSXTarget) << Major << '.' << Minor << '.'
581                                             << Micro;
582       }
583     }
584 
585     // Do not allow conflicts with the watchOS target.
586     if (!WatchOSTarget.empty() && (!iOSTarget.empty() || !TvOSTarget.empty())) {
587       getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
588         << "WATCHOS_DEPLOYMENT_TARGET"
589         << (!iOSTarget.empty() ? "IPHONEOS_DEPLOYMENT_TARGET" :
590             "TVOS_DEPLOYMENT_TARGET");
591     }
592 
593     // Do not allow conflicts with the tvOS target.
594     if (!TvOSTarget.empty() && !iOSTarget.empty()) {
595       getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
596         << "TVOS_DEPLOYMENT_TARGET"
597         << "IPHONEOS_DEPLOYMENT_TARGET";
598     }
599 
600     // Allow conflicts among OSX and iOS for historical reasons, but choose the
601     // default platform.
602     if (!OSXTarget.empty() && (!iOSTarget.empty() ||
603                                !WatchOSTarget.empty() ||
604                                !TvOSTarget.empty())) {
605       if (getTriple().getArch() == llvm::Triple::arm ||
606           getTriple().getArch() == llvm::Triple::aarch64 ||
607           getTriple().getArch() == llvm::Triple::thumb)
608         OSXTarget = "";
609       else
610         iOSTarget = WatchOSTarget = TvOSTarget = "";
611     }
612 
613     if (!OSXTarget.empty()) {
614       const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
615       OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
616       Args.append(OSXVersion);
617     } else if (!iOSTarget.empty()) {
618       const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
619       iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
620       Args.append(iOSVersion);
621     } else if (!TvOSTarget.empty()) {
622       const Option O = Opts.getOption(options::OPT_mtvos_version_min_EQ);
623       TvOSVersion = Args.MakeJoinedArg(nullptr, O, TvOSTarget);
624       Args.append(TvOSVersion);
625     } else if (!WatchOSTarget.empty()) {
626       const Option O = Opts.getOption(options::OPT_mwatchos_version_min_EQ);
627       WatchOSVersion = Args.MakeJoinedArg(nullptr, O, WatchOSTarget);
628       Args.append(WatchOSVersion);
629     }
630   }
631 
632   DarwinPlatformKind Platform;
633   if (OSXVersion)
634     Platform = MacOS;
635   else if (iOSVersion)
636     Platform = IPhoneOS;
637   else if (TvOSVersion)
638     Platform = TvOS;
639   else if (WatchOSVersion)
640     Platform = WatchOS;
641   else
642     llvm_unreachable("Unable to infer Darwin variant");
643 
644   // Set the tool chain target information.
645   unsigned Major, Minor, Micro;
646   bool HadExtra;
647   if (Platform == MacOS) {
648     assert((!iOSVersion && !TvOSVersion && !WatchOSVersion) &&
649            "Unknown target platform!");
650     if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, Micro,
651                                    HadExtra) ||
652         HadExtra || Major != 10 || Minor >= 100 || Micro >= 100)
653       getDriver().Diag(diag::err_drv_invalid_version_number)
654           << OSXVersion->getAsString(Args);
655   } else if (Platform == IPhoneOS) {
656     assert(iOSVersion && "Unknown target platform!");
657     if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
658                                    HadExtra) ||
659         HadExtra || Major >= 10 || Minor >= 100 || Micro >= 100)
660       getDriver().Diag(diag::err_drv_invalid_version_number)
661           << iOSVersion->getAsString(Args);
662   } else if (Platform == TvOS) {
663     if (!Driver::GetReleaseVersion(TvOSVersion->getValue(), Major, Minor,
664                                    Micro, HadExtra) || HadExtra ||
665         Major >= 10 || Minor >= 100 || Micro >= 100)
666       getDriver().Diag(diag::err_drv_invalid_version_number)
667           << TvOSVersion->getAsString(Args);
668   } else if (Platform == WatchOS) {
669     if (!Driver::GetReleaseVersion(WatchOSVersion->getValue(), Major, Minor,
670                                    Micro, HadExtra) || HadExtra ||
671         Major >= 10 || Minor >= 100 || Micro >= 100)
672       getDriver().Diag(diag::err_drv_invalid_version_number)
673           << WatchOSVersion->getAsString(Args);
674   } else
675     llvm_unreachable("unknown kind of Darwin platform");
676 
677   // Recognize iOS targets with an x86 architecture as the iOS simulator.
678   if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
679                      getTriple().getArch() == llvm::Triple::x86_64))
680     Platform = IPhoneOSSimulator;
681   if (TvOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
682                       getTriple().getArch() == llvm::Triple::x86_64))
683     Platform = TvOSSimulator;
684   if (WatchOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
685                          getTriple().getArch() == llvm::Triple::x86_64))
686     Platform = WatchOSSimulator;
687 
688   setTarget(Platform, Major, Minor, Micro);
689 }
690 
AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const691 void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
692                                       ArgStringList &CmdArgs) const {
693   CXXStdlibType Type = GetCXXStdlibType(Args);
694 
695   switch (Type) {
696   case ToolChain::CST_Libcxx:
697     CmdArgs.push_back("-lc++");
698     break;
699 
700   case ToolChain::CST_Libstdcxx:
701     // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
702     // it was previously found in the gcc lib dir. However, for all the Darwin
703     // platforms we care about it was -lstdc++.6, so we search for that
704     // explicitly if we can't see an obvious -lstdc++ candidate.
705 
706     // Check in the sysroot first.
707     if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
708       SmallString<128> P(A->getValue());
709       llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
710 
711       if (!getVFS().exists(P)) {
712         llvm::sys::path::remove_filename(P);
713         llvm::sys::path::append(P, "libstdc++.6.dylib");
714         if (getVFS().exists(P)) {
715           CmdArgs.push_back(Args.MakeArgString(P));
716           return;
717         }
718       }
719     }
720 
721     // Otherwise, look in the root.
722     // FIXME: This should be removed someday when we don't have to care about
723     // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
724     if (!getVFS().exists("/usr/lib/libstdc++.dylib") &&
725         getVFS().exists("/usr/lib/libstdc++.6.dylib")) {
726       CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
727       return;
728     }
729 
730     // Otherwise, let the linker search.
731     CmdArgs.push_back("-lstdc++");
732     break;
733   }
734 }
735 
AddCCKextLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const736 void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
737                                    ArgStringList &CmdArgs) const {
738 
739   // For Darwin platforms, use the compiler-rt-based support library
740   // instead of the gcc-provided one (which is also incidentally
741   // only present in the gcc lib dir, which makes it hard to find).
742 
743   SmallString<128> P(getDriver().ResourceDir);
744   llvm::sys::path::append(P, "lib", "darwin");
745 
746   // Use the newer cc_kext for iOS ARM after 6.0.
747   if (isTargetWatchOS()) {
748     llvm::sys::path::append(P, "libclang_rt.cc_kext_watchos.a");
749   } else if (isTargetTvOS()) {
750     llvm::sys::path::append(P, "libclang_rt.cc_kext_tvos.a");
751   } else if (isTargetIPhoneOS()) {
752     llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a");
753   } else {
754     llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
755   }
756 
757   // For now, allow missing resource libraries to support developers who may
758   // not have compiler-rt checked out or integrated into their build.
759   if (getVFS().exists(P))
760     CmdArgs.push_back(Args.MakeArgString(P));
761 }
762 
TranslateArgs(const DerivedArgList & Args,const char * BoundArch) const763 DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
764                                      const char *BoundArch) const {
765   DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
766   const OptTable &Opts = getDriver().getOpts();
767 
768   // FIXME: We really want to get out of the tool chain level argument
769   // translation business, as it makes the driver functionality much
770   // more opaque. For now, we follow gcc closely solely for the
771   // purpose of easily achieving feature parity & testability. Once we
772   // have something that works, we should reevaluate each translation
773   // and try to push it down into tool specific logic.
774 
775   for (Arg *A : Args) {
776     if (A->getOption().matches(options::OPT_Xarch__)) {
777       // Skip this argument unless the architecture matches either the toolchain
778       // triple arch, or the arch being bound.
779       llvm::Triple::ArchType XarchArch =
780           tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
781       if (!(XarchArch == getArch() ||
782             (BoundArch &&
783              XarchArch ==
784                  tools::darwin::getArchTypeForMachOArchName(BoundArch))))
785         continue;
786 
787       Arg *OriginalArg = A;
788       unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
789       unsigned Prev = Index;
790       std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
791 
792       // If the argument parsing failed or more than one argument was
793       // consumed, the -Xarch_ argument's parameter tried to consume
794       // extra arguments. Emit an error and ignore.
795       //
796       // We also want to disallow any options which would alter the
797       // driver behavior; that isn't going to work in our model. We
798       // use isDriverOption() as an approximation, although things
799       // like -O4 are going to slip through.
800       if (!XarchArg || Index > Prev + 1) {
801         getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
802             << A->getAsString(Args);
803         continue;
804       } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
805         getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
806             << A->getAsString(Args);
807         continue;
808       }
809 
810       XarchArg->setBaseArg(A);
811 
812       A = XarchArg.release();
813       DAL->AddSynthesizedArg(A);
814 
815       // Linker input arguments require custom handling. The problem is that we
816       // have already constructed the phase actions, so we can not treat them as
817       // "input arguments".
818       if (A->getOption().hasFlag(options::LinkerInput)) {
819         // Convert the argument into individual Zlinker_input_args.
820         for (const char *Value : A->getValues()) {
821           DAL->AddSeparateArg(
822               OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value);
823         }
824         continue;
825       }
826     }
827 
828     // Sob. These is strictly gcc compatible for the time being. Apple
829     // gcc translates options twice, which means that self-expanding
830     // options add duplicates.
831     switch ((options::ID)A->getOption().getID()) {
832     default:
833       DAL->append(A);
834       break;
835 
836     case options::OPT_mkernel:
837     case options::OPT_fapple_kext:
838       DAL->append(A);
839       DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
840       break;
841 
842     case options::OPT_dependency_file:
843       DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
844       break;
845 
846     case options::OPT_gfull:
847       DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
848       DAL->AddFlagArg(
849           A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
850       break;
851 
852     case options::OPT_gused:
853       DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
854       DAL->AddFlagArg(
855           A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
856       break;
857 
858     case options::OPT_shared:
859       DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
860       break;
861 
862     case options::OPT_fconstant_cfstrings:
863       DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
864       break;
865 
866     case options::OPT_fno_constant_cfstrings:
867       DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
868       break;
869 
870     case options::OPT_Wnonportable_cfstrings:
871       DAL->AddFlagArg(A,
872                       Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
873       break;
874 
875     case options::OPT_Wno_nonportable_cfstrings:
876       DAL->AddFlagArg(
877           A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
878       break;
879 
880     case options::OPT_fpascal_strings:
881       DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
882       break;
883 
884     case options::OPT_fno_pascal_strings:
885       DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
886       break;
887     }
888   }
889 
890   if (getTriple().getArch() == llvm::Triple::x86 ||
891       getTriple().getArch() == llvm::Triple::x86_64)
892     if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
893       DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
894                         "core2");
895 
896   // Add the arch options based on the particular spelling of -arch, to match
897   // how the driver driver works.
898   if (BoundArch) {
899     StringRef Name = BoundArch;
900     const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
901     const Option MArch = Opts.getOption(options::OPT_march_EQ);
902 
903     // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
904     // which defines the list of which architectures we accept.
905     if (Name == "ppc")
906       ;
907     else if (Name == "ppc601")
908       DAL->AddJoinedArg(nullptr, MCpu, "601");
909     else if (Name == "ppc603")
910       DAL->AddJoinedArg(nullptr, MCpu, "603");
911     else if (Name == "ppc604")
912       DAL->AddJoinedArg(nullptr, MCpu, "604");
913     else if (Name == "ppc604e")
914       DAL->AddJoinedArg(nullptr, MCpu, "604e");
915     else if (Name == "ppc750")
916       DAL->AddJoinedArg(nullptr, MCpu, "750");
917     else if (Name == "ppc7400")
918       DAL->AddJoinedArg(nullptr, MCpu, "7400");
919     else if (Name == "ppc7450")
920       DAL->AddJoinedArg(nullptr, MCpu, "7450");
921     else if (Name == "ppc970")
922       DAL->AddJoinedArg(nullptr, MCpu, "970");
923 
924     else if (Name == "ppc64" || Name == "ppc64le")
925       DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
926 
927     else if (Name == "i386")
928       ;
929     else if (Name == "i486")
930       DAL->AddJoinedArg(nullptr, MArch, "i486");
931     else if (Name == "i586")
932       DAL->AddJoinedArg(nullptr, MArch, "i586");
933     else if (Name == "i686")
934       DAL->AddJoinedArg(nullptr, MArch, "i686");
935     else if (Name == "pentium")
936       DAL->AddJoinedArg(nullptr, MArch, "pentium");
937     else if (Name == "pentium2")
938       DAL->AddJoinedArg(nullptr, MArch, "pentium2");
939     else if (Name == "pentpro")
940       DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
941     else if (Name == "pentIIm3")
942       DAL->AddJoinedArg(nullptr, MArch, "pentium2");
943 
944     else if (Name == "x86_64")
945       DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
946     else if (Name == "x86_64h") {
947       DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
948       DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
949     }
950 
951     else if (Name == "arm")
952       DAL->AddJoinedArg(nullptr, MArch, "armv4t");
953     else if (Name == "armv4t")
954       DAL->AddJoinedArg(nullptr, MArch, "armv4t");
955     else if (Name == "armv5")
956       DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
957     else if (Name == "xscale")
958       DAL->AddJoinedArg(nullptr, MArch, "xscale");
959     else if (Name == "armv6")
960       DAL->AddJoinedArg(nullptr, MArch, "armv6k");
961     else if (Name == "armv6m")
962       DAL->AddJoinedArg(nullptr, MArch, "armv6m");
963     else if (Name == "armv7")
964       DAL->AddJoinedArg(nullptr, MArch, "armv7a");
965     else if (Name == "armv7em")
966       DAL->AddJoinedArg(nullptr, MArch, "armv7em");
967     else if (Name == "armv7k")
968       DAL->AddJoinedArg(nullptr, MArch, "armv7k");
969     else if (Name == "armv7m")
970       DAL->AddJoinedArg(nullptr, MArch, "armv7m");
971     else if (Name == "armv7s")
972       DAL->AddJoinedArg(nullptr, MArch, "armv7s");
973   }
974 
975   return DAL;
976 }
977 
AddLinkRuntimeLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const978 void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
979                                   ArgStringList &CmdArgs) const {
980   // Embedded targets are simple at the moment, not supporting sanitizers and
981   // with different libraries for each member of the product { static, PIC } x
982   // { hard-float, soft-float }
983   llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
984   CompilerRT +=
985       (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
986           ? "hard"
987           : "soft";
988   CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
989 
990   AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
991 }
992 
TranslateArgs(const DerivedArgList & Args,const char * BoundArch) const993 DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
994                                       const char *BoundArch) const {
995   // First get the generic Apple args, before moving onto Darwin-specific ones.
996   DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
997   const OptTable &Opts = getDriver().getOpts();
998 
999   // If no architecture is bound, none of the translations here are relevant.
1000   if (!BoundArch)
1001     return DAL;
1002 
1003   // Add an explicit version min argument for the deployment target. We do this
1004   // after argument translation because -Xarch_ arguments may add a version min
1005   // argument.
1006   AddDeploymentTarget(*DAL);
1007 
1008   // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
1009   // FIXME: It would be far better to avoid inserting those -static arguments,
1010   // but we can't check the deployment target in the translation code until
1011   // it is set here.
1012   if (isTargetWatchOSBased() ||
1013       (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0))) {
1014     for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
1015       Arg *A = *it;
1016       ++it;
1017       if (A->getOption().getID() != options::OPT_mkernel &&
1018           A->getOption().getID() != options::OPT_fapple_kext)
1019         continue;
1020       assert(it != ie && "unexpected argument translation");
1021       A = *it;
1022       assert(A->getOption().getID() == options::OPT_static &&
1023              "missing expected -static argument");
1024       it = DAL->getArgs().erase(it);
1025     }
1026   }
1027 
1028   // Default to use libc++ on OS X 10.9+ and iOS 7+.
1029   if (((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
1030        (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0)) ||
1031        isTargetWatchOSBased()) &&
1032       !Args.getLastArg(options::OPT_stdlib_EQ))
1033     DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
1034                       "libc++");
1035 
1036   // Validate the C++ standard library choice.
1037   CXXStdlibType Type = GetCXXStdlibType(*DAL);
1038   if (Type == ToolChain::CST_Libcxx) {
1039     // Check whether the target provides libc++.
1040     StringRef where;
1041 
1042     // Complain about targeting iOS < 5.0 in any way.
1043     if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
1044       where = "iOS 5.0";
1045 
1046     if (where != StringRef()) {
1047       getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where;
1048     }
1049   }
1050 
1051   return DAL;
1052 }
1053 
IsUnwindTablesDefault() const1054 bool MachO::IsUnwindTablesDefault() const {
1055   return getArch() == llvm::Triple::x86_64;
1056 }
1057 
UseDwarfDebugFlags() const1058 bool MachO::UseDwarfDebugFlags() const {
1059   if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
1060     return S[0] != '\0';
1061   return false;
1062 }
1063 
UseSjLjExceptions(const ArgList & Args) const1064 bool Darwin::UseSjLjExceptions(const ArgList &Args) const {
1065   // Darwin uses SjLj exceptions on ARM.
1066   if (getTriple().getArch() != llvm::Triple::arm &&
1067       getTriple().getArch() != llvm::Triple::thumb)
1068     return false;
1069 
1070   // Only watchOS uses the new DWARF/Compact unwinding method.
1071   return !isTargetWatchOS();
1072 }
1073 
isPICDefault() const1074 bool MachO::isPICDefault() const { return true; }
1075 
isPIEDefault() const1076 bool MachO::isPIEDefault() const { return false; }
1077 
isPICDefaultForced() const1078 bool MachO::isPICDefaultForced() const {
1079   return (getArch() == llvm::Triple::x86_64 ||
1080           getArch() == llvm::Triple::aarch64);
1081 }
1082 
SupportsProfiling() const1083 bool MachO::SupportsProfiling() const {
1084   // Profiling instrumentation is only supported on x86.
1085   return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
1086 }
1087 
addMinVersionArgs(const ArgList & Args,ArgStringList & CmdArgs) const1088 void Darwin::addMinVersionArgs(const ArgList &Args,
1089                                ArgStringList &CmdArgs) const {
1090   VersionTuple TargetVersion = getTargetVersion();
1091 
1092   if (isTargetWatchOS())
1093     CmdArgs.push_back("-watchos_version_min");
1094   else if (isTargetWatchOSSimulator())
1095     CmdArgs.push_back("-watchos_simulator_version_min");
1096   else if (isTargetTvOS())
1097     CmdArgs.push_back("-tvos_version_min");
1098   else if (isTargetTvOSSimulator())
1099     CmdArgs.push_back("-tvos_simulator_version_min");
1100   else if (isTargetIOSSimulator())
1101     CmdArgs.push_back("-ios_simulator_version_min");
1102   else if (isTargetIOSBased())
1103     CmdArgs.push_back("-iphoneos_version_min");
1104   else {
1105     assert(isTargetMacOS() && "unexpected target");
1106     CmdArgs.push_back("-macosx_version_min");
1107   }
1108 
1109   CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
1110 }
1111 
addStartObjectFileArgs(const ArgList & Args,ArgStringList & CmdArgs) const1112 void Darwin::addStartObjectFileArgs(const ArgList &Args,
1113                                     ArgStringList &CmdArgs) const {
1114   // Derived from startfile spec.
1115   if (Args.hasArg(options::OPT_dynamiclib)) {
1116     // Derived from darwin_dylib1 spec.
1117     if (isTargetWatchOSBased()) {
1118       ; // watchOS does not need dylib1.o.
1119     } else if (isTargetIOSSimulator()) {
1120       ; // iOS simulator does not need dylib1.o.
1121     } else if (isTargetIPhoneOS()) {
1122       if (isIPhoneOSVersionLT(3, 1))
1123         CmdArgs.push_back("-ldylib1.o");
1124     } else {
1125       if (isMacosxVersionLT(10, 5))
1126         CmdArgs.push_back("-ldylib1.o");
1127       else if (isMacosxVersionLT(10, 6))
1128         CmdArgs.push_back("-ldylib1.10.5.o");
1129     }
1130   } else {
1131     if (Args.hasArg(options::OPT_bundle)) {
1132       if (!Args.hasArg(options::OPT_static)) {
1133         // Derived from darwin_bundle1 spec.
1134         if (isTargetWatchOSBased()) {
1135           ; // watchOS does not need bundle1.o.
1136         } else if (isTargetIOSSimulator()) {
1137           ; // iOS simulator does not need bundle1.o.
1138         } else if (isTargetIPhoneOS()) {
1139           if (isIPhoneOSVersionLT(3, 1))
1140             CmdArgs.push_back("-lbundle1.o");
1141         } else {
1142           if (isMacosxVersionLT(10, 6))
1143             CmdArgs.push_back("-lbundle1.o");
1144         }
1145       }
1146     } else {
1147       if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1148         if (Args.hasArg(options::OPT_static) ||
1149             Args.hasArg(options::OPT_object) ||
1150             Args.hasArg(options::OPT_preload)) {
1151           CmdArgs.push_back("-lgcrt0.o");
1152         } else {
1153           CmdArgs.push_back("-lgcrt1.o");
1154 
1155           // darwin_crt2 spec is empty.
1156         }
1157         // By default on OS X 10.8 and later, we don't link with a crt1.o
1158         // file and the linker knows to use _main as the entry point.  But,
1159         // when compiling with -pg, we need to link with the gcrt1.o file,
1160         // so pass the -no_new_main option to tell the linker to use the
1161         // "start" symbol as the entry point.
1162         if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1163           CmdArgs.push_back("-no_new_main");
1164       } else {
1165         if (Args.hasArg(options::OPT_static) ||
1166             Args.hasArg(options::OPT_object) ||
1167             Args.hasArg(options::OPT_preload)) {
1168           CmdArgs.push_back("-lcrt0.o");
1169         } else {
1170           // Derived from darwin_crt1 spec.
1171           if (isTargetWatchOSBased()) {
1172             ; // watchOS does not need crt1.o.
1173           } else if (isTargetIOSSimulator()) {
1174             ; // iOS simulator does not need crt1.o.
1175           } else if (isTargetIPhoneOS()) {
1176             if (getArch() == llvm::Triple::aarch64)
1177               ; // iOS does not need any crt1 files for arm64
1178             else if (isIPhoneOSVersionLT(3, 1))
1179               CmdArgs.push_back("-lcrt1.o");
1180             else if (isIPhoneOSVersionLT(6, 0))
1181               CmdArgs.push_back("-lcrt1.3.1.o");
1182           } else {
1183             if (isMacosxVersionLT(10, 5))
1184               CmdArgs.push_back("-lcrt1.o");
1185             else if (isMacosxVersionLT(10, 6))
1186               CmdArgs.push_back("-lcrt1.10.5.o");
1187             else if (isMacosxVersionLT(10, 8))
1188               CmdArgs.push_back("-lcrt1.10.6.o");
1189 
1190             // darwin_crt2 spec is empty.
1191           }
1192         }
1193       }
1194     }
1195   }
1196 
1197   if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
1198       !isTargetWatchOS() &&
1199       isMacosxVersionLT(10, 5)) {
1200     const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1201     CmdArgs.push_back(Str);
1202   }
1203 }
1204 
SupportsObjCGC() const1205 bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
1206 
CheckObjCARC() const1207 void Darwin::CheckObjCARC() const {
1208   if (isTargetIOSBased() || isTargetWatchOSBased() ||
1209       (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
1210     return;
1211   getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
1212 }
1213 
getSupportedSanitizers() const1214 SanitizerMask Darwin::getSupportedSanitizers() const {
1215   SanitizerMask Res = ToolChain::getSupportedSanitizers();
1216   if (isTargetMacOS() || isTargetIOSSimulator())
1217     Res |= SanitizerKind::Address;
1218   if (isTargetMacOS()) {
1219     if (!isMacosxVersionLT(10, 9))
1220       Res |= SanitizerKind::Vptr;
1221     Res |= SanitizerKind::SafeStack;
1222     Res |= SanitizerKind::Thread;
1223   }
1224   return Res;
1225 }
1226 
1227 /// Generic_GCC - A tool chain using the 'gcc' command to perform
1228 /// all subcommands; this relies on gcc translating the majority of
1229 /// command line options.
1230 
1231 /// \brief Parse a GCCVersion object out of a string of text.
1232 ///
1233 /// This is the primary means of forming GCCVersion objects.
1234 /*static*/
Parse(StringRef VersionText)1235 Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
1236   const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1237   std::pair<StringRef, StringRef> First = VersionText.split('.');
1238   std::pair<StringRef, StringRef> Second = First.second.split('.');
1239 
1240   GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1241   if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
1242     return BadVersion;
1243   GoodVersion.MajorStr = First.first.str();
1244   if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
1245     return BadVersion;
1246   GoodVersion.MinorStr = Second.first.str();
1247 
1248   // First look for a number prefix and parse that if present. Otherwise just
1249   // stash the entire patch string in the suffix, and leave the number
1250   // unspecified. This covers versions strings such as:
1251   //   4.4
1252   //   4.4.0
1253   //   4.4.x
1254   //   4.4.2-rc4
1255   //   4.4.x-patched
1256   // And retains any patch number it finds.
1257   StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1258   if (!PatchText.empty()) {
1259     if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
1260       // Try to parse the number and any suffix.
1261       if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1262           GoodVersion.Patch < 0)
1263         return BadVersion;
1264       GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
1265     }
1266   }
1267 
1268   return GoodVersion;
1269 }
1270 
1271 /// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
isOlderThan(int RHSMajor,int RHSMinor,int RHSPatch,StringRef RHSPatchSuffix) const1272 bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1273                                           int RHSPatch,
1274                                           StringRef RHSPatchSuffix) const {
1275   if (Major != RHSMajor)
1276     return Major < RHSMajor;
1277   if (Minor != RHSMinor)
1278     return Minor < RHSMinor;
1279   if (Patch != RHSPatch) {
1280     // Note that versions without a specified patch sort higher than those with
1281     // a patch.
1282     if (RHSPatch == -1)
1283       return true;
1284     if (Patch == -1)
1285       return false;
1286 
1287     // Otherwise just sort on the patch itself.
1288     return Patch < RHSPatch;
1289   }
1290   if (PatchSuffix != RHSPatchSuffix) {
1291     // Sort empty suffixes higher.
1292     if (RHSPatchSuffix.empty())
1293       return true;
1294     if (PatchSuffix.empty())
1295       return false;
1296 
1297     // Provide a lexicographic sort to make this a total ordering.
1298     return PatchSuffix < RHSPatchSuffix;
1299   }
1300 
1301   // The versions are equal.
1302   return false;
1303 }
1304 
getGCCToolchainDir(const ArgList & Args)1305 static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
1306   const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1307   if (A)
1308     return A->getValue();
1309   return GCC_INSTALL_PREFIX;
1310 }
1311 
1312 /// \brief Initialize a GCCInstallationDetector from the driver.
1313 ///
1314 /// This performs all of the autodetection and sets up the various paths.
1315 /// Once constructed, a GCCInstallationDetector is essentially immutable.
1316 ///
1317 /// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1318 /// should instead pull the target out of the driver. This is currently
1319 /// necessary because the driver doesn't store the final version of the target
1320 /// triple.
init(const llvm::Triple & TargetTriple,const ArgList & Args,ArrayRef<std::string> ExtraTripleAliases)1321 void Generic_GCC::GCCInstallationDetector::init(
1322     const llvm::Triple &TargetTriple, const ArgList &Args,
1323     ArrayRef<std::string> ExtraTripleAliases) {
1324   llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1325                                          ? TargetTriple.get64BitArchVariant()
1326                                          : TargetTriple.get32BitArchVariant();
1327   // The library directories which may contain GCC installations.
1328   SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
1329   // The compatible GCC triples for this particular architecture.
1330   SmallVector<StringRef, 16> CandidateTripleAliases;
1331   SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
1332   CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1333                            CandidateTripleAliases, CandidateBiarchLibDirs,
1334                            CandidateBiarchTripleAliases);
1335 
1336   // Compute the set of prefixes for our search.
1337   SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1338                                        D.PrefixDirs.end());
1339 
1340   StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1341   if (GCCToolchainDir != "") {
1342     if (GCCToolchainDir.back() == '/')
1343       GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
1344 
1345     Prefixes.push_back(GCCToolchainDir);
1346   } else {
1347     // If we have a SysRoot, try that first.
1348     if (!D.SysRoot.empty()) {
1349       Prefixes.push_back(D.SysRoot);
1350       Prefixes.push_back(D.SysRoot + "/usr");
1351     }
1352 
1353     // Then look for gcc installed alongside clang.
1354     Prefixes.push_back(D.InstalledDir + "/..");
1355 
1356     // And finally in /usr.
1357     if (D.SysRoot.empty())
1358       Prefixes.push_back("/usr");
1359   }
1360 
1361   // Loop over the various components which exist and select the best GCC
1362   // installation available. GCC installs are ranked by version number.
1363   Version = GCCVersion::Parse("0.0.0");
1364   for (const std::string &Prefix : Prefixes) {
1365     if (!D.getVFS().exists(Prefix))
1366       continue;
1367     for (StringRef Suffix : CandidateLibDirs) {
1368       const std::string LibDir = Prefix + Suffix.str();
1369       if (!D.getVFS().exists(LibDir))
1370         continue;
1371       for (StringRef Candidate : ExtraTripleAliases) // Try these first.
1372         ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
1373       for (StringRef Candidate : CandidateTripleAliases)
1374         ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
1375     }
1376     for (StringRef Suffix : CandidateBiarchLibDirs) {
1377       const std::string LibDir = Prefix + Suffix.str();
1378       if (!D.getVFS().exists(LibDir))
1379         continue;
1380       for (StringRef Candidate : CandidateBiarchTripleAliases)
1381         ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
1382                                /*NeedsBiarchSuffix=*/ true);
1383     }
1384   }
1385 }
1386 
print(raw_ostream & OS) const1387 void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
1388   for (const auto &InstallPath : CandidateGCCInstallPaths)
1389     OS << "Found candidate GCC installation: " << InstallPath << "\n";
1390 
1391   if (!GCCInstallPath.empty())
1392     OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1393 
1394   for (const auto &Multilib : Multilibs)
1395     OS << "Candidate multilib: " << Multilib << "\n";
1396 
1397   if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1398     OS << "Selected multilib: " << SelectedMultilib << "\n";
1399 }
1400 
getBiarchSibling(Multilib & M) const1401 bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1402   if (BiarchSibling.hasValue()) {
1403     M = BiarchSibling.getValue();
1404     return true;
1405   }
1406   return false;
1407 }
1408 
CollectLibDirsAndTriples(const llvm::Triple & TargetTriple,const llvm::Triple & BiarchTriple,SmallVectorImpl<StringRef> & LibDirs,SmallVectorImpl<StringRef> & TripleAliases,SmallVectorImpl<StringRef> & BiarchLibDirs,SmallVectorImpl<StringRef> & BiarchTripleAliases)1409 /*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
1410     const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
1411     SmallVectorImpl<StringRef> &LibDirs,
1412     SmallVectorImpl<StringRef> &TripleAliases,
1413     SmallVectorImpl<StringRef> &BiarchLibDirs,
1414     SmallVectorImpl<StringRef> &BiarchTripleAliases) {
1415   // Declare a bunch of static data sets that we'll select between below. These
1416   // are specifically designed to always refer to string literals to avoid any
1417   // lifetime or initialization issues.
1418   static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1419   static const char *const AArch64Triples[] = {
1420       "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1421       "aarch64-redhat-linux"};
1422   static const char *const AArch64beLibDirs[] = {"/lib"};
1423   static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1424                                                  "aarch64_be-linux-gnu"};
1425 
1426   static const char *const ARMLibDirs[] = {"/lib"};
1427   static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1428                                            "arm-linux-androideabi"};
1429   static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1430                                              "armv7hl-redhat-linux-gnueabi"};
1431   static const char *const ARMebLibDirs[] = {"/lib"};
1432   static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1433                                              "armeb-linux-androideabi"};
1434   static const char *const ARMebHFTriples[] = {
1435       "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
1436 
1437   static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
1438   static const char *const X86_64Triples[] = {
1439       "x86_64-linux-gnu",       "x86_64-unknown-linux-gnu",
1440       "x86_64-pc-linux-gnu",    "x86_64-redhat-linux6E",
1441       "x86_64-redhat-linux",    "x86_64-suse-linux",
1442       "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1443       "x86_64-slackware-linux", "x86_64-linux-android",
1444       "x86_64-unknown-linux"};
1445   static const char *const X32LibDirs[] = {"/libx32"};
1446   static const char *const X86LibDirs[] = {"/lib32", "/lib"};
1447   static const char *const X86Triples[] = {
1448       "i686-linux-gnu",       "i686-pc-linux-gnu",     "i486-linux-gnu",
1449       "i386-linux-gnu",       "i386-redhat-linux6E",   "i686-redhat-linux",
1450       "i586-redhat-linux",    "i386-redhat-linux",     "i586-suse-linux",
1451       "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1452       "i586-linux-gnu"};
1453 
1454   static const char *const MIPSLibDirs[] = {"/lib"};
1455   static const char *const MIPSTriples[] = {"mips-linux-gnu", "mips-mti-linux",
1456                                             "mips-mti-linux-gnu",
1457                                             "mips-img-linux-gnu"};
1458   static const char *const MIPSELLibDirs[] = {"/lib"};
1459   static const char *const MIPSELTriples[] = {
1460       "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
1461 
1462   static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1463   static const char *const MIPS64Triples[] = {
1464       "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1465       "mips64-linux-gnuabi64"};
1466   static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1467   static const char *const MIPS64ELTriples[] = {
1468       "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1469       "mips64el-linux-android", "mips64el-linux-gnuabi64"};
1470 
1471   static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
1472   static const char *const PPCTriples[] = {
1473       "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1474       "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1475   static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1476   static const char *const PPC64Triples[] = {
1477       "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1478       "powerpc64-suse-linux", "ppc64-redhat-linux"};
1479   static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1480   static const char *const PPC64LETriples[] = {
1481       "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1482       "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
1483 
1484   static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1485   static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1486                                                "sparcv8-linux-gnu"};
1487   static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1488   static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1489                                                "sparcv9-linux-gnu"};
1490 
1491   static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
1492   static const char *const SystemZTriples[] = {
1493       "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1494       "s390x-suse-linux", "s390x-redhat-linux"};
1495 
1496   // Solaris.
1497   static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1498   static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1499                                                     "i386-pc-solaris2.11"};
1500 
1501   using std::begin;
1502   using std::end;
1503 
1504   if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1505     LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1506     TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
1507     return;
1508   }
1509 
1510   switch (TargetTriple.getArch()) {
1511   case llvm::Triple::aarch64:
1512     LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1513     TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1514     BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1515     BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1516     break;
1517   case llvm::Triple::aarch64_be:
1518     LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1519     TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1520     BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1521     BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1522     break;
1523   case llvm::Triple::arm:
1524   case llvm::Triple::thumb:
1525     LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
1526     if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
1527       TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
1528     } else {
1529       TripleAliases.append(begin(ARMTriples), end(ARMTriples));
1530     }
1531     break;
1532   case llvm::Triple::armeb:
1533   case llvm::Triple::thumbeb:
1534     LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
1535     if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
1536       TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
1537     } else {
1538       TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
1539     }
1540     break;
1541   case llvm::Triple::x86_64:
1542     LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1543     TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1544     // x32 is always available when x86_64 is available, so adding it as
1545     // secondary arch with x86_64 triples
1546     if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
1547       BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1548       BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1549     } else {
1550       BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1551       BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
1552     }
1553     break;
1554   case llvm::Triple::x86:
1555     LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1556     TripleAliases.append(begin(X86Triples), end(X86Triples));
1557     BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1558     BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1559     break;
1560   case llvm::Triple::mips:
1561     LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1562     TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1563     BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1564     BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1565     break;
1566   case llvm::Triple::mipsel:
1567     LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1568     TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1569     TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1570     BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1571     BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1572     break;
1573   case llvm::Triple::mips64:
1574     LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1575     TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1576     BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1577     BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1578     break;
1579   case llvm::Triple::mips64el:
1580     LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1581     TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1582     BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1583     BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1584     BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1585     break;
1586   case llvm::Triple::ppc:
1587     LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1588     TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1589     BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1590     BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1591     break;
1592   case llvm::Triple::ppc64:
1593     LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1594     TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1595     BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1596     BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
1597     break;
1598   case llvm::Triple::ppc64le:
1599     LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1600     TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
1601     break;
1602   case llvm::Triple::sparc:
1603   case llvm::Triple::sparcel:
1604     LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1605     TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1606     BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1607     BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1608     break;
1609   case llvm::Triple::sparcv9:
1610     LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1611     TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1612     BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1613     BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1614     break;
1615   case llvm::Triple::systemz:
1616     LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1617     TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
1618     break;
1619   default:
1620     // By default, just rely on the standard lib directories and the original
1621     // triple.
1622     break;
1623   }
1624 
1625   // Always append the drivers target triple to the end, in case it doesn't
1626   // match any of our aliases.
1627   TripleAliases.push_back(TargetTriple.str());
1628 
1629   // Also include the multiarch variant if it's different.
1630   if (TargetTriple.str() != BiarchTriple.str())
1631     BiarchTripleAliases.push_back(BiarchTriple.str());
1632 }
1633 
1634 // \brief -- try common CUDA installation paths looking for files we need for
1635 // CUDA compilation.
1636 
init(const llvm::Triple & TargetTriple,const llvm::opt::ArgList & Args)1637 void Generic_GCC::CudaInstallationDetector::init(
1638     const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
1639   SmallVector<std::string, 4> CudaPathCandidates;
1640 
1641   if (Args.hasArg(options::OPT_cuda_path_EQ))
1642     CudaPathCandidates.push_back(
1643         Args.getLastArgValue(options::OPT_cuda_path_EQ));
1644   else {
1645     CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
1646     CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.5");
1647     CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1648   }
1649 
1650   for (const auto &CudaPath : CudaPathCandidates) {
1651     if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
1652       continue;
1653 
1654     CudaInstallPath = CudaPath;
1655     CudaIncludePath = CudaInstallPath + "/include";
1656     CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1657     CudaLibPath =
1658         CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1659 
1660     if (!(D.getVFS().exists(CudaIncludePath) &&
1661           D.getVFS().exists(CudaLibPath) &&
1662           D.getVFS().exists(CudaLibDevicePath)))
1663       continue;
1664 
1665     std::error_code EC;
1666     for (llvm::sys::fs::directory_iterator LI(CudaLibDevicePath, EC), LE;
1667          !EC && LI != LE; LI = LI.increment(EC)) {
1668       StringRef FilePath = LI->path();
1669       StringRef FileName = llvm::sys::path::filename(FilePath);
1670       // Process all bitcode filenames that look like libdevice.compute_XX.YY.bc
1671       const StringRef LibDeviceName = "libdevice.";
1672       if (!(FileName.startswith(LibDeviceName) && FileName.endswith(".bc")))
1673         continue;
1674       StringRef GpuArch = FileName.slice(
1675           LibDeviceName.size(), FileName.find('.', LibDeviceName.size()));
1676       CudaLibDeviceMap[GpuArch] = FilePath.str();
1677       // Insert map entries for specifc devices with this compute capability.
1678       if (GpuArch == "compute_20") {
1679         CudaLibDeviceMap["sm_20"] = FilePath;
1680         CudaLibDeviceMap["sm_21"] = FilePath;
1681       } else if (GpuArch == "compute_30") {
1682         CudaLibDeviceMap["sm_30"] = FilePath;
1683         CudaLibDeviceMap["sm_32"] = FilePath;
1684       } else if (GpuArch == "compute_35") {
1685         CudaLibDeviceMap["sm_35"] = FilePath;
1686         CudaLibDeviceMap["sm_37"] = FilePath;
1687       }
1688     }
1689 
1690     IsValid = true;
1691     break;
1692   }
1693 }
1694 
print(raw_ostream & OS) const1695 void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1696   if (isValid())
1697     OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1698 }
1699 
1700 namespace {
1701 // Filter to remove Multilibs that don't exist as a suffix to Path
1702 class FilterNonExistent {
1703   StringRef Base;
1704   vfs::FileSystem &VFS;
1705 
1706 public:
FilterNonExistent(StringRef Base,vfs::FileSystem & VFS)1707   FilterNonExistent(StringRef Base, vfs::FileSystem &VFS)
1708       : Base(Base), VFS(VFS) {}
operator ()(const Multilib & M)1709   bool operator()(const Multilib &M) {
1710     return !VFS.exists(Base + M.gccSuffix() + "/crtbegin.o");
1711   }
1712 };
1713 } // end anonymous namespace
1714 
addMultilibFlag(bool Enabled,const char * const Flag,std::vector<std::string> & Flags)1715 static void addMultilibFlag(bool Enabled, const char *const Flag,
1716                             std::vector<std::string> &Flags) {
1717   if (Enabled)
1718     Flags.push_back(std::string("+") + Flag);
1719   else
1720     Flags.push_back(std::string("-") + Flag);
1721 }
1722 
isMipsArch(llvm::Triple::ArchType Arch)1723 static bool isMipsArch(llvm::Triple::ArchType Arch) {
1724   return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1725          Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1726 }
1727 
isMips32(llvm::Triple::ArchType Arch)1728 static bool isMips32(llvm::Triple::ArchType Arch) {
1729   return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1730 }
1731 
isMips64(llvm::Triple::ArchType Arch)1732 static bool isMips64(llvm::Triple::ArchType Arch) {
1733   return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1734 }
1735 
isMipsEL(llvm::Triple::ArchType Arch)1736 static bool isMipsEL(llvm::Triple::ArchType Arch) {
1737   return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1738 }
1739 
isMips16(const ArgList & Args)1740 static bool isMips16(const ArgList &Args) {
1741   Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
1742   return A && A->getOption().matches(options::OPT_mips16);
1743 }
1744 
isMicroMips(const ArgList & Args)1745 static bool isMicroMips(const ArgList &Args) {
1746   Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
1747   return A && A->getOption().matches(options::OPT_mmicromips);
1748 }
1749 
1750 namespace {
1751 struct DetectedMultilibs {
1752   /// The set of multilibs that the detected installation supports.
1753   MultilibSet Multilibs;
1754 
1755   /// The primary multilib appropriate for the given flags.
1756   Multilib SelectedMultilib;
1757 
1758   /// On Biarch systems, this corresponds to the default multilib when
1759   /// targeting the non-default multilib. Otherwise, it is empty.
1760   llvm::Optional<Multilib> BiarchSibling;
1761 };
1762 } // end anonymous namespace
1763 
makeMultilib(StringRef commonSuffix)1764 static Multilib makeMultilib(StringRef commonSuffix) {
1765   return Multilib(commonSuffix, commonSuffix, commonSuffix);
1766 }
1767 
findMIPSMultilibs(const Driver & D,const llvm::Triple & TargetTriple,StringRef Path,const ArgList & Args,DetectedMultilibs & Result)1768 static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
1769                               StringRef Path, const ArgList &Args,
1770                               DetectedMultilibs &Result) {
1771   // Some MIPS toolchains put libraries and object files compiled
1772   // using different options in to the sub-directoris which names
1773   // reflects the flags used for compilation. For example sysroot
1774   // directory might looks like the following examples:
1775   //
1776   // /usr
1777   //   /lib      <= crt*.o files compiled with '-mips32'
1778   // /mips16
1779   //   /usr
1780   //     /lib    <= crt*.o files compiled with '-mips16'
1781   //   /el
1782   //     /usr
1783   //       /lib  <= crt*.o files compiled with '-mips16 -EL'
1784   //
1785   // or
1786   //
1787   // /usr
1788   //   /lib      <= crt*.o files compiled with '-mips32r2'
1789   // /mips16
1790   //   /usr
1791   //     /lib    <= crt*.o files compiled with '-mips32r2 -mips16'
1792   // /mips32
1793   //     /usr
1794   //       /lib  <= crt*.o files compiled with '-mips32'
1795 
1796   FilterNonExistent NonExistent(Path, D.getVFS());
1797 
1798   // Check for FSF toolchain multilibs
1799   MultilibSet FSFMipsMultilibs;
1800   {
1801     auto MArchMips32 = makeMultilib("/mips32")
1802                            .flag("+m32")
1803                            .flag("-m64")
1804                            .flag("-mmicromips")
1805                            .flag("+march=mips32");
1806 
1807     auto MArchMicroMips = makeMultilib("/micromips")
1808                               .flag("+m32")
1809                               .flag("-m64")
1810                               .flag("+mmicromips");
1811 
1812     auto MArchMips64r2 = makeMultilib("/mips64r2")
1813                              .flag("-m32")
1814                              .flag("+m64")
1815                              .flag("+march=mips64r2");
1816 
1817     auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1818         "-march=mips64r2");
1819 
1820     auto MArchDefault = makeMultilib("")
1821                             .flag("+m32")
1822                             .flag("-m64")
1823                             .flag("-mmicromips")
1824                             .flag("+march=mips32r2");
1825 
1826     auto Mips16 = makeMultilib("/mips16").flag("+mips16");
1827 
1828     auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
1829 
1830     auto MAbi64 =
1831         makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
1832 
1833     auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
1834 
1835     auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
1836 
1837     auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
1838 
1839     auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
1840 
1841     FSFMipsMultilibs =
1842         MultilibSet()
1843             .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1844                     MArchDefault)
1845             .Maybe(UCLibc)
1846             .Maybe(Mips16)
1847             .FilterOut("/mips64/mips16")
1848             .FilterOut("/mips64r2/mips16")
1849             .FilterOut("/micromips/mips16")
1850             .Maybe(MAbi64)
1851             .FilterOut("/micromips/64")
1852             .FilterOut("/mips32/64")
1853             .FilterOut("^/64")
1854             .FilterOut("/mips16/64")
1855             .Either(BigEndian, LittleEndian)
1856             .Maybe(SoftFloat)
1857             .Maybe(Nan2008)
1858             .FilterOut(".*sof/nan2008")
1859             .FilterOut(NonExistent)
1860             .setIncludeDirsCallback([](StringRef InstallDir,
1861                                        StringRef TripleStr, const Multilib &M) {
1862               std::vector<std::string> Dirs;
1863               Dirs.push_back((InstallDir + "/include").str());
1864               std::string SysRootInc =
1865                   InstallDir.str() + "/../../../../sysroot";
1866               if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1867                 Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1868               else
1869                 Dirs.push_back(SysRootInc + "/usr/include");
1870               return Dirs;
1871             });
1872   }
1873 
1874   // Check for Musl toolchain multilibs
1875   MultilibSet MuslMipsMultilibs;
1876   {
1877     auto MArchMipsR2 = makeMultilib("")
1878                            .osSuffix("/mips-r2-hard-musl")
1879                            .flag("+EB")
1880                            .flag("-EL")
1881                            .flag("+march=mips32r2");
1882 
1883     auto MArchMipselR2 = makeMultilib("/mipsel-r2-hard-musl")
1884                              .flag("-EB")
1885                              .flag("+EL")
1886                              .flag("+march=mips32r2");
1887 
1888     MuslMipsMultilibs = MultilibSet().Either(MArchMipsR2, MArchMipselR2);
1889 
1890     // Specify the callback that computes the include directories.
1891     MuslMipsMultilibs.setIncludeDirsCallback([](
1892         StringRef InstallDir, StringRef TripleStr, const Multilib &M) {
1893       std::vector<std::string> Dirs;
1894       Dirs.push_back(
1895           (InstallDir + "/../sysroot" + M.osSuffix() + "/usr/include").str());
1896       return Dirs;
1897     });
1898   }
1899 
1900   // Check for Code Sourcery toolchain multilibs
1901   MultilibSet CSMipsMultilibs;
1902   {
1903     auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
1904 
1905     auto MArchMicroMips =
1906         makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
1907 
1908     auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
1909 
1910     auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
1911 
1912     auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
1913 
1914     auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
1915 
1916     auto DefaultFloat =
1917         makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
1918 
1919     auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
1920 
1921     auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
1922 
1923     // Note that this one's osSuffix is ""
1924     auto MAbi64 = makeMultilib("")
1925                       .gccSuffix("/64")
1926                       .includeSuffix("/64")
1927                       .flag("+mabi=n64")
1928                       .flag("-mabi=n32")
1929                       .flag("-m32");
1930 
1931     CSMipsMultilibs =
1932         MultilibSet()
1933             .Either(MArchMips16, MArchMicroMips, MArchDefault)
1934             .Maybe(UCLibc)
1935             .Either(SoftFloat, Nan2008, DefaultFloat)
1936             .FilterOut("/micromips/nan2008")
1937             .FilterOut("/mips16/nan2008")
1938             .Either(BigEndian, LittleEndian)
1939             .Maybe(MAbi64)
1940             .FilterOut("/mips16.*/64")
1941             .FilterOut("/micromips.*/64")
1942             .FilterOut(NonExistent)
1943             .setIncludeDirsCallback([](StringRef InstallDir,
1944                                        StringRef TripleStr, const Multilib &M) {
1945               std::vector<std::string> Dirs;
1946               Dirs.push_back((InstallDir + "/include").str());
1947               std::string SysRootInc =
1948                   InstallDir.str() + "/../../../../" + TripleStr.str();
1949               if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1950                 Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1951               else
1952                 Dirs.push_back(SysRootInc + "/libc/usr/include");
1953               return Dirs;
1954             });
1955   }
1956 
1957   MultilibSet AndroidMipsMultilibs =
1958       MultilibSet()
1959           .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1960           .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1961           .FilterOut(NonExistent);
1962 
1963   MultilibSet DebianMipsMultilibs;
1964   {
1965     Multilib MAbiN32 =
1966         Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
1967 
1968     Multilib M64 = Multilib()
1969                        .gccSuffix("/64")
1970                        .includeSuffix("/64")
1971                        .flag("+m64")
1972                        .flag("-m32")
1973                        .flag("-mabi=n32");
1974 
1975     Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
1976 
1977     DebianMipsMultilibs =
1978         MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
1979   }
1980 
1981   MultilibSet ImgMultilibs;
1982   {
1983     auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
1984 
1985     auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
1986 
1987     auto MAbi64 =
1988         makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
1989 
1990     ImgMultilibs =
1991         MultilibSet()
1992             .Maybe(Mips64r6)
1993             .Maybe(MAbi64)
1994             .Maybe(LittleEndian)
1995             .FilterOut(NonExistent)
1996             .setIncludeDirsCallback([](StringRef InstallDir,
1997                                        StringRef TripleStr, const Multilib &M) {
1998               std::vector<std::string> Dirs;
1999               Dirs.push_back((InstallDir + "/include").str());
2000               Dirs.push_back(
2001                   (InstallDir + "/../../../../sysroot/usr/include").str());
2002               return Dirs;
2003             });
2004   }
2005 
2006   StringRef CPUName;
2007   StringRef ABIName;
2008   tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
2009 
2010   llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2011 
2012   Multilib::flags_list Flags;
2013   addMultilibFlag(isMips32(TargetArch), "m32", Flags);
2014   addMultilibFlag(isMips64(TargetArch), "m64", Flags);
2015   addMultilibFlag(isMips16(Args), "mips16", Flags);
2016   addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
2017   addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
2018                       CPUName == "mips32r5" || CPUName == "p5600",
2019                   "march=mips32r2", Flags);
2020   addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
2021   addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
2022   addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
2023                       CPUName == "mips64r5" || CPUName == "octeon",
2024                   "march=mips64r2", Flags);
2025   addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
2026   addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
2027   addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
2028                   Flags);
2029   addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
2030   addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
2031   addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
2032   addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
2033   addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
2034   addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
2035 
2036   if (TargetTriple.isAndroid()) {
2037     // Select Android toolchain. It's the only choice in that case.
2038     if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2039       Result.Multilibs = AndroidMipsMultilibs;
2040       return true;
2041     }
2042     return false;
2043   }
2044 
2045   if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2046       TargetTriple.getOS() == llvm::Triple::Linux &&
2047       TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment) {
2048     if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2049       Result.Multilibs = MuslMipsMultilibs;
2050       return true;
2051     }
2052     return false;
2053   }
2054 
2055   if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
2056       TargetTriple.getOS() == llvm::Triple::Linux &&
2057       TargetTriple.getEnvironment() == llvm::Triple::GNU) {
2058     // Select mips-img-linux-gnu toolchain.
2059     if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
2060       Result.Multilibs = ImgMultilibs;
2061       return true;
2062     }
2063     return false;
2064   }
2065 
2066   // Sort candidates. Toolchain that best meets the directories goes first.
2067   // Then select the first toolchains matches command line flags.
2068   MultilibSet *candidates[] = {&DebianMipsMultilibs, &FSFMipsMultilibs,
2069                                &CSMipsMultilibs};
2070   std::sort(
2071       std::begin(candidates), std::end(candidates),
2072       [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
2073   for (const auto &candidate : candidates) {
2074     if (candidate->select(Flags, Result.SelectedMultilib)) {
2075       if (candidate == &DebianMipsMultilibs)
2076         Result.BiarchSibling = Multilib();
2077       Result.Multilibs = *candidate;
2078       return true;
2079     }
2080   }
2081 
2082   {
2083     // Fallback to the regular toolchain-tree structure.
2084     Multilib Default;
2085     Result.Multilibs.push_back(Default);
2086     Result.Multilibs.FilterOut(NonExistent);
2087 
2088     if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2089       Result.BiarchSibling = Multilib();
2090       return true;
2091     }
2092   }
2093 
2094   return false;
2095 }
2096 
findBiarchMultilibs(const Driver & D,const llvm::Triple & TargetTriple,StringRef Path,const ArgList & Args,bool NeedsBiarchSuffix,DetectedMultilibs & Result)2097 static bool findBiarchMultilibs(const Driver &D,
2098                                 const llvm::Triple &TargetTriple,
2099                                 StringRef Path, const ArgList &Args,
2100                                 bool NeedsBiarchSuffix,
2101                                 DetectedMultilibs &Result) {
2102   // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2103   // in what would normally be GCCInstallPath and put the 64-bit
2104   // libs in a subdirectory named 64. The simple logic we follow is that
2105   // *if* there is a subdirectory of the right name with crtbegin.o in it,
2106   // we use that. If not, and if not a biarch triple alias, we look for
2107   // crtbegin.o without the subdirectory.
2108 
2109   Multilib Default;
2110   Multilib Alt64 = Multilib()
2111                        .gccSuffix("/64")
2112                        .includeSuffix("/64")
2113                        .flag("-m32")
2114                        .flag("+m64")
2115                        .flag("-mx32");
2116   Multilib Alt32 = Multilib()
2117                        .gccSuffix("/32")
2118                        .includeSuffix("/32")
2119                        .flag("+m32")
2120                        .flag("-m64")
2121                        .flag("-mx32");
2122   Multilib Altx32 = Multilib()
2123                         .gccSuffix("/x32")
2124                         .includeSuffix("/x32")
2125                         .flag("-m32")
2126                         .flag("-m64")
2127                         .flag("+mx32");
2128 
2129   FilterNonExistent NonExistent(Path, D.getVFS());
2130 
2131   // Determine default multilib from: 32, 64, x32
2132   // Also handle cases such as 64 on 32, 32 on 64, etc.
2133   enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
2134   const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
2135   if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
2136     Want = WANT64;
2137   else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
2138     Want = WANT64;
2139   else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
2140     Want = WANT32;
2141   else {
2142     if (TargetTriple.isArch32Bit())
2143       Want = NeedsBiarchSuffix ? WANT64 : WANT32;
2144     else if (IsX32)
2145       Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
2146     else
2147       Want = NeedsBiarchSuffix ? WANT32 : WANT64;
2148   }
2149 
2150   if (Want == WANT32)
2151     Default.flag("+m32").flag("-m64").flag("-mx32");
2152   else if (Want == WANT64)
2153     Default.flag("-m32").flag("+m64").flag("-mx32");
2154   else if (Want == WANTX32)
2155     Default.flag("-m32").flag("-m64").flag("+mx32");
2156   else
2157     return false;
2158 
2159   Result.Multilibs.push_back(Default);
2160   Result.Multilibs.push_back(Alt64);
2161   Result.Multilibs.push_back(Alt32);
2162   Result.Multilibs.push_back(Altx32);
2163 
2164   Result.Multilibs.FilterOut(NonExistent);
2165 
2166   Multilib::flags_list Flags;
2167   addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
2168   addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
2169   addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
2170 
2171   if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
2172     return false;
2173 
2174   if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
2175       Result.SelectedMultilib == Altx32)
2176     Result.BiarchSibling = Default;
2177 
2178   return true;
2179 }
2180 
scanLibDirForGCCTripleSolaris(const llvm::Triple & TargetArch,const llvm::opt::ArgList & Args,const std::string & LibDir,StringRef CandidateTriple,bool NeedsBiarchSuffix)2181 void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2182     const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2183     const std::string &LibDir, StringRef CandidateTriple,
2184     bool NeedsBiarchSuffix) {
2185   // Solaris is a special case. The GCC installation is under
2186   // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2187   // need to iterate twice.
2188   std::error_code EC;
2189   for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2190        !EC && LI != LE; LI = LI.increment(EC)) {
2191     StringRef VersionText = llvm::sys::path::filename(LI->getName());
2192     GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2193 
2194     if (CandidateVersion.Major != -1) // Filter obviously bad entries.
2195       if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
2196         continue; // Saw this path before; no need to look at it again.
2197     if (CandidateVersion.isOlderThan(4, 1, 1))
2198       continue;
2199     if (CandidateVersion <= Version)
2200       continue;
2201 
2202     GCCInstallPath =
2203         LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
2204     if (!D.getVFS().exists(GCCInstallPath))
2205       continue;
2206 
2207     // If we make it here there has to be at least one GCC version, let's just
2208     // use the latest one.
2209     std::error_code EEC;
2210     for (vfs::directory_iterator
2211              LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2212              LLE;
2213          !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2214 
2215       StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
2216       GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2217 
2218       if (CandidateSubVersion > Version)
2219         Version = CandidateSubVersion;
2220     }
2221 
2222     GCCTriple.setTriple(CandidateTriple);
2223 
2224     GCCInstallPath += "/" + Version.Text;
2225     GCCParentLibPath = GCCInstallPath + "/../../../../";
2226 
2227     IsValid = true;
2228   }
2229 }
2230 
ScanLibDirForGCCTriple(const llvm::Triple & TargetTriple,const ArgList & Args,const std::string & LibDir,StringRef CandidateTriple,bool NeedsBiarchSuffix)2231 void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
2232     const llvm::Triple &TargetTriple, const ArgList &Args,
2233     const std::string &LibDir, StringRef CandidateTriple,
2234     bool NeedsBiarchSuffix) {
2235   llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2236   // There are various different suffixes involving the triple we
2237   // check for. We also record what is necessary to walk from each back
2238   // up to the lib directory. Specifically, the number of "up" steps
2239   // in the second half of each row is 1 + the number of path separators
2240   // in the first half.
2241   const std::string LibAndInstallSuffixes[][2] = {
2242       {"/gcc/" + CandidateTriple.str(), "/../../.."},
2243 
2244       // Debian puts cross-compilers in gcc-cross
2245       {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2246 
2247       {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2248        "/../../../.."},
2249 
2250       // The Freescale PPC SDK has the gcc libraries in
2251       // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
2252       {"/" + CandidateTriple.str(), "/../.."},
2253 
2254       // Ubuntu has a strange mis-matched pair of triples that this happens to
2255       // match.
2256       // FIXME: It may be worthwhile to generalize this and look for a second
2257       // triple.
2258       {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2259 
2260   if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2261     scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2262                                   NeedsBiarchSuffix);
2263     return;
2264   }
2265 
2266   // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
2267   const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2268                                    (TargetArch != llvm::Triple::x86));
2269   for (unsigned i = 0; i < NumLibSuffixes; ++i) {
2270     StringRef LibSuffix = LibAndInstallSuffixes[i][0];
2271     std::error_code EC;
2272     for (vfs::directory_iterator
2273              LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2274              LE;
2275          !EC && LI != LE; LI = LI.increment(EC)) {
2276       StringRef VersionText = llvm::sys::path::filename(LI->getName());
2277       GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2278       if (CandidateVersion.Major != -1) // Filter obviously bad entries.
2279         if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
2280           continue; // Saw this path before; no need to look at it again.
2281       if (CandidateVersion.isOlderThan(4, 1, 1))
2282         continue;
2283       if (CandidateVersion <= Version)
2284         continue;
2285 
2286       DetectedMultilibs Detected;
2287 
2288       // Debian mips multilibs behave more like the rest of the biarch ones,
2289       // so handle them there
2290       if (isMipsArch(TargetArch)) {
2291         if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
2292           continue;
2293       } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
2294                                       NeedsBiarchSuffix, Detected)) {
2295         continue;
2296       }
2297 
2298       Multilibs = Detected.Multilibs;
2299       SelectedMultilib = Detected.SelectedMultilib;
2300       BiarchSibling = Detected.BiarchSibling;
2301       Version = CandidateVersion;
2302       GCCTriple.setTriple(CandidateTriple);
2303       // FIXME: We hack together the directory name here instead of
2304       // using LI to ensure stable path separators across Windows and
2305       // Linux.
2306       GCCInstallPath =
2307           LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2308       GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
2309       IsValid = true;
2310     }
2311   }
2312 }
2313 
Generic_GCC(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2314 Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
2315                          const ArgList &Args)
2316     : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
2317   getProgramPaths().push_back(getDriver().getInstalledDir());
2318   if (getDriver().getInstalledDir() != getDriver().Dir)
2319     getProgramPaths().push_back(getDriver().Dir);
2320 }
2321 
~Generic_GCC()2322 Generic_GCC::~Generic_GCC() {}
2323 
getTool(Action::ActionClass AC) const2324 Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
2325   switch (AC) {
2326   case Action::PreprocessJobClass:
2327     if (!Preprocess)
2328       Preprocess.reset(new tools::gcc::Preprocessor(*this));
2329     return Preprocess.get();
2330   case Action::CompileJobClass:
2331     if (!Compile)
2332       Compile.reset(new tools::gcc::Compiler(*this));
2333     return Compile.get();
2334   default:
2335     return ToolChain::getTool(AC);
2336   }
2337 }
2338 
buildAssembler() const2339 Tool *Generic_GCC::buildAssembler() const {
2340   return new tools::gnutools::Assembler(*this);
2341 }
2342 
buildLinker() const2343 Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
2344 
printVerboseInfo(raw_ostream & OS) const2345 void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2346   // Print the information about how we detected the GCC installation.
2347   GCCInstallation.print(OS);
2348   CudaInstallation.print(OS);
2349 }
2350 
IsUnwindTablesDefault() const2351 bool Generic_GCC::IsUnwindTablesDefault() const {
2352   return getArch() == llvm::Triple::x86_64;
2353 }
2354 
isPICDefault() const2355 bool Generic_GCC::isPICDefault() const {
2356   return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2357 }
2358 
isPIEDefault() const2359 bool Generic_GCC::isPIEDefault() const { return false; }
2360 
isPICDefaultForced() const2361 bool Generic_GCC::isPICDefaultForced() const {
2362   return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2363 }
2364 
IsIntegratedAssemblerDefault() const2365 bool Generic_GCC::IsIntegratedAssemblerDefault() const {
2366   switch (getTriple().getArch()) {
2367   case llvm::Triple::x86:
2368   case llvm::Triple::x86_64:
2369   case llvm::Triple::aarch64:
2370   case llvm::Triple::aarch64_be:
2371   case llvm::Triple::arm:
2372   case llvm::Triple::armeb:
2373   case llvm::Triple::bpfel:
2374   case llvm::Triple::bpfeb:
2375   case llvm::Triple::thumb:
2376   case llvm::Triple::thumbeb:
2377   case llvm::Triple::ppc:
2378   case llvm::Triple::ppc64:
2379   case llvm::Triple::ppc64le:
2380   case llvm::Triple::systemz:
2381     return true;
2382   default:
2383     return false;
2384   }
2385 }
2386 
2387 /// \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) const2388 bool Generic_GCC::addLibStdCXXIncludePaths(
2389     Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2390     StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2391     const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2392   if (!getVFS().exists(Base + Suffix))
2393     return false;
2394 
2395   addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2396 
2397   // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2398   // that path exists or we have neither a GCC nor target multiarch triple, use
2399   // this vanilla search path.
2400   if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2401       getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2402     addSystemInclude(DriverArgs, CC1Args,
2403                      Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2404   } else {
2405     // Otherwise try to use multiarch naming schemes which have normalized the
2406     // triples and put the triple before the suffix.
2407     //
2408     // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2409     // the target triple, so we support that here.
2410     addSystemInclude(DriverArgs, CC1Args,
2411                      Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2412     addSystemInclude(DriverArgs, CC1Args,
2413                      Base + "/" + TargetMultiarchTriple + Suffix);
2414   }
2415 
2416   addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2417   return true;
2418 }
2419 
2420 
addClangTargetOptions(const ArgList & DriverArgs,ArgStringList & CC1Args) const2421 void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2422                                         ArgStringList &CC1Args) const {
2423   const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
2424   bool UseInitArrayDefault =
2425       getTriple().getArch() == llvm::Triple::aarch64 ||
2426       getTriple().getArch() == llvm::Triple::aarch64_be ||
2427       (getTriple().getOS() == llvm::Triple::Linux &&
2428        (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
2429       getTriple().getOS() == llvm::Triple::NaCl ||
2430       (getTriple().getVendor() == llvm::Triple::MipsTechnologies &&
2431        !getTriple().hasEnvironment());
2432 
2433   if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
2434                          options::OPT_fno_use_init_array, UseInitArrayDefault))
2435     CC1Args.push_back("-fuse-init-array");
2436 }
2437 
2438 /// Mips Toolchain
MipsLLVMToolChain(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2439 MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
2440                                      const llvm::Triple &Triple,
2441                                      const ArgList &Args)
2442     : Linux(D, Triple, Args) {
2443   // Select the correct multilib according to the given arguments.
2444   DetectedMultilibs Result;
2445   findMIPSMultilibs(D, Triple, "", Args, Result);
2446   Multilibs = Result.Multilibs;
2447   SelectedMultilib = Result.SelectedMultilib;
2448 
2449   // Find out the library suffix based on the ABI.
2450   LibSuffix = tools::mips::getMipsABILibSuffix(Args, Triple);
2451   getFilePaths().clear();
2452   getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix);
2453 
2454   // Use LLD by default.
2455   DefaultLinker = "lld";
2456 }
2457 
AddClangSystemIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2458 void MipsLLVMToolChain::AddClangSystemIncludeArgs(
2459     const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2460   if (DriverArgs.hasArg(options::OPT_nostdinc))
2461     return;
2462 
2463   const Driver &D = getDriver();
2464 
2465   if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2466     SmallString<128> P(D.ResourceDir);
2467     llvm::sys::path::append(P, "include");
2468     addSystemInclude(DriverArgs, CC1Args, P);
2469   }
2470 
2471   if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2472     return;
2473 
2474   const auto &Callback = Multilibs.includeDirsCallback();
2475   if (Callback) {
2476     const auto IncludePaths =
2477         Callback(D.getInstalledDir(), getTripleString(), SelectedMultilib);
2478     for (const auto &Path : IncludePaths)
2479       addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
2480   }
2481 }
2482 
buildLinker() const2483 Tool *MipsLLVMToolChain::buildLinker() const {
2484   return new tools::gnutools::Linker(*this);
2485 }
2486 
computeSysRoot() const2487 std::string MipsLLVMToolChain::computeSysRoot() const {
2488   if (!getDriver().SysRoot.empty())
2489     return getDriver().SysRoot + SelectedMultilib.osSuffix();
2490 
2491   const std::string InstalledDir(getDriver().getInstalledDir());
2492   std::string SysRootPath =
2493       InstalledDir + "/../sysroot" + SelectedMultilib.osSuffix();
2494   if (llvm::sys::fs::exists(SysRootPath))
2495     return SysRootPath;
2496 
2497   return std::string();
2498 }
2499 
2500 ToolChain::CXXStdlibType
GetCXXStdlibType(const ArgList & Args) const2501 MipsLLVMToolChain::GetCXXStdlibType(const ArgList &Args) const {
2502   Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2503   if (A) {
2504     StringRef Value = A->getValue();
2505     if (Value != "libc++")
2506       getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2507           << A->getAsString(Args);
2508   }
2509 
2510   return ToolChain::CST_Libcxx;
2511 }
2512 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2513 void MipsLLVMToolChain::AddClangCXXStdlibIncludeArgs(
2514     const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2515   if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2516       DriverArgs.hasArg(options::OPT_nostdincxx))
2517     return;
2518 
2519   assert((GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) &&
2520          "Only -lc++ (aka libcxx) is suported in this toolchain.");
2521 
2522   const auto &Callback = Multilibs.includeDirsCallback();
2523   if (Callback) {
2524     const auto IncludePaths = Callback(getDriver().getInstalledDir(),
2525                                        getTripleString(), SelectedMultilib);
2526     for (const auto &Path : IncludePaths) {
2527       if (llvm::sys::fs::exists(Path + "/c++/v1")) {
2528         addSystemInclude(DriverArgs, CC1Args, Path + "/c++/v1");
2529         break;
2530       }
2531     }
2532   }
2533 }
2534 
AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const2535 void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2536                                             ArgStringList &CmdArgs) const {
2537   assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
2538          "Only -lc++ (aka libxx) is suported in this toolchain.");
2539 
2540   CmdArgs.push_back("-lc++");
2541   CmdArgs.push_back("-lc++abi");
2542   CmdArgs.push_back("-lunwind");
2543 }
2544 
getCompilerRT(const ArgList & Args,StringRef Component,bool Shared) const2545 std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
2546                                              StringRef Component,
2547                                              bool Shared) const {
2548   SmallString<128> Path(getDriver().ResourceDir);
2549   llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
2550                           getOS());
2551   llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" +
2552                                       "mips" + (Shared ? ".so" : ".a")));
2553   return Path.str();
2554 }
2555 
2556 /// Hexagon Toolchain
2557 
getHexagonTargetDir(const std::string & InstalledDir,const SmallVectorImpl<std::string> & PrefixDirs) const2558 std::string HexagonToolChain::getHexagonTargetDir(
2559       const std::string &InstalledDir,
2560       const SmallVectorImpl<std::string> &PrefixDirs) const {
2561   std::string InstallRelDir;
2562   const Driver &D = getDriver();
2563 
2564   // Locate the rest of the toolchain ...
2565   for (auto &I : PrefixDirs)
2566     if (D.getVFS().exists(I))
2567       return I;
2568 
2569   if (getVFS().exists(InstallRelDir = InstalledDir + "/../target"))
2570     return InstallRelDir;
2571 
2572   std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/target";
2573   if (getVFS().exists(PrefixRelDir))
2574     return PrefixRelDir;
2575 
2576   return InstallRelDir;
2577 }
2578 
2579 
getSmallDataThreshold(const ArgList & Args)2580 Optional<unsigned> HexagonToolChain::getSmallDataThreshold(
2581       const ArgList &Args) {
2582   StringRef Gn = "";
2583   if (Arg *A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
2584                                options::OPT_msmall_data_threshold_EQ)) {
2585     Gn = A->getValue();
2586   } else if (Args.getLastArg(options::OPT_shared, options::OPT_fpic,
2587                              options::OPT_fPIC)) {
2588     Gn = "0";
2589   }
2590 
2591   unsigned G;
2592   if (!Gn.getAsInteger(10, G))
2593     return G;
2594 
2595   return None;
2596 }
2597 
2598 
getHexagonLibraryPaths(const ArgList & Args,ToolChain::path_list & LibPaths) const2599 void HexagonToolChain::getHexagonLibraryPaths(const ArgList &Args,
2600       ToolChain::path_list &LibPaths) const {
2601   const Driver &D = getDriver();
2602 
2603   //----------------------------------------------------------------------------
2604   // -L Args
2605   //----------------------------------------------------------------------------
2606   for (Arg *A : Args.filtered(options::OPT_L))
2607     for (const char *Value : A->getValues())
2608       LibPaths.push_back(Value);
2609 
2610   //----------------------------------------------------------------------------
2611   // Other standard paths
2612   //----------------------------------------------------------------------------
2613   std::vector<std::string> RootDirs;
2614   std::copy(D.PrefixDirs.begin(), D.PrefixDirs.end(), RootDirs.begin());
2615 
2616   std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2617                                               D.PrefixDirs);
2618   if (std::find(RootDirs.begin(), RootDirs.end(), TargetDir) == RootDirs.end())
2619     RootDirs.push_back(TargetDir);
2620 
2621   bool HasPIC = Args.hasArg(options::OPT_fpic, options::OPT_fPIC);
2622   // Assume G0 with -shared.
2623   bool HasG0 = Args.hasArg(options::OPT_shared);
2624   if (auto G = getSmallDataThreshold(Args))
2625     HasG0 = G.getValue() == 0;
2626 
2627   const std::string CpuVer = GetTargetCPUVersion(Args).str();
2628   for (auto &Dir : RootDirs) {
2629     std::string LibDir = Dir + "/hexagon/lib";
2630     std::string LibDirCpu = LibDir + '/' + CpuVer;
2631     if (HasG0) {
2632       if (HasPIC)
2633         LibPaths.push_back(LibDirCpu + "/G0/pic");
2634       LibPaths.push_back(LibDirCpu + "/G0");
2635     }
2636     LibPaths.push_back(LibDirCpu);
2637     LibPaths.push_back(LibDir);
2638   }
2639 }
2640 
HexagonToolChain(const Driver & D,const llvm::Triple & Triple,const llvm::opt::ArgList & Args)2641 HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
2642                                    const llvm::opt::ArgList &Args)
2643     : Linux(D, Triple, Args) {
2644   const std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2645                                                     D.PrefixDirs);
2646 
2647   // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2648   // program paths
2649   const std::string BinDir(TargetDir + "/bin");
2650   if (D.getVFS().exists(BinDir))
2651     getProgramPaths().push_back(BinDir);
2652 
2653   ToolChain::path_list &LibPaths = getFilePaths();
2654 
2655   // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2656   // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2657   // support 'linux' we'll need to fix this up
2658   LibPaths.clear();
2659   getHexagonLibraryPaths(Args, LibPaths);
2660 }
2661 
~HexagonToolChain()2662 HexagonToolChain::~HexagonToolChain() {}
2663 
buildAssembler() const2664 Tool *HexagonToolChain::buildAssembler() const {
2665   return new tools::hexagon::Assembler(*this);
2666 }
2667 
buildLinker() const2668 Tool *HexagonToolChain::buildLinker() const {
2669   return new tools::hexagon::Linker(*this);
2670 }
2671 
AddClangSystemIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2672 void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2673                                                  ArgStringList &CC1Args) const {
2674   if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2675       DriverArgs.hasArg(options::OPT_nostdlibinc))
2676     return;
2677 
2678   const Driver &D = getDriver();
2679   std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2680                                               D.PrefixDirs);
2681   addExternCSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include");
2682 }
2683 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2684 void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2685     const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2686   if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2687       DriverArgs.hasArg(options::OPT_nostdincxx))
2688     return;
2689 
2690   const Driver &D = getDriver();
2691   std::string TargetDir = getHexagonTargetDir(D.InstalledDir, D.PrefixDirs);
2692   addSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include/c++");
2693 }
2694 
2695 ToolChain::CXXStdlibType
GetCXXStdlibType(const ArgList & Args) const2696 HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
2697   Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2698   if (!A)
2699     return ToolChain::CST_Libstdcxx;
2700 
2701   StringRef Value = A->getValue();
2702   if (Value != "libstdc++")
2703     getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
2704 
2705   return ToolChain::CST_Libstdcxx;
2706 }
2707 
2708 //
2709 // Returns the default CPU for Hexagon. This is the default compilation target
2710 // if no Hexagon processor is selected at the command-line.
2711 //
GetDefaultCPU()2712 const StringRef HexagonToolChain::GetDefaultCPU() {
2713   return "hexagonv60";
2714 }
2715 
GetTargetCPUVersion(const ArgList & Args)2716 const StringRef HexagonToolChain::GetTargetCPUVersion(const ArgList &Args) {
2717   Arg *CpuArg = nullptr;
2718 
2719   for (auto &A : Args) {
2720     if (A->getOption().matches(options::OPT_mcpu_EQ)) {
2721       CpuArg = A;
2722       A->claim();
2723     }
2724   }
2725 
2726   StringRef CPU = CpuArg ? CpuArg->getValue() : GetDefaultCPU();
2727   if (CPU.startswith("hexagon"))
2728     return CPU.substr(sizeof("hexagon") - 1);
2729   return CPU;
2730 }
2731 // End Hexagon
2732 
2733 /// AMDGPU Toolchain
AMDGPUToolChain(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2734 AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2735                                  const ArgList &Args)
2736   : Generic_ELF(D, Triple, Args) { }
2737 
buildLinker() const2738 Tool *AMDGPUToolChain::buildLinker() const {
2739   return new tools::amdgpu::Linker(*this);
2740 }
2741 // End AMDGPU
2742 
2743 /// NaCl Toolchain
NaClToolChain(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2744 NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2745                              const ArgList &Args)
2746     : Generic_ELF(D, Triple, Args) {
2747 
2748   // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2749   // default paths, and must instead only use the paths provided
2750   // with this toolchain based on architecture.
2751   path_list &file_paths = getFilePaths();
2752   path_list &prog_paths = getProgramPaths();
2753 
2754   file_paths.clear();
2755   prog_paths.clear();
2756 
2757   // Path for library files (libc.a, ...)
2758   std::string FilePath(getDriver().Dir + "/../");
2759 
2760   // Path for tools (clang, ld, etc..)
2761   std::string ProgPath(getDriver().Dir + "/../");
2762 
2763   // Path for toolchain libraries (libgcc.a, ...)
2764   std::string ToolPath(getDriver().ResourceDir + "/lib/");
2765 
2766   switch (Triple.getArch()) {
2767   case llvm::Triple::x86:
2768     file_paths.push_back(FilePath + "x86_64-nacl/lib32");
2769     file_paths.push_back(FilePath + "i686-nacl/usr/lib");
2770     prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2771     file_paths.push_back(ToolPath + "i686-nacl");
2772     break;
2773   case llvm::Triple::x86_64:
2774     file_paths.push_back(FilePath + "x86_64-nacl/lib");
2775     file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2776     prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2777     file_paths.push_back(ToolPath + "x86_64-nacl");
2778     break;
2779   case llvm::Triple::arm:
2780     file_paths.push_back(FilePath + "arm-nacl/lib");
2781     file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2782     prog_paths.push_back(ProgPath + "arm-nacl/bin");
2783     file_paths.push_back(ToolPath + "arm-nacl");
2784     break;
2785   case llvm::Triple::mipsel:
2786     file_paths.push_back(FilePath + "mipsel-nacl/lib");
2787     file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2788     prog_paths.push_back(ProgPath + "bin");
2789     file_paths.push_back(ToolPath + "mipsel-nacl");
2790     break;
2791   default:
2792     break;
2793   }
2794 
2795   NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2796 }
2797 
AddClangSystemIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2798 void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2799                                               ArgStringList &CC1Args) const {
2800   const Driver &D = getDriver();
2801   if (DriverArgs.hasArg(options::OPT_nostdinc))
2802     return;
2803 
2804   if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2805     SmallString<128> P(D.ResourceDir);
2806     llvm::sys::path::append(P, "include");
2807     addSystemInclude(DriverArgs, CC1Args, P.str());
2808   }
2809 
2810   if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2811     return;
2812 
2813   SmallString<128> P(D.Dir + "/../");
2814   switch (getTriple().getArch()) {
2815   case llvm::Triple::x86:
2816     // x86 is special because multilib style uses x86_64-nacl/include for libc
2817     // headers but the SDK wants i686-nacl/usr/include. The other architectures
2818     // have the same substring.
2819     llvm::sys::path::append(P, "i686-nacl/usr/include");
2820     addSystemInclude(DriverArgs, CC1Args, P.str());
2821     llvm::sys::path::remove_filename(P);
2822     llvm::sys::path::remove_filename(P);
2823     llvm::sys::path::remove_filename(P);
2824     llvm::sys::path::append(P, "x86_64-nacl/include");
2825     addSystemInclude(DriverArgs, CC1Args, P.str());
2826     return;
2827   case llvm::Triple::arm:
2828     llvm::sys::path::append(P, "arm-nacl/usr/include");
2829     break;
2830   case llvm::Triple::x86_64:
2831     llvm::sys::path::append(P, "x86_64-nacl/usr/include");
2832     break;
2833   case llvm::Triple::mipsel:
2834     llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2835     break;
2836   default:
2837     return;
2838   }
2839 
2840   addSystemInclude(DriverArgs, CC1Args, P.str());
2841   llvm::sys::path::remove_filename(P);
2842   llvm::sys::path::remove_filename(P);
2843   llvm::sys::path::append(P, "include");
2844   addSystemInclude(DriverArgs, CC1Args, P.str());
2845 }
2846 
AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const2847 void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2848                                         ArgStringList &CmdArgs) const {
2849   // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2850   // if the value is libc++, and emits an error for other values.
2851   GetCXXStdlibType(Args);
2852   CmdArgs.push_back("-lc++");
2853 }
2854 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2855 void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2856                                                  ArgStringList &CC1Args) const {
2857   const Driver &D = getDriver();
2858   if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2859       DriverArgs.hasArg(options::OPT_nostdincxx))
2860     return;
2861 
2862   // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2863   // if the value is libc++, and emits an error for other values.
2864   GetCXXStdlibType(DriverArgs);
2865 
2866   SmallString<128> P(D.Dir + "/../");
2867   switch (getTriple().getArch()) {
2868   case llvm::Triple::arm:
2869     llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2870     addSystemInclude(DriverArgs, CC1Args, P.str());
2871     break;
2872   case llvm::Triple::x86:
2873     llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2874     addSystemInclude(DriverArgs, CC1Args, P.str());
2875     break;
2876   case llvm::Triple::x86_64:
2877     llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2878     addSystemInclude(DriverArgs, CC1Args, P.str());
2879     break;
2880   case llvm::Triple::mipsel:
2881     llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2882     addSystemInclude(DriverArgs, CC1Args, P.str());
2883     break;
2884   default:
2885     break;
2886   }
2887 }
2888 
2889 ToolChain::CXXStdlibType
GetCXXStdlibType(const ArgList & Args) const2890 NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
2891   if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2892     StringRef Value = A->getValue();
2893     if (Value == "libc++")
2894       return ToolChain::CST_Libcxx;
2895     getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
2896   }
2897 
2898   return ToolChain::CST_Libcxx;
2899 }
2900 
2901 std::string
ComputeEffectiveClangTriple(const ArgList & Args,types::ID InputType) const2902 NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2903                                            types::ID InputType) const {
2904   llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2905   if (TheTriple.getArch() == llvm::Triple::arm &&
2906       TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2907     TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2908   return TheTriple.getTriple();
2909 }
2910 
buildLinker() const2911 Tool *NaClToolChain::buildLinker() const {
2912   return new tools::nacltools::Linker(*this);
2913 }
2914 
buildAssembler() const2915 Tool *NaClToolChain::buildAssembler() const {
2916   if (getTriple().getArch() == llvm::Triple::arm)
2917     return new tools::nacltools::AssemblerARM(*this);
2918   return new tools::gnutools::Assembler(*this);
2919 }
2920 // End NaCl
2921 
2922 /// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2923 /// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2924 /// Currently does not support anything else but compilation.
2925 
TCEToolChain(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2926 TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
2927                            const ArgList &Args)
2928     : ToolChain(D, Triple, Args) {
2929   // Path mangling to find libexec
2930   std::string Path(getDriver().Dir);
2931 
2932   Path += "/../libexec";
2933   getProgramPaths().push_back(Path);
2934 }
2935 
~TCEToolChain()2936 TCEToolChain::~TCEToolChain() {}
2937 
IsMathErrnoDefault() const2938 bool TCEToolChain::IsMathErrnoDefault() const { return true; }
2939 
isPICDefault() const2940 bool TCEToolChain::isPICDefault() const { return false; }
2941 
isPIEDefault() const2942 bool TCEToolChain::isPIEDefault() const { return false; }
2943 
isPICDefaultForced() const2944 bool TCEToolChain::isPICDefaultForced() const { return false; }
2945 
2946 // CloudABI - CloudABI tool chain which can call ld(1) directly.
2947 
CloudABI(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2948 CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2949                    const ArgList &Args)
2950     : Generic_ELF(D, Triple, Args) {
2951   SmallString<128> P(getDriver().Dir);
2952   llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2953   getFilePaths().push_back(P.str());
2954 }
2955 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2956 void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2957                                             ArgStringList &CC1Args) const {
2958   if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2959       DriverArgs.hasArg(options::OPT_nostdincxx))
2960     return;
2961 
2962   SmallString<128> P(getDriver().Dir);
2963   llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2964   addSystemInclude(DriverArgs, CC1Args, P.str());
2965 }
2966 
AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const2967 void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
2968                                    ArgStringList &CmdArgs) const {
2969   CmdArgs.push_back("-lc++");
2970   CmdArgs.push_back("-lc++abi");
2971   CmdArgs.push_back("-lunwind");
2972 }
2973 
buildLinker() const2974 Tool *CloudABI::buildLinker() const {
2975   return new tools::cloudabi::Linker(*this);
2976 }
2977 
2978 /// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
2979 
OpenBSD(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2980 OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
2981                  const ArgList &Args)
2982     : Generic_ELF(D, Triple, Args) {
2983   getFilePaths().push_back(getDriver().Dir + "/../lib");
2984   getFilePaths().push_back("/usr/lib");
2985 }
2986 
buildAssembler() const2987 Tool *OpenBSD::buildAssembler() const {
2988   return new tools::openbsd::Assembler(*this);
2989 }
2990 
buildLinker() const2991 Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
2992 
2993 /// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
2994 
Bitrig(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2995 Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2996     : Generic_ELF(D, Triple, Args) {
2997   getFilePaths().push_back(getDriver().Dir + "/../lib");
2998   getFilePaths().push_back("/usr/lib");
2999 }
3000 
buildAssembler() const3001 Tool *Bitrig::buildAssembler() const {
3002   return new tools::bitrig::Assembler(*this);
3003 }
3004 
buildLinker() const3005 Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
3006 
GetCXXStdlibType(const ArgList & Args) const3007 ToolChain::CXXStdlibType Bitrig::GetCXXStdlibType(const ArgList &Args) const {
3008   if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3009     StringRef Value = A->getValue();
3010     if (Value == "libstdc++")
3011       return ToolChain::CST_Libstdcxx;
3012     if (Value == "libc++")
3013       return ToolChain::CST_Libcxx;
3014 
3015     getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
3016   }
3017   return ToolChain::CST_Libcxx;
3018 }
3019 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const3020 void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3021                                           ArgStringList &CC1Args) const {
3022   if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3023       DriverArgs.hasArg(options::OPT_nostdincxx))
3024     return;
3025 
3026   switch (GetCXXStdlibType(DriverArgs)) {
3027   case ToolChain::CST_Libcxx:
3028     addSystemInclude(DriverArgs, CC1Args,
3029                      getDriver().SysRoot + "/usr/include/c++/v1");
3030     break;
3031   case ToolChain::CST_Libstdcxx:
3032     addSystemInclude(DriverArgs, CC1Args,
3033                      getDriver().SysRoot + "/usr/include/c++/stdc++");
3034     addSystemInclude(DriverArgs, CC1Args,
3035                      getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
3036 
3037     StringRef Triple = getTriple().str();
3038     if (Triple.startswith("amd64"))
3039       addSystemInclude(DriverArgs, CC1Args,
3040                        getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
3041                            Triple.substr(5));
3042     else
3043       addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
3044                                                 "/usr/include/c++/stdc++/" +
3045                                                 Triple);
3046     break;
3047   }
3048 }
3049 
AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const3050 void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
3051                                  ArgStringList &CmdArgs) const {
3052   switch (GetCXXStdlibType(Args)) {
3053   case ToolChain::CST_Libcxx:
3054     CmdArgs.push_back("-lc++");
3055     CmdArgs.push_back("-lc++abi");
3056     CmdArgs.push_back("-lpthread");
3057     break;
3058   case ToolChain::CST_Libstdcxx:
3059     CmdArgs.push_back("-lstdc++");
3060     break;
3061   }
3062 }
3063 
3064 /// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
3065 
FreeBSD(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)3066 FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
3067                  const ArgList &Args)
3068     : Generic_ELF(D, Triple, Args) {
3069 
3070   // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
3071   // back to '/usr/lib' if it doesn't exist.
3072   if ((Triple.getArch() == llvm::Triple::x86 ||
3073        Triple.getArch() == llvm::Triple::ppc) &&
3074       D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
3075     getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
3076   else
3077     getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
3078 }
3079 
GetCXXStdlibType(const ArgList & Args) const3080 ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
3081   if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3082     StringRef Value = A->getValue();
3083     if (Value == "libstdc++")
3084       return ToolChain::CST_Libstdcxx;
3085     if (Value == "libc++")
3086       return ToolChain::CST_Libcxx;
3087 
3088     getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
3089   }
3090   if (getTriple().getOSMajorVersion() >= 10)
3091     return ToolChain::CST_Libcxx;
3092   return ToolChain::CST_Libstdcxx;
3093 }
3094 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const3095 void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3096                                            ArgStringList &CC1Args) const {
3097   if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3098       DriverArgs.hasArg(options::OPT_nostdincxx))
3099     return;
3100 
3101   switch (GetCXXStdlibType(DriverArgs)) {
3102   case ToolChain::CST_Libcxx:
3103     addSystemInclude(DriverArgs, CC1Args,
3104                      getDriver().SysRoot + "/usr/include/c++/v1");
3105     break;
3106   case ToolChain::CST_Libstdcxx:
3107     addSystemInclude(DriverArgs, CC1Args,
3108                      getDriver().SysRoot + "/usr/include/c++/4.2");
3109     addSystemInclude(DriverArgs, CC1Args,
3110                      getDriver().SysRoot + "/usr/include/c++/4.2/backward");
3111     break;
3112   }
3113 }
3114 
buildAssembler() const3115 Tool *FreeBSD::buildAssembler() const {
3116   return new tools::freebsd::Assembler(*this);
3117 }
3118 
buildLinker() const3119 Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
3120 
UseSjLjExceptions(const ArgList & Args) const3121 bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
3122   // FreeBSD uses SjLj exceptions on ARM oabi.
3123   switch (getTriple().getEnvironment()) {
3124   case llvm::Triple::GNUEABIHF:
3125   case llvm::Triple::GNUEABI:
3126   case llvm::Triple::EABI:
3127     return false;
3128 
3129   default:
3130     return (getTriple().getArch() == llvm::Triple::arm ||
3131             getTriple().getArch() == llvm::Triple::thumb);
3132   }
3133 }
3134 
HasNativeLLVMSupport() const3135 bool FreeBSD::HasNativeLLVMSupport() const { return true; }
3136 
isPIEDefault() const3137 bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
3138 
getSupportedSanitizers() const3139 SanitizerMask FreeBSD::getSupportedSanitizers() const {
3140   const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3141   const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3142   const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3143                         getTriple().getArch() == llvm::Triple::mips64el;
3144   SanitizerMask Res = ToolChain::getSupportedSanitizers();
3145   Res |= SanitizerKind::Address;
3146   Res |= SanitizerKind::Vptr;
3147   if (IsX86_64 || IsMIPS64) {
3148     Res |= SanitizerKind::Leak;
3149     Res |= SanitizerKind::Thread;
3150   }
3151   if (IsX86 || IsX86_64) {
3152     Res |= SanitizerKind::SafeStack;
3153   }
3154   return Res;
3155 }
3156 
3157 /// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3158 
NetBSD(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)3159 NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3160     : Generic_ELF(D, Triple, Args) {
3161 
3162   if (getDriver().UseStdLib) {
3163     // When targeting a 32-bit platform, try the special directory used on
3164     // 64-bit hosts, and only fall back to the main library directory if that
3165     // doesn't work.
3166     // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3167     // what all logic is needed to emulate the '=' prefix here.
3168     switch (Triple.getArch()) {
3169     case llvm::Triple::x86:
3170       getFilePaths().push_back("=/usr/lib/i386");
3171       break;
3172     case llvm::Triple::arm:
3173     case llvm::Triple::armeb:
3174     case llvm::Triple::thumb:
3175     case llvm::Triple::thumbeb:
3176       switch (Triple.getEnvironment()) {
3177       case llvm::Triple::EABI:
3178       case llvm::Triple::GNUEABI:
3179         getFilePaths().push_back("=/usr/lib/eabi");
3180         break;
3181       case llvm::Triple::EABIHF:
3182       case llvm::Triple::GNUEABIHF:
3183         getFilePaths().push_back("=/usr/lib/eabihf");
3184         break;
3185       default:
3186         getFilePaths().push_back("=/usr/lib/oabi");
3187         break;
3188       }
3189       break;
3190     case llvm::Triple::mips64:
3191     case llvm::Triple::mips64el:
3192       if (tools::mips::hasMipsAbiArg(Args, "o32"))
3193         getFilePaths().push_back("=/usr/lib/o32");
3194       else if (tools::mips::hasMipsAbiArg(Args, "64"))
3195         getFilePaths().push_back("=/usr/lib/64");
3196       break;
3197     case llvm::Triple::ppc:
3198       getFilePaths().push_back("=/usr/lib/powerpc");
3199       break;
3200     case llvm::Triple::sparc:
3201       getFilePaths().push_back("=/usr/lib/sparc");
3202       break;
3203     default:
3204       break;
3205     }
3206 
3207     getFilePaths().push_back("=/usr/lib");
3208   }
3209 }
3210 
buildAssembler() const3211 Tool *NetBSD::buildAssembler() const {
3212   return new tools::netbsd::Assembler(*this);
3213 }
3214 
buildLinker() const3215 Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
3216 
GetCXXStdlibType(const ArgList & Args) const3217 ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
3218   if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3219     StringRef Value = A->getValue();
3220     if (Value == "libstdc++")
3221       return ToolChain::CST_Libstdcxx;
3222     if (Value == "libc++")
3223       return ToolChain::CST_Libcxx;
3224 
3225     getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
3226   }
3227 
3228   unsigned Major, Minor, Micro;
3229   getTriple().getOSVersion(Major, Minor, Micro);
3230   if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
3231     switch (getArch()) {
3232     case llvm::Triple::aarch64:
3233     case llvm::Triple::arm:
3234     case llvm::Triple::armeb:
3235     case llvm::Triple::thumb:
3236     case llvm::Triple::thumbeb:
3237     case llvm::Triple::ppc:
3238     case llvm::Triple::ppc64:
3239     case llvm::Triple::ppc64le:
3240     case llvm::Triple::x86:
3241     case llvm::Triple::x86_64:
3242       return ToolChain::CST_Libcxx;
3243     default:
3244       break;
3245     }
3246   }
3247   return ToolChain::CST_Libstdcxx;
3248 }
3249 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const3250 void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3251                                           ArgStringList &CC1Args) const {
3252   if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3253       DriverArgs.hasArg(options::OPT_nostdincxx))
3254     return;
3255 
3256   switch (GetCXXStdlibType(DriverArgs)) {
3257   case ToolChain::CST_Libcxx:
3258     addSystemInclude(DriverArgs, CC1Args,
3259                      getDriver().SysRoot + "/usr/include/c++/");
3260     break;
3261   case ToolChain::CST_Libstdcxx:
3262     addSystemInclude(DriverArgs, CC1Args,
3263                      getDriver().SysRoot + "/usr/include/g++");
3264     addSystemInclude(DriverArgs, CC1Args,
3265                      getDriver().SysRoot + "/usr/include/g++/backward");
3266     break;
3267   }
3268 }
3269 
3270 /// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3271 
Minix(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)3272 Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3273     : Generic_ELF(D, Triple, Args) {
3274   getFilePaths().push_back(getDriver().Dir + "/../lib");
3275   getFilePaths().push_back("/usr/lib");
3276 }
3277 
buildAssembler() const3278 Tool *Minix::buildAssembler() const {
3279   return new tools::minix::Assembler(*this);
3280 }
3281 
buildLinker() const3282 Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
3283 
addPathIfExists(const Driver & D,const Twine & Path,ToolChain::path_list & Paths)3284 static void addPathIfExists(const Driver &D, const Twine &Path,
3285                             ToolChain::path_list &Paths) {
3286   if (D.getVFS().exists(Path))
3287     Paths.push_back(Path.str());
3288 }
3289 
3290 /// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3291 
Solaris(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)3292 Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
3293                  const ArgList &Args)
3294     : Generic_GCC(D, Triple, Args) {
3295 
3296   GCCInstallation.init(Triple, Args);
3297 
3298   path_list &Paths = getFilePaths();
3299   if (GCCInstallation.isValid())
3300     addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
3301 
3302   addPathIfExists(D, getDriver().getInstalledDir(), Paths);
3303   if (getDriver().getInstalledDir() != getDriver().Dir)
3304     addPathIfExists(D, getDriver().Dir, Paths);
3305 
3306   addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
3307 
3308   std::string LibPath = "/usr/lib/";
3309   switch (Triple.getArch()) {
3310   case llvm::Triple::x86:
3311   case llvm::Triple::sparc:
3312     break;
3313   case llvm::Triple::x86_64:
3314     LibPath += "amd64/";
3315     break;
3316   case llvm::Triple::sparcv9:
3317     LibPath += "sparcv9/";
3318     break;
3319   default:
3320     llvm_unreachable("Unsupported architecture");
3321   }
3322 
3323   addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
3324 }
3325 
buildAssembler() const3326 Tool *Solaris::buildAssembler() const {
3327   return new tools::solaris::Assembler(*this);
3328 }
3329 
buildLinker() const3330 Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
3331 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const3332 void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3333                                            ArgStringList &CC1Args) const {
3334   if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3335       DriverArgs.hasArg(options::OPT_nostdincxx))
3336     return;
3337 
3338   // Include the support directory for things like xlocale and fudged system
3339   // headers.
3340   addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3341 
3342   if (GCCInstallation.isValid()) {
3343     GCCVersion Version = GCCInstallation.getVersion();
3344     addSystemInclude(DriverArgs, CC1Args,
3345                      getDriver().SysRoot + "/usr/gcc/" +
3346                      Version.MajorStr + "." +
3347                      Version.MinorStr +
3348                      "/include/c++/" + Version.Text);
3349     addSystemInclude(DriverArgs, CC1Args,
3350                      getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3351                      "." + Version.MinorStr + "/include/c++/" +
3352                      Version.Text + "/" +
3353                      GCCInstallation.getTriple().str());
3354   }
3355 }
3356 
3357 /// Distribution (very bare-bones at the moment).
3358 
3359 enum Distro {
3360   // NB: Releases of a particular Linux distro should be kept together
3361   // in this enum, because some tests are done by integer comparison against
3362   // the first and last known member in the family, e.g. IsRedHat().
3363   ArchLinux,
3364   DebianLenny,
3365   DebianSqueeze,
3366   DebianWheezy,
3367   DebianJessie,
3368   DebianStretch,
3369   Exherbo,
3370   RHEL4,
3371   RHEL5,
3372   RHEL6,
3373   RHEL7,
3374   Fedora,
3375   OpenSUSE,
3376   UbuntuHardy,
3377   UbuntuIntrepid,
3378   UbuntuJaunty,
3379   UbuntuKarmic,
3380   UbuntuLucid,
3381   UbuntuMaverick,
3382   UbuntuNatty,
3383   UbuntuOneiric,
3384   UbuntuPrecise,
3385   UbuntuQuantal,
3386   UbuntuRaring,
3387   UbuntuSaucy,
3388   UbuntuTrusty,
3389   UbuntuUtopic,
3390   UbuntuVivid,
3391   UbuntuWily,
3392   UbuntuXenial,
3393   UnknownDistro
3394 };
3395 
IsRedhat(enum Distro Distro)3396 static bool IsRedhat(enum Distro Distro) {
3397   return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
3398 }
3399 
IsOpenSUSE(enum Distro Distro)3400 static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
3401 
IsDebian(enum Distro Distro)3402 static bool IsDebian(enum Distro Distro) {
3403   return Distro >= DebianLenny && Distro <= DebianStretch;
3404 }
3405 
IsUbuntu(enum Distro Distro)3406 static bool IsUbuntu(enum Distro Distro) {
3407   return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
3408 }
3409 
DetectDistro(const Driver & D,llvm::Triple::ArchType Arch)3410 static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
3411   llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3412       llvm::MemoryBuffer::getFile("/etc/lsb-release");
3413   if (File) {
3414     StringRef Data = File.get()->getBuffer();
3415     SmallVector<StringRef, 16> Lines;
3416     Data.split(Lines, "\n");
3417     Distro Version = UnknownDistro;
3418     for (StringRef Line : Lines)
3419       if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3420         Version = llvm::StringSwitch<Distro>(Line.substr(17))
3421                       .Case("hardy", UbuntuHardy)
3422                       .Case("intrepid", UbuntuIntrepid)
3423                       .Case("jaunty", UbuntuJaunty)
3424                       .Case("karmic", UbuntuKarmic)
3425                       .Case("lucid", UbuntuLucid)
3426                       .Case("maverick", UbuntuMaverick)
3427                       .Case("natty", UbuntuNatty)
3428                       .Case("oneiric", UbuntuOneiric)
3429                       .Case("precise", UbuntuPrecise)
3430                       .Case("quantal", UbuntuQuantal)
3431                       .Case("raring", UbuntuRaring)
3432                       .Case("saucy", UbuntuSaucy)
3433                       .Case("trusty", UbuntuTrusty)
3434                       .Case("utopic", UbuntuUtopic)
3435                       .Case("vivid", UbuntuVivid)
3436                       .Case("wily", UbuntuWily)
3437                       .Case("xenial", UbuntuXenial)
3438                       .Default(UnknownDistro);
3439     return Version;
3440   }
3441 
3442   File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3443   if (File) {
3444     StringRef Data = File.get()->getBuffer();
3445     if (Data.startswith("Fedora release"))
3446       return Fedora;
3447     if (Data.startswith("Red Hat Enterprise Linux") ||
3448         Data.startswith("CentOS")) {
3449       if (Data.find("release 7") != StringRef::npos)
3450         return RHEL7;
3451       else if (Data.find("release 6") != StringRef::npos)
3452         return RHEL6;
3453       else if (Data.find("release 5") != StringRef::npos)
3454         return RHEL5;
3455       else if (Data.find("release 4") != StringRef::npos)
3456         return RHEL4;
3457     }
3458     return UnknownDistro;
3459   }
3460 
3461   File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3462   if (File) {
3463     StringRef Data = File.get()->getBuffer();
3464     if (Data[0] == '5')
3465       return DebianLenny;
3466     else if (Data.startswith("squeeze/sid") || Data[0] == '6')
3467       return DebianSqueeze;
3468     else if (Data.startswith("wheezy/sid") || Data[0] == '7')
3469       return DebianWheezy;
3470     else if (Data.startswith("jessie/sid") || Data[0] == '8')
3471       return DebianJessie;
3472     else if (Data.startswith("stretch/sid") || Data[0] == '9')
3473       return DebianStretch;
3474     return UnknownDistro;
3475   }
3476 
3477   if (D.getVFS().exists("/etc/SuSE-release"))
3478     return OpenSUSE;
3479 
3480   if (D.getVFS().exists("/etc/exherbo-release"))
3481     return Exherbo;
3482 
3483   if (D.getVFS().exists("/etc/arch-release"))
3484     return ArchLinux;
3485 
3486   return UnknownDistro;
3487 }
3488 
3489 /// \brief Get our best guess at the multiarch triple for a target.
3490 ///
3491 /// Debian-based systems are starting to use a multiarch setup where they use
3492 /// a target-triple directory in the library and header search paths.
3493 /// Unfortunately, this triple does not align with the vanilla target triple,
3494 /// so we provide a rough mapping here.
getMultiarchTriple(const Driver & D,const llvm::Triple & TargetTriple,StringRef SysRoot)3495 static std::string getMultiarchTriple(const Driver &D,
3496                                       const llvm::Triple &TargetTriple,
3497                                       StringRef SysRoot) {
3498   llvm::Triple::EnvironmentType TargetEnvironment =
3499       TargetTriple.getEnvironment();
3500 
3501   // For most architectures, just use whatever we have rather than trying to be
3502   // clever.
3503   switch (TargetTriple.getArch()) {
3504   default:
3505     break;
3506 
3507   // We use the existence of '/lib/<triple>' as a directory to detect some
3508   // common linux triples that don't quite match the Clang triple for both
3509   // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3510   // regardless of what the actual target triple is.
3511   case llvm::Triple::arm:
3512   case llvm::Triple::thumb:
3513     if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
3514       if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
3515         return "arm-linux-gnueabihf";
3516     } else {
3517       if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
3518         return "arm-linux-gnueabi";
3519     }
3520     break;
3521   case llvm::Triple::armeb:
3522   case llvm::Triple::thumbeb:
3523     if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
3524       if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
3525         return "armeb-linux-gnueabihf";
3526     } else {
3527       if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
3528         return "armeb-linux-gnueabi";
3529     }
3530     break;
3531   case llvm::Triple::x86:
3532     if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
3533       return "i386-linux-gnu";
3534     break;
3535   case llvm::Triple::x86_64:
3536     // We don't want this for x32, otherwise it will match x86_64 libs
3537     if (TargetEnvironment != llvm::Triple::GNUX32 &&
3538         D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
3539       return "x86_64-linux-gnu";
3540     break;
3541   case llvm::Triple::aarch64:
3542     if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
3543       return "aarch64-linux-gnu";
3544     break;
3545   case llvm::Triple::aarch64_be:
3546     if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
3547       return "aarch64_be-linux-gnu";
3548     break;
3549   case llvm::Triple::mips:
3550     if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
3551       return "mips-linux-gnu";
3552     break;
3553   case llvm::Triple::mipsel:
3554     if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
3555       return "mipsel-linux-gnu";
3556     break;
3557   case llvm::Triple::mips64:
3558     if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
3559       return "mips64-linux-gnu";
3560     if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
3561       return "mips64-linux-gnuabi64";
3562     break;
3563   case llvm::Triple::mips64el:
3564     if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
3565       return "mips64el-linux-gnu";
3566     if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
3567       return "mips64el-linux-gnuabi64";
3568     break;
3569   case llvm::Triple::ppc:
3570     if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
3571       return "powerpc-linux-gnuspe";
3572     if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
3573       return "powerpc-linux-gnu";
3574     break;
3575   case llvm::Triple::ppc64:
3576     if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
3577       return "powerpc64-linux-gnu";
3578     break;
3579   case llvm::Triple::ppc64le:
3580     if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
3581       return "powerpc64le-linux-gnu";
3582     break;
3583   case llvm::Triple::sparc:
3584     if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
3585       return "sparc-linux-gnu";
3586     break;
3587   case llvm::Triple::sparcv9:
3588     if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
3589       return "sparc64-linux-gnu";
3590     break;
3591   case llvm::Triple::systemz:
3592     if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
3593       return "s390x-linux-gnu";
3594     break;
3595   }
3596   return TargetTriple.str();
3597 }
3598 
getOSLibDir(const llvm::Triple & Triple,const ArgList & Args)3599 static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
3600   if (isMipsArch(Triple.getArch())) {
3601     // lib32 directory has a special meaning on MIPS targets.
3602     // It contains N32 ABI binaries. Use this folder if produce
3603     // code for N32 ABI only.
3604     if (tools::mips::hasMipsAbiArg(Args, "n32"))
3605       return "lib32";
3606     return Triple.isArch32Bit() ? "lib" : "lib64";
3607   }
3608 
3609   // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
3610   // using that variant while targeting other architectures causes problems
3611   // because the libraries are laid out in shared system roots that can't cope
3612   // with a 'lib32' library search path being considered. So we only enable
3613   // them when we know we may need it.
3614   //
3615   // FIXME: This is a bit of a hack. We should really unify this code for
3616   // reasoning about oslibdir spellings with the lib dir spellings in the
3617   // GCCInstallationDetector, but that is a more significant refactoring.
3618   if (Triple.getArch() == llvm::Triple::x86 ||
3619       Triple.getArch() == llvm::Triple::ppc)
3620     return "lib32";
3621 
3622   if (Triple.getArch() == llvm::Triple::x86_64 &&
3623       Triple.getEnvironment() == llvm::Triple::GNUX32)
3624     return "libx32";
3625 
3626   return Triple.isArch32Bit() ? "lib" : "lib64";
3627 }
3628 
Linux(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)3629 Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3630     : Generic_ELF(D, Triple, Args) {
3631   GCCInstallation.init(Triple, Args);
3632   CudaInstallation.init(Triple, Args);
3633   Multilibs = GCCInstallation.getMultilibs();
3634   llvm::Triple::ArchType Arch = Triple.getArch();
3635   std::string SysRoot = computeSysRoot();
3636 
3637   // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
3638   // least) put various tools in a triple-prefixed directory off of the parent
3639   // of the GCC installation. We use the GCC triple here to ensure that we end
3640   // up with tools that support the same amount of cross compiling as the
3641   // detected GCC installation. For example, if we find a GCC installation
3642   // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3643   // used to target i386.
3644   // FIXME: This seems unlikely to be Linux-specific.
3645   ToolChain::path_list &PPaths = getProgramPaths();
3646   PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
3647                          GCCInstallation.getTriple().str() + "/bin")
3648                        .str());
3649 
3650   Distro Distro = DetectDistro(D, Arch);
3651 
3652   if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
3653     ExtraOpts.push_back("-z");
3654     ExtraOpts.push_back("relro");
3655   }
3656 
3657   if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
3658     ExtraOpts.push_back("-X");
3659 
3660   const bool IsAndroid = Triple.isAndroid();
3661   const bool IsMips = isMipsArch(Arch);
3662 
3663   if (IsMips && !SysRoot.empty())
3664     ExtraOpts.push_back("--sysroot=" + SysRoot);
3665 
3666   // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3667   // and the MIPS ABI require .dynsym to be sorted in different ways.
3668   // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3669   // ABI requires a mapping between the GOT and the symbol table.
3670   // Android loader does not support .gnu.hash.
3671   if (!IsMips && !IsAndroid) {
3672     if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
3673         (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
3674       ExtraOpts.push_back("--hash-style=gnu");
3675 
3676     if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
3677         Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3678       ExtraOpts.push_back("--hash-style=both");
3679   }
3680 
3681   if (IsRedhat(Distro))
3682     ExtraOpts.push_back("--no-add-needed");
3683 
3684   if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
3685       (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
3686       (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
3687     ExtraOpts.push_back("--build-id");
3688 
3689   if (IsOpenSUSE(Distro))
3690     ExtraOpts.push_back("--enable-new-dtags");
3691 
3692   // The selection of paths to try here is designed to match the patterns which
3693   // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3694   // This was determined by running GCC in a fake filesystem, creating all
3695   // possible permutations of these directories, and seeing which ones it added
3696   // to the link paths.
3697   path_list &Paths = getFilePaths();
3698 
3699   const std::string OSLibDir = getOSLibDir(Triple, Args);
3700   const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
3701 
3702   // Add the multilib suffixed paths where they are available.
3703   if (GCCInstallation.isValid()) {
3704     const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3705     const std::string &LibPath = GCCInstallation.getParentLibPath();
3706     const Multilib &Multilib = GCCInstallation.getMultilib();
3707 
3708     // Sourcery CodeBench MIPS toolchain holds some libraries under
3709     // a biarch-like suffix of the GCC installation.
3710     addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
3711                     Paths);
3712 
3713     // GCC cross compiling toolchains will install target libraries which ship
3714     // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3715     // any part of the GCC installation in
3716     // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3717     // debatable, but is the reality today. We need to search this tree even
3718     // when we have a sysroot somewhere else. It is the responsibility of
3719     // whomever is doing the cross build targeting a sysroot using a GCC
3720     // installation that is *not* within the system root to ensure two things:
3721     //
3722     //  1) Any DSOs that are linked in from this tree or from the install path
3723     //     above must be present on the system root and found via an
3724     //     appropriate rpath.
3725     //  2) There must not be libraries installed into
3726     //     <prefix>/<triple>/<libdir> unless they should be preferred over
3727     //     those within the system root.
3728     //
3729     // Note that this matches the GCC behavior. See the below comment for where
3730     // Clang diverges from GCC's behavior.
3731     addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
3732                            OSLibDir + Multilib.osSuffix(),
3733                     Paths);
3734 
3735     // If the GCC installation we found is inside of the sysroot, we want to
3736     // prefer libraries installed in the parent prefix of the GCC installation.
3737     // It is important to *not* use these paths when the GCC installation is
3738     // outside of the system root as that can pick up unintended libraries.
3739     // This usually happens when there is an external cross compiler on the
3740     // host system, and a more minimal sysroot available that is the target of
3741     // the cross. Note that GCC does include some of these directories in some
3742     // configurations but this seems somewhere between questionable and simply
3743     // a bug.
3744     if (StringRef(LibPath).startswith(SysRoot)) {
3745       addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
3746       addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
3747     }
3748   }
3749 
3750   // Similar to the logic for GCC above, if we currently running Clang inside
3751   // of the requested system root, add its parent library paths to
3752   // those searched.
3753   // FIXME: It's not clear whether we should use the driver's installed
3754   // directory ('Dir' below) or the ResourceDir.
3755   if (StringRef(D.Dir).startswith(SysRoot)) {
3756     addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
3757     addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
3758   }
3759 
3760   addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
3761   addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
3762   addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3763   addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
3764 
3765   // Try walking via the GCC triple path in case of biarch or multiarch GCC
3766   // installations with strange symlinks.
3767   if (GCCInstallation.isValid()) {
3768     addPathIfExists(D,
3769                     SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
3770                         "/../../" + OSLibDir,
3771                     Paths);
3772 
3773     // Add the 'other' biarch variant path
3774     Multilib BiarchSibling;
3775     if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
3776       addPathIfExists(D, GCCInstallation.getInstallPath() +
3777                              BiarchSibling.gccSuffix(),
3778                       Paths);
3779     }
3780 
3781     // See comments above on the multilib variant for details of why this is
3782     // included even from outside the sysroot.
3783     const std::string &LibPath = GCCInstallation.getParentLibPath();
3784     const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3785     const Multilib &Multilib = GCCInstallation.getMultilib();
3786     addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
3787                            Multilib.osSuffix(),
3788                     Paths);
3789 
3790     // See comments above on the multilib variant for details of why this is
3791     // only included from within the sysroot.
3792     if (StringRef(LibPath).startswith(SysRoot))
3793       addPathIfExists(D, LibPath, Paths);
3794   }
3795 
3796   // Similar to the logic for GCC above, if we are currently running Clang
3797   // inside of the requested system root, add its parent library path to those
3798   // searched.
3799   // FIXME: It's not clear whether we should use the driver's installed
3800   // directory ('Dir' below) or the ResourceDir.
3801   if (StringRef(D.Dir).startswith(SysRoot))
3802     addPathIfExists(D, D.Dir + "/../lib", Paths);
3803 
3804   addPathIfExists(D, SysRoot + "/lib", Paths);
3805   addPathIfExists(D, SysRoot + "/usr/lib", Paths);
3806 }
3807 
HasNativeLLVMSupport() const3808 bool Linux::HasNativeLLVMSupport() const { return true; }
3809 
buildLinker() const3810 Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
3811 
buildAssembler() const3812 Tool *Linux::buildAssembler() const {
3813   return new tools::gnutools::Assembler(*this);
3814 }
3815 
computeSysRoot() const3816 std::string Linux::computeSysRoot() const {
3817   if (!getDriver().SysRoot.empty())
3818     return getDriver().SysRoot;
3819 
3820   if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3821     return std::string();
3822 
3823   // Standalone MIPS toolchains use different names for sysroot folder
3824   // and put it into different places. Here we try to check some known
3825   // variants.
3826 
3827   const StringRef InstallDir = GCCInstallation.getInstallPath();
3828   const StringRef TripleStr = GCCInstallation.getTriple().str();
3829   const Multilib &Multilib = GCCInstallation.getMultilib();
3830 
3831   std::string Path =
3832       (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3833           .str();
3834 
3835   if (getVFS().exists(Path))
3836     return Path;
3837 
3838   Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
3839 
3840   if (getVFS().exists(Path))
3841     return Path;
3842 
3843   return std::string();
3844 }
3845 
AddClangSystemIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const3846 void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3847                                       ArgStringList &CC1Args) const {
3848   const Driver &D = getDriver();
3849   std::string SysRoot = computeSysRoot();
3850 
3851   if (DriverArgs.hasArg(options::OPT_nostdinc))
3852     return;
3853 
3854   if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
3855     addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
3856 
3857   if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
3858     SmallString<128> P(D.ResourceDir);
3859     llvm::sys::path::append(P, "include");
3860     addSystemInclude(DriverArgs, CC1Args, P);
3861   }
3862 
3863   if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3864     return;
3865 
3866   // Check for configure-time C include directories.
3867   StringRef CIncludeDirs(C_INCLUDE_DIRS);
3868   if (CIncludeDirs != "") {
3869     SmallVector<StringRef, 5> dirs;
3870     CIncludeDirs.split(dirs, ":");
3871     for (StringRef dir : dirs) {
3872       StringRef Prefix =
3873           llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
3874       addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
3875     }
3876     return;
3877   }
3878 
3879   // Lacking those, try to detect the correct set of system includes for the
3880   // target triple.
3881 
3882   // Add include directories specific to the selected multilib set and multilib.
3883   if (GCCInstallation.isValid()) {
3884     const auto &Callback = Multilibs.includeDirsCallback();
3885     if (Callback) {
3886       const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3887                                          GCCInstallation.getTriple().str(),
3888                                          GCCInstallation.getMultilib());
3889       for (const auto &Path : IncludePaths)
3890         addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3891     }
3892   }
3893 
3894   // Implement generic Debian multiarch support.
3895   const StringRef X86_64MultiarchIncludeDirs[] = {
3896       "/usr/include/x86_64-linux-gnu",
3897 
3898       // FIXME: These are older forms of multiarch. It's not clear that they're
3899       // in use in any released version of Debian, so we should consider
3900       // removing them.
3901       "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
3902   const StringRef X86MultiarchIncludeDirs[] = {
3903       "/usr/include/i386-linux-gnu",
3904 
3905       // FIXME: These are older forms of multiarch. It's not clear that they're
3906       // in use in any released version of Debian, so we should consider
3907       // removing them.
3908       "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3909       "/usr/include/i486-linux-gnu"};
3910   const StringRef AArch64MultiarchIncludeDirs[] = {
3911       "/usr/include/aarch64-linux-gnu"};
3912   const StringRef ARMMultiarchIncludeDirs[] = {
3913       "/usr/include/arm-linux-gnueabi"};
3914   const StringRef ARMHFMultiarchIncludeDirs[] = {
3915       "/usr/include/arm-linux-gnueabihf"};
3916   const StringRef ARMEBMultiarchIncludeDirs[] = {
3917       "/usr/include/armeb-linux-gnueabi"};
3918   const StringRef ARMEBHFMultiarchIncludeDirs[] = {
3919       "/usr/include/armeb-linux-gnueabihf"};
3920   const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
3921   const StringRef MIPSELMultiarchIncludeDirs[] = {
3922       "/usr/include/mipsel-linux-gnu"};
3923   const StringRef MIPS64MultiarchIncludeDirs[] = {
3924       "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
3925   const StringRef MIPS64ELMultiarchIncludeDirs[] = {
3926       "/usr/include/mips64el-linux-gnu",
3927       "/usr/include/mips64el-linux-gnuabi64"};
3928   const StringRef PPCMultiarchIncludeDirs[] = {
3929       "/usr/include/powerpc-linux-gnu"};
3930   const StringRef PPC64MultiarchIncludeDirs[] = {
3931       "/usr/include/powerpc64-linux-gnu"};
3932   const StringRef PPC64LEMultiarchIncludeDirs[] = {
3933       "/usr/include/powerpc64le-linux-gnu"};
3934   const StringRef SparcMultiarchIncludeDirs[] = {
3935       "/usr/include/sparc-linux-gnu"};
3936   const StringRef Sparc64MultiarchIncludeDirs[] = {
3937       "/usr/include/sparc64-linux-gnu"};
3938   const StringRef SYSTEMZMultiarchIncludeDirs[] = {
3939       "/usr/include/s390x-linux-gnu"};
3940   ArrayRef<StringRef> MultiarchIncludeDirs;
3941   switch (getTriple().getArch()) {
3942   case llvm::Triple::x86_64:
3943     MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
3944     break;
3945   case llvm::Triple::x86:
3946     MultiarchIncludeDirs = X86MultiarchIncludeDirs;
3947     break;
3948   case llvm::Triple::aarch64:
3949   case llvm::Triple::aarch64_be:
3950     MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
3951     break;
3952   case llvm::Triple::arm:
3953   case llvm::Triple::thumb:
3954     if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3955       MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3956     else
3957       MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
3958     break;
3959   case llvm::Triple::armeb:
3960   case llvm::Triple::thumbeb:
3961     if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3962       MultiarchIncludeDirs = ARMEBHFMultiarchIncludeDirs;
3963     else
3964       MultiarchIncludeDirs = ARMEBMultiarchIncludeDirs;
3965     break;
3966   case llvm::Triple::mips:
3967     MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
3968     break;
3969   case llvm::Triple::mipsel:
3970     MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
3971     break;
3972   case llvm::Triple::mips64:
3973     MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
3974     break;
3975   case llvm::Triple::mips64el:
3976     MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
3977     break;
3978   case llvm::Triple::ppc:
3979     MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
3980     break;
3981   case llvm::Triple::ppc64:
3982     MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
3983     break;
3984   case llvm::Triple::ppc64le:
3985     MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
3986     break;
3987   case llvm::Triple::sparc:
3988     MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
3989     break;
3990   case llvm::Triple::sparcv9:
3991     MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
3992     break;
3993   case llvm::Triple::systemz:
3994     MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
3995     break;
3996   default:
3997     break;
3998   }
3999   for (StringRef Dir : MultiarchIncludeDirs) {
4000     if (D.getVFS().exists(SysRoot + Dir)) {
4001       addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
4002       break;
4003     }
4004   }
4005 
4006   if (getTriple().getOS() == llvm::Triple::RTEMS)
4007     return;
4008 
4009   // Add an include of '/include' directly. This isn't provided by default by
4010   // system GCCs, but is often used with cross-compiling GCCs, and harmless to
4011   // add even when Clang is acting as-if it were a system compiler.
4012   addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
4013 
4014   addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
4015 }
4016 
4017 
DetectLibcxxIncludePath(StringRef base)4018 static std::string DetectLibcxxIncludePath(StringRef base) {
4019   std::error_code EC;
4020   int MaxVersion = 0;
4021   std::string MaxVersionString = "";
4022   for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
4023        LI = LI.increment(EC)) {
4024     StringRef VersionText = llvm::sys::path::filename(LI->path());
4025     int Version;
4026     if (VersionText[0] == 'v' &&
4027         !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
4028       if (Version > MaxVersion) {
4029         MaxVersion = Version;
4030         MaxVersionString = VersionText;
4031       }
4032     }
4033   }
4034   return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
4035 }
4036 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const4037 void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4038                                          ArgStringList &CC1Args) const {
4039   if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4040       DriverArgs.hasArg(options::OPT_nostdincxx))
4041     return;
4042 
4043   // Check if libc++ has been enabled and provide its include paths if so.
4044   if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
4045     const std::string LibCXXIncludePathCandidates[] = {
4046         DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
4047 
4048         // We also check the system as for a long time this is the only place
4049         // Clang looked.
4050         // FIXME: We should really remove this. It doesn't make any sense.
4051         DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++")};
4052     for (const auto &IncludePath : LibCXXIncludePathCandidates) {
4053       if (IncludePath.empty() || !getVFS().exists(IncludePath))
4054         continue;
4055       // Add the first candidate that exists.
4056       addSystemInclude(DriverArgs, CC1Args, IncludePath);
4057       break;
4058     }
4059     return;
4060   }
4061 
4062   // We need a detected GCC installation on Linux to provide libstdc++'s
4063   // headers. We handled the libc++ case above.
4064   if (!GCCInstallation.isValid())
4065     return;
4066 
4067   // By default, look for the C++ headers in an include directory adjacent to
4068   // the lib directory of the GCC installation. Note that this is expect to be
4069   // equivalent to '/usr/include/c++/X.Y' in almost all cases.
4070   StringRef LibDir = GCCInstallation.getParentLibPath();
4071   StringRef InstallDir = GCCInstallation.getInstallPath();
4072   StringRef TripleStr = GCCInstallation.getTriple().str();
4073   const Multilib &Multilib = GCCInstallation.getMultilib();
4074   const std::string GCCMultiarchTriple = getMultiarchTriple(
4075       getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
4076   const std::string TargetMultiarchTriple =
4077       getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
4078   const GCCVersion &Version = GCCInstallation.getVersion();
4079 
4080   // The primary search for libstdc++ supports multiarch variants.
4081   if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
4082                                "/c++/" + Version.Text, TripleStr,
4083                                GCCMultiarchTriple, TargetMultiarchTriple,
4084                                Multilib.includeSuffix(), DriverArgs, CC1Args))
4085     return;
4086 
4087   // Otherwise, fall back on a bunch of options which don't use multiarch
4088   // layouts for simplicity.
4089   const std::string LibStdCXXIncludePathCandidates[] = {
4090       // Gentoo is weird and places its headers inside the GCC install,
4091       // so if the first attempt to find the headers fails, try these patterns.
4092       InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
4093           Version.MinorStr,
4094       InstallDir.str() + "/include/g++-v" + Version.MajorStr,
4095       // Android standalone toolchain has C++ headers in yet another place.
4096       LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4097       // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
4098       // without a subdirectory corresponding to the gcc version.
4099       LibDir.str() + "/../include/c++",
4100   };
4101 
4102   for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
4103     if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
4104                                  /*GCCMultiarchTriple*/ "",
4105                                  /*TargetMultiarchTriple*/ "",
4106                                  Multilib.includeSuffix(), DriverArgs, CC1Args))
4107       break;
4108   }
4109 }
4110 
AddCudaIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const4111 void Linux::AddCudaIncludeArgs(const ArgList &DriverArgs,
4112                                ArgStringList &CC1Args) const {
4113   if (DriverArgs.hasArg(options::OPT_nocudainc))
4114     return;
4115 
4116   if (CudaInstallation.isValid()) {
4117     addSystemInclude(DriverArgs, CC1Args, CudaInstallation.getIncludePath());
4118     CC1Args.push_back("-include");
4119     CC1Args.push_back("__clang_cuda_runtime_wrapper.h");
4120   }
4121 }
4122 
isPIEDefault() const4123 bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
4124 
getSupportedSanitizers() const4125 SanitizerMask Linux::getSupportedSanitizers() const {
4126   const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
4127   const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
4128   const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
4129                         getTriple().getArch() == llvm::Triple::mips64el;
4130   const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
4131                            getTriple().getArch() == llvm::Triple::ppc64le;
4132   const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
4133                          getTriple().getArch() == llvm::Triple::aarch64_be;
4134   SanitizerMask Res = ToolChain::getSupportedSanitizers();
4135   Res |= SanitizerKind::Address;
4136   Res |= SanitizerKind::KernelAddress;
4137   Res |= SanitizerKind::Vptr;
4138   Res |= SanitizerKind::SafeStack;
4139   if (IsX86_64 || IsMIPS64 || IsAArch64)
4140     Res |= SanitizerKind::DataFlow;
4141   if (IsX86_64 || IsMIPS64 || IsAArch64)
4142     Res |= SanitizerKind::Leak;
4143   if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64)
4144     Res |= SanitizerKind::Thread;
4145   if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
4146     Res |= SanitizerKind::Memory;
4147   if (IsX86 || IsX86_64) {
4148     Res |= SanitizerKind::Function;
4149   }
4150   return Res;
4151 }
4152 
addProfileRTLibs(const llvm::opt::ArgList & Args,llvm::opt::ArgStringList & CmdArgs) const4153 void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
4154                              llvm::opt::ArgStringList &CmdArgs) const {
4155   if (!needsProfileRT(Args)) return;
4156 
4157   // Add linker option -u__llvm_runtime_variable to cause runtime
4158   // initialization module to be linked in.
4159   if (!Args.hasArg(options::OPT_coverage))
4160     CmdArgs.push_back(Args.MakeArgString(
4161         Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
4162   ToolChain::addProfileRTLibs(Args, CmdArgs);
4163 }
4164 
4165 /// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
4166 
DragonFly(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)4167 DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
4168                      const ArgList &Args)
4169     : Generic_ELF(D, Triple, Args) {
4170 
4171   // Path mangling to find libexec
4172   getProgramPaths().push_back(getDriver().getInstalledDir());
4173   if (getDriver().getInstalledDir() != getDriver().Dir)
4174     getProgramPaths().push_back(getDriver().Dir);
4175 
4176   getFilePaths().push_back(getDriver().Dir + "/../lib");
4177   getFilePaths().push_back("/usr/lib");
4178   if (D.getVFS().exists("/usr/lib/gcc47"))
4179     getFilePaths().push_back("/usr/lib/gcc47");
4180   else
4181     getFilePaths().push_back("/usr/lib/gcc44");
4182 }
4183 
buildAssembler() const4184 Tool *DragonFly::buildAssembler() const {
4185   return new tools::dragonfly::Assembler(*this);
4186 }
4187 
buildLinker() const4188 Tool *DragonFly::buildLinker() const {
4189   return new tools::dragonfly::Linker(*this);
4190 }
4191 
4192 /// Stub for CUDA toolchain. At the moment we don't have assembler or
4193 /// linker and need toolchain mainly to propagate device-side options
4194 /// to CC1.
4195 
CudaToolChain(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)4196 CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4197                              const ArgList &Args)
4198     : Linux(D, Triple, Args) {}
4199 
4200 void
addClangTargetOptions(const llvm::opt::ArgList & DriverArgs,llvm::opt::ArgStringList & CC1Args) const4201 CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4202                                      llvm::opt::ArgStringList &CC1Args) const {
4203   Linux::addClangTargetOptions(DriverArgs, CC1Args);
4204   CC1Args.push_back("-fcuda-is-device");
4205 
4206   if (DriverArgs.hasArg(options::OPT_nocudalib))
4207     return;
4208 
4209   std::string LibDeviceFile = CudaInstallation.getLibDeviceFile(
4210       DriverArgs.getLastArgValue(options::OPT_march_EQ));
4211   if (!LibDeviceFile.empty()) {
4212     CC1Args.push_back("-mlink-cuda-bitcode");
4213     CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
4214 
4215     // Libdevice in CUDA-7.0 requires PTX version that's more recent
4216     // than LLVM defaults to. Use PTX4.2 which is the PTX version that
4217     // came with CUDA-7.0.
4218     CC1Args.push_back("-target-feature");
4219     CC1Args.push_back("+ptx42");
4220   }
4221 }
4222 
4223 llvm::opt::DerivedArgList *
TranslateArgs(const llvm::opt::DerivedArgList & Args,const char * BoundArch) const4224 CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
4225                              const char *BoundArch) const {
4226   DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
4227   const OptTable &Opts = getDriver().getOpts();
4228 
4229   for (Arg *A : Args) {
4230     if (A->getOption().matches(options::OPT_Xarch__)) {
4231       // Skip this argument unless the architecture matches BoundArch
4232       if (A->getValue(0) != StringRef(BoundArch))
4233         continue;
4234 
4235       unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
4236       unsigned Prev = Index;
4237       std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
4238 
4239       // If the argument parsing failed or more than one argument was
4240       // consumed, the -Xarch_ argument's parameter tried to consume
4241       // extra arguments. Emit an error and ignore.
4242       //
4243       // We also want to disallow any options which would alter the
4244       // driver behavior; that isn't going to work in our model. We
4245       // use isDriverOption() as an approximation, although things
4246       // like -O4 are going to slip through.
4247       if (!XarchArg || Index > Prev + 1) {
4248         getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
4249             << A->getAsString(Args);
4250         continue;
4251       } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
4252         getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
4253             << A->getAsString(Args);
4254         continue;
4255       }
4256       XarchArg->setBaseArg(A);
4257       A = XarchArg.release();
4258       DAL->AddSynthesizedArg(A);
4259     }
4260     DAL->append(A);
4261   }
4262 
4263   DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
4264   return DAL;
4265 }
4266 
4267 /// XCore tool chain
XCoreToolChain(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)4268 XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
4269                                const ArgList &Args)
4270     : ToolChain(D, Triple, Args) {
4271   // ProgramPaths are found via 'PATH' environment variable.
4272 }
4273 
buildAssembler() const4274 Tool *XCoreToolChain::buildAssembler() const {
4275   return new tools::XCore::Assembler(*this);
4276 }
4277 
buildLinker() const4278 Tool *XCoreToolChain::buildLinker() const {
4279   return new tools::XCore::Linker(*this);
4280 }
4281 
isPICDefault() const4282 bool XCoreToolChain::isPICDefault() const { return false; }
4283 
isPIEDefault() const4284 bool XCoreToolChain::isPIEDefault() const { return false; }
4285 
isPICDefaultForced() const4286 bool XCoreToolChain::isPICDefaultForced() const { return false; }
4287 
SupportsProfiling() const4288 bool XCoreToolChain::SupportsProfiling() const { return false; }
4289 
hasBlocksRuntime() const4290 bool XCoreToolChain::hasBlocksRuntime() const { return false; }
4291 
AddClangSystemIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const4292 void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4293                                                ArgStringList &CC1Args) const {
4294   if (DriverArgs.hasArg(options::OPT_nostdinc) ||
4295       DriverArgs.hasArg(options::OPT_nostdlibinc))
4296     return;
4297   if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
4298     SmallVector<StringRef, 4> Dirs;
4299     const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
4300     StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4301     ArrayRef<StringRef> DirVec(Dirs);
4302     addSystemIncludes(DriverArgs, CC1Args, DirVec);
4303   }
4304 }
4305 
addClangTargetOptions(const ArgList & DriverArgs,ArgStringList & CC1Args) const4306 void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
4307                                            ArgStringList &CC1Args) const {
4308   CC1Args.push_back("-nostdsysteminc");
4309 }
4310 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const4311 void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
4312     const ArgList &DriverArgs, ArgStringList &CC1Args) const {
4313   if (DriverArgs.hasArg(options::OPT_nostdinc) ||
4314       DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4315       DriverArgs.hasArg(options::OPT_nostdincxx))
4316     return;
4317   if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
4318     SmallVector<StringRef, 4> Dirs;
4319     const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
4320     StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4321     ArrayRef<StringRef> DirVec(Dirs);
4322     addSystemIncludes(DriverArgs, CC1Args, DirVec);
4323   }
4324 }
4325 
AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const4326 void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
4327                                          ArgStringList &CmdArgs) const {
4328   // We don't output any lib args. This is handled by xcc.
4329 }
4330 
MyriadToolChain(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)4331 MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
4332                                  const ArgList &Args)
4333     : Generic_GCC(D, Triple, Args) {
4334   // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
4335   // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
4336   // This won't work to find gcc. Instead we give the installation detector an
4337   // extra triple, which is preferable to further hacks of the logic that at
4338   // present is based solely on getArch(). In particular, it would be wrong to
4339   // choose the myriad installation when targeting a non-myriad sparc install.
4340   switch (Triple.getArch()) {
4341   default:
4342     D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
4343                                               << "myriad";
4344   case llvm::Triple::sparc:
4345   case llvm::Triple::sparcel:
4346   case llvm::Triple::shave:
4347     GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
4348   }
4349 
4350   if (GCCInstallation.isValid()) {
4351     // The contents of LibDir are independent of the version of gcc.
4352     // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4353     SmallString<128> LibDir(GCCInstallation.getParentLibPath());
4354     if (Triple.getArch() == llvm::Triple::sparcel)
4355       llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib/le");
4356     else
4357       llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib");
4358     addPathIfExists(D, LibDir, getFilePaths());
4359 
4360     // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4361     // These files are tied to a particular version of gcc.
4362     SmallString<128> CompilerSupportDir(GCCInstallation.getInstallPath());
4363     // There are actually 4 choices: {le,be} x {fpu,nofpu}
4364     // but as this toolchain is for LEON sparc, it can assume FPU.
4365     if (Triple.getArch() == llvm::Triple::sparcel)
4366       llvm::sys::path::append(CompilerSupportDir, "le");
4367     addPathIfExists(D, CompilerSupportDir, getFilePaths());
4368   }
4369 }
4370 
~MyriadToolChain()4371 MyriadToolChain::~MyriadToolChain() {}
4372 
AddClangSystemIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const4373 void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4374                                                 ArgStringList &CC1Args) const {
4375   if (!DriverArgs.hasArg(options::OPT_nostdinc))
4376     addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4377 }
4378 
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const4379 void MyriadToolChain::AddClangCXXStdlibIncludeArgs(
4380     const ArgList &DriverArgs, ArgStringList &CC1Args) const {
4381   if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4382       DriverArgs.hasArg(options::OPT_nostdincxx))
4383     return;
4384 
4385   // Only libstdc++, for now.
4386   StringRef LibDir = GCCInstallation.getParentLibPath();
4387   const GCCVersion &Version = GCCInstallation.getVersion();
4388   StringRef TripleStr = GCCInstallation.getTriple().str();
4389   const Multilib &Multilib = GCCInstallation.getMultilib();
4390 
4391   addLibStdCXXIncludePaths(
4392       LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4393       "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
4394 }
4395 
4396 // MyriadToolChain handles several triples:
4397 //  {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
SelectTool(const JobAction & JA) const4398 Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4399   // The inherited method works fine if not targeting the SHAVE.
4400   if (!isShaveCompilation(getTriple()))
4401     return ToolChain::SelectTool(JA);
4402   switch (JA.getKind()) {
4403   case Action::PreprocessJobClass:
4404   case Action::CompileJobClass:
4405     if (!Compiler)
4406       Compiler.reset(new tools::SHAVE::Compiler(*this));
4407     return Compiler.get();
4408   case Action::AssembleJobClass:
4409     if (!Assembler)
4410       Assembler.reset(new tools::SHAVE::Assembler(*this));
4411     return Assembler.get();
4412   default:
4413     return ToolChain::getTool(JA.getKind());
4414   }
4415 }
4416 
buildLinker() const4417 Tool *MyriadToolChain::buildLinker() const {
4418   return new tools::Myriad::Linker(*this);
4419 }
4420 
WebAssembly(const Driver & D,const llvm::Triple & Triple,const llvm::opt::ArgList & Args)4421 WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple,
4422                          const llvm::opt::ArgList &Args)
4423   : ToolChain(D, Triple, Args) {
4424   // Use LLD by default.
4425   DefaultLinker = "lld";
4426 }
4427 
IsMathErrnoDefault() const4428 bool WebAssembly::IsMathErrnoDefault() const { return false; }
4429 
IsObjCNonFragileABIDefault() const4430 bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4431 
UseObjCMixedDispatch() const4432 bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4433 
isPICDefault() const4434 bool WebAssembly::isPICDefault() const { return false; }
4435 
isPIEDefault() const4436 bool WebAssembly::isPIEDefault() const { return false; }
4437 
isPICDefaultForced() const4438 bool WebAssembly::isPICDefaultForced() const { return false; }
4439 
IsIntegratedAssemblerDefault() const4440 bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4441 
4442 // TODO: Support Objective C stuff.
SupportsObjCGC() const4443 bool WebAssembly::SupportsObjCGC() const { return false; }
4444 
hasBlocksRuntime() const4445 bool WebAssembly::hasBlocksRuntime() const { return false; }
4446 
4447 // TODO: Support profiling.
SupportsProfiling() const4448 bool WebAssembly::SupportsProfiling() const { return false; }
4449 
HasNativeLLVMSupport() const4450 bool WebAssembly::HasNativeLLVMSupport() const { return true; }
4451 
addClangTargetOptions(const ArgList & DriverArgs,ArgStringList & CC1Args) const4452 void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4453                                         ArgStringList &CC1Args) const {
4454   if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4455                          options::OPT_fno_use_init_array, true))
4456     CC1Args.push_back("-fuse-init-array");
4457 }
4458 
buildLinker() const4459 Tool *WebAssembly::buildLinker() const {
4460   return new tools::wasm::Linker(*this);
4461 }
4462 
PS4CPU(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)4463 PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4464     : Generic_ELF(D, Triple, Args) {
4465   if (Args.hasArg(options::OPT_static))
4466     D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4467 
4468   // Determine where to find the PS4 libraries. We use SCE_PS4_SDK_DIR
4469   // if it exists; otherwise use the driver's installation path, which
4470   // should be <SDK_DIR>/host_tools/bin.
4471 
4472   SmallString<512> PS4SDKDir;
4473   if (const char *EnvValue = getenv("SCE_PS4_SDK_DIR")) {
4474     if (!llvm::sys::fs::exists(EnvValue))
4475       getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4476     PS4SDKDir = EnvValue;
4477   } else {
4478     PS4SDKDir = getDriver().Dir;
4479     llvm::sys::path::append(PS4SDKDir, "/../../");
4480   }
4481 
4482   // By default, the driver won't report a warning if it can't find
4483   // PS4's include or lib directories. This behavior could be changed if
4484   // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
4485   // If -isysroot was passed, use that as the SDK base path.
4486   std::string PrefixDir;
4487   if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4488     PrefixDir = A->getValue();
4489     if (!llvm::sys::fs::exists(PrefixDir))
4490       getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4491   } else
4492     PrefixDir = PS4SDKDir.str();
4493 
4494   SmallString<512> PS4SDKIncludeDir(PrefixDir);
4495   llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4496   if (!Args.hasArg(options::OPT_nostdinc) &&
4497       !Args.hasArg(options::OPT_nostdlibinc) &&
4498       !Args.hasArg(options::OPT_isysroot) &&
4499       !Args.hasArg(options::OPT__sysroot_EQ) &&
4500       !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4501     getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4502         << "PS4 system headers" << PS4SDKIncludeDir;
4503   }
4504 
4505   SmallString<512> PS4SDKLibDir(PS4SDKDir);
4506   llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4507   if (!Args.hasArg(options::OPT_nostdlib) &&
4508       !Args.hasArg(options::OPT_nodefaultlibs) &&
4509       !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
4510       !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
4511       !Args.hasArg(options::OPT_emit_ast) &&
4512       !llvm::sys::fs::exists(PS4SDKLibDir)) {
4513     getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4514         << "PS4 system libraries" << PS4SDKLibDir;
4515     return;
4516   }
4517   getFilePaths().push_back(PS4SDKLibDir.str());
4518 }
4519 
buildAssembler() const4520 Tool *PS4CPU::buildAssembler() const {
4521   return new tools::PS4cpu::Assemble(*this);
4522 }
4523 
buildLinker() const4524 Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
4525 
isPICDefault() const4526 bool PS4CPU::isPICDefault() const { return true; }
4527 
HasNativeLLVMSupport() const4528 bool PS4CPU::HasNativeLLVMSupport() const { return true; }
4529 
getSupportedSanitizers() const4530 SanitizerMask PS4CPU::getSupportedSanitizers() const {
4531   SanitizerMask Res = ToolChain::getSupportedSanitizers();
4532   Res |= SanitizerKind::Address;
4533   Res |= SanitizerKind::Vptr;
4534   return Res;
4535 }
4536