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