1 //===--- ToolChains.cpp - ToolChain Implementations -----------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "ToolChains.h"
11 #include "SanitizerArgs.h"
12 #include "clang/Basic/ObjCRuntime.h"
13 #include "clang/Basic/Version.h"
14 #include "clang/Driver/Arg.h"
15 #include "clang/Driver/ArgList.h"
16 #include "clang/Driver/Compilation.h"
17 #include "clang/Driver/Driver.h"
18 #include "clang/Driver/DriverDiagnostic.h"
19 #include "clang/Driver/OptTable.h"
20 #include "clang/Driver/Option.h"
21 #include "clang/Driver/Options.h"
22 #include "llvm/ADT/STLExtras.h"
23 #include "llvm/ADT/SmallString.h"
24 #include "llvm/ADT/StringExtras.h"
25 #include "llvm/ADT/StringSwitch.h"
26 #include "llvm/Support/ErrorHandling.h"
27 #include "llvm/Support/FileSystem.h"
28 #include "llvm/Support/MemoryBuffer.h"
29 #include "llvm/Support/Path.h"
30 #include "llvm/Support/raw_ostream.h"
31 #include "llvm/Support/system_error.h"
33 // FIXME: This needs to be listed last until we fix the broken include guards
34 // in these files and the LLVM config.h files.
35 #include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
37 #include <cstdlib> // ::getenv
39 using namespace clang::driver;
40 using namespace clang::driver::toolchains;
41 using namespace clang;
43 /// Darwin - Darwin tool chain for i386 and x86_64.
45 Darwin::Darwin(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
46 : ToolChain(D, Triple, Args), TargetInitialized(false)
48 // Compute the initial Darwin version from the triple
49 unsigned Major, Minor, Micro;
50 if (!Triple.getMacOSXVersion(Major, Minor, Micro))
51 getDriver().Diag(diag::err_drv_invalid_darwin_version) <<
53 llvm::raw_string_ostream(MacosxVersionMin)
54 << Major << '.' << Minor << '.' << Micro;
56 // FIXME: DarwinVersion is only used to find GCC's libexec directory.
57 // It should be removed when we stop supporting that.
58 DarwinVersion[0] = Minor + 4;
59 DarwinVersion[1] = Micro;
62 // Compute the initial iOS version from the triple
63 Triple.getiOSVersion(Major, Minor, Micro);
64 llvm::raw_string_ostream(iOSVersionMin)
65 << Major << '.' << Minor << '.' << Micro;
68 types::ID Darwin::LookupTypeForExtension(const char *Ext) const {
69 types::ID Ty = types::lookupTypeForExtension(Ext);
71 // Darwin always preprocesses assembly files (unless -x is used explicitly).
72 if (Ty == types::TY_PP_Asm)
78 bool Darwin::HasNativeLLVMSupport() const {
82 /// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
83 ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
84 if (isTargetIPhoneOS())
85 return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
87 return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
88 return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
91 /// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
92 bool Darwin::hasBlocksRuntime() const {
93 if (isTargetIPhoneOS())
94 return !isIPhoneOSVersionLT(3, 2);
96 return !isMacosxVersionLT(10, 6);
99 static const char *GetArmArchForMArch(StringRef Value) {
100 return llvm::StringSwitch<const char*>(Value)
101 .Case("armv6k", "armv6")
102 .Case("armv6m", "armv6m")
103 .Case("armv5tej", "armv5")
104 .Case("xscale", "xscale")
105 .Case("armv4t", "armv4t")
106 .Case("armv7", "armv7")
107 .Cases("armv7a", "armv7-a", "armv7")
108 .Cases("armv7r", "armv7-r", "armv7")
109 .Cases("armv7em", "armv7e-m", "armv7em")
110 .Cases("armv7f", "armv7-f", "armv7f")
111 .Cases("armv7k", "armv7-k", "armv7k")
112 .Cases("armv7m", "armv7-m", "armv7m")
113 .Cases("armv7s", "armv7-s", "armv7s")
117 static const char *GetArmArchForMCpu(StringRef Value) {
118 return llvm::StringSwitch<const char *>(Value)
119 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "arm926ej-s","armv5")
120 .Cases("arm10e", "arm10tdmi", "armv5")
121 .Cases("arm1020t", "arm1020e", "arm1022e", "arm1026ej-s", "armv5")
122 .Case("xscale", "xscale")
123 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "arm1176jzf-s", "armv6")
124 .Case("cortex-m0", "armv6m")
125 .Cases("cortex-a8", "cortex-r4", "cortex-a9", "cortex-a15", "armv7")
126 .Case("cortex-a9-mp", "armv7f")
127 .Case("cortex-m3", "armv7m")
128 .Case("cortex-m4", "armv7em")
129 .Case("swift", "armv7s")
133 StringRef Darwin::getDarwinArchName(const ArgList &Args) const {
134 switch (getTriple().getArch()) {
136 return getArchName();
138 case llvm::Triple::thumb:
139 case llvm::Triple::arm: {
140 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
141 if (const char *Arch = GetArmArchForMArch(A->getValue()))
144 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
145 if (const char *Arch = GetArmArchForMCpu(A->getValue()))
156 std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
157 types::ID InputType) const {
158 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
160 // If the target isn't initialized (e.g., an unknown Darwin platform, return
161 // the default triple).
162 if (!isTargetInitialized())
163 return Triple.getTriple();
166 Str += isTargetIPhoneOS() ? "ios" : "macosx";
167 Str += getTargetVersion().getAsString();
168 Triple.setOSName(Str);
170 return Triple.getTriple();
173 void Generic_ELF::anchor() {}
175 Tool *Darwin::getTool(Action::ActionClass AC) const {
177 case Action::LipoJobClass:
179 Lipo.reset(new tools::darwin::Lipo(*this));
181 case Action::DsymutilJobClass:
183 Dsymutil.reset(new tools::darwin::Dsymutil(*this));
184 return Dsymutil.get();
185 case Action::VerifyJobClass:
187 VerifyDebug.reset(new tools::darwin::VerifyDebug(*this));
188 return VerifyDebug.get();
190 return ToolChain::getTool(AC);
194 Tool *Darwin::buildLinker() const {
195 return new tools::darwin::Link(*this);
198 Tool *Darwin::buildAssembler() const {
199 return new tools::darwin::Assemble(*this);
202 DarwinClang::DarwinClang(const Driver &D, const llvm::Triple& Triple,
204 : Darwin(D, Triple, Args)
206 getProgramPaths().push_back(getDriver().getInstalledDir());
207 if (getDriver().getInstalledDir() != getDriver().Dir)
208 getProgramPaths().push_back(getDriver().Dir);
210 // We expect 'as', 'ld', etc. to be adjacent to our install dir.
211 getProgramPaths().push_back(getDriver().getInstalledDir());
212 if (getDriver().getInstalledDir() != getDriver().Dir)
213 getProgramPaths().push_back(getDriver().Dir);
216 void DarwinClang::AddLinkARCArgs(const ArgList &Args,
217 ArgStringList &CmdArgs) const {
219 CmdArgs.push_back("-force_load");
220 llvm::sys::Path P(getDriver().ClangExecutable);
221 P.eraseComponent(); // 'clang'
222 P.eraseComponent(); // 'bin'
223 P.appendComponent("lib");
224 P.appendComponent("arc");
225 P.appendComponent("libarclite_");
226 std::string s = P.str();
227 // Mash in the platform.
228 if (isTargetIOSSimulator())
229 s += "iphonesimulator";
230 else if (isTargetIPhoneOS())
236 CmdArgs.push_back(Args.MakeArgString(s));
239 void DarwinClang::AddLinkRuntimeLib(const ArgList &Args,
240 ArgStringList &CmdArgs,
241 const char *DarwinStaticLib,
242 bool AlwaysLink) const {
243 llvm::sys::Path P(getDriver().ResourceDir);
244 P.appendComponent("lib");
245 P.appendComponent("darwin");
246 P.appendComponent(DarwinStaticLib);
248 // For now, allow missing resource libraries to support developers who may
249 // not have compiler-rt checked out or integrated into their build (unless
250 // we explicitly force linking with this library).
252 if (AlwaysLink || (!llvm::sys::fs::exists(P.str(), Exists) && Exists))
253 CmdArgs.push_back(Args.MakeArgString(P.str()));
256 void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
257 ArgStringList &CmdArgs) const {
258 // Darwin only supports the compiler-rt based runtime libraries.
259 switch (GetRuntimeLibType(Args)) {
260 case ToolChain::RLT_CompilerRT:
263 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
264 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
268 // Darwin doesn't support real static executables, don't link any runtime
269 // libraries with -static.
270 if (Args.hasArg(options::OPT_static) ||
271 Args.hasArg(options::OPT_fapple_kext) ||
272 Args.hasArg(options::OPT_mkernel))
275 // Reject -static-libgcc for now, we can deal with this when and if someone
276 // cares. This is useful in situations where someone wants to statically link
277 // something like libstdc++, and needs its runtime support routines.
278 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
279 getDriver().Diag(diag::err_drv_unsupported_opt)
280 << A->getAsString(Args);
284 // If we are building profile support, link that library in.
285 if (Args.hasArg(options::OPT_fprofile_arcs) ||
286 Args.hasArg(options::OPT_fprofile_generate) ||
287 Args.hasArg(options::OPT_fcreate_profile) ||
288 Args.hasArg(options::OPT_coverage)) {
289 // Select the appropriate runtime library for the target.
290 if (isTargetIPhoneOS()) {
291 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a");
293 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a");
297 SanitizerArgs Sanitize(getDriver(), Args);
299 // Add Ubsan runtime library, if required.
300 if (Sanitize.needsUbsanRt()) {
301 if (isTargetIPhoneOS()) {
302 getDriver().Diag(diag::err_drv_clang_unsupported_per_platform)
303 << "-fsanitize=undefined";
305 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ubsan_osx.a", true);
307 // The Ubsan runtime library requires C++.
308 AddCXXStdlibLibArgs(Args, CmdArgs);
312 // Add ASAN runtime library, if required. Dynamic libraries and bundles
313 // should not be linked with the runtime library.
314 if (Sanitize.needsAsanRt()) {
315 if (isTargetIPhoneOS() && !isTargetIOSSimulator()) {
316 getDriver().Diag(diag::err_drv_clang_unsupported_per_platform)
317 << "-fsanitize=address";
319 if (Args.hasArg(options::OPT_dynamiclib) ||
320 Args.hasArg(options::OPT_bundle)) {
321 // Assume the binary will provide the ASan runtime.
323 AddLinkRuntimeLib(Args, CmdArgs,
324 "libclang_rt.asan_osx_dynamic.dylib", true);
325 // The ASAN runtime library requires C++.
326 AddCXXStdlibLibArgs(Args, CmdArgs);
331 // Otherwise link libSystem, then the dynamic runtime library, and finally any
332 // target specific static runtime library.
333 CmdArgs.push_back("-lSystem");
335 // Select the dynamic runtime library and the target specific static library.
336 if (isTargetIPhoneOS()) {
337 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
338 // it never went into the SDK.
339 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
340 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator())
341 CmdArgs.push_back("-lgcc_s.1");
343 // We currently always need a static runtime library for iOS.
344 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
346 // The dynamic runtime library was merged with libSystem for 10.6 and
347 // beyond; only 10.4 and 10.5 need an additional runtime library.
348 if (isMacosxVersionLT(10, 5))
349 CmdArgs.push_back("-lgcc_s.10.4");
350 else if (isMacosxVersionLT(10, 6))
351 CmdArgs.push_back("-lgcc_s.10.5");
353 // For OS X, we thought we would only need a static runtime library when
354 // targeting 10.4, to provide versions of the static functions which were
355 // omitted from 10.4.dylib.
357 // Unfortunately, that turned out to not be true, because Darwin system
358 // headers can still use eprintf on i386, and it is not exported from
359 // libSystem. Therefore, we still must provide a runtime library just for
360 // the tiny tiny handful of projects that *might* use that symbol.
361 if (isMacosxVersionLT(10, 5)) {
362 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
364 if (getTriple().getArch() == llvm::Triple::x86)
365 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
366 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
371 void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
372 const OptTable &Opts = getDriver().getOpts();
374 // Support allowing the SDKROOT environment variable used by xcrun and other
375 // Xcode tools to define the default sysroot, by making it the default for
377 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
378 // Warn if the path does not exist.
380 if (llvm::sys::fs::exists(A->getValue(), Exists) || !Exists)
381 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
383 if (char *env = ::getenv("SDKROOT")) {
384 // We only use this value as the default if it is an absolute path,
385 // exists, and it is not the root path.
386 if (llvm::sys::path::is_absolute(env) && llvm::sys::fs::exists(env) &&
387 StringRef(env) != "/") {
388 Args.append(Args.MakeSeparateArg(
389 0, Opts.getOption(options::OPT_isysroot), env));
394 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
395 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
396 Arg *iOSSimVersion = Args.getLastArg(
397 options::OPT_mios_simulator_version_min_EQ);
399 if (OSXVersion && (iOSVersion || iOSSimVersion)) {
400 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
401 << OSXVersion->getAsString(Args)
402 << (iOSVersion ? iOSVersion : iOSSimVersion)->getAsString(Args);
403 iOSVersion = iOSSimVersion = 0;
404 } else if (iOSVersion && iOSSimVersion) {
405 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
406 << iOSVersion->getAsString(Args)
407 << iOSSimVersion->getAsString(Args);
409 } else if (!OSXVersion && !iOSVersion && !iOSSimVersion) {
410 // If no deployment target was specified on the command line, check for
411 // environment defines.
414 StringRef iOSSimTarget;
415 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
417 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
419 if (char *env = ::getenv("IOS_SIMULATOR_DEPLOYMENT_TARGET"))
422 // If no '-miphoneos-version-min' specified on the command line and
423 // IPHONEOS_DEPLOYMENT_TARGET is not defined, see if we can set the default
424 // based on -isysroot.
425 if (iOSTarget.empty()) {
426 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
427 StringRef first, second;
428 StringRef isysroot = A->getValue();
429 llvm::tie(first, second) = isysroot.split(StringRef("SDKs/iPhoneOS"));
431 iOSTarget = second.substr(0,3);
435 // If no OSX or iOS target has been specified and we're compiling for armv7,
436 // go ahead as assume we're targeting iOS.
437 if (OSXTarget.empty() && iOSTarget.empty() &&
438 (getDarwinArchName(Args) == "armv7" ||
439 getDarwinArchName(Args) == "armv7s"))
440 iOSTarget = iOSVersionMin;
442 // Handle conflicting deployment targets
444 // FIXME: Don't hardcode default here.
446 // Do not allow conflicts with the iOS simulator target.
447 if (!iOSSimTarget.empty() && (!OSXTarget.empty() || !iOSTarget.empty())) {
448 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
449 << "IOS_SIMULATOR_DEPLOYMENT_TARGET"
450 << (!OSXTarget.empty() ? "MACOSX_DEPLOYMENT_TARGET" :
451 "IPHONEOS_DEPLOYMENT_TARGET");
454 // Allow conflicts among OSX and iOS for historical reasons, but choose the
456 if (!OSXTarget.empty() && !iOSTarget.empty()) {
457 if (getTriple().getArch() == llvm::Triple::arm ||
458 getTriple().getArch() == llvm::Triple::thumb)
464 if (!OSXTarget.empty()) {
465 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
466 OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget);
467 Args.append(OSXVersion);
468 } else if (!iOSTarget.empty()) {
469 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
470 iOSVersion = Args.MakeJoinedArg(0, O, iOSTarget);
471 Args.append(iOSVersion);
472 } else if (!iOSSimTarget.empty()) {
473 const Option O = Opts.getOption(
474 options::OPT_mios_simulator_version_min_EQ);
475 iOSSimVersion = Args.MakeJoinedArg(0, O, iOSSimTarget);
476 Args.append(iOSSimVersion);
478 // Otherwise, assume we are targeting OS X.
479 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
480 OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin);
481 Args.append(OSXVersion);
485 // Reject invalid architecture combinations.
486 if (iOSSimVersion && (getTriple().getArch() != llvm::Triple::x86 &&
487 getTriple().getArch() != llvm::Triple::x86_64)) {
488 getDriver().Diag(diag::err_drv_invalid_arch_for_deployment_target)
489 << getTriple().getArchName() << iOSSimVersion->getAsString(Args);
492 // Set the tool chain target information.
493 unsigned Major, Minor, Micro;
496 assert((!iOSVersion && !iOSSimVersion) && "Unknown target platform!");
497 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor,
498 Micro, HadExtra) || HadExtra ||
499 Major != 10 || Minor >= 100 || Micro >= 100)
500 getDriver().Diag(diag::err_drv_invalid_version_number)
501 << OSXVersion->getAsString(Args);
503 const Arg *Version = iOSVersion ? iOSVersion : iOSSimVersion;
504 assert(Version && "Unknown target platform!");
505 if (!Driver::GetReleaseVersion(Version->getValue(), Major, Minor,
506 Micro, HadExtra) || HadExtra ||
507 Major >= 10 || Minor >= 100 || Micro >= 100)
508 getDriver().Diag(diag::err_drv_invalid_version_number)
509 << Version->getAsString(Args);
512 bool IsIOSSim = bool(iOSSimVersion);
514 // In GCC, the simulator historically was treated as being OS X in some
515 // contexts, like determining the link logic, despite generally being called
516 // with an iOS deployment target. For compatibility, we detect the
517 // simulator as iOS + x86, and treat it differently in a few contexts.
518 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
519 getTriple().getArch() == llvm::Triple::x86_64))
522 setTarget(/*IsIPhoneOS=*/ !OSXVersion, Major, Minor, Micro, IsIOSSim);
525 void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
526 ArgStringList &CmdArgs) const {
527 CXXStdlibType Type = GetCXXStdlibType(Args);
530 case ToolChain::CST_Libcxx:
531 CmdArgs.push_back("-lc++");
534 case ToolChain::CST_Libstdcxx: {
535 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
536 // it was previously found in the gcc lib dir. However, for all the Darwin
537 // platforms we care about it was -lstdc++.6, so we search for that
538 // explicitly if we can't see an obvious -lstdc++ candidate.
540 // Check in the sysroot first.
542 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
543 llvm::sys::Path P(A->getValue());
544 P.appendComponent("usr");
545 P.appendComponent("lib");
546 P.appendComponent("libstdc++.dylib");
548 if (llvm::sys::fs::exists(P.str(), Exists) || !Exists) {
550 P.appendComponent("libstdc++.6.dylib");
551 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
552 CmdArgs.push_back(Args.MakeArgString(P.str()));
558 // Otherwise, look in the root.
559 // FIXME: This should be removed someday when we don't have to care about
560 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
561 if ((llvm::sys::fs::exists("/usr/lib/libstdc++.dylib", Exists) || !Exists)&&
562 (!llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib", Exists) && Exists)){
563 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
567 // Otherwise, let the linker search.
568 CmdArgs.push_back("-lstdc++");
574 void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
575 ArgStringList &CmdArgs) const {
577 // For Darwin platforms, use the compiler-rt-based support library
578 // instead of the gcc-provided one (which is also incidentally
579 // only present in the gcc lib dir, which makes it hard to find).
581 llvm::sys::Path P(getDriver().ResourceDir);
582 P.appendComponent("lib");
583 P.appendComponent("darwin");
585 // Use the newer cc_kext for iOS ARM after 6.0.
586 if (!isTargetIPhoneOS() || isTargetIOSSimulator() ||
587 !isIPhoneOSVersionLT(6, 0)) {
588 P.appendComponent("libclang_rt.cc_kext.a");
590 P.appendComponent("libclang_rt.cc_kext_ios5.a");
593 // For now, allow missing resource libraries to support developers who may
594 // not have compiler-rt checked out or integrated into their build.
596 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
597 CmdArgs.push_back(Args.MakeArgString(P.str()));
600 DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
601 const char *BoundArch) const {
602 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
603 const OptTable &Opts = getDriver().getOpts();
605 // FIXME: We really want to get out of the tool chain level argument
606 // translation business, as it makes the driver functionality much
607 // more opaque. For now, we follow gcc closely solely for the
608 // purpose of easily achieving feature parity & testability. Once we
609 // have something that works, we should reevaluate each translation
610 // and try to push it down into tool specific logic.
612 for (ArgList::const_iterator it = Args.begin(),
613 ie = Args.end(); it != ie; ++it) {
616 if (A->getOption().matches(options::OPT_Xarch__)) {
617 // Skip this argument unless the architecture matches either the toolchain
618 // triple arch, or the arch being bound.
619 llvm::Triple::ArchType XarchArch =
620 tools::darwin::getArchTypeForDarwinArchName(A->getValue(0));
621 if (!(XarchArch == getArch() ||
622 (BoundArch && XarchArch ==
623 tools::darwin::getArchTypeForDarwinArchName(BoundArch))))
626 Arg *OriginalArg = A;
627 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
628 unsigned Prev = Index;
629 Arg *XarchArg = Opts.ParseOneArg(Args, Index);
631 // If the argument parsing failed or more than one argument was
632 // consumed, the -Xarch_ argument's parameter tried to consume
633 // extra arguments. Emit an error and ignore.
635 // We also want to disallow any options which would alter the
636 // driver behavior; that isn't going to work in our model. We
637 // use isDriverOption() as an approximation, although things
638 // like -O4 are going to slip through.
639 if (!XarchArg || Index > Prev + 1) {
640 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
641 << A->getAsString(Args);
643 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
644 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
645 << A->getAsString(Args);
649 XarchArg->setBaseArg(A);
652 DAL->AddSynthesizedArg(A);
654 // Linker input arguments require custom handling. The problem is that we
655 // have already constructed the phase actions, so we can not treat them as
656 // "input arguments".
657 if (A->getOption().hasFlag(options::LinkerInput)) {
658 // Convert the argument into individual Zlinker_input_args.
659 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
660 DAL->AddSeparateArg(OriginalArg,
661 Opts.getOption(options::OPT_Zlinker_input),
669 // Sob. These is strictly gcc compatible for the time being. Apple
670 // gcc translates options twice, which means that self-expanding
671 // options add duplicates.
672 switch ((options::ID) A->getOption().getID()) {
677 case options::OPT_mkernel:
678 case options::OPT_fapple_kext:
680 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
683 case options::OPT_dependency_file:
684 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF),
688 case options::OPT_gfull:
689 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
691 Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
694 case options::OPT_gused:
695 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
697 Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
700 case options::OPT_shared:
701 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
704 case options::OPT_fconstant_cfstrings:
705 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
708 case options::OPT_fno_constant_cfstrings:
709 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
712 case options::OPT_Wnonportable_cfstrings:
714 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
717 case options::OPT_Wno_nonportable_cfstrings:
719 Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
722 case options::OPT_fpascal_strings:
723 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
726 case options::OPT_fno_pascal_strings:
727 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
732 if (getTriple().getArch() == llvm::Triple::x86 ||
733 getTriple().getArch() == llvm::Triple::x86_64)
734 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
735 DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2");
737 // Add the arch options based on the particular spelling of -arch, to match
738 // how the driver driver works.
740 StringRef Name = BoundArch;
741 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
742 const Option MArch = Opts.getOption(options::OPT_march_EQ);
744 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
745 // which defines the list of which architectures we accept.
748 else if (Name == "ppc601")
749 DAL->AddJoinedArg(0, MCpu, "601");
750 else if (Name == "ppc603")
751 DAL->AddJoinedArg(0, MCpu, "603");
752 else if (Name == "ppc604")
753 DAL->AddJoinedArg(0, MCpu, "604");
754 else if (Name == "ppc604e")
755 DAL->AddJoinedArg(0, MCpu, "604e");
756 else if (Name == "ppc750")
757 DAL->AddJoinedArg(0, MCpu, "750");
758 else if (Name == "ppc7400")
759 DAL->AddJoinedArg(0, MCpu, "7400");
760 else if (Name == "ppc7450")
761 DAL->AddJoinedArg(0, MCpu, "7450");
762 else if (Name == "ppc970")
763 DAL->AddJoinedArg(0, MCpu, "970");
765 else if (Name == "ppc64")
766 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
768 else if (Name == "i386")
770 else if (Name == "i486")
771 DAL->AddJoinedArg(0, MArch, "i486");
772 else if (Name == "i586")
773 DAL->AddJoinedArg(0, MArch, "i586");
774 else if (Name == "i686")
775 DAL->AddJoinedArg(0, MArch, "i686");
776 else if (Name == "pentium")
777 DAL->AddJoinedArg(0, MArch, "pentium");
778 else if (Name == "pentium2")
779 DAL->AddJoinedArg(0, MArch, "pentium2");
780 else if (Name == "pentpro")
781 DAL->AddJoinedArg(0, MArch, "pentiumpro");
782 else if (Name == "pentIIm3")
783 DAL->AddJoinedArg(0, MArch, "pentium2");
785 else if (Name == "x86_64")
786 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
788 else if (Name == "arm")
789 DAL->AddJoinedArg(0, MArch, "armv4t");
790 else if (Name == "armv4t")
791 DAL->AddJoinedArg(0, MArch, "armv4t");
792 else if (Name == "armv5")
793 DAL->AddJoinedArg(0, MArch, "armv5tej");
794 else if (Name == "xscale")
795 DAL->AddJoinedArg(0, MArch, "xscale");
796 else if (Name == "armv6")
797 DAL->AddJoinedArg(0, MArch, "armv6k");
798 else if (Name == "armv6m")
799 DAL->AddJoinedArg(0, MArch, "armv6m");
800 else if (Name == "armv7")
801 DAL->AddJoinedArg(0, MArch, "armv7a");
802 else if (Name == "armv7em")
803 DAL->AddJoinedArg(0, MArch, "armv7em");
804 else if (Name == "armv7f")
805 DAL->AddJoinedArg(0, MArch, "armv7f");
806 else if (Name == "armv7k")
807 DAL->AddJoinedArg(0, MArch, "armv7k");
808 else if (Name == "armv7m")
809 DAL->AddJoinedArg(0, MArch, "armv7m");
810 else if (Name == "armv7s")
811 DAL->AddJoinedArg(0, MArch, "armv7s");
814 llvm_unreachable("invalid Darwin arch");
817 // Add an explicit version min argument for the deployment target. We do this
818 // after argument translation because -Xarch_ arguments may add a version min
821 AddDeploymentTarget(*DAL);
823 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
824 // FIXME: It would be far better to avoid inserting those -static arguments,
825 // but we can't check the deployment target in the translation code until
827 if (isTargetIPhoneOS() && !isIPhoneOSVersionLT(6, 0)) {
828 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
831 if (A->getOption().getID() != options::OPT_mkernel &&
832 A->getOption().getID() != options::OPT_fapple_kext)
834 assert(it != ie && "unexpected argument translation");
836 assert(A->getOption().getID() == options::OPT_static &&
837 "missing expected -static argument");
838 it = DAL->getArgs().erase(it);
842 // Validate the C++ standard library choice.
843 CXXStdlibType Type = GetCXXStdlibType(*DAL);
844 if (Type == ToolChain::CST_Libcxx) {
845 // Check whether the target provides libc++.
848 // Complain about targetting iOS < 5.0 in any way.
849 if (isTargetIPhoneOS() && isIPhoneOSVersionLT(5, 0))
852 if (where != StringRef()) {
853 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment)
861 bool Darwin::IsUnwindTablesDefault() const {
862 return getArch() == llvm::Triple::x86_64;
865 bool Darwin::UseDwarfDebugFlags() const {
866 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
871 bool Darwin::UseSjLjExceptions() const {
872 // Darwin uses SjLj exceptions on ARM.
873 return (getTriple().getArch() == llvm::Triple::arm ||
874 getTriple().getArch() == llvm::Triple::thumb);
877 bool Darwin::isPICDefault() const {
881 bool Darwin::isPICDefaultForced() const {
882 return getArch() == llvm::Triple::x86_64;
885 bool Darwin::SupportsProfiling() const {
886 // Profiling instrumentation is only supported on x86.
887 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
890 bool Darwin::SupportsObjCGC() const {
891 // Garbage collection is supported everywhere except on iPhone OS.
892 return !isTargetIPhoneOS();
895 void Darwin::CheckObjCARC() const {
896 if (isTargetIPhoneOS() || !isMacosxVersionLT(10, 6))
898 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
902 Darwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args,
903 types::ID InputType) const {
904 return ComputeLLVMTriple(Args, InputType);
907 /// Generic_GCC - A tool chain using the 'gcc' command to perform
908 /// all subcommands; this relies on gcc translating the majority of
909 /// command line options.
911 /// \brief Parse a GCCVersion object out of a string of text.
913 /// This is the primary means of forming GCCVersion objects.
915 Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
916 const GCCVersion BadVersion = { VersionText.str(), -1, -1, -1, "" };
917 std::pair<StringRef, StringRef> First = VersionText.split('.');
918 std::pair<StringRef, StringRef> Second = First.second.split('.');
920 GCCVersion GoodVersion = { VersionText.str(), -1, -1, -1, "" };
921 if (First.first.getAsInteger(10, GoodVersion.Major) ||
922 GoodVersion.Major < 0)
924 if (Second.first.getAsInteger(10, GoodVersion.Minor) ||
925 GoodVersion.Minor < 0)
928 // First look for a number prefix and parse that if present. Otherwise just
929 // stash the entire patch string in the suffix, and leave the number
930 // unspecified. This covers versions strings such as:
936 // And retains any patch number it finds.
937 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
938 if (!PatchText.empty()) {
939 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
940 // Try to parse the number and any suffix.
941 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
942 GoodVersion.Patch < 0)
944 GoodVersion.PatchSuffix = PatchText.substr(EndNumber).str();
951 /// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
952 bool Generic_GCC::GCCVersion::operator<(const GCCVersion &RHS) const {
953 if (Major != RHS.Major)
954 return Major < RHS.Major;
955 if (Minor != RHS.Minor)
956 return Minor < RHS.Minor;
957 if (Patch != RHS.Patch) {
958 // Note that versions without a specified patch sort higher than those with
965 // Otherwise just sort on the patch itself.
966 return Patch < RHS.Patch;
968 if (PatchSuffix != RHS.PatchSuffix) {
969 // Sort empty suffixes higher.
970 if (RHS.PatchSuffix.empty())
972 if (PatchSuffix.empty())
975 // Provide a lexicographic sort to make this a total ordering.
976 return PatchSuffix < RHS.PatchSuffix;
979 // The versions are equal.
983 static StringRef getGCCToolchainDir(const ArgList &Args) {
984 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
986 return A->getValue();
987 return GCC_INSTALL_PREFIX;
990 /// \brief Construct a GCCInstallationDetector from the driver.
992 /// This performs all of the autodetection and sets up the various paths.
993 /// Once constructed, a GCCInstallationDetector is essentially immutable.
995 /// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
996 /// should instead pull the target out of the driver. This is currently
997 /// necessary because the driver doesn't store the final version of the target
999 Generic_GCC::GCCInstallationDetector::GCCInstallationDetector(
1001 const llvm::Triple &TargetTriple,
1002 const ArgList &Args)
1004 llvm::Triple MultiarchTriple
1005 = TargetTriple.isArch32Bit() ? TargetTriple.get64BitArchVariant()
1006 : TargetTriple.get32BitArchVariant();
1007 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1008 // The library directories which may contain GCC installations.
1009 SmallVector<StringRef, 4> CandidateLibDirs, CandidateMultiarchLibDirs;
1010 // The compatible GCC triples for this particular architecture.
1011 SmallVector<StringRef, 10> CandidateTripleAliases;
1012 SmallVector<StringRef, 10> CandidateMultiarchTripleAliases;
1013 CollectLibDirsAndTriples(TargetTriple, MultiarchTriple, CandidateLibDirs,
1014 CandidateTripleAliases,
1015 CandidateMultiarchLibDirs,
1016 CandidateMultiarchTripleAliases);
1018 // Compute the set of prefixes for our search.
1019 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1020 D.PrefixDirs.end());
1022 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1023 if (GCCToolchainDir != "") {
1024 if (GCCToolchainDir.back() == '/')
1025 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
1027 Prefixes.push_back(GCCToolchainDir);
1029 Prefixes.push_back(D.SysRoot);
1030 Prefixes.push_back(D.SysRoot + "/usr");
1031 Prefixes.push_back(D.InstalledDir + "/..");
1034 // Loop over the various components which exist and select the best GCC
1035 // installation available. GCC installs are ranked by version number.
1036 Version = GCCVersion::Parse("0.0.0");
1037 for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) {
1038 if (!llvm::sys::fs::exists(Prefixes[i]))
1040 for (unsigned j = 0, je = CandidateLibDirs.size(); j < je; ++j) {
1041 const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str();
1042 if (!llvm::sys::fs::exists(LibDir))
1044 for (unsigned k = 0, ke = CandidateTripleAliases.size(); k < ke; ++k)
1045 ScanLibDirForGCCTriple(TargetArch, Args, LibDir,
1046 CandidateTripleAliases[k]);
1048 for (unsigned j = 0, je = CandidateMultiarchLibDirs.size(); j < je; ++j) {
1049 const std::string LibDir
1050 = Prefixes[i] + CandidateMultiarchLibDirs[j].str();
1051 if (!llvm::sys::fs::exists(LibDir))
1053 for (unsigned k = 0, ke = CandidateMultiarchTripleAliases.size(); k < ke;
1055 ScanLibDirForGCCTriple(TargetArch, Args, LibDir,
1056 CandidateMultiarchTripleAliases[k],
1057 /*NeedsMultiarchSuffix=*/true);
1062 /*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
1063 const llvm::Triple &TargetTriple,
1064 const llvm::Triple &MultiarchTriple,
1065 SmallVectorImpl<StringRef> &LibDirs,
1066 SmallVectorImpl<StringRef> &TripleAliases,
1067 SmallVectorImpl<StringRef> &MultiarchLibDirs,
1068 SmallVectorImpl<StringRef> &MultiarchTripleAliases) {
1069 // Declare a bunch of static data sets that we'll select between below. These
1070 // are specifically designed to always refer to string literals to avoid any
1071 // lifetime or initialization issues.
1072 static const char *const AArch64LibDirs[] = { "/lib" };
1073 static const char *const AArch64Triples[] = {
1074 "aarch64-none-linux-gnu",
1078 static const char *const ARMLibDirs[] = { "/lib" };
1079 static const char *const ARMTriples[] = {
1080 "arm-linux-gnueabi",
1081 "arm-linux-androideabi"
1083 static const char *const ARMHFTriples[] = {
1084 "arm-linux-gnueabihf",
1087 static const char *const X86_64LibDirs[] = { "/lib64", "/lib" };
1088 static const char *const X86_64Triples[] = {
1090 "x86_64-unknown-linux-gnu",
1091 "x86_64-pc-linux-gnu",
1092 "x86_64-redhat-linux6E",
1093 "x86_64-redhat-linux",
1094 "x86_64-suse-linux",
1095 "x86_64-manbo-linux-gnu",
1097 "x86_64-slackware-linux"
1099 static const char *const X86LibDirs[] = { "/lib32", "/lib" };
1100 static const char *const X86Triples[] = {
1102 "i686-pc-linux-gnu",
1105 "i386-redhat-linux6E",
1106 "i686-redhat-linux",
1107 "i586-redhat-linux",
1108 "i386-redhat-linux",
1110 "i486-slackware-linux",
1111 "i686-montavista-linux"
1114 static const char *const MIPSLibDirs[] = { "/lib" };
1115 static const char *const MIPSTriples[] = { "mips-linux-gnu" };
1116 static const char *const MIPSELLibDirs[] = { "/lib" };
1117 static const char *const MIPSELTriples[] = {
1119 "mipsel-linux-android"
1122 static const char *const MIPS64LibDirs[] = { "/lib64", "/lib" };
1123 static const char *const MIPS64Triples[] = { "mips64-linux-gnu" };
1124 static const char *const MIPS64ELLibDirs[] = { "/lib64", "/lib" };
1125 static const char *const MIPS64ELTriples[] = { "mips64el-linux-gnu" };
1127 static const char *const PPCLibDirs[] = { "/lib32", "/lib" };
1128 static const char *const PPCTriples[] = {
1129 "powerpc-linux-gnu",
1130 "powerpc-unknown-linux-gnu",
1131 "powerpc-linux-gnuspe",
1132 "powerpc-suse-linux",
1133 "powerpc-montavista-linuxspe"
1135 static const char *const PPC64LibDirs[] = { "/lib64", "/lib" };
1136 static const char *const PPC64Triples[] = {
1137 "powerpc64-linux-gnu",
1138 "powerpc64-unknown-linux-gnu",
1139 "powerpc64-suse-linux",
1140 "ppc64-redhat-linux"
1143 switch (TargetTriple.getArch()) {
1144 case llvm::Triple::aarch64:
1145 LibDirs.append(AArch64LibDirs, AArch64LibDirs
1146 + llvm::array_lengthof(AArch64LibDirs));
1147 TripleAliases.append(
1148 AArch64Triples, AArch64Triples + llvm::array_lengthof(AArch64Triples));
1149 MultiarchLibDirs.append(
1150 AArch64LibDirs, AArch64LibDirs + llvm::array_lengthof(AArch64LibDirs));
1151 MultiarchTripleAliases.append(
1152 AArch64Triples, AArch64Triples + llvm::array_lengthof(AArch64Triples));
1154 case llvm::Triple::arm:
1155 case llvm::Triple::thumb:
1156 LibDirs.append(ARMLibDirs, ARMLibDirs + llvm::array_lengthof(ARMLibDirs));
1157 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
1158 TripleAliases.append(
1159 ARMHFTriples, ARMHFTriples + llvm::array_lengthof(ARMHFTriples));
1161 TripleAliases.append(
1162 ARMTriples, ARMTriples + llvm::array_lengthof(ARMTriples));
1165 case llvm::Triple::x86_64:
1167 X86_64LibDirs, X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
1168 TripleAliases.append(
1169 X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples));
1170 MultiarchLibDirs.append(
1171 X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
1172 MultiarchTripleAliases.append(
1173 X86Triples, X86Triples + llvm::array_lengthof(X86Triples));
1175 case llvm::Triple::x86:
1176 LibDirs.append(X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
1177 TripleAliases.append(
1178 X86Triples, X86Triples + llvm::array_lengthof(X86Triples));
1179 MultiarchLibDirs.append(
1180 X86_64LibDirs, X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
1181 MultiarchTripleAliases.append(
1182 X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples));
1184 case llvm::Triple::mips:
1186 MIPSLibDirs, MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs));
1187 TripleAliases.append(
1188 MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples));
1189 MultiarchLibDirs.append(
1190 MIPS64LibDirs, MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs));
1191 MultiarchTripleAliases.append(
1192 MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples));
1194 case llvm::Triple::mipsel:
1196 MIPSELLibDirs, MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs));
1197 TripleAliases.append(
1198 MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples));
1199 MultiarchLibDirs.append(
1200 MIPS64ELLibDirs, MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs));
1201 MultiarchTripleAliases.append(
1202 MIPS64ELTriples, MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples));
1204 case llvm::Triple::mips64:
1206 MIPS64LibDirs, MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs));
1207 TripleAliases.append(
1208 MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples));
1209 MultiarchLibDirs.append(
1210 MIPSLibDirs, MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs));
1211 MultiarchTripleAliases.append(
1212 MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples));
1214 case llvm::Triple::mips64el:
1216 MIPS64ELLibDirs, MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs));
1217 TripleAliases.append(
1218 MIPS64ELTriples, MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples));
1219 MultiarchLibDirs.append(
1220 MIPSELLibDirs, MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs));
1221 MultiarchTripleAliases.append(
1222 MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples));
1224 case llvm::Triple::ppc:
1225 LibDirs.append(PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
1226 TripleAliases.append(
1227 PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples));
1228 MultiarchLibDirs.append(
1229 PPC64LibDirs, PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
1230 MultiarchTripleAliases.append(
1231 PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples));
1233 case llvm::Triple::ppc64:
1235 PPC64LibDirs, PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
1236 TripleAliases.append(
1237 PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples));
1238 MultiarchLibDirs.append(
1239 PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
1240 MultiarchTripleAliases.append(
1241 PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples));
1245 // By default, just rely on the standard lib directories and the original
1250 // Always append the drivers target triple to the end, in case it doesn't
1251 // match any of our aliases.
1252 TripleAliases.push_back(TargetTriple.str());
1254 // Also include the multiarch variant if it's different.
1255 if (TargetTriple.str() != MultiarchTriple.str())
1256 MultiarchTripleAliases.push_back(MultiarchTriple.str());
1259 // FIXME: There is the same routine in the Tools.cpp.
1260 static bool hasMipsN32ABIArg(const ArgList &Args) {
1261 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1262 return A && (A->getValue() == StringRef("n32"));
1265 static StringRef getTargetMultiarchSuffix(llvm::Triple::ArchType TargetArch,
1266 const ArgList &Args) {
1267 if (TargetArch == llvm::Triple::x86_64 ||
1268 TargetArch == llvm::Triple::ppc64)
1271 if (TargetArch == llvm::Triple::mips64 ||
1272 TargetArch == llvm::Triple::mips64el) {
1273 if (hasMipsN32ABIArg(Args))
1282 void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
1283 llvm::Triple::ArchType TargetArch, const ArgList &Args,
1284 const std::string &LibDir,
1285 StringRef CandidateTriple, bool NeedsMultiarchSuffix) {
1286 // There are various different suffixes involving the triple we
1287 // check for. We also record what is necessary to walk from each back
1288 // up to the lib directory.
1289 const std::string LibSuffixes[] = {
1290 "/gcc/" + CandidateTriple.str(),
1291 "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
1293 // The Freescale PPC SDK has the gcc libraries in
1294 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
1295 "/" + CandidateTriple.str(),
1297 // Ubuntu has a strange mis-matched pair of triples that this happens to
1299 // FIXME: It may be worthwhile to generalize this and look for a second
1301 "/i386-linux-gnu/gcc/" + CandidateTriple.str()
1303 const std::string InstallSuffixes[] = {
1309 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
1310 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibSuffixes) -
1311 (TargetArch != llvm::Triple::x86));
1312 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
1313 StringRef LibSuffix = LibSuffixes[i];
1314 llvm::error_code EC;
1315 for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE;
1316 !EC && LI != LE; LI = LI.increment(EC)) {
1317 StringRef VersionText = llvm::sys::path::filename(LI->path());
1318 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
1319 static const GCCVersion MinVersion = { "4.1.1", 4, 1, 1, "" };
1320 if (CandidateVersion < MinVersion)
1322 if (CandidateVersion <= Version)
1325 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
1326 // in what would normally be GCCInstallPath and put the 64-bit
1327 // libs in a subdirectory named 64. The simple logic we follow is that
1328 // *if* there is a subdirectory of the right name with crtbegin.o in it,
1329 // we use that. If not, and if not a multiarch triple, we look for
1330 // crtbegin.o without the subdirectory.
1331 StringRef MultiarchSuffix = getTargetMultiarchSuffix(TargetArch, Args);
1332 if (llvm::sys::fs::exists(LI->path() + MultiarchSuffix + "/crtbegin.o")) {
1333 GCCMultiarchSuffix = MultiarchSuffix.str();
1335 if (NeedsMultiarchSuffix ||
1336 !llvm::sys::fs::exists(LI->path() + "/crtbegin.o"))
1338 GCCMultiarchSuffix.clear();
1341 Version = CandidateVersion;
1342 GCCTriple.setTriple(CandidateTriple);
1343 // FIXME: We hack together the directory name here instead of
1344 // using LI to ensure stable path separators across Windows and
1346 GCCInstallPath = LibDir + LibSuffixes[i] + "/" + VersionText.str();
1347 GCCParentLibPath = GCCInstallPath + InstallSuffixes[i];
1353 Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple,
1354 const ArgList &Args)
1355 : ToolChain(D, Triple, Args), GCCInstallation(getDriver(), Triple, Args) {
1356 getProgramPaths().push_back(getDriver().getInstalledDir());
1357 if (getDriver().getInstalledDir() != getDriver().Dir)
1358 getProgramPaths().push_back(getDriver().Dir);
1361 Generic_GCC::~Generic_GCC() {
1364 Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
1366 case Action::PreprocessJobClass:
1368 Preprocess.reset(new tools::gcc::Preprocess(*this));
1369 return Preprocess.get();
1370 case Action::PrecompileJobClass:
1372 Precompile.reset(new tools::gcc::Precompile(*this));
1373 return Precompile.get();
1374 case Action::CompileJobClass:
1376 Compile.reset(new tools::gcc::Compile(*this));
1377 return Compile.get();
1379 return ToolChain::getTool(AC);
1383 Tool *Generic_GCC::buildAssembler() const {
1384 return new tools::gcc::Assemble(*this);
1387 Tool *Generic_GCC::buildLinker() const {
1388 return new tools::gcc::Link(*this);
1391 bool Generic_GCC::IsUnwindTablesDefault() const {
1392 return getArch() == llvm::Triple::x86_64;
1395 bool Generic_GCC::isPICDefault() const {
1399 bool Generic_GCC::isPICDefaultForced() const {
1403 /// Hexagon Toolchain
1405 std::string Hexagon_TC::GetGnuDir(const std::string &InstalledDir) {
1407 // Locate the rest of the toolchain ...
1408 if (strlen(GCC_INSTALL_PREFIX))
1409 return std::string(GCC_INSTALL_PREFIX);
1411 std::string InstallRelDir = InstalledDir + "/../../gnu";
1412 if (llvm::sys::fs::exists(InstallRelDir))
1413 return InstallRelDir;
1415 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
1416 if (llvm::sys::fs::exists(PrefixRelDir))
1417 return PrefixRelDir;
1419 return InstallRelDir;
1422 static void GetHexagonLibraryPaths(
1423 const ArgList &Args,
1424 const std::string Ver,
1425 const std::string MarchString,
1426 const std::string &InstalledDir,
1427 ToolChain::path_list *LibPaths)
1429 bool buildingLib = Args.hasArg(options::OPT_shared);
1431 //----------------------------------------------------------------------------
1433 //----------------------------------------------------------------------------
1435 it = Args.filtered_begin(options::OPT_L),
1436 ie = Args.filtered_end();
1439 for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i)
1440 LibPaths->push_back((*it)->getValue(i));
1443 //----------------------------------------------------------------------------
1444 // Other standard paths
1445 //----------------------------------------------------------------------------
1446 const std::string MarchSuffix = "/" + MarchString;
1447 const std::string G0Suffix = "/G0";
1448 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
1449 const std::string RootDir = Hexagon_TC::GetGnuDir(InstalledDir) + "/";
1451 // lib/gcc/hexagon/...
1452 std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
1454 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
1455 LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
1457 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
1458 LibPaths->push_back(LibGCCHexagonDir + Ver);
1461 LibPaths->push_back(RootDir + "lib/gcc");
1464 std::string HexagonLibDir = RootDir + "hexagon/lib";
1466 LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
1467 LibPaths->push_back(HexagonLibDir + G0Suffix);
1469 LibPaths->push_back(HexagonLibDir + MarchSuffix);
1470 LibPaths->push_back(HexagonLibDir);
1473 Hexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple &Triple,
1474 const ArgList &Args)
1475 : Linux(D, Triple, Args) {
1476 const std::string InstalledDir(getDriver().getInstalledDir());
1477 const std::string GnuDir = Hexagon_TC::GetGnuDir(InstalledDir);
1479 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
1481 const std::string BinDir(GnuDir + "/bin");
1482 if (llvm::sys::fs::exists(BinDir))
1483 getProgramPaths().push_back(BinDir);
1485 // Determine version of GCC libraries and headers to use.
1486 const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
1487 llvm::error_code ec;
1488 GCCVersion MaxVersion= GCCVersion::Parse("0.0.0");
1489 for (llvm::sys::fs::directory_iterator di(HexagonDir, ec), de;
1490 !ec && di != de; di = di.increment(ec)) {
1491 GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->path()));
1492 if (MaxVersion < cv)
1495 GCCLibAndIncVersion = MaxVersion;
1497 ToolChain::path_list *LibPaths= &getFilePaths();
1499 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
1500 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
1501 // support 'linux' we'll need to fix this up
1504 GetHexagonLibraryPaths(
1506 GetGCCLibAndIncVersion(),
1512 Hexagon_TC::~Hexagon_TC() {
1515 Tool *Hexagon_TC::buildAssembler() const {
1516 return new tools::hexagon::Assemble(*this);
1519 Tool *Hexagon_TC::buildLinker() const {
1520 return new tools::hexagon::Link(*this);
1523 void Hexagon_TC::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
1524 ArgStringList &CC1Args) const {
1525 const Driver &D = getDriver();
1527 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
1528 DriverArgs.hasArg(options::OPT_nostdlibinc))
1531 llvm::sys::Path InstallDir(D.InstalledDir);
1532 std::string Ver(GetGCCLibAndIncVersion());
1533 std::string GnuDir = Hexagon_TC::GetGnuDir(D.InstalledDir);
1534 std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
1535 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
1536 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
1537 addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
1540 void Hexagon_TC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1541 ArgStringList &CC1Args) const {
1543 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
1544 DriverArgs.hasArg(options::OPT_nostdincxx))
1547 const Driver &D = getDriver();
1548 std::string Ver(GetGCCLibAndIncVersion());
1549 llvm::sys::Path IncludeDir(Hexagon_TC::GetGnuDir(D.InstalledDir));
1551 IncludeDir.appendComponent("hexagon/include/c++/");
1552 IncludeDir.appendComponent(Ver);
1553 addSystemInclude(DriverArgs, CC1Args, IncludeDir.str());
1556 ToolChain::CXXStdlibType
1557 Hexagon_TC::GetCXXStdlibType(const ArgList &Args) const {
1558 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
1560 return ToolChain::CST_Libstdcxx;
1562 StringRef Value = A->getValue();
1563 if (Value != "libstdc++") {
1564 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
1565 << A->getAsString(Args);
1568 return ToolChain::CST_Libstdcxx;
1571 static Arg *GetLastHexagonArchArg(const ArgList &Args)
1575 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1577 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
1578 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1581 } else if ((*it)->getOption().matches(options::OPT_m_Joined)) {
1582 StringRef Value = (*it)->getValue(0);
1583 if (Value.startswith("v")) {
1592 StringRef Hexagon_TC::GetTargetCPU(const ArgList &Args)
1594 // Select the default CPU (v4) if none was given or detection failed.
1595 Arg *A = GetLastHexagonArchArg (Args);
1597 StringRef WhichHexagon = A->getValue();
1598 if (WhichHexagon.startswith("hexagon"))
1599 return WhichHexagon.substr(sizeof("hexagon") - 1);
1600 if (WhichHexagon != "")
1601 return WhichHexagon;
1608 /// TCEToolChain - A tool chain using the llvm bitcode tools to perform
1609 /// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
1610 /// Currently does not support anything else but compilation.
1612 TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple& Triple,
1613 const ArgList &Args)
1614 : ToolChain(D, Triple, Args) {
1615 // Path mangling to find libexec
1616 std::string Path(getDriver().Dir);
1618 Path += "/../libexec";
1619 getProgramPaths().push_back(Path);
1622 TCEToolChain::~TCEToolChain() {
1625 bool TCEToolChain::IsMathErrnoDefault() const {
1629 bool TCEToolChain::isPICDefault() const {
1633 bool TCEToolChain::isPICDefaultForced() const {
1637 /// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
1639 OpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1640 : Generic_ELF(D, Triple, Args) {
1641 getFilePaths().push_back(getDriver().Dir + "/../lib");
1642 getFilePaths().push_back("/usr/lib");
1645 Tool *OpenBSD::buildAssembler() const {
1646 return new tools::openbsd::Assemble(*this);
1649 Tool *OpenBSD::buildLinker() const {
1650 return new tools::openbsd::Link(*this);
1653 /// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
1655 Bitrig::Bitrig(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1656 : Generic_ELF(D, Triple, Args) {
1657 getFilePaths().push_back(getDriver().Dir + "/../lib");
1658 getFilePaths().push_back("/usr/lib");
1661 Tool *Bitrig::buildAssembler() const {
1662 return new tools::bitrig::Assemble(*this);
1665 Tool *Bitrig::buildLinker() const {
1666 return new tools::bitrig::Link(*this);
1669 void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1670 ArgStringList &CC1Args) const {
1671 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
1672 DriverArgs.hasArg(options::OPT_nostdincxx))
1675 switch (GetCXXStdlibType(DriverArgs)) {
1676 case ToolChain::CST_Libcxx:
1677 addSystemInclude(DriverArgs, CC1Args,
1678 getDriver().SysRoot + "/usr/include/c++/");
1680 case ToolChain::CST_Libstdcxx:
1681 addSystemInclude(DriverArgs, CC1Args,
1682 getDriver().SysRoot + "/usr/include/c++/stdc++");
1683 addSystemInclude(DriverArgs, CC1Args,
1684 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
1686 StringRef Triple = getTriple().str();
1687 if (Triple.startswith("amd64"))
1688 addSystemInclude(DriverArgs, CC1Args,
1689 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
1692 addSystemInclude(DriverArgs, CC1Args,
1693 getDriver().SysRoot + "/usr/include/c++/stdc++/" +
1699 void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
1700 ArgStringList &CmdArgs) const {
1701 switch (GetCXXStdlibType(Args)) {
1702 case ToolChain::CST_Libcxx:
1703 CmdArgs.push_back("-lc++");
1704 CmdArgs.push_back("-lcxxrt");
1705 // Include supc++ to provide Unwind until provided by libcxx.
1706 CmdArgs.push_back("-lgcc");
1708 case ToolChain::CST_Libstdcxx:
1709 CmdArgs.push_back("-lstdc++");
1714 /// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
1716 FreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1717 : Generic_ELF(D, Triple, Args) {
1719 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
1720 // back to '/usr/lib' if it doesn't exist.
1721 if ((Triple.getArch() == llvm::Triple::x86 ||
1722 Triple.getArch() == llvm::Triple::ppc) &&
1723 llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
1724 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
1726 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
1729 Tool *FreeBSD::buildAssembler() const {
1730 return new tools::freebsd::Assemble(*this);
1733 Tool *FreeBSD::buildLinker() const {
1734 return new tools::freebsd::Link(*this);
1737 bool FreeBSD::UseSjLjExceptions() const {
1738 // FreeBSD uses SjLj exceptions on ARM oabi.
1739 switch (getTriple().getEnvironment()) {
1740 case llvm::Triple::GNUEABI:
1741 case llvm::Triple::EABI:
1745 return (getTriple().getArch() == llvm::Triple::arm ||
1746 getTriple().getArch() == llvm::Triple::thumb);
1750 /// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
1752 NetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1753 : Generic_ELF(D, Triple, Args) {
1755 if (getDriver().UseStdLib) {
1756 // When targeting a 32-bit platform, try the special directory used on
1757 // 64-bit hosts, and only fall back to the main library directory if that
1759 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
1760 // what all logic is needed to emulate the '=' prefix here.
1761 if (Triple.getArch() == llvm::Triple::x86)
1762 getFilePaths().push_back("=/usr/lib/i386");
1764 getFilePaths().push_back("=/usr/lib");
1768 Tool *NetBSD::buildAssembler() const {
1769 return new tools::netbsd::Assemble(*this);
1772 Tool *NetBSD::buildLinker() const {
1773 return new tools::netbsd::Link(*this);
1776 /// Minix - Minix tool chain which can call as(1) and ld(1) directly.
1778 Minix::Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1779 : Generic_ELF(D, Triple, Args) {
1780 getFilePaths().push_back(getDriver().Dir + "/../lib");
1781 getFilePaths().push_back("/usr/lib");
1784 Tool *Minix::buildAssembler() const {
1785 return new tools::minix::Assemble(*this);
1788 Tool *Minix::buildLinker() const {
1789 return new tools::minix::Link(*this);
1792 /// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
1794 AuroraUX::AuroraUX(const Driver &D, const llvm::Triple& Triple,
1795 const ArgList &Args)
1796 : Generic_GCC(D, Triple, Args) {
1798 getProgramPaths().push_back(getDriver().getInstalledDir());
1799 if (getDriver().getInstalledDir() != getDriver().Dir)
1800 getProgramPaths().push_back(getDriver().Dir);
1802 getFilePaths().push_back(getDriver().Dir + "/../lib");
1803 getFilePaths().push_back("/usr/lib");
1804 getFilePaths().push_back("/usr/sfw/lib");
1805 getFilePaths().push_back("/opt/gcc4/lib");
1806 getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
1810 Tool *AuroraUX::buildAssembler() const {
1811 return new tools::auroraux::Assemble(*this);
1814 Tool *AuroraUX::buildLinker() const {
1815 return new tools::auroraux::Link(*this);
1818 /// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
1820 Solaris::Solaris(const Driver &D, const llvm::Triple& Triple,
1821 const ArgList &Args)
1822 : Generic_GCC(D, Triple, Args) {
1824 getProgramPaths().push_back(getDriver().getInstalledDir());
1825 if (getDriver().getInstalledDir() != getDriver().Dir)
1826 getProgramPaths().push_back(getDriver().Dir);
1828 getFilePaths().push_back(getDriver().Dir + "/../lib");
1829 getFilePaths().push_back("/usr/lib");
1832 Tool *Solaris::buildAssembler() const {
1833 return new tools::solaris::Assemble(*this);
1836 Tool *Solaris::buildLinker() const {
1837 return new tools::solaris::Link(*this);
1840 /// Distribution (very bare-bones at the moment).
1875 static bool IsRedhat(enum Distro Distro) {
1876 return (Distro >= Fedora13 && Distro <= FedoraRawhide) ||
1877 (Distro >= RHEL4 && Distro <= RHEL6);
1880 static bool IsOpenSuse(enum Distro Distro) {
1881 return Distro >= OpenSuse11_3 && Distro <= OpenSuse12_2;
1884 static bool IsDebian(enum Distro Distro) {
1885 return Distro >= DebianLenny && Distro <= DebianJessie;
1888 static bool IsUbuntu(enum Distro Distro) {
1889 return Distro >= UbuntuHardy && Distro <= UbuntuRaring;
1892 static Distro DetectDistro(llvm::Triple::ArchType Arch) {
1893 OwningPtr<llvm::MemoryBuffer> File;
1894 if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) {
1895 StringRef Data = File.get()->getBuffer();
1896 SmallVector<StringRef, 8> Lines;
1897 Data.split(Lines, "\n");
1898 Distro Version = UnknownDistro;
1899 for (unsigned i = 0, s = Lines.size(); i != s; ++i)
1900 if (Version == UnknownDistro && Lines[i].startswith("DISTRIB_CODENAME="))
1901 Version = llvm::StringSwitch<Distro>(Lines[i].substr(17))
1902 .Case("hardy", UbuntuHardy)
1903 .Case("intrepid", UbuntuIntrepid)
1904 .Case("jaunty", UbuntuJaunty)
1905 .Case("karmic", UbuntuKarmic)
1906 .Case("lucid", UbuntuLucid)
1907 .Case("maverick", UbuntuMaverick)
1908 .Case("natty", UbuntuNatty)
1909 .Case("oneiric", UbuntuOneiric)
1910 .Case("precise", UbuntuPrecise)
1911 .Case("quantal", UbuntuQuantal)
1912 .Case("raring", UbuntuRaring)
1913 .Default(UnknownDistro);
1917 if (!llvm::MemoryBuffer::getFile("/etc/redhat-release", File)) {
1918 StringRef Data = File.get()->getBuffer();
1919 if (Data.startswith("Fedora release 16"))
1921 else if (Data.startswith("Fedora release 15"))
1923 else if (Data.startswith("Fedora release 14"))
1925 else if (Data.startswith("Fedora release 13"))
1927 else if (Data.startswith("Fedora release") &&
1928 Data.find("Rawhide") != StringRef::npos)
1929 return FedoraRawhide;
1930 else if (Data.startswith("Red Hat Enterprise Linux") &&
1931 Data.find("release 6") != StringRef::npos)
1933 else if ((Data.startswith("Red Hat Enterprise Linux") ||
1934 Data.startswith("CentOS")) &&
1935 Data.find("release 5") != StringRef::npos)
1937 else if ((Data.startswith("Red Hat Enterprise Linux") ||
1938 Data.startswith("CentOS")) &&
1939 Data.find("release 4") != StringRef::npos)
1941 return UnknownDistro;
1944 if (!llvm::MemoryBuffer::getFile("/etc/debian_version", File)) {
1945 StringRef Data = File.get()->getBuffer();
1948 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
1949 return DebianSqueeze;
1950 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
1951 return DebianWheezy;
1952 else if (Data.startswith("jessie/sid") || Data[0] == '8')
1953 return DebianJessie;
1954 return UnknownDistro;
1957 if (!llvm::MemoryBuffer::getFile("/etc/SuSE-release", File))
1958 return llvm::StringSwitch<Distro>(File.get()->getBuffer())
1959 .StartsWith("openSUSE 11.3", OpenSuse11_3)
1960 .StartsWith("openSUSE 11.4", OpenSuse11_4)
1961 .StartsWith("openSUSE 12.1", OpenSuse12_1)
1962 .StartsWith("openSUSE 12.2", OpenSuse12_2)
1963 .Default(UnknownDistro);
1966 if (!llvm::sys::fs::exists("/etc/exherbo-release", Exists) && Exists)
1969 if (!llvm::sys::fs::exists("/etc/arch-release", Exists) && Exists)
1972 return UnknownDistro;
1975 /// \brief Get our best guess at the multiarch triple for a target.
1977 /// Debian-based systems are starting to use a multiarch setup where they use
1978 /// a target-triple directory in the library and header search paths.
1979 /// Unfortunately, this triple does not align with the vanilla target triple,
1980 /// so we provide a rough mapping here.
1981 static std::string getMultiarchTriple(const llvm::Triple TargetTriple,
1982 StringRef SysRoot) {
1983 // For most architectures, just use whatever we have rather than trying to be
1985 switch (TargetTriple.getArch()) {
1987 return TargetTriple.str();
1989 // We use the existence of '/lib/<triple>' as a directory to detect some
1990 // common linux triples that don't quite match the Clang triple for both
1991 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
1992 // regardless of what the actual target triple is.
1993 case llvm::Triple::arm:
1994 case llvm::Triple::thumb:
1995 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
1996 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf"))
1997 return "arm-linux-gnueabihf";
1999 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi"))
2000 return "arm-linux-gnueabi";
2002 return TargetTriple.str();
2003 case llvm::Triple::x86:
2004 if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
2005 return "i386-linux-gnu";
2006 return TargetTriple.str();
2007 case llvm::Triple::x86_64:
2008 if (llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
2009 return "x86_64-linux-gnu";
2010 return TargetTriple.str();
2011 case llvm::Triple::aarch64:
2012 if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64-linux-gnu"))
2013 return "aarch64-linux-gnu";
2014 case llvm::Triple::mips:
2015 if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu"))
2016 return "mips-linux-gnu";
2017 return TargetTriple.str();
2018 case llvm::Triple::mipsel:
2019 if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu"))
2020 return "mipsel-linux-gnu";
2021 return TargetTriple.str();
2022 case llvm::Triple::ppc:
2023 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
2024 return "powerpc-linux-gnuspe";
2025 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu"))
2026 return "powerpc-linux-gnu";
2027 return TargetTriple.str();
2028 case llvm::Triple::ppc64:
2029 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu"))
2030 return "powerpc64-linux-gnu";
2031 return TargetTriple.str();
2035 static void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
2036 if (llvm::sys::fs::exists(Path)) Paths.push_back(Path.str());
2039 static bool isMipsArch(llvm::Triple::ArchType Arch) {
2040 return Arch == llvm::Triple::mips ||
2041 Arch == llvm::Triple::mipsel ||
2042 Arch == llvm::Triple::mips64 ||
2043 Arch == llvm::Triple::mips64el;
2046 static bool isMipsR2Arch(llvm::Triple::ArchType Arch,
2047 const ArgList &Args) {
2048 if (Arch != llvm::Triple::mips &&
2049 Arch != llvm::Triple::mipsel)
2052 Arg *A = Args.getLastArg(options::OPT_march_EQ,
2053 options::OPT_mcpu_EQ,
2054 options::OPT_mips_CPUs_Group);
2059 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
2060 return A->getOption().matches(options::OPT_mips32r2);
2062 return A->getValue() == StringRef("mips32r2");
2065 static StringRef getMultilibDir(const llvm::Triple &Triple,
2066 const ArgList &Args) {
2067 if (!isMipsArch(Triple.getArch()))
2068 return Triple.isArch32Bit() ? "lib32" : "lib64";
2070 // lib32 directory has a special meaning on MIPS targets.
2071 // It contains N32 ABI binaries. Use this folder if produce
2072 // code for N32 ABI only.
2073 if (hasMipsN32ABIArg(Args))
2076 return Triple.isArch32Bit() ? "lib" : "lib64";
2079 Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2080 : Generic_ELF(D, Triple, Args) {
2081 llvm::Triple::ArchType Arch = Triple.getArch();
2082 const std::string &SysRoot = getDriver().SysRoot;
2084 // OpenSuse stores the linker with the compiler, add that to the search
2086 ToolChain::path_list &PPaths = getProgramPaths();
2087 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
2088 GCCInstallation.getTriple().str() + "/bin").str());
2090 Linker = GetProgramPath("ld");
2092 Distro Distro = DetectDistro(Arch);
2094 if (IsOpenSuse(Distro) || IsUbuntu(Distro)) {
2095 ExtraOpts.push_back("-z");
2096 ExtraOpts.push_back("relro");
2099 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
2100 ExtraOpts.push_back("-X");
2102 const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android;
2104 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
2105 // and the MIPS ABI require .dynsym to be sorted in different ways.
2106 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
2107 // ABI requires a mapping between the GOT and the symbol table.
2108 // Android loader does not support .gnu.hash.
2109 if (!isMipsArch(Arch) && !IsAndroid) {
2110 if (IsRedhat(Distro) || IsOpenSuse(Distro) ||
2111 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
2112 ExtraOpts.push_back("--hash-style=gnu");
2114 if (IsDebian(Distro) || IsOpenSuse(Distro) || Distro == UbuntuLucid ||
2115 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
2116 ExtraOpts.push_back("--hash-style=both");
2119 if (IsRedhat(Distro))
2120 ExtraOpts.push_back("--no-add-needed");
2122 if (Distro == DebianSqueeze || Distro == DebianWheezy ||
2123 Distro == DebianJessie || IsOpenSuse(Distro) ||
2124 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
2125 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
2126 ExtraOpts.push_back("--build-id");
2128 if (IsOpenSuse(Distro))
2129 ExtraOpts.push_back("--enable-new-dtags");
2131 // The selection of paths to try here is designed to match the patterns which
2132 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
2133 // This was determined by running GCC in a fake filesystem, creating all
2134 // possible permutations of these directories, and seeing which ones it added
2135 // to the link paths.
2136 path_list &Paths = getFilePaths();
2138 const std::string Multilib = getMultilibDir(Triple, Args);
2139 const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
2141 // Add the multilib suffixed paths where they are available.
2142 if (GCCInstallation.isValid()) {
2143 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
2144 const std::string &LibPath = GCCInstallation.getParentLibPath();
2146 if (IsAndroid && isMipsR2Arch(Triple.getArch(), Args))
2147 addPathIfExists(GCCInstallation.getInstallPath() +
2148 GCCInstallation.getMultiarchSuffix() +
2152 addPathIfExists((GCCInstallation.getInstallPath() +
2153 GCCInstallation.getMultiarchSuffix()),
2156 // If the GCC installation we found is inside of the sysroot, we want to
2157 // prefer libraries installed in the parent prefix of the GCC installation.
2158 // It is important to *not* use these paths when the GCC installation is
2159 // outside of the system root as that can pick up unintended libraries.
2160 // This usually happens when there is an external cross compiler on the
2161 // host system, and a more minimal sysroot available that is the target of
2163 if (StringRef(LibPath).startswith(SysRoot)) {
2164 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + Multilib,
2166 addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
2167 addPathIfExists(LibPath + "/../" + Multilib, Paths);
2169 // On Android, libraries in the parent prefix of the GCC installation are
2170 // preferred to the ones under sysroot.
2172 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib", Paths);
2175 addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
2176 addPathIfExists(SysRoot + "/lib/../" + Multilib, Paths);
2177 addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
2178 addPathIfExists(SysRoot + "/usr/lib/../" + Multilib, Paths);
2180 // Try walking via the GCC triple path in case of multiarch GCC
2181 // installations with strange symlinks.
2182 if (GCCInstallation.isValid())
2183 addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
2184 "/../../" + Multilib, Paths);
2186 // Add the non-multilib suffixed paths (if potentially different).
2187 if (GCCInstallation.isValid()) {
2188 const std::string &LibPath = GCCInstallation.getParentLibPath();
2189 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
2190 if (!GCCInstallation.getMultiarchSuffix().empty())
2191 addPathIfExists(GCCInstallation.getInstallPath(), Paths);
2193 if (StringRef(LibPath).startswith(SysRoot)) {
2194 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib", Paths);
2195 addPathIfExists(LibPath, Paths);
2198 addPathIfExists(SysRoot + "/lib", Paths);
2199 addPathIfExists(SysRoot + "/usr/lib", Paths);
2202 bool Linux::HasNativeLLVMSupport() const {
2206 Tool *Linux::buildLinker() const {
2207 return new tools::gnutools::Link(*this);
2210 Tool *Linux::buildAssembler() const {
2211 return new tools::gnutools::Assemble(*this);
2214 void Linux::addClangTargetOptions(const ArgList &DriverArgs,
2215 ArgStringList &CC1Args) const {
2216 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
2217 bool UseInitArrayDefault
2218 = V >= Generic_GCC::GCCVersion::Parse("4.7.0") ||
2219 getTriple().getArch() == llvm::Triple::aarch64 ||
2220 getTriple().getEnvironment() == llvm::Triple::Android;
2221 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
2222 options::OPT_fno_use_init_array,
2223 UseInitArrayDefault))
2224 CC1Args.push_back("-fuse-init-array");
2227 void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2228 ArgStringList &CC1Args) const {
2229 const Driver &D = getDriver();
2231 if (DriverArgs.hasArg(options::OPT_nostdinc))
2234 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
2235 addSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/local/include");
2237 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2238 llvm::sys::Path P(D.ResourceDir);
2239 P.appendComponent("include");
2240 addSystemInclude(DriverArgs, CC1Args, P.str());
2243 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2246 // Check for configure-time C include directories.
2247 StringRef CIncludeDirs(C_INCLUDE_DIRS);
2248 if (CIncludeDirs != "") {
2249 SmallVector<StringRef, 5> dirs;
2250 CIncludeDirs.split(dirs, ":");
2251 for (SmallVectorImpl<StringRef>::iterator I = dirs.begin(), E = dirs.end();
2253 StringRef Prefix = llvm::sys::path::is_absolute(*I) ? D.SysRoot : "";
2254 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + *I);
2259 // Lacking those, try to detect the correct set of system includes for the
2262 // Implement generic Debian multiarch support.
2263 const StringRef X86_64MultiarchIncludeDirs[] = {
2264 "/usr/include/x86_64-linux-gnu",
2266 // FIXME: These are older forms of multiarch. It's not clear that they're
2267 // in use in any released version of Debian, so we should consider
2269 "/usr/include/i686-linux-gnu/64",
2270 "/usr/include/i486-linux-gnu/64"
2272 const StringRef X86MultiarchIncludeDirs[] = {
2273 "/usr/include/i386-linux-gnu",
2275 // FIXME: These are older forms of multiarch. It's not clear that they're
2276 // in use in any released version of Debian, so we should consider
2278 "/usr/include/x86_64-linux-gnu/32",
2279 "/usr/include/i686-linux-gnu",
2280 "/usr/include/i486-linux-gnu"
2282 const StringRef AArch64MultiarchIncludeDirs[] = {
2283 "/usr/include/aarch64-linux-gnu"
2285 const StringRef ARMMultiarchIncludeDirs[] = {
2286 "/usr/include/arm-linux-gnueabi"
2288 const StringRef ARMHFMultiarchIncludeDirs[] = {
2289 "/usr/include/arm-linux-gnueabihf"
2291 const StringRef MIPSMultiarchIncludeDirs[] = {
2292 "/usr/include/mips-linux-gnu"
2294 const StringRef MIPSELMultiarchIncludeDirs[] = {
2295 "/usr/include/mipsel-linux-gnu"
2297 const StringRef PPCMultiarchIncludeDirs[] = {
2298 "/usr/include/powerpc-linux-gnu"
2300 const StringRef PPC64MultiarchIncludeDirs[] = {
2301 "/usr/include/powerpc64-linux-gnu"
2303 ArrayRef<StringRef> MultiarchIncludeDirs;
2304 if (getTriple().getArch() == llvm::Triple::x86_64) {
2305 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
2306 } else if (getTriple().getArch() == llvm::Triple::x86) {
2307 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
2308 } else if (getTriple().getArch() == llvm::Triple::aarch64) {
2309 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
2310 } else if (getTriple().getArch() == llvm::Triple::arm) {
2311 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
2312 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
2314 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
2315 } else if (getTriple().getArch() == llvm::Triple::mips) {
2316 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
2317 } else if (getTriple().getArch() == llvm::Triple::mipsel) {
2318 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
2319 } else if (getTriple().getArch() == llvm::Triple::ppc) {
2320 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
2321 } else if (getTriple().getArch() == llvm::Triple::ppc64) {
2322 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
2324 for (ArrayRef<StringRef>::iterator I = MultiarchIncludeDirs.begin(),
2325 E = MultiarchIncludeDirs.end();
2327 if (llvm::sys::fs::exists(D.SysRoot + *I)) {
2328 addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + *I);
2333 if (getTriple().getOS() == llvm::Triple::RTEMS)
2336 // Add an include of '/include' directly. This isn't provided by default by
2337 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
2338 // add even when Clang is acting as-if it were a system compiler.
2339 addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/include");
2341 addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/include");
2344 /// \brief Helper to add the three variant paths for a libstdc++ installation.
2345 /*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir,
2346 const ArgList &DriverArgs,
2347 ArgStringList &CC1Args) {
2348 if (!llvm::sys::fs::exists(Base))
2350 addSystemInclude(DriverArgs, CC1Args, Base);
2351 addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir);
2352 addSystemInclude(DriverArgs, CC1Args, Base + "/backward");
2356 /// \brief Helper to add an extra variant path for an (Ubuntu) multilib
2357 /// libstdc++ installation.
2358 /*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine Suffix,
2359 Twine TargetArchDir,
2360 Twine MultiLibSuffix,
2361 const ArgList &DriverArgs,
2362 ArgStringList &CC1Args) {
2363 if (!addLibStdCXXIncludePaths(Base+Suffix, TargetArchDir + MultiLibSuffix,
2364 DriverArgs, CC1Args))
2367 addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir + Suffix
2372 void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2373 ArgStringList &CC1Args) const {
2374 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2375 DriverArgs.hasArg(options::OPT_nostdincxx))
2378 // Check if libc++ has been enabled and provide its include paths if so.
2379 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
2380 // libc++ is always installed at a fixed path on Linux currently.
2381 addSystemInclude(DriverArgs, CC1Args,
2382 getDriver().SysRoot + "/usr/include/c++/v1");
2386 // We need a detected GCC installation on Linux to provide libstdc++'s
2387 // headers. We handled the libc++ case above.
2388 if (!GCCInstallation.isValid())
2391 // By default, look for the C++ headers in an include directory adjacent to
2392 // the lib directory of the GCC installation. Note that this is expect to be
2393 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
2394 StringRef LibDir = GCCInstallation.getParentLibPath();
2395 StringRef InstallDir = GCCInstallation.getInstallPath();
2396 StringRef Version = GCCInstallation.getVersion().Text;
2397 StringRef TripleStr = GCCInstallation.getTriple().str();
2399 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
2400 "/c++/" + Version.str(),
2402 GCCInstallation.getMultiarchSuffix(),
2403 DriverArgs, CC1Args))
2406 const std::string IncludePathCandidates[] = {
2407 // Gentoo is weird and places its headers inside the GCC install, so if the
2408 // first attempt to find the headers fails, try this pattern.
2409 InstallDir.str() + "/include/g++-v4",
2410 // Android standalone toolchain has C++ headers in yet another place.
2411 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.str(),
2412 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
2413 // without a subdirectory corresponding to the gcc version.
2414 LibDir.str() + "/../include/c++",
2417 for (unsigned i = 0; i < llvm::array_lengthof(IncludePathCandidates); ++i) {
2418 if (addLibStdCXXIncludePaths(IncludePathCandidates[i], (TripleStr +
2419 GCCInstallation.getMultiarchSuffix()),
2420 DriverArgs, CC1Args))
2425 /// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
2427 DragonFly::DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
2428 : Generic_ELF(D, Triple, Args) {
2430 // Path mangling to find libexec
2431 getProgramPaths().push_back(getDriver().getInstalledDir());
2432 if (getDriver().getInstalledDir() != getDriver().Dir)
2433 getProgramPaths().push_back(getDriver().Dir);
2435 getFilePaths().push_back(getDriver().Dir + "/../lib");
2436 getFilePaths().push_back("/usr/lib");
2437 getFilePaths().push_back("/usr/lib/gcc41");
2440 Tool *DragonFly::buildAssembler() const {
2441 return new tools::dragonfly::Assemble(*this);
2444 Tool *DragonFly::buildLinker() const {
2445 return new tools::dragonfly::Link(*this);