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(*this, 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::isPIEDefault() const {
885 bool Darwin::isPICDefaultForced() const {
886 return getArch() == llvm::Triple::x86_64;
889 bool Darwin::SupportsProfiling() const {
890 // Profiling instrumentation is only supported on x86.
891 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
894 bool Darwin::SupportsObjCGC() const {
895 // Garbage collection is supported everywhere except on iPhone OS.
896 return !isTargetIPhoneOS();
899 void Darwin::CheckObjCARC() const {
900 if (isTargetIPhoneOS() || !isMacosxVersionLT(10, 6))
902 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
906 Darwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args,
907 types::ID InputType) const {
908 return ComputeLLVMTriple(Args, InputType);
911 /// Generic_GCC - A tool chain using the 'gcc' command to perform
912 /// all subcommands; this relies on gcc translating the majority of
913 /// command line options.
915 /// \brief Parse a GCCVersion object out of a string of text.
917 /// This is the primary means of forming GCCVersion objects.
919 Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
920 const GCCVersion BadVersion = { VersionText.str(), -1, -1, -1, "" };
921 std::pair<StringRef, StringRef> First = VersionText.split('.');
922 std::pair<StringRef, StringRef> Second = First.second.split('.');
924 GCCVersion GoodVersion = { VersionText.str(), -1, -1, -1, "" };
925 if (First.first.getAsInteger(10, GoodVersion.Major) ||
926 GoodVersion.Major < 0)
928 if (Second.first.getAsInteger(10, GoodVersion.Minor) ||
929 GoodVersion.Minor < 0)
932 // First look for a number prefix and parse that if present. Otherwise just
933 // stash the entire patch string in the suffix, and leave the number
934 // unspecified. This covers versions strings such as:
940 // And retains any patch number it finds.
941 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
942 if (!PatchText.empty()) {
943 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
944 // Try to parse the number and any suffix.
945 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
946 GoodVersion.Patch < 0)
948 GoodVersion.PatchSuffix = PatchText.substr(EndNumber).str();
955 /// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
956 bool Generic_GCC::GCCVersion::operator<(const GCCVersion &RHS) const {
957 if (Major != RHS.Major)
958 return Major < RHS.Major;
959 if (Minor != RHS.Minor)
960 return Minor < RHS.Minor;
961 if (Patch != RHS.Patch) {
962 // Note that versions without a specified patch sort higher than those with
969 // Otherwise just sort on the patch itself.
970 return Patch < RHS.Patch;
972 if (PatchSuffix != RHS.PatchSuffix) {
973 // Sort empty suffixes higher.
974 if (RHS.PatchSuffix.empty())
976 if (PatchSuffix.empty())
979 // Provide a lexicographic sort to make this a total ordering.
980 return PatchSuffix < RHS.PatchSuffix;
983 // The versions are equal.
987 static StringRef getGCCToolchainDir(const ArgList &Args) {
988 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
990 return A->getValue();
991 return GCC_INSTALL_PREFIX;
994 /// \brief Initialize a GCCInstallationDetector from the driver.
996 /// This performs all of the autodetection and sets up the various paths.
997 /// Once constructed, a GCCInstallationDetector is essentially immutable.
999 /// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1000 /// should instead pull the target out of the driver. This is currently
1001 /// necessary because the driver doesn't store the final version of the target
1004 Generic_GCC::GCCInstallationDetector::init(
1005 const Driver &D, const llvm::Triple &TargetTriple, const ArgList &Args) {
1006 llvm::Triple MultiarchTriple
1007 = TargetTriple.isArch32Bit() ? TargetTriple.get64BitArchVariant()
1008 : TargetTriple.get32BitArchVariant();
1009 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1010 // The library directories which may contain GCC installations.
1011 SmallVector<StringRef, 4> CandidateLibDirs, CandidateMultiarchLibDirs;
1012 // The compatible GCC triples for this particular architecture.
1013 SmallVector<StringRef, 10> CandidateTripleAliases;
1014 SmallVector<StringRef, 10> CandidateMultiarchTripleAliases;
1015 CollectLibDirsAndTriples(TargetTriple, MultiarchTriple, CandidateLibDirs,
1016 CandidateTripleAliases,
1017 CandidateMultiarchLibDirs,
1018 CandidateMultiarchTripleAliases);
1020 // Compute the set of prefixes for our search.
1021 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1022 D.PrefixDirs.end());
1024 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1025 if (GCCToolchainDir != "") {
1026 if (GCCToolchainDir.back() == '/')
1027 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
1029 Prefixes.push_back(GCCToolchainDir);
1031 Prefixes.push_back(D.SysRoot);
1032 Prefixes.push_back(D.SysRoot + "/usr");
1033 Prefixes.push_back(D.InstalledDir + "/..");
1036 // Loop over the various components which exist and select the best GCC
1037 // installation available. GCC installs are ranked by version number.
1038 Version = GCCVersion::Parse("0.0.0");
1039 for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) {
1040 if (!llvm::sys::fs::exists(Prefixes[i]))
1042 for (unsigned j = 0, je = CandidateLibDirs.size(); j < je; ++j) {
1043 const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str();
1044 if (!llvm::sys::fs::exists(LibDir))
1046 for (unsigned k = 0, ke = CandidateTripleAliases.size(); k < ke; ++k)
1047 ScanLibDirForGCCTriple(TargetArch, Args, LibDir,
1048 CandidateTripleAliases[k]);
1050 for (unsigned j = 0, je = CandidateMultiarchLibDirs.size(); j < je; ++j) {
1051 const std::string LibDir
1052 = Prefixes[i] + CandidateMultiarchLibDirs[j].str();
1053 if (!llvm::sys::fs::exists(LibDir))
1055 for (unsigned k = 0, ke = CandidateMultiarchTripleAliases.size(); k < ke;
1057 ScanLibDirForGCCTriple(TargetArch, Args, LibDir,
1058 CandidateMultiarchTripleAliases[k],
1059 /*NeedsMultiarchSuffix=*/true);
1064 /*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
1065 const llvm::Triple &TargetTriple,
1066 const llvm::Triple &MultiarchTriple,
1067 SmallVectorImpl<StringRef> &LibDirs,
1068 SmallVectorImpl<StringRef> &TripleAliases,
1069 SmallVectorImpl<StringRef> &MultiarchLibDirs,
1070 SmallVectorImpl<StringRef> &MultiarchTripleAliases) {
1071 // Declare a bunch of static data sets that we'll select between below. These
1072 // are specifically designed to always refer to string literals to avoid any
1073 // lifetime or initialization issues.
1074 static const char *const AArch64LibDirs[] = { "/lib" };
1075 static const char *const AArch64Triples[] = {
1076 "aarch64-none-linux-gnu",
1080 static const char *const ARMLibDirs[] = { "/lib" };
1081 static const char *const ARMTriples[] = {
1082 "arm-linux-gnueabi",
1083 "arm-linux-androideabi"
1085 static const char *const ARMHFTriples[] = {
1086 "arm-linux-gnueabihf",
1087 "armv7hl-redhat-linux-gnueabi"
1090 static const char *const X86_64LibDirs[] = { "/lib64", "/lib" };
1091 static const char *const X86_64Triples[] = {
1093 "x86_64-unknown-linux-gnu",
1094 "x86_64-pc-linux-gnu",
1095 "x86_64-redhat-linux6E",
1096 "x86_64-redhat-linux",
1097 "x86_64-suse-linux",
1098 "x86_64-manbo-linux-gnu",
1100 "x86_64-slackware-linux"
1102 static const char *const X86LibDirs[] = { "/lib32", "/lib" };
1103 static const char *const X86Triples[] = {
1105 "i686-pc-linux-gnu",
1108 "i386-redhat-linux6E",
1109 "i686-redhat-linux",
1110 "i586-redhat-linux",
1111 "i386-redhat-linux",
1113 "i486-slackware-linux",
1114 "i686-montavista-linux"
1117 static const char *const MIPSLibDirs[] = { "/lib" };
1118 static const char *const MIPSTriples[] = { "mips-linux-gnu" };
1119 static const char *const MIPSELLibDirs[] = { "/lib" };
1120 static const char *const MIPSELTriples[] = {
1122 "mipsel-linux-android",
1126 static const char *const MIPS64LibDirs[] = { "/lib64", "/lib" };
1127 static const char *const MIPS64Triples[] = { "mips64-linux-gnu" };
1128 static const char *const MIPS64ELLibDirs[] = { "/lib64", "/lib" };
1129 static const char *const MIPS64ELTriples[] = { "mips64el-linux-gnu" };
1131 static const char *const PPCLibDirs[] = { "/lib32", "/lib" };
1132 static const char *const PPCTriples[] = {
1133 "powerpc-linux-gnu",
1134 "powerpc-unknown-linux-gnu",
1135 "powerpc-linux-gnuspe",
1136 "powerpc-suse-linux",
1137 "powerpc-montavista-linuxspe"
1139 static const char *const PPC64LibDirs[] = { "/lib64", "/lib" };
1140 static const char *const PPC64Triples[] = {
1141 "powerpc64-linux-gnu",
1142 "powerpc64-unknown-linux-gnu",
1143 "powerpc64-suse-linux",
1144 "ppc64-redhat-linux"
1147 static const char *const SystemZLibDirs[] = { "/lib64", "/lib" };
1148 static const char *const SystemZTriples[] = {
1150 "s390x-unknown-linux-gnu",
1151 "s390x-ibm-linux-gnu",
1153 "s390x-redhat-linux"
1156 switch (TargetTriple.getArch()) {
1157 case llvm::Triple::aarch64:
1158 LibDirs.append(AArch64LibDirs, AArch64LibDirs
1159 + llvm::array_lengthof(AArch64LibDirs));
1160 TripleAliases.append(
1161 AArch64Triples, AArch64Triples + llvm::array_lengthof(AArch64Triples));
1162 MultiarchLibDirs.append(
1163 AArch64LibDirs, AArch64LibDirs + llvm::array_lengthof(AArch64LibDirs));
1164 MultiarchTripleAliases.append(
1165 AArch64Triples, AArch64Triples + llvm::array_lengthof(AArch64Triples));
1167 case llvm::Triple::arm:
1168 case llvm::Triple::thumb:
1169 LibDirs.append(ARMLibDirs, ARMLibDirs + llvm::array_lengthof(ARMLibDirs));
1170 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
1171 TripleAliases.append(
1172 ARMHFTriples, ARMHFTriples + llvm::array_lengthof(ARMHFTriples));
1174 TripleAliases.append(
1175 ARMTriples, ARMTriples + llvm::array_lengthof(ARMTriples));
1178 case llvm::Triple::x86_64:
1180 X86_64LibDirs, X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
1181 TripleAliases.append(
1182 X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples));
1183 MultiarchLibDirs.append(
1184 X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
1185 MultiarchTripleAliases.append(
1186 X86Triples, X86Triples + llvm::array_lengthof(X86Triples));
1188 case llvm::Triple::x86:
1189 LibDirs.append(X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
1190 TripleAliases.append(
1191 X86Triples, X86Triples + llvm::array_lengthof(X86Triples));
1192 MultiarchLibDirs.append(
1193 X86_64LibDirs, X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
1194 MultiarchTripleAliases.append(
1195 X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples));
1197 case llvm::Triple::mips:
1199 MIPSLibDirs, MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs));
1200 TripleAliases.append(
1201 MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples));
1202 MultiarchLibDirs.append(
1203 MIPS64LibDirs, MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs));
1204 MultiarchTripleAliases.append(
1205 MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples));
1207 case llvm::Triple::mipsel:
1209 MIPSELLibDirs, MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs));
1210 TripleAliases.append(
1211 MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples));
1212 MultiarchLibDirs.append(
1213 MIPS64ELLibDirs, MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs));
1214 MultiarchTripleAliases.append(
1215 MIPS64ELTriples, MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples));
1217 case llvm::Triple::mips64:
1219 MIPS64LibDirs, MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs));
1220 TripleAliases.append(
1221 MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples));
1222 MultiarchLibDirs.append(
1223 MIPSLibDirs, MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs));
1224 MultiarchTripleAliases.append(
1225 MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples));
1227 case llvm::Triple::mips64el:
1229 MIPS64ELLibDirs, MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs));
1230 TripleAliases.append(
1231 MIPS64ELTriples, MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples));
1232 MultiarchLibDirs.append(
1233 MIPSELLibDirs, MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs));
1234 MultiarchTripleAliases.append(
1235 MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples));
1237 case llvm::Triple::ppc:
1238 LibDirs.append(PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
1239 TripleAliases.append(
1240 PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples));
1241 MultiarchLibDirs.append(
1242 PPC64LibDirs, PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
1243 MultiarchTripleAliases.append(
1244 PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples));
1246 case llvm::Triple::ppc64:
1248 PPC64LibDirs, PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
1249 TripleAliases.append(
1250 PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples));
1251 MultiarchLibDirs.append(
1252 PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
1253 MultiarchTripleAliases.append(
1254 PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples));
1256 case llvm::Triple::systemz:
1258 SystemZLibDirs, SystemZLibDirs + llvm::array_lengthof(SystemZLibDirs));
1259 TripleAliases.append(
1260 SystemZTriples, SystemZTriples + llvm::array_lengthof(SystemZTriples));
1264 // By default, just rely on the standard lib directories and the original
1269 // Always append the drivers target triple to the end, in case it doesn't
1270 // match any of our aliases.
1271 TripleAliases.push_back(TargetTriple.str());
1273 // Also include the multiarch variant if it's different.
1274 if (TargetTriple.str() != MultiarchTriple.str())
1275 MultiarchTripleAliases.push_back(MultiarchTriple.str());
1278 static bool isSoftFloatABI(const ArgList &Args) {
1279 Arg *A = Args.getLastArg(options::OPT_msoft_float,
1280 options::OPT_mhard_float,
1281 options::OPT_mfloat_abi_EQ);
1282 if (!A) return false;
1284 return A->getOption().matches(options::OPT_msoft_float) ||
1285 (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
1286 A->getValue() == StringRef("soft"));
1289 static bool isMipsArch(llvm::Triple::ArchType Arch) {
1290 return Arch == llvm::Triple::mips ||
1291 Arch == llvm::Triple::mipsel ||
1292 Arch == llvm::Triple::mips64 ||
1293 Arch == llvm::Triple::mips64el;
1296 static bool isMips16(const ArgList &Args) {
1297 Arg *A = Args.getLastArg(options::OPT_mips16,
1298 options::OPT_mno_mips16);
1299 return A && A->getOption().matches(options::OPT_mips16);
1302 static bool isMicroMips(const ArgList &Args) {
1303 Arg *A = Args.getLastArg(options::OPT_mmicromips,
1304 options::OPT_mno_micromips);
1305 return A && A->getOption().matches(options::OPT_mmicromips);
1308 // FIXME: There is the same routine in the Tools.cpp.
1309 static bool hasMipsN32ABIArg(const ArgList &Args) {
1310 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1311 return A && (A->getValue() == StringRef("n32"));
1314 static void appendMipsTargetSuffix(std::string &Path,
1315 llvm::Triple::ArchType TargetArch,
1316 const ArgList &Args) {
1319 else if (isMicroMips(Args))
1320 Path += "/micromips";
1322 if (isSoftFloatABI(Args))
1323 Path += "/soft-float";
1325 if (TargetArch == llvm::Triple::mipsel ||
1326 TargetArch == llvm::Triple::mips64el)
1330 static StringRef getMipsTargetABISuffix(llvm::Triple::ArchType TargetArch,
1331 const ArgList &Args) {
1332 if (TargetArch == llvm::Triple::mips64 ||
1333 TargetArch == llvm::Triple::mips64el)
1334 return hasMipsN32ABIArg(Args) ? "/n32" : "/64";
1339 static bool findTargetMultiarchSuffix(std::string &Suffix,
1341 llvm::Triple::ArchType TargetArch,
1342 const ArgList &Args) {
1343 if (isMipsArch(TargetArch)) {
1344 StringRef ABISuffix = getMipsTargetABISuffix(TargetArch, Args);
1346 // First build and check a complex path to crtbegin.o
1347 // depends on command line options (-mips16, -msoft-float, ...)
1348 // like mips-linux-gnu/4.7/mips16/soft-float/el/crtbegin.o
1349 appendMipsTargetSuffix(Suffix, TargetArch, Args);
1351 if (TargetArch == llvm::Triple::mips64 ||
1352 TargetArch == llvm::Triple::mips64el)
1353 Suffix += ABISuffix;
1355 if (llvm::sys::fs::exists(Path + Suffix + "/crtbegin.o"))
1358 // Then fall back and probe a simple case like
1359 // mips-linux-gnu/4.7/32/crtbegin.o
1361 return llvm::sys::fs::exists(Path + Suffix + "/crtbegin.o");
1364 if (TargetArch == llvm::Triple::x86_64 ||
1365 TargetArch == llvm::Triple::ppc64 ||
1366 TargetArch == llvm::Triple::systemz)
1371 return llvm::sys::fs::exists(Path + Suffix + "/crtbegin.o");
1374 void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
1375 llvm::Triple::ArchType TargetArch, const ArgList &Args,
1376 const std::string &LibDir,
1377 StringRef CandidateTriple, bool NeedsMultiarchSuffix) {
1378 // There are various different suffixes involving the triple we
1379 // check for. We also record what is necessary to walk from each back
1380 // up to the lib directory.
1381 const std::string LibSuffixes[] = {
1382 "/gcc/" + CandidateTriple.str(),
1383 "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
1385 // The Freescale PPC SDK has the gcc libraries in
1386 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
1387 "/" + CandidateTriple.str(),
1389 // Ubuntu has a strange mis-matched pair of triples that this happens to
1391 // FIXME: It may be worthwhile to generalize this and look for a second
1393 "/i386-linux-gnu/gcc/" + CandidateTriple.str()
1395 const std::string InstallSuffixes[] = {
1401 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
1402 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibSuffixes) -
1403 (TargetArch != llvm::Triple::x86));
1404 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
1405 StringRef LibSuffix = LibSuffixes[i];
1406 llvm::error_code EC;
1407 for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE;
1408 !EC && LI != LE; LI = LI.increment(EC)) {
1409 StringRef VersionText = llvm::sys::path::filename(LI->path());
1410 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
1411 static const GCCVersion MinVersion = { "4.1.1", 4, 1, 1, "" };
1412 if (CandidateVersion < MinVersion)
1414 if (CandidateVersion <= Version)
1417 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
1418 // in what would normally be GCCInstallPath and put the 64-bit
1419 // libs in a subdirectory named 64. The simple logic we follow is that
1420 // *if* there is a subdirectory of the right name with crtbegin.o in it,
1421 // we use that. If not, and if not a multiarch triple, we look for
1422 // crtbegin.o without the subdirectory.
1424 std::string MultiarchSuffix;
1425 if (findTargetMultiarchSuffix(MultiarchSuffix,
1426 LI->path(), TargetArch, Args)) {
1427 GCCMultiarchSuffix = MultiarchSuffix;
1429 if (NeedsMultiarchSuffix ||
1430 !llvm::sys::fs::exists(LI->path() + "/crtbegin.o"))
1432 GCCMultiarchSuffix.clear();
1435 Version = CandidateVersion;
1436 GCCTriple.setTriple(CandidateTriple);
1437 // FIXME: We hack together the directory name here instead of
1438 // using LI to ensure stable path separators across Windows and
1440 GCCInstallPath = LibDir + LibSuffixes[i] + "/" + VersionText.str();
1441 GCCParentLibPath = GCCInstallPath + InstallSuffixes[i];
1447 Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple,
1448 const ArgList &Args)
1449 : ToolChain(D, Triple, Args), GCCInstallation() {
1450 getProgramPaths().push_back(getDriver().getInstalledDir());
1451 if (getDriver().getInstalledDir() != getDriver().Dir)
1452 getProgramPaths().push_back(getDriver().Dir);
1455 Generic_GCC::~Generic_GCC() {
1458 Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
1460 case Action::PreprocessJobClass:
1462 Preprocess.reset(new tools::gcc::Preprocess(*this));
1463 return Preprocess.get();
1464 case Action::PrecompileJobClass:
1466 Precompile.reset(new tools::gcc::Precompile(*this));
1467 return Precompile.get();
1468 case Action::CompileJobClass:
1470 Compile.reset(new tools::gcc::Compile(*this));
1471 return Compile.get();
1473 return ToolChain::getTool(AC);
1477 Tool *Generic_GCC::buildAssembler() const {
1478 return new tools::gcc::Assemble(*this);
1481 Tool *Generic_GCC::buildLinker() const {
1482 return new tools::gcc::Link(*this);
1485 bool Generic_GCC::IsUnwindTablesDefault() const {
1486 return getArch() == llvm::Triple::x86_64;
1489 bool Generic_GCC::isPICDefault() const {
1493 bool Generic_GCC::isPIEDefault() const {
1497 bool Generic_GCC::isPICDefaultForced() const {
1501 /// Hexagon Toolchain
1503 std::string Hexagon_TC::GetGnuDir(const std::string &InstalledDir) {
1505 // Locate the rest of the toolchain ...
1506 if (strlen(GCC_INSTALL_PREFIX))
1507 return std::string(GCC_INSTALL_PREFIX);
1509 std::string InstallRelDir = InstalledDir + "/../../gnu";
1510 if (llvm::sys::fs::exists(InstallRelDir))
1511 return InstallRelDir;
1513 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
1514 if (llvm::sys::fs::exists(PrefixRelDir))
1515 return PrefixRelDir;
1517 return InstallRelDir;
1520 static void GetHexagonLibraryPaths(
1521 const ArgList &Args,
1522 const std::string Ver,
1523 const std::string MarchString,
1524 const std::string &InstalledDir,
1525 ToolChain::path_list *LibPaths)
1527 bool buildingLib = Args.hasArg(options::OPT_shared);
1529 //----------------------------------------------------------------------------
1531 //----------------------------------------------------------------------------
1533 it = Args.filtered_begin(options::OPT_L),
1534 ie = Args.filtered_end();
1537 for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i)
1538 LibPaths->push_back((*it)->getValue(i));
1541 //----------------------------------------------------------------------------
1542 // Other standard paths
1543 //----------------------------------------------------------------------------
1544 const std::string MarchSuffix = "/" + MarchString;
1545 const std::string G0Suffix = "/G0";
1546 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
1547 const std::string RootDir = Hexagon_TC::GetGnuDir(InstalledDir) + "/";
1549 // lib/gcc/hexagon/...
1550 std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
1552 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
1553 LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
1555 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
1556 LibPaths->push_back(LibGCCHexagonDir + Ver);
1559 LibPaths->push_back(RootDir + "lib/gcc");
1562 std::string HexagonLibDir = RootDir + "hexagon/lib";
1564 LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
1565 LibPaths->push_back(HexagonLibDir + G0Suffix);
1567 LibPaths->push_back(HexagonLibDir + MarchSuffix);
1568 LibPaths->push_back(HexagonLibDir);
1571 Hexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple &Triple,
1572 const ArgList &Args)
1573 : Linux(D, Triple, Args) {
1574 const std::string InstalledDir(getDriver().getInstalledDir());
1575 const std::string GnuDir = Hexagon_TC::GetGnuDir(InstalledDir);
1577 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
1579 const std::string BinDir(GnuDir + "/bin");
1580 if (llvm::sys::fs::exists(BinDir))
1581 getProgramPaths().push_back(BinDir);
1583 // Determine version of GCC libraries and headers to use.
1584 const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
1585 llvm::error_code ec;
1586 GCCVersion MaxVersion= GCCVersion::Parse("0.0.0");
1587 for (llvm::sys::fs::directory_iterator di(HexagonDir, ec), de;
1588 !ec && di != de; di = di.increment(ec)) {
1589 GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->path()));
1590 if (MaxVersion < cv)
1593 GCCLibAndIncVersion = MaxVersion;
1595 ToolChain::path_list *LibPaths= &getFilePaths();
1597 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
1598 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
1599 // support 'linux' we'll need to fix this up
1602 GetHexagonLibraryPaths(
1604 GetGCCLibAndIncVersion(),
1610 Hexagon_TC::~Hexagon_TC() {
1613 Tool *Hexagon_TC::buildAssembler() const {
1614 return new tools::hexagon::Assemble(*this);
1617 Tool *Hexagon_TC::buildLinker() const {
1618 return new tools::hexagon::Link(*this);
1621 void Hexagon_TC::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
1622 ArgStringList &CC1Args) const {
1623 const Driver &D = getDriver();
1625 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
1626 DriverArgs.hasArg(options::OPT_nostdlibinc))
1629 llvm::sys::Path InstallDir(D.InstalledDir);
1630 std::string Ver(GetGCCLibAndIncVersion());
1631 std::string GnuDir = Hexagon_TC::GetGnuDir(D.InstalledDir);
1632 std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
1633 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
1634 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
1635 addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
1638 void Hexagon_TC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1639 ArgStringList &CC1Args) const {
1641 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
1642 DriverArgs.hasArg(options::OPT_nostdincxx))
1645 const Driver &D = getDriver();
1646 std::string Ver(GetGCCLibAndIncVersion());
1647 llvm::sys::Path IncludeDir(Hexagon_TC::GetGnuDir(D.InstalledDir));
1649 IncludeDir.appendComponent("hexagon/include/c++/");
1650 IncludeDir.appendComponent(Ver);
1651 addSystemInclude(DriverArgs, CC1Args, IncludeDir.str());
1654 ToolChain::CXXStdlibType
1655 Hexagon_TC::GetCXXStdlibType(const ArgList &Args) const {
1656 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
1658 return ToolChain::CST_Libstdcxx;
1660 StringRef Value = A->getValue();
1661 if (Value != "libstdc++") {
1662 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
1663 << A->getAsString(Args);
1666 return ToolChain::CST_Libstdcxx;
1669 static Arg *GetLastHexagonArchArg(const ArgList &Args)
1673 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1675 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
1676 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1679 } else if ((*it)->getOption().matches(options::OPT_m_Joined)) {
1680 StringRef Value = (*it)->getValue(0);
1681 if (Value.startswith("v")) {
1690 StringRef Hexagon_TC::GetTargetCPU(const ArgList &Args)
1692 // Select the default CPU (v4) if none was given or detection failed.
1693 Arg *A = GetLastHexagonArchArg (Args);
1695 StringRef WhichHexagon = A->getValue();
1696 if (WhichHexagon.startswith("hexagon"))
1697 return WhichHexagon.substr(sizeof("hexagon") - 1);
1698 if (WhichHexagon != "")
1699 return WhichHexagon;
1706 /// TCEToolChain - A tool chain using the llvm bitcode tools to perform
1707 /// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
1708 /// Currently does not support anything else but compilation.
1710 TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple& Triple,
1711 const ArgList &Args)
1712 : ToolChain(D, Triple, Args) {
1713 // Path mangling to find libexec
1714 std::string Path(getDriver().Dir);
1716 Path += "/../libexec";
1717 getProgramPaths().push_back(Path);
1720 TCEToolChain::~TCEToolChain() {
1723 bool TCEToolChain::IsMathErrnoDefault() const {
1727 bool TCEToolChain::isPICDefault() const {
1731 bool TCEToolChain::isPIEDefault() const {
1735 bool TCEToolChain::isPICDefaultForced() const {
1739 /// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
1741 OpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1742 : Generic_ELF(D, Triple, Args) {
1743 getFilePaths().push_back(getDriver().Dir + "/../lib");
1744 getFilePaths().push_back("/usr/lib");
1747 Tool *OpenBSD::buildAssembler() const {
1748 return new tools::openbsd::Assemble(*this);
1751 Tool *OpenBSD::buildLinker() const {
1752 return new tools::openbsd::Link(*this);
1755 /// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
1757 Bitrig::Bitrig(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1758 : Generic_ELF(D, Triple, Args) {
1759 getFilePaths().push_back(getDriver().Dir + "/../lib");
1760 getFilePaths().push_back("/usr/lib");
1763 Tool *Bitrig::buildAssembler() const {
1764 return new tools::bitrig::Assemble(*this);
1767 Tool *Bitrig::buildLinker() const {
1768 return new tools::bitrig::Link(*this);
1771 void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1772 ArgStringList &CC1Args) const {
1773 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
1774 DriverArgs.hasArg(options::OPT_nostdincxx))
1777 switch (GetCXXStdlibType(DriverArgs)) {
1778 case ToolChain::CST_Libcxx:
1779 addSystemInclude(DriverArgs, CC1Args,
1780 getDriver().SysRoot + "/usr/include/c++/");
1782 case ToolChain::CST_Libstdcxx:
1783 addSystemInclude(DriverArgs, CC1Args,
1784 getDriver().SysRoot + "/usr/include/c++/stdc++");
1785 addSystemInclude(DriverArgs, CC1Args,
1786 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
1788 StringRef Triple = getTriple().str();
1789 if (Triple.startswith("amd64"))
1790 addSystemInclude(DriverArgs, CC1Args,
1791 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
1794 addSystemInclude(DriverArgs, CC1Args,
1795 getDriver().SysRoot + "/usr/include/c++/stdc++/" +
1801 void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
1802 ArgStringList &CmdArgs) const {
1803 switch (GetCXXStdlibType(Args)) {
1804 case ToolChain::CST_Libcxx:
1805 CmdArgs.push_back("-lc++");
1806 CmdArgs.push_back("-lcxxrt");
1807 // Include supc++ to provide Unwind until provided by libcxx.
1808 CmdArgs.push_back("-lgcc");
1810 case ToolChain::CST_Libstdcxx:
1811 CmdArgs.push_back("-lstdc++");
1816 /// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
1818 FreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1819 : Generic_ELF(D, Triple, Args) {
1821 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
1822 // back to '/usr/lib' if it doesn't exist.
1823 if ((Triple.getArch() == llvm::Triple::x86 ||
1824 Triple.getArch() == llvm::Triple::ppc) &&
1825 llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
1826 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
1828 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
1831 Tool *FreeBSD::buildAssembler() const {
1832 return new tools::freebsd::Assemble(*this);
1835 Tool *FreeBSD::buildLinker() const {
1836 return new tools::freebsd::Link(*this);
1839 bool FreeBSD::UseSjLjExceptions() const {
1840 // FreeBSD uses SjLj exceptions on ARM oabi.
1841 switch (getTriple().getEnvironment()) {
1842 case llvm::Triple::GNUEABI:
1843 case llvm::Triple::EABI:
1847 return (getTriple().getArch() == llvm::Triple::arm ||
1848 getTriple().getArch() == llvm::Triple::thumb);
1852 ToolChain::CXXStdlibType
1853 FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
1854 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
1855 StringRef Value = A->getValue();
1856 if (Value == "libc++")
1857 return ToolChain::CST_Libcxx;
1858 if (Value == "libstdc++")
1859 return ToolChain::CST_Libstdcxx;
1860 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
1861 << A->getAsString(Args);
1864 return getTriple().getOSMajorVersion() >= 10 ? ToolChain::CST_Libcxx :
1865 ToolChain::CST_Libstdcxx;
1868 void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1869 ArgStringList &CC1Args) const {
1870 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
1871 DriverArgs.hasArg(options::OPT_nostdincxx))
1874 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx)
1875 addSystemInclude(DriverArgs, CC1Args,
1876 getDriver().SysRoot + "/usr/include/c++/v1");
1878 addSystemInclude(DriverArgs, CC1Args,
1879 getDriver().SysRoot + "/usr/include/c++/4.2");
1884 /// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
1886 NetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1887 : Generic_ELF(D, Triple, Args) {
1889 if (getDriver().UseStdLib) {
1890 // When targeting a 32-bit platform, try the special directory used on
1891 // 64-bit hosts, and only fall back to the main library directory if that
1893 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
1894 // what all logic is needed to emulate the '=' prefix here.
1895 if (Triple.getArch() == llvm::Triple::x86)
1896 getFilePaths().push_back("=/usr/lib/i386");
1898 getFilePaths().push_back("=/usr/lib");
1902 Tool *NetBSD::buildAssembler() const {
1903 return new tools::netbsd::Assemble(*this);
1906 Tool *NetBSD::buildLinker() const {
1907 return new tools::netbsd::Link(*this);
1910 ToolChain::CXXStdlibType
1911 NetBSD::GetCXXStdlibType(const ArgList &Args) const {
1912 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
1913 StringRef Value = A->getValue();
1914 if (Value == "libstdc++")
1915 return ToolChain::CST_Libstdcxx;
1916 if (Value == "libc++")
1917 return ToolChain::CST_Libcxx;
1919 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
1920 << A->getAsString(Args);
1923 return ToolChain::CST_Libstdcxx;
1926 void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1927 ArgStringList &CC1Args) const {
1928 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
1929 DriverArgs.hasArg(options::OPT_nostdincxx))
1932 switch (GetCXXStdlibType(DriverArgs)) {
1933 case ToolChain::CST_Libcxx:
1934 addSystemInclude(DriverArgs, CC1Args,
1935 getDriver().SysRoot + "/usr/include/c++/");
1937 case ToolChain::CST_Libstdcxx:
1938 addSystemInclude(DriverArgs, CC1Args,
1939 getDriver().SysRoot + "/usr/include/g++");
1940 addSystemInclude(DriverArgs, CC1Args,
1941 getDriver().SysRoot + "/usr/include/g++/backward");
1946 /// Minix - Minix tool chain which can call as(1) and ld(1) directly.
1948 Minix::Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1949 : Generic_ELF(D, Triple, Args) {
1950 getFilePaths().push_back(getDriver().Dir + "/../lib");
1951 getFilePaths().push_back("/usr/lib");
1954 Tool *Minix::buildAssembler() const {
1955 return new tools::minix::Assemble(*this);
1958 Tool *Minix::buildLinker() const {
1959 return new tools::minix::Link(*this);
1962 /// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
1964 AuroraUX::AuroraUX(const Driver &D, const llvm::Triple& Triple,
1965 const ArgList &Args)
1966 : Generic_GCC(D, Triple, Args) {
1968 getProgramPaths().push_back(getDriver().getInstalledDir());
1969 if (getDriver().getInstalledDir() != getDriver().Dir)
1970 getProgramPaths().push_back(getDriver().Dir);
1972 getFilePaths().push_back(getDriver().Dir + "/../lib");
1973 getFilePaths().push_back("/usr/lib");
1974 getFilePaths().push_back("/usr/sfw/lib");
1975 getFilePaths().push_back("/opt/gcc4/lib");
1976 getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
1980 Tool *AuroraUX::buildAssembler() const {
1981 return new tools::auroraux::Assemble(*this);
1984 Tool *AuroraUX::buildLinker() const {
1985 return new tools::auroraux::Link(*this);
1988 /// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
1990 Solaris::Solaris(const Driver &D, const llvm::Triple& Triple,
1991 const ArgList &Args)
1992 : Generic_GCC(D, Triple, Args) {
1994 getProgramPaths().push_back(getDriver().getInstalledDir());
1995 if (getDriver().getInstalledDir() != getDriver().Dir)
1996 getProgramPaths().push_back(getDriver().Dir);
1998 getFilePaths().push_back(getDriver().Dir + "/../lib");
1999 getFilePaths().push_back("/usr/lib");
2002 Tool *Solaris::buildAssembler() const {
2003 return new tools::solaris::Assemble(*this);
2006 Tool *Solaris::buildLinker() const {
2007 return new tools::solaris::Link(*this);
2010 /// Distribution (very bare-bones at the moment).
2045 static bool IsRedhat(enum Distro Distro) {
2046 return (Distro >= Fedora13 && Distro <= FedoraRawhide) ||
2047 (Distro >= RHEL4 && Distro <= RHEL6);
2050 static bool IsOpenSuse(enum Distro Distro) {
2051 return Distro >= OpenSuse11_3 && Distro <= OpenSuse12_2;
2054 static bool IsDebian(enum Distro Distro) {
2055 return Distro >= DebianLenny && Distro <= DebianJessie;
2058 static bool IsUbuntu(enum Distro Distro) {
2059 return Distro >= UbuntuHardy && Distro <= UbuntuRaring;
2062 static Distro DetectDistro(llvm::Triple::ArchType Arch) {
2063 OwningPtr<llvm::MemoryBuffer> File;
2064 if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) {
2065 StringRef Data = File.get()->getBuffer();
2066 SmallVector<StringRef, 8> Lines;
2067 Data.split(Lines, "\n");
2068 Distro Version = UnknownDistro;
2069 for (unsigned i = 0, s = Lines.size(); i != s; ++i)
2070 if (Version == UnknownDistro && Lines[i].startswith("DISTRIB_CODENAME="))
2071 Version = llvm::StringSwitch<Distro>(Lines[i].substr(17))
2072 .Case("hardy", UbuntuHardy)
2073 .Case("intrepid", UbuntuIntrepid)
2074 .Case("jaunty", UbuntuJaunty)
2075 .Case("karmic", UbuntuKarmic)
2076 .Case("lucid", UbuntuLucid)
2077 .Case("maverick", UbuntuMaverick)
2078 .Case("natty", UbuntuNatty)
2079 .Case("oneiric", UbuntuOneiric)
2080 .Case("precise", UbuntuPrecise)
2081 .Case("quantal", UbuntuQuantal)
2082 .Case("raring", UbuntuRaring)
2083 .Default(UnknownDistro);
2087 if (!llvm::MemoryBuffer::getFile("/etc/redhat-release", File)) {
2088 StringRef Data = File.get()->getBuffer();
2089 if (Data.startswith("Fedora release 16"))
2091 else if (Data.startswith("Fedora release 15"))
2093 else if (Data.startswith("Fedora release 14"))
2095 else if (Data.startswith("Fedora release 13"))
2097 else if (Data.startswith("Fedora release") &&
2098 Data.find("Rawhide") != StringRef::npos)
2099 return FedoraRawhide;
2100 else if (Data.startswith("Red Hat Enterprise Linux") &&
2101 Data.find("release 6") != StringRef::npos)
2103 else if ((Data.startswith("Red Hat Enterprise Linux") ||
2104 Data.startswith("CentOS")) &&
2105 Data.find("release 5") != StringRef::npos)
2107 else if ((Data.startswith("Red Hat Enterprise Linux") ||
2108 Data.startswith("CentOS")) &&
2109 Data.find("release 4") != StringRef::npos)
2111 return UnknownDistro;
2114 if (!llvm::MemoryBuffer::getFile("/etc/debian_version", File)) {
2115 StringRef Data = File.get()->getBuffer();
2118 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
2119 return DebianSqueeze;
2120 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
2121 return DebianWheezy;
2122 else if (Data.startswith("jessie/sid") || Data[0] == '8')
2123 return DebianJessie;
2124 return UnknownDistro;
2127 if (!llvm::MemoryBuffer::getFile("/etc/SuSE-release", File))
2128 return llvm::StringSwitch<Distro>(File.get()->getBuffer())
2129 .StartsWith("openSUSE 11.3", OpenSuse11_3)
2130 .StartsWith("openSUSE 11.4", OpenSuse11_4)
2131 .StartsWith("openSUSE 12.1", OpenSuse12_1)
2132 .StartsWith("openSUSE 12.2", OpenSuse12_2)
2133 .Default(UnknownDistro);
2136 if (!llvm::sys::fs::exists("/etc/exherbo-release", Exists) && Exists)
2139 if (!llvm::sys::fs::exists("/etc/arch-release", Exists) && Exists)
2142 return UnknownDistro;
2145 /// \brief Get our best guess at the multiarch triple for a target.
2147 /// Debian-based systems are starting to use a multiarch setup where they use
2148 /// a target-triple directory in the library and header search paths.
2149 /// Unfortunately, this triple does not align with the vanilla target triple,
2150 /// so we provide a rough mapping here.
2151 static std::string getMultiarchTriple(const llvm::Triple TargetTriple,
2152 StringRef SysRoot) {
2153 // For most architectures, just use whatever we have rather than trying to be
2155 switch (TargetTriple.getArch()) {
2157 return TargetTriple.str();
2159 // We use the existence of '/lib/<triple>' as a directory to detect some
2160 // common linux triples that don't quite match the Clang triple for both
2161 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
2162 // regardless of what the actual target triple is.
2163 case llvm::Triple::arm:
2164 case llvm::Triple::thumb:
2165 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
2166 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf"))
2167 return "arm-linux-gnueabihf";
2169 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi"))
2170 return "arm-linux-gnueabi";
2172 return TargetTriple.str();
2173 case llvm::Triple::x86:
2174 if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
2175 return "i386-linux-gnu";
2176 return TargetTriple.str();
2177 case llvm::Triple::x86_64:
2178 if (llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
2179 return "x86_64-linux-gnu";
2180 return TargetTriple.str();
2181 case llvm::Triple::aarch64:
2182 if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64-linux-gnu"))
2183 return "aarch64-linux-gnu";
2184 case llvm::Triple::mips:
2185 if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu"))
2186 return "mips-linux-gnu";
2187 return TargetTriple.str();
2188 case llvm::Triple::mipsel:
2189 if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu"))
2190 return "mipsel-linux-gnu";
2191 return TargetTriple.str();
2192 case llvm::Triple::ppc:
2193 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
2194 return "powerpc-linux-gnuspe";
2195 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu"))
2196 return "powerpc-linux-gnu";
2197 return TargetTriple.str();
2198 case llvm::Triple::ppc64:
2199 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu"))
2200 return "powerpc64-linux-gnu";
2201 return TargetTriple.str();
2205 static void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
2206 if (llvm::sys::fs::exists(Path)) Paths.push_back(Path.str());
2209 static bool isMipsR2Arch(llvm::Triple::ArchType Arch,
2210 const ArgList &Args) {
2211 if (Arch != llvm::Triple::mips &&
2212 Arch != llvm::Triple::mipsel)
2215 Arg *A = Args.getLastArg(options::OPT_march_EQ,
2216 options::OPT_mcpu_EQ,
2217 options::OPT_mips_CPUs_Group);
2222 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
2223 return A->getOption().matches(options::OPT_mips32r2);
2225 return A->getValue() == StringRef("mips32r2");
2228 static StringRef getMultilibDir(const llvm::Triple &Triple,
2229 const ArgList &Args) {
2230 if (!isMipsArch(Triple.getArch()))
2231 return Triple.isArch32Bit() ? "lib32" : "lib64";
2233 // lib32 directory has a special meaning on MIPS targets.
2234 // It contains N32 ABI binaries. Use this folder if produce
2235 // code for N32 ABI only.
2236 if (hasMipsN32ABIArg(Args))
2239 return Triple.isArch32Bit() ? "lib" : "lib64";
2242 Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2243 : Generic_ELF(D, Triple, Args) {
2244 GCCInstallation.init(D, Triple, Args);
2245 llvm::Triple::ArchType Arch = Triple.getArch();
2246 std::string SysRoot = computeSysRoot(Args);
2248 // OpenSuse stores the linker with the compiler, add that to the search
2250 ToolChain::path_list &PPaths = getProgramPaths();
2251 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
2252 GCCInstallation.getTriple().str() + "/bin").str());
2254 Linker = GetProgramPath("ld");
2256 Distro Distro = DetectDistro(Arch);
2258 if (IsOpenSuse(Distro) || IsUbuntu(Distro)) {
2259 ExtraOpts.push_back("-z");
2260 ExtraOpts.push_back("relro");
2263 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
2264 ExtraOpts.push_back("-X");
2266 const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android;
2267 const bool IsMips = isMipsArch(Arch);
2269 if (IsMips && !SysRoot.empty())
2270 ExtraOpts.push_back("--sysroot=" + SysRoot);
2272 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
2273 // and the MIPS ABI require .dynsym to be sorted in different ways.
2274 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
2275 // ABI requires a mapping between the GOT and the symbol table.
2276 // Android loader does not support .gnu.hash.
2277 if (!IsMips && !IsAndroid) {
2278 if (IsRedhat(Distro) || IsOpenSuse(Distro) ||
2279 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
2280 ExtraOpts.push_back("--hash-style=gnu");
2282 if (IsDebian(Distro) || IsOpenSuse(Distro) || Distro == UbuntuLucid ||
2283 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
2284 ExtraOpts.push_back("--hash-style=both");
2287 if (IsRedhat(Distro))
2288 ExtraOpts.push_back("--no-add-needed");
2290 if (Distro == DebianSqueeze || Distro == DebianWheezy ||
2291 Distro == DebianJessie || IsOpenSuse(Distro) ||
2292 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
2293 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
2294 ExtraOpts.push_back("--build-id");
2296 if (IsOpenSuse(Distro))
2297 ExtraOpts.push_back("--enable-new-dtags");
2299 // The selection of paths to try here is designed to match the patterns which
2300 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
2301 // This was determined by running GCC in a fake filesystem, creating all
2302 // possible permutations of these directories, and seeing which ones it added
2303 // to the link paths.
2304 path_list &Paths = getFilePaths();
2306 const std::string Multilib = getMultilibDir(Triple, Args);
2307 const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
2309 // Add the multilib suffixed paths where they are available.
2310 if (GCCInstallation.isValid()) {
2311 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
2312 const std::string &LibPath = GCCInstallation.getParentLibPath();
2314 if (IsAndroid && isMipsR2Arch(Triple.getArch(), Args))
2315 addPathIfExists(GCCInstallation.getInstallPath() +
2316 GCCInstallation.getMultiarchSuffix() +
2320 addPathIfExists((GCCInstallation.getInstallPath() +
2321 GCCInstallation.getMultiarchSuffix()),
2324 // If the GCC installation we found is inside of the sysroot, we want to
2325 // prefer libraries installed in the parent prefix of the GCC installation.
2326 // It is important to *not* use these paths when the GCC installation is
2327 // outside of the system root as that can pick up unintended libraries.
2328 // This usually happens when there is an external cross compiler on the
2329 // host system, and a more minimal sysroot available that is the target of
2331 if (StringRef(LibPath).startswith(SysRoot)) {
2332 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + Multilib,
2334 addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
2335 addPathIfExists(LibPath + "/../" + Multilib, Paths);
2337 // On Android, libraries in the parent prefix of the GCC installation are
2338 // preferred to the ones under sysroot.
2340 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib", Paths);
2342 // Sourcery CodeBench MIPS toolchain holds some libraries under
2343 // the parent prefix of the GCC installation.
2346 appendMipsTargetSuffix(Suffix, Arch, Args);
2347 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" +
2352 addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
2353 addPathIfExists(SysRoot + "/lib/../" + Multilib, Paths);
2354 addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
2355 addPathIfExists(SysRoot + "/usr/lib/../" + Multilib, Paths);
2357 // Try walking via the GCC triple path in case of multiarch GCC
2358 // installations with strange symlinks.
2359 if (GCCInstallation.isValid())
2360 addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
2361 "/../../" + Multilib, Paths);
2363 // Add the non-multilib suffixed paths (if potentially different).
2364 if (GCCInstallation.isValid()) {
2365 const std::string &LibPath = GCCInstallation.getParentLibPath();
2366 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
2367 if (!GCCInstallation.getMultiarchSuffix().empty())
2368 addPathIfExists(GCCInstallation.getInstallPath(), Paths);
2370 if (StringRef(LibPath).startswith(SysRoot)) {
2371 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib", Paths);
2372 addPathIfExists(LibPath, Paths);
2375 addPathIfExists(SysRoot + "/lib", Paths);
2376 addPathIfExists(SysRoot + "/usr/lib", Paths);
2378 IsPIEDefault = SanitizerArgs(*this, Args).hasZeroBaseShadow();
2381 bool Linux::HasNativeLLVMSupport() const {
2385 Tool *Linux::buildLinker() const {
2386 return new tools::gnutools::Link(*this);
2389 Tool *Linux::buildAssembler() const {
2390 return new tools::gnutools::Assemble(*this);
2393 void Linux::addClangTargetOptions(const ArgList &DriverArgs,
2394 ArgStringList &CC1Args) const {
2395 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
2396 bool UseInitArrayDefault
2397 = V >= Generic_GCC::GCCVersion::Parse("4.7.0") ||
2398 getTriple().getArch() == llvm::Triple::aarch64 ||
2399 getTriple().getEnvironment() == llvm::Triple::Android;
2400 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
2401 options::OPT_fno_use_init_array,
2402 UseInitArrayDefault))
2403 CC1Args.push_back("-fuse-init-array");
2406 std::string Linux::computeSysRoot(const ArgList &Args) const {
2407 if (!getDriver().SysRoot.empty())
2408 return getDriver().SysRoot;
2410 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
2411 return std::string();
2414 (GCCInstallation.getInstallPath() +
2415 "/../../../../" + GCCInstallation.getTriple().str() + "/libc").str();
2416 appendMipsTargetSuffix(Path, getTriple().getArch(), Args);
2418 return llvm::sys::fs::exists(Path) ? Path : "";
2421 void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2422 ArgStringList &CC1Args) const {
2423 const Driver &D = getDriver();
2424 std::string SysRoot = computeSysRoot(DriverArgs);
2426 if (DriverArgs.hasArg(options::OPT_nostdinc))
2429 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
2430 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
2432 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2433 llvm::sys::Path P(D.ResourceDir);
2434 P.appendComponent("include");
2435 addSystemInclude(DriverArgs, CC1Args, P.str());
2438 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2441 // Check for configure-time C include directories.
2442 StringRef CIncludeDirs(C_INCLUDE_DIRS);
2443 if (CIncludeDirs != "") {
2444 SmallVector<StringRef, 5> dirs;
2445 CIncludeDirs.split(dirs, ":");
2446 for (SmallVectorImpl<StringRef>::iterator I = dirs.begin(), E = dirs.end();
2448 StringRef Prefix = llvm::sys::path::is_absolute(*I) ? SysRoot : "";
2449 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + *I);
2454 // Lacking those, try to detect the correct set of system includes for the
2457 // Sourcery CodeBench and modern FSF Mips toolchains put extern C
2458 // system includes under three additional directories.
2459 if (GCCInstallation.isValid() && isMipsArch(getTriple().getArch())) {
2460 addExternCSystemIncludeIfExists(DriverArgs, CC1Args,
2461 GCCInstallation.getInstallPath() +
2464 addExternCSystemIncludeIfExists(DriverArgs, CC1Args,
2465 GCCInstallation.getInstallPath() +
2467 GCCInstallation.getTriple().str() +
2468 "/libc/usr/include");
2471 // Implement generic Debian multiarch support.
2472 const StringRef X86_64MultiarchIncludeDirs[] = {
2473 "/usr/include/x86_64-linux-gnu",
2475 // FIXME: These are older forms of multiarch. It's not clear that they're
2476 // in use in any released version of Debian, so we should consider
2478 "/usr/include/i686-linux-gnu/64",
2479 "/usr/include/i486-linux-gnu/64"
2481 const StringRef X86MultiarchIncludeDirs[] = {
2482 "/usr/include/i386-linux-gnu",
2484 // FIXME: These are older forms of multiarch. It's not clear that they're
2485 // in use in any released version of Debian, so we should consider
2487 "/usr/include/x86_64-linux-gnu/32",
2488 "/usr/include/i686-linux-gnu",
2489 "/usr/include/i486-linux-gnu"
2491 const StringRef AArch64MultiarchIncludeDirs[] = {
2492 "/usr/include/aarch64-linux-gnu"
2494 const StringRef ARMMultiarchIncludeDirs[] = {
2495 "/usr/include/arm-linux-gnueabi"
2497 const StringRef ARMHFMultiarchIncludeDirs[] = {
2498 "/usr/include/arm-linux-gnueabihf"
2500 const StringRef MIPSMultiarchIncludeDirs[] = {
2501 "/usr/include/mips-linux-gnu"
2503 const StringRef MIPSELMultiarchIncludeDirs[] = {
2504 "/usr/include/mipsel-linux-gnu"
2506 const StringRef PPCMultiarchIncludeDirs[] = {
2507 "/usr/include/powerpc-linux-gnu"
2509 const StringRef PPC64MultiarchIncludeDirs[] = {
2510 "/usr/include/powerpc64-linux-gnu"
2512 ArrayRef<StringRef> MultiarchIncludeDirs;
2513 if (getTriple().getArch() == llvm::Triple::x86_64) {
2514 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
2515 } else if (getTriple().getArch() == llvm::Triple::x86) {
2516 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
2517 } else if (getTriple().getArch() == llvm::Triple::aarch64) {
2518 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
2519 } else if (getTriple().getArch() == llvm::Triple::arm) {
2520 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
2521 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
2523 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
2524 } else if (getTriple().getArch() == llvm::Triple::mips) {
2525 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
2526 } else if (getTriple().getArch() == llvm::Triple::mipsel) {
2527 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
2528 } else if (getTriple().getArch() == llvm::Triple::ppc) {
2529 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
2530 } else if (getTriple().getArch() == llvm::Triple::ppc64) {
2531 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
2533 for (ArrayRef<StringRef>::iterator I = MultiarchIncludeDirs.begin(),
2534 E = MultiarchIncludeDirs.end();
2536 if (llvm::sys::fs::exists(SysRoot + *I)) {
2537 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + *I);
2542 if (getTriple().getOS() == llvm::Triple::RTEMS)
2545 // Add an include of '/include' directly. This isn't provided by default by
2546 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
2547 // add even when Clang is acting as-if it were a system compiler.
2548 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
2550 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
2553 /// \brief Helper to add the three variant paths for a libstdc++ installation.
2554 /*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir,
2555 const ArgList &DriverArgs,
2556 ArgStringList &CC1Args) {
2557 if (!llvm::sys::fs::exists(Base))
2559 addSystemInclude(DriverArgs, CC1Args, Base);
2560 addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir);
2561 addSystemInclude(DriverArgs, CC1Args, Base + "/backward");
2565 /// \brief Helper to add an extra variant path for an (Ubuntu) multilib
2566 /// libstdc++ installation.
2567 /*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine Suffix,
2568 Twine TargetArchDir,
2569 Twine MultiLibSuffix,
2570 const ArgList &DriverArgs,
2571 ArgStringList &CC1Args) {
2572 if (!addLibStdCXXIncludePaths(Base+Suffix, TargetArchDir + MultiLibSuffix,
2573 DriverArgs, CC1Args))
2576 addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir + Suffix
2581 void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2582 ArgStringList &CC1Args) const {
2583 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2584 DriverArgs.hasArg(options::OPT_nostdincxx))
2587 // Check if libc++ has been enabled and provide its include paths if so.
2588 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
2589 // libc++ is always installed at a fixed path on Linux currently.
2590 addSystemInclude(DriverArgs, CC1Args,
2591 getDriver().SysRoot + "/usr/include/c++/v1");
2595 // We need a detected GCC installation on Linux to provide libstdc++'s
2596 // headers. We handled the libc++ case above.
2597 if (!GCCInstallation.isValid())
2600 // By default, look for the C++ headers in an include directory adjacent to
2601 // the lib directory of the GCC installation. Note that this is expect to be
2602 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
2603 StringRef LibDir = GCCInstallation.getParentLibPath();
2604 StringRef InstallDir = GCCInstallation.getInstallPath();
2605 StringRef Version = GCCInstallation.getVersion().Text;
2606 StringRef TripleStr = GCCInstallation.getTriple().str();
2608 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
2609 "/c++/" + Version.str(),
2611 GCCInstallation.getMultiarchSuffix(),
2612 DriverArgs, CC1Args))
2615 const std::string IncludePathCandidates[] = {
2616 // Gentoo is weird and places its headers inside the GCC install, so if the
2617 // first attempt to find the headers fails, try this pattern.
2618 InstallDir.str() + "/include/g++-v4",
2619 // Android standalone toolchain has C++ headers in yet another place.
2620 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.str(),
2621 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
2622 // without a subdirectory corresponding to the gcc version.
2623 LibDir.str() + "/../include/c++",
2626 for (unsigned i = 0; i < llvm::array_lengthof(IncludePathCandidates); ++i) {
2627 if (addLibStdCXXIncludePaths(IncludePathCandidates[i], (TripleStr +
2628 GCCInstallation.getMultiarchSuffix()),
2629 DriverArgs, CC1Args))
2634 bool Linux::isPIEDefault() const {
2635 return IsPIEDefault;
2638 /// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
2640 DragonFly::DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
2641 : Generic_ELF(D, Triple, Args) {
2643 // Path mangling to find libexec
2644 getProgramPaths().push_back(getDriver().getInstalledDir());
2645 if (getDriver().getInstalledDir() != getDriver().Dir)
2646 getProgramPaths().push_back(getDriver().Dir);
2648 getFilePaths().push_back(getDriver().Dir + "/../lib");
2649 getFilePaths().push_back("/usr/lib");
2650 if (llvm::sys::fs::exists("/usr/lib/gcc47"))
2651 getFilePaths().push_back("/usr/lib/gcc47");
2653 getFilePaths().push_back("/usr/lib/gcc44");
2656 Tool *DragonFly::buildAssembler() const {
2657 return new tools::dragonfly::Assemble(*this);
2660 Tool *DragonFly::buildLinker() const {
2661 return new tools::dragonfly::Link(*this);