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