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