1 //===--- ToolChains.cpp - ToolChain Implementations -----------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "ToolChains.h"
11 #include "clang/Basic/ObjCRuntime.h"
12 #include "clang/Basic/Version.h"
13 #include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
14 #include "clang/Driver/Compilation.h"
15 #include "clang/Driver/Driver.h"
16 #include "clang/Driver/DriverDiagnostic.h"
17 #include "clang/Driver/Options.h"
18 #include "clang/Driver/SanitizerArgs.h"
19 #include "llvm/ADT/STLExtras.h"
20 #include "llvm/ADT/SmallString.h"
21 #include "llvm/ADT/StringExtras.h"
22 #include "llvm/ADT/StringSwitch.h"
23 #include "llvm/Option/Arg.h"
24 #include "llvm/Option/ArgList.h"
25 #include "llvm/Option/OptTable.h"
26 #include "llvm/Option/Option.h"
27 #include "llvm/Support/ErrorHandling.h"
28 #include "llvm/Support/FileSystem.h"
29 #include "llvm/Support/MemoryBuffer.h"
30 #include "llvm/Support/Path.h"
31 #include "llvm/Support/Program.h"
32 #include "llvm/Support/raw_ostream.h"
33 #include <cstdlib> // ::getenv
34 #include <system_error>
35
36 using namespace clang::driver;
37 using namespace clang::driver::toolchains;
38 using namespace clang;
39 using namespace llvm::opt;
40
MachO(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)41 MachO::MachO(const Driver &D, const llvm::Triple &Triple,
42 const ArgList &Args)
43 : ToolChain(D, Triple, Args) {
44 getProgramPaths().push_back(getDriver().getInstalledDir());
45 if (getDriver().getInstalledDir() != getDriver().Dir)
46 getProgramPaths().push_back(getDriver().Dir);
47
48 // We expect 'as', 'ld', etc. to be adjacent to our install dir.
49 getProgramPaths().push_back(getDriver().getInstalledDir());
50 if (getDriver().getInstalledDir() != getDriver().Dir)
51 getProgramPaths().push_back(getDriver().Dir);
52 }
53
54 /// Darwin - Darwin tool chain for i386 and x86_64.
Darwin(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)55 Darwin::Darwin(const Driver & D, const llvm::Triple & Triple,
56 const ArgList & Args)
57 : MachO(D, Triple, Args), TargetInitialized(false) {
58 // Compute the initial Darwin version from the triple
59 unsigned Major, Minor, Micro;
60 if (!Triple.getMacOSXVersion(Major, Minor, Micro))
61 getDriver().Diag(diag::err_drv_invalid_darwin_version) <<
62 Triple.getOSName();
63 llvm::raw_string_ostream(MacosxVersionMin)
64 << Major << '.' << Minor << '.' << Micro;
65
66 // FIXME: DarwinVersion is only used to find GCC's libexec directory.
67 // It should be removed when we stop supporting that.
68 DarwinVersion[0] = Minor + 4;
69 DarwinVersion[1] = Micro;
70 DarwinVersion[2] = 0;
71
72 // Compute the initial iOS version from the triple
73 Triple.getiOSVersion(Major, Minor, Micro);
74 llvm::raw_string_ostream(iOSVersionMin)
75 << Major << '.' << Minor << '.' << Micro;
76 }
77
LookupTypeForExtension(const char * Ext) const78 types::ID MachO::LookupTypeForExtension(const char *Ext) const {
79 types::ID Ty = types::lookupTypeForExtension(Ext);
80
81 // Darwin always preprocesses assembly files (unless -x is used explicitly).
82 if (Ty == types::TY_PP_Asm)
83 return types::TY_Asm;
84
85 return Ty;
86 }
87
HasNativeLLVMSupport() const88 bool MachO::HasNativeLLVMSupport() const {
89 return true;
90 }
91
92 /// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
getDefaultObjCRuntime(bool isNonFragile) const93 ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
94 if (isTargetIOSBased())
95 return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
96 if (isNonFragile)
97 return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
98 return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
99 }
100
101 /// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
hasBlocksRuntime() const102 bool Darwin::hasBlocksRuntime() const {
103 if (isTargetIOSBased())
104 return !isIPhoneOSVersionLT(3, 2);
105 else {
106 assert(isTargetMacOS() && "unexpected darwin target");
107 return !isMacosxVersionLT(10, 6);
108 }
109 }
110
GetArmArchForMArch(StringRef Value)111 static const char *GetArmArchForMArch(StringRef Value) {
112 return llvm::StringSwitch<const char*>(Value)
113 .Case("armv6k", "armv6")
114 .Case("armv6m", "armv6m")
115 .Case("armv5tej", "armv5")
116 .Case("xscale", "xscale")
117 .Case("armv4t", "armv4t")
118 .Case("armv7", "armv7")
119 .Cases("armv7a", "armv7-a", "armv7")
120 .Cases("armv7r", "armv7-r", "armv7")
121 .Cases("armv7em", "armv7e-m", "armv7em")
122 .Cases("armv7k", "armv7-k", "armv7k")
123 .Cases("armv7m", "armv7-m", "armv7m")
124 .Cases("armv7s", "armv7-s", "armv7s")
125 .Default(nullptr);
126 }
127
GetArmArchForMCpu(StringRef Value)128 static const char *GetArmArchForMCpu(StringRef Value) {
129 return llvm::StringSwitch<const char *>(Value)
130 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "arm926ej-s","armv5")
131 .Cases("arm10e", "arm10tdmi", "armv5")
132 .Cases("arm1020t", "arm1020e", "arm1022e", "arm1026ej-s", "armv5")
133 .Case("xscale", "xscale")
134 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "arm1176jzf-s", "armv6")
135 .Case("cortex-m0", "armv6m")
136 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "armv7")
137 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "armv7")
138 .Cases("cortex-r4", "cortex-r5", "armv7r")
139 .Case("cortex-m3", "armv7m")
140 .Cases("cortex-m4", "cortex-m7", "armv7em")
141 .Case("swift", "armv7s")
142 .Default(nullptr);
143 }
144
isSoftFloatABI(const ArgList & Args)145 static bool isSoftFloatABI(const ArgList &Args) {
146 Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
147 options::OPT_mfloat_abi_EQ);
148 if (!A)
149 return false;
150
151 return A->getOption().matches(options::OPT_msoft_float) ||
152 (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
153 A->getValue() == StringRef("soft"));
154 }
155
getMachOArchName(const ArgList & Args) const156 StringRef MachO::getMachOArchName(const ArgList &Args) const {
157 switch (getTriple().getArch()) {
158 default:
159 return getDefaultUniversalArchName();
160
161 case llvm::Triple::aarch64:
162 return "arm64";
163
164 case llvm::Triple::thumb:
165 case llvm::Triple::arm: {
166 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
167 if (const char *Arch = GetArmArchForMArch(A->getValue()))
168 return Arch;
169
170 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
171 if (const char *Arch = GetArmArchForMCpu(A->getValue()))
172 return Arch;
173
174 return "arm";
175 }
176 }
177 }
178
~Darwin()179 Darwin::~Darwin() {
180 }
181
~MachO()182 MachO::~MachO() {
183 }
184
185
ComputeEffectiveClangTriple(const ArgList & Args,types::ID InputType) const186 std::string MachO::ComputeEffectiveClangTriple(const ArgList &Args,
187 types::ID InputType) const {
188 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
189
190 return Triple.getTriple();
191 }
192
ComputeEffectiveClangTriple(const ArgList & Args,types::ID InputType) const193 std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
194 types::ID InputType) const {
195 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
196
197 // If the target isn't initialized (e.g., an unknown Darwin platform, return
198 // the default triple).
199 if (!isTargetInitialized())
200 return Triple.getTriple();
201
202 SmallString<16> Str;
203 Str += isTargetIOSBased() ? "ios" : "macosx";
204 Str += getTargetVersion().getAsString();
205 Triple.setOSName(Str);
206
207 return Triple.getTriple();
208 }
209
anchor()210 void Generic_ELF::anchor() {}
211
getTool(Action::ActionClass AC) const212 Tool *MachO::getTool(Action::ActionClass AC) const {
213 switch (AC) {
214 case Action::LipoJobClass:
215 if (!Lipo)
216 Lipo.reset(new tools::darwin::Lipo(*this));
217 return Lipo.get();
218 case Action::DsymutilJobClass:
219 if (!Dsymutil)
220 Dsymutil.reset(new tools::darwin::Dsymutil(*this));
221 return Dsymutil.get();
222 case Action::VerifyDebugInfoJobClass:
223 if (!VerifyDebug)
224 VerifyDebug.reset(new tools::darwin::VerifyDebug(*this));
225 return VerifyDebug.get();
226 default:
227 return ToolChain::getTool(AC);
228 }
229 }
230
buildLinker() const231 Tool *MachO::buildLinker() const {
232 return new tools::darwin::Link(*this);
233 }
234
buildAssembler() const235 Tool *MachO::buildAssembler() const {
236 return new tools::darwin::Assemble(*this);
237 }
238
DarwinClang(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)239 DarwinClang::DarwinClang(const Driver &D, const llvm::Triple& Triple,
240 const ArgList &Args)
241 : Darwin(D, Triple, Args) {
242 }
243
addClangWarningOptions(ArgStringList & CC1Args) const244 void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
245 // For iOS, 64-bit, promote certain warnings to errors.
246 if (!isTargetMacOS() && getTriple().isArch64Bit()) {
247 // Always enable -Wdeprecated-objc-isa-usage and promote it
248 // to an error.
249 CC1Args.push_back("-Wdeprecated-objc-isa-usage");
250 CC1Args.push_back("-Werror=deprecated-objc-isa-usage");
251
252 // Also error about implicit function declarations, as that
253 // can impact calling conventions.
254 CC1Args.push_back("-Werror=implicit-function-declaration");
255 }
256 }
257
258 /// \brief Determine whether Objective-C automated reference counting is
259 /// enabled.
isObjCAutoRefCount(const ArgList & Args)260 static bool isObjCAutoRefCount(const ArgList &Args) {
261 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
262 }
263
AddLinkARCArgs(const ArgList & Args,ArgStringList & CmdArgs) const264 void DarwinClang::AddLinkARCArgs(const ArgList &Args,
265 ArgStringList &CmdArgs) const {
266 // Avoid linking compatibility stubs on i386 mac.
267 if (isTargetMacOS() && getArch() == llvm::Triple::x86)
268 return;
269
270 ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true);
271
272 if ((runtime.hasNativeARC() || !isObjCAutoRefCount(Args)) &&
273 runtime.hasSubscripting())
274 return;
275
276 CmdArgs.push_back("-force_load");
277 SmallString<128> P(getDriver().ClangExecutable);
278 llvm::sys::path::remove_filename(P); // 'clang'
279 llvm::sys::path::remove_filename(P); // 'bin'
280 llvm::sys::path::append(P, "lib", "arc", "libarclite_");
281 // Mash in the platform.
282 if (isTargetIOSSimulator())
283 P += "iphonesimulator";
284 else if (isTargetIPhoneOS())
285 P += "iphoneos";
286 else
287 P += "macosx";
288 P += ".a";
289
290 CmdArgs.push_back(Args.MakeArgString(P));
291 }
292
AddLinkRuntimeLib(const ArgList & Args,ArgStringList & CmdArgs,StringRef DarwinLibName,bool AlwaysLink,bool IsEmbedded,bool AddRPath) const293 void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
294 StringRef DarwinLibName, bool AlwaysLink,
295 bool IsEmbedded, bool AddRPath) const {
296 SmallString<128> Dir(getDriver().ResourceDir);
297 llvm::sys::path::append(Dir, "lib", IsEmbedded ? "macho_embedded" : "darwin");
298
299 SmallString<128> P(Dir);
300 llvm::sys::path::append(P, DarwinLibName);
301
302 // For now, allow missing resource libraries to support developers who may
303 // not have compiler-rt checked out or integrated into their build (unless
304 // we explicitly force linking with this library).
305 if (AlwaysLink || llvm::sys::fs::exists(P.str()))
306 CmdArgs.push_back(Args.MakeArgString(P.str()));
307
308 // Adding the rpaths might negatively interact when other rpaths are involved,
309 // so we should make sure we add the rpaths last, after all user-specified
310 // rpaths. This is currently true from this place, but we need to be
311 // careful if this function is ever called before user's rpaths are emitted.
312 if (AddRPath) {
313 assert(DarwinLibName.endswith(".dylib") && "must be a dynamic library");
314
315 // Add @executable_path to rpath to support having the dylib copied with
316 // the executable.
317 CmdArgs.push_back("-rpath");
318 CmdArgs.push_back("@executable_path");
319
320 // Add the path to the resource dir to rpath to support using the dylib
321 // from the default location without copying.
322 CmdArgs.push_back("-rpath");
323 CmdArgs.push_back(Args.MakeArgString(Dir.str()));
324 }
325 }
326
AddLinkRuntimeLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const327 void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
328 ArgStringList &CmdArgs) const {
329 // Darwin only supports the compiler-rt based runtime libraries.
330 switch (GetRuntimeLibType(Args)) {
331 case ToolChain::RLT_CompilerRT:
332 break;
333 default:
334 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
335 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
336 return;
337 }
338
339 // Darwin doesn't support real static executables, don't link any runtime
340 // libraries with -static.
341 if (Args.hasArg(options::OPT_static) ||
342 Args.hasArg(options::OPT_fapple_kext) ||
343 Args.hasArg(options::OPT_mkernel))
344 return;
345
346 // Reject -static-libgcc for now, we can deal with this when and if someone
347 // cares. This is useful in situations where someone wants to statically link
348 // something like libstdc++, and needs its runtime support routines.
349 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
350 getDriver().Diag(diag::err_drv_unsupported_opt)
351 << A->getAsString(Args);
352 return;
353 }
354
355 // If we are building profile support, link that library in.
356 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
357 false) ||
358 Args.hasArg(options::OPT_fprofile_generate) ||
359 Args.hasArg(options::OPT_fprofile_instr_generate) ||
360 Args.hasArg(options::OPT_fcreate_profile) ||
361 Args.hasArg(options::OPT_coverage)) {
362 // Select the appropriate runtime library for the target.
363 if (isTargetIOSBased())
364 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a");
365 else
366 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a");
367 }
368
369 const SanitizerArgs &Sanitize = getSanitizerArgs();
370
371 // Add Ubsan runtime library, if required.
372 if (Sanitize.needsUbsanRt()) {
373 // FIXME: Move this check to SanitizerArgs::filterUnsupportedKinds.
374 if (isTargetIOSBased()) {
375 getDriver().Diag(diag::err_drv_clang_unsupported_per_platform)
376 << "-fsanitize=undefined";
377 } else {
378 assert(isTargetMacOS() && "unexpected non OS X target");
379 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ubsan_osx.a", true);
380
381 // The Ubsan runtime library requires C++.
382 AddCXXStdlibLibArgs(Args, CmdArgs);
383 }
384 }
385
386 // Add ASAN runtime library, if required. Dynamic libraries and bundles
387 // should not be linked with the runtime library.
388 if (Sanitize.needsAsanRt()) {
389 // FIXME: Move this check to SanitizerArgs::filterUnsupportedKinds.
390 if (isTargetIPhoneOS()) {
391 getDriver().Diag(diag::err_drv_clang_unsupported_per_platform)
392 << "-fsanitize=address";
393 } else {
394 if (!Args.hasArg(options::OPT_dynamiclib) &&
395 !Args.hasArg(options::OPT_bundle)) {
396 // The ASAN runtime library requires C++.
397 AddCXXStdlibLibArgs(Args, CmdArgs);
398 }
399 if (isTargetMacOS()) {
400 AddLinkRuntimeLib(Args, CmdArgs,
401 "libclang_rt.asan_osx_dynamic.dylib",
402 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
403 /*AddRPath*/ true);
404 } else {
405 if (isTargetIOSSimulator()) {
406 AddLinkRuntimeLib(Args, CmdArgs,
407 "libclang_rt.asan_iossim_dynamic.dylib",
408 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
409 /*AddRPath*/ true);
410 }
411 }
412 }
413 }
414
415 // Otherwise link libSystem, then the dynamic runtime library, and finally any
416 // target specific static runtime library.
417 CmdArgs.push_back("-lSystem");
418
419 // Select the dynamic runtime library and the target specific static library.
420 if (isTargetIOSBased()) {
421 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
422 // it never went into the SDK.
423 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
424 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
425 getTriple().getArch() != llvm::Triple::aarch64)
426 CmdArgs.push_back("-lgcc_s.1");
427
428 // We currently always need a static runtime library for iOS.
429 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
430 } else {
431 assert(isTargetMacOS() && "unexpected non MacOS platform");
432 // The dynamic runtime library was merged with libSystem for 10.6 and
433 // beyond; only 10.4 and 10.5 need an additional runtime library.
434 if (isMacosxVersionLT(10, 5))
435 CmdArgs.push_back("-lgcc_s.10.4");
436 else if (isMacosxVersionLT(10, 6))
437 CmdArgs.push_back("-lgcc_s.10.5");
438
439 // For OS X, we thought we would only need a static runtime library when
440 // targeting 10.4, to provide versions of the static functions which were
441 // omitted from 10.4.dylib.
442 //
443 // Unfortunately, that turned out to not be true, because Darwin system
444 // headers can still use eprintf on i386, and it is not exported from
445 // libSystem. Therefore, we still must provide a runtime library just for
446 // the tiny tiny handful of projects that *might* use that symbol.
447 if (isMacosxVersionLT(10, 5)) {
448 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
449 } else {
450 if (getTriple().getArch() == llvm::Triple::x86)
451 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
452 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
453 }
454 }
455 }
456
AddDeploymentTarget(DerivedArgList & Args) const457 void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
458 const OptTable &Opts = getDriver().getOpts();
459
460 // Support allowing the SDKROOT environment variable used by xcrun and other
461 // Xcode tools to define the default sysroot, by making it the default for
462 // isysroot.
463 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
464 // Warn if the path does not exist.
465 if (!llvm::sys::fs::exists(A->getValue()))
466 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
467 } else {
468 if (char *env = ::getenv("SDKROOT")) {
469 // We only use this value as the default if it is an absolute path,
470 // exists, and it is not the root path.
471 if (llvm::sys::path::is_absolute(env) && llvm::sys::fs::exists(env) &&
472 StringRef(env) != "/") {
473 Args.append(Args.MakeSeparateArg(
474 0, Opts.getOption(options::OPT_isysroot), env));
475 }
476 }
477 }
478
479 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
480 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
481 Arg *iOSSimVersion = Args.getLastArg(
482 options::OPT_mios_simulator_version_min_EQ);
483
484 if (OSXVersion && iOSVersion) {
485 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
486 << OSXVersion->getAsString(Args)
487 << iOSVersion->getAsString(Args);
488 iOSVersion = nullptr;
489 } else if (!OSXVersion && !iOSVersion) {
490 // If no deployment target was specified on the command line, check for
491 // environment defines.
492 StringRef OSXTarget;
493 StringRef iOSTarget;
494 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
495 OSXTarget = env;
496 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
497 iOSTarget = env;
498
499 // If no '-miphoneos-version-min' specified on the command line and
500 // IPHONEOS_DEPLOYMENT_TARGET is not defined, see if we can set the default
501 // based on -isysroot.
502 if (iOSTarget.empty()) {
503 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
504 StringRef first, second;
505 StringRef isysroot = A->getValue();
506 std::tie(first, second) = isysroot.split(StringRef("SDKs/iPhoneOS"));
507 if (second != "")
508 iOSTarget = second.substr(0,3);
509 }
510 }
511
512 // If no OSX or iOS target has been specified and we're compiling for armv7,
513 // go ahead as assume we're targeting iOS.
514 StringRef MachOArchName = getMachOArchName(Args);
515 if (OSXTarget.empty() && iOSTarget.empty() &&
516 (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
517 MachOArchName == "arm64"))
518 iOSTarget = iOSVersionMin;
519
520 // Allow conflicts among OSX and iOS for historical reasons, but choose the
521 // default platform.
522 if (!OSXTarget.empty() && !iOSTarget.empty()) {
523 if (getTriple().getArch() == llvm::Triple::arm ||
524 getTriple().getArch() == llvm::Triple::aarch64 ||
525 getTriple().getArch() == llvm::Triple::thumb)
526 OSXTarget = "";
527 else
528 iOSTarget = "";
529 }
530
531 if (!OSXTarget.empty()) {
532 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
533 OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
534 Args.append(OSXVersion);
535 } else if (!iOSTarget.empty()) {
536 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
537 iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
538 Args.append(iOSVersion);
539 } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
540 MachOArchName != "armv7em") {
541 // Otherwise, assume we are targeting OS X.
542 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
543 OSXVersion = Args.MakeJoinedArg(nullptr, O, MacosxVersionMin);
544 Args.append(OSXVersion);
545 }
546 }
547
548 DarwinPlatformKind Platform;
549 if (OSXVersion)
550 Platform = MacOS;
551 else if (iOSVersion)
552 Platform = IPhoneOS;
553 else
554 llvm_unreachable("Unable to infer Darwin variant");
555
556 // Set the tool chain target information.
557 unsigned Major, Minor, Micro;
558 bool HadExtra;
559 if (Platform == MacOS) {
560 assert(!iOSVersion && "Unknown target platform!");
561 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor,
562 Micro, HadExtra) || HadExtra ||
563 Major != 10 || Minor >= 100 || Micro >= 100)
564 getDriver().Diag(diag::err_drv_invalid_version_number)
565 << OSXVersion->getAsString(Args);
566 } else if (Platform == IPhoneOS) {
567 assert(iOSVersion && "Unknown target platform!");
568 if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor,
569 Micro, HadExtra) || HadExtra ||
570 Major >= 10 || Minor >= 100 || Micro >= 100)
571 getDriver().Diag(diag::err_drv_invalid_version_number)
572 << iOSVersion->getAsString(Args);
573 } else
574 llvm_unreachable("unknown kind of Darwin platform");
575
576 // Recognize iOS targets with an x86 architecture as the iOS simulator.
577 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
578 getTriple().getArch() == llvm::Triple::x86_64))
579 Platform = IPhoneOSSimulator;
580
581 setTarget(Platform, Major, Minor, Micro);
582 }
583
AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const584 void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
585 ArgStringList &CmdArgs) const {
586 CXXStdlibType Type = GetCXXStdlibType(Args);
587
588 switch (Type) {
589 case ToolChain::CST_Libcxx:
590 CmdArgs.push_back("-lc++");
591 break;
592
593 case ToolChain::CST_Libstdcxx: {
594 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
595 // it was previously found in the gcc lib dir. However, for all the Darwin
596 // platforms we care about it was -lstdc++.6, so we search for that
597 // explicitly if we can't see an obvious -lstdc++ candidate.
598
599 // Check in the sysroot first.
600 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
601 SmallString<128> P(A->getValue());
602 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
603
604 if (!llvm::sys::fs::exists(P.str())) {
605 llvm::sys::path::remove_filename(P);
606 llvm::sys::path::append(P, "libstdc++.6.dylib");
607 if (llvm::sys::fs::exists(P.str())) {
608 CmdArgs.push_back(Args.MakeArgString(P.str()));
609 return;
610 }
611 }
612 }
613
614 // Otherwise, look in the root.
615 // FIXME: This should be removed someday when we don't have to care about
616 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
617 if (!llvm::sys::fs::exists("/usr/lib/libstdc++.dylib") &&
618 llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib")) {
619 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
620 return;
621 }
622
623 // Otherwise, let the linker search.
624 CmdArgs.push_back("-lstdc++");
625 break;
626 }
627 }
628 }
629
AddCCKextLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const630 void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
631 ArgStringList &CmdArgs) const {
632
633 // For Darwin platforms, use the compiler-rt-based support library
634 // instead of the gcc-provided one (which is also incidentally
635 // only present in the gcc lib dir, which makes it hard to find).
636
637 SmallString<128> P(getDriver().ResourceDir);
638 llvm::sys::path::append(P, "lib", "darwin");
639
640 // Use the newer cc_kext for iOS ARM after 6.0.
641 if (!isTargetIPhoneOS() || isTargetIOSSimulator() ||
642 getTriple().getArch() == llvm::Triple::aarch64 ||
643 !isIPhoneOSVersionLT(6, 0)) {
644 llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
645 } else {
646 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios5.a");
647 }
648
649 // For now, allow missing resource libraries to support developers who may
650 // not have compiler-rt checked out or integrated into their build.
651 if (llvm::sys::fs::exists(P.str()))
652 CmdArgs.push_back(Args.MakeArgString(P.str()));
653 }
654
TranslateArgs(const DerivedArgList & Args,const char * BoundArch) const655 DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
656 const char *BoundArch) const {
657 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
658 const OptTable &Opts = getDriver().getOpts();
659
660 // FIXME: We really want to get out of the tool chain level argument
661 // translation business, as it makes the driver functionality much
662 // more opaque. For now, we follow gcc closely solely for the
663 // purpose of easily achieving feature parity & testability. Once we
664 // have something that works, we should reevaluate each translation
665 // and try to push it down into tool specific logic.
666
667 for (Arg *A : Args) {
668 if (A->getOption().matches(options::OPT_Xarch__)) {
669 // Skip this argument unless the architecture matches either the toolchain
670 // triple arch, or the arch being bound.
671 llvm::Triple::ArchType XarchArch =
672 tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
673 if (!(XarchArch == getArch() ||
674 (BoundArch && XarchArch ==
675 tools::darwin::getArchTypeForMachOArchName(BoundArch))))
676 continue;
677
678 Arg *OriginalArg = A;
679 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
680 unsigned Prev = Index;
681 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
682
683 // If the argument parsing failed or more than one argument was
684 // consumed, the -Xarch_ argument's parameter tried to consume
685 // extra arguments. Emit an error and ignore.
686 //
687 // We also want to disallow any options which would alter the
688 // driver behavior; that isn't going to work in our model. We
689 // use isDriverOption() as an approximation, although things
690 // like -O4 are going to slip through.
691 if (!XarchArg || Index > Prev + 1) {
692 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
693 << A->getAsString(Args);
694 continue;
695 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
696 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
697 << A->getAsString(Args);
698 continue;
699 }
700
701 XarchArg->setBaseArg(A);
702
703 A = XarchArg.release();
704 DAL->AddSynthesizedArg(A);
705
706 // Linker input arguments require custom handling. The problem is that we
707 // have already constructed the phase actions, so we can not treat them as
708 // "input arguments".
709 if (A->getOption().hasFlag(options::LinkerInput)) {
710 // Convert the argument into individual Zlinker_input_args.
711 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
712 DAL->AddSeparateArg(OriginalArg,
713 Opts.getOption(options::OPT_Zlinker_input),
714 A->getValue(i));
715
716 }
717 continue;
718 }
719 }
720
721 // Sob. These is strictly gcc compatible for the time being. Apple
722 // gcc translates options twice, which means that self-expanding
723 // options add duplicates.
724 switch ((options::ID) A->getOption().getID()) {
725 default:
726 DAL->append(A);
727 break;
728
729 case options::OPT_mkernel:
730 case options::OPT_fapple_kext:
731 DAL->append(A);
732 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
733 break;
734
735 case options::OPT_dependency_file:
736 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF),
737 A->getValue());
738 break;
739
740 case options::OPT_gfull:
741 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
742 DAL->AddFlagArg(A,
743 Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
744 break;
745
746 case options::OPT_gused:
747 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
748 DAL->AddFlagArg(A,
749 Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
750 break;
751
752 case options::OPT_shared:
753 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
754 break;
755
756 case options::OPT_fconstant_cfstrings:
757 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
758 break;
759
760 case options::OPT_fno_constant_cfstrings:
761 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
762 break;
763
764 case options::OPT_Wnonportable_cfstrings:
765 DAL->AddFlagArg(A,
766 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
767 break;
768
769 case options::OPT_Wno_nonportable_cfstrings:
770 DAL->AddFlagArg(A,
771 Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
772 break;
773
774 case options::OPT_fpascal_strings:
775 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
776 break;
777
778 case options::OPT_fno_pascal_strings:
779 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
780 break;
781 }
782 }
783
784 if (getTriple().getArch() == llvm::Triple::x86 ||
785 getTriple().getArch() == llvm::Triple::x86_64)
786 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
787 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
788 "core2");
789
790 // Add the arch options based on the particular spelling of -arch, to match
791 // how the driver driver works.
792 if (BoundArch) {
793 StringRef Name = BoundArch;
794 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
795 const Option MArch = Opts.getOption(options::OPT_march_EQ);
796
797 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
798 // which defines the list of which architectures we accept.
799 if (Name == "ppc")
800 ;
801 else if (Name == "ppc601")
802 DAL->AddJoinedArg(nullptr, MCpu, "601");
803 else if (Name == "ppc603")
804 DAL->AddJoinedArg(nullptr, MCpu, "603");
805 else if (Name == "ppc604")
806 DAL->AddJoinedArg(nullptr, MCpu, "604");
807 else if (Name == "ppc604e")
808 DAL->AddJoinedArg(nullptr, MCpu, "604e");
809 else if (Name == "ppc750")
810 DAL->AddJoinedArg(nullptr, MCpu, "750");
811 else if (Name == "ppc7400")
812 DAL->AddJoinedArg(nullptr, MCpu, "7400");
813 else if (Name == "ppc7450")
814 DAL->AddJoinedArg(nullptr, MCpu, "7450");
815 else if (Name == "ppc970")
816 DAL->AddJoinedArg(nullptr, MCpu, "970");
817
818 else if (Name == "ppc64" || Name == "ppc64le")
819 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
820
821 else if (Name == "i386")
822 ;
823 else if (Name == "i486")
824 DAL->AddJoinedArg(nullptr, MArch, "i486");
825 else if (Name == "i586")
826 DAL->AddJoinedArg(nullptr, MArch, "i586");
827 else if (Name == "i686")
828 DAL->AddJoinedArg(nullptr, MArch, "i686");
829 else if (Name == "pentium")
830 DAL->AddJoinedArg(nullptr, MArch, "pentium");
831 else if (Name == "pentium2")
832 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
833 else if (Name == "pentpro")
834 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
835 else if (Name == "pentIIm3")
836 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
837
838 else if (Name == "x86_64")
839 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
840 else if (Name == "x86_64h") {
841 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
842 DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
843 }
844
845 else if (Name == "arm")
846 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
847 else if (Name == "armv4t")
848 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
849 else if (Name == "armv5")
850 DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
851 else if (Name == "xscale")
852 DAL->AddJoinedArg(nullptr, MArch, "xscale");
853 else if (Name == "armv6")
854 DAL->AddJoinedArg(nullptr, MArch, "armv6k");
855 else if (Name == "armv6m")
856 DAL->AddJoinedArg(nullptr, MArch, "armv6m");
857 else if (Name == "armv7")
858 DAL->AddJoinedArg(nullptr, MArch, "armv7a");
859 else if (Name == "armv7em")
860 DAL->AddJoinedArg(nullptr, MArch, "armv7em");
861 else if (Name == "armv7k")
862 DAL->AddJoinedArg(nullptr, MArch, "armv7k");
863 else if (Name == "armv7m")
864 DAL->AddJoinedArg(nullptr, MArch, "armv7m");
865 else if (Name == "armv7s")
866 DAL->AddJoinedArg(nullptr, MArch, "armv7s");
867 }
868
869 return DAL;
870 }
871
AddLinkRuntimeLibArgs(const llvm::opt::ArgList & Args,llvm::opt::ArgStringList & CmdArgs) const872 void MachO::AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,
873 llvm::opt::ArgStringList &CmdArgs) const {
874 // Embedded targets are simple at the moment, not supporting sanitizers and
875 // with different libraries for each member of the product { static, PIC } x
876 // { hard-float, soft-float }
877 llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
878 CompilerRT +=
879 tools::arm::getARMFloatABI(getDriver(), Args, getTriple()) == "hard"
880 ? "hard"
881 : "soft";
882 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
883
884 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
885 }
886
887
TranslateArgs(const DerivedArgList & Args,const char * BoundArch) const888 DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
889 const char *BoundArch) const {
890 // First get the generic Apple args, before moving onto Darwin-specific ones.
891 DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
892 const OptTable &Opts = getDriver().getOpts();
893
894 // If no architecture is bound, none of the translations here are relevant.
895 if (!BoundArch)
896 return DAL;
897
898 // Add an explicit version min argument for the deployment target. We do this
899 // after argument translation because -Xarch_ arguments may add a version min
900 // argument.
901 AddDeploymentTarget(*DAL);
902
903 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
904 // FIXME: It would be far better to avoid inserting those -static arguments,
905 // but we can't check the deployment target in the translation code until
906 // it is set here.
907 if (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0)) {
908 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
909 Arg *A = *it;
910 ++it;
911 if (A->getOption().getID() != options::OPT_mkernel &&
912 A->getOption().getID() != options::OPT_fapple_kext)
913 continue;
914 assert(it != ie && "unexpected argument translation");
915 A = *it;
916 assert(A->getOption().getID() == options::OPT_static &&
917 "missing expected -static argument");
918 it = DAL->getArgs().erase(it);
919 }
920 }
921
922 // Default to use libc++ on OS X 10.9+ and iOS 7+.
923 if (((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
924 (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0))) &&
925 !Args.getLastArg(options::OPT_stdlib_EQ))
926 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
927 "libc++");
928
929 // Validate the C++ standard library choice.
930 CXXStdlibType Type = GetCXXStdlibType(*DAL);
931 if (Type == ToolChain::CST_Libcxx) {
932 // Check whether the target provides libc++.
933 StringRef where;
934
935 // Complain about targeting iOS < 5.0 in any way.
936 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
937 where = "iOS 5.0";
938
939 if (where != StringRef()) {
940 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment)
941 << where;
942 }
943 }
944
945 return DAL;
946 }
947
IsUnwindTablesDefault() const948 bool MachO::IsUnwindTablesDefault() const {
949 return getArch() == llvm::Triple::x86_64;
950 }
951
UseDwarfDebugFlags() const952 bool MachO::UseDwarfDebugFlags() const {
953 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
954 return S[0] != '\0';
955 return false;
956 }
957
UseSjLjExceptions() const958 bool Darwin::UseSjLjExceptions() const {
959 // Darwin uses SjLj exceptions on ARM.
960 return (getTriple().getArch() == llvm::Triple::arm ||
961 getTriple().getArch() == llvm::Triple::thumb);
962 }
963
isPICDefault() const964 bool MachO::isPICDefault() const {
965 return true;
966 }
967
isPIEDefault() const968 bool MachO::isPIEDefault() const {
969 return false;
970 }
971
isPICDefaultForced() const972 bool MachO::isPICDefaultForced() const {
973 return (getArch() == llvm::Triple::x86_64 ||
974 getArch() == llvm::Triple::aarch64);
975 }
976
SupportsProfiling() const977 bool MachO::SupportsProfiling() const {
978 // Profiling instrumentation is only supported on x86.
979 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
980 }
981
addMinVersionArgs(const llvm::opt::ArgList & Args,llvm::opt::ArgStringList & CmdArgs) const982 void Darwin::addMinVersionArgs(const llvm::opt::ArgList &Args,
983 llvm::opt::ArgStringList &CmdArgs) const {
984 VersionTuple TargetVersion = getTargetVersion();
985
986 if (isTargetIOSSimulator())
987 CmdArgs.push_back("-ios_simulator_version_min");
988 else if (isTargetIOSBased())
989 CmdArgs.push_back("-iphoneos_version_min");
990 else {
991 assert(isTargetMacOS() && "unexpected target");
992 CmdArgs.push_back("-macosx_version_min");
993 }
994
995 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
996 }
997
addStartObjectFileArgs(const llvm::opt::ArgList & Args,llvm::opt::ArgStringList & CmdArgs) const998 void Darwin::addStartObjectFileArgs(const llvm::opt::ArgList &Args,
999 llvm::opt::ArgStringList &CmdArgs) const {
1000 // Derived from startfile spec.
1001 if (Args.hasArg(options::OPT_dynamiclib)) {
1002 // Derived from darwin_dylib1 spec.
1003 if (isTargetIOSSimulator()) {
1004 ; // iOS simulator does not need dylib1.o.
1005 } else if (isTargetIPhoneOS()) {
1006 if (isIPhoneOSVersionLT(3, 1))
1007 CmdArgs.push_back("-ldylib1.o");
1008 } else {
1009 if (isMacosxVersionLT(10, 5))
1010 CmdArgs.push_back("-ldylib1.o");
1011 else if (isMacosxVersionLT(10, 6))
1012 CmdArgs.push_back("-ldylib1.10.5.o");
1013 }
1014 } else {
1015 if (Args.hasArg(options::OPT_bundle)) {
1016 if (!Args.hasArg(options::OPT_static)) {
1017 // Derived from darwin_bundle1 spec.
1018 if (isTargetIOSSimulator()) {
1019 ; // iOS simulator does not need bundle1.o.
1020 } else if (isTargetIPhoneOS()) {
1021 if (isIPhoneOSVersionLT(3, 1))
1022 CmdArgs.push_back("-lbundle1.o");
1023 } else {
1024 if (isMacosxVersionLT(10, 6))
1025 CmdArgs.push_back("-lbundle1.o");
1026 }
1027 }
1028 } else {
1029 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1030 if (Args.hasArg(options::OPT_static) ||
1031 Args.hasArg(options::OPT_object) ||
1032 Args.hasArg(options::OPT_preload)) {
1033 CmdArgs.push_back("-lgcrt0.o");
1034 } else {
1035 CmdArgs.push_back("-lgcrt1.o");
1036
1037 // darwin_crt2 spec is empty.
1038 }
1039 // By default on OS X 10.8 and later, we don't link with a crt1.o
1040 // file and the linker knows to use _main as the entry point. But,
1041 // when compiling with -pg, we need to link with the gcrt1.o file,
1042 // so pass the -no_new_main option to tell the linker to use the
1043 // "start" symbol as the entry point.
1044 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1045 CmdArgs.push_back("-no_new_main");
1046 } else {
1047 if (Args.hasArg(options::OPT_static) ||
1048 Args.hasArg(options::OPT_object) ||
1049 Args.hasArg(options::OPT_preload)) {
1050 CmdArgs.push_back("-lcrt0.o");
1051 } else {
1052 // Derived from darwin_crt1 spec.
1053 if (isTargetIOSSimulator()) {
1054 ; // iOS simulator does not need crt1.o.
1055 } else if (isTargetIPhoneOS()) {
1056 if (getArch() == llvm::Triple::aarch64)
1057 ; // iOS does not need any crt1 files for arm64
1058 else if (isIPhoneOSVersionLT(3, 1))
1059 CmdArgs.push_back("-lcrt1.o");
1060 else if (isIPhoneOSVersionLT(6, 0))
1061 CmdArgs.push_back("-lcrt1.3.1.o");
1062 } else {
1063 if (isMacosxVersionLT(10, 5))
1064 CmdArgs.push_back("-lcrt1.o");
1065 else if (isMacosxVersionLT(10, 6))
1066 CmdArgs.push_back("-lcrt1.10.5.o");
1067 else if (isMacosxVersionLT(10, 8))
1068 CmdArgs.push_back("-lcrt1.10.6.o");
1069
1070 // darwin_crt2 spec is empty.
1071 }
1072 }
1073 }
1074 }
1075 }
1076
1077 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
1078 isMacosxVersionLT(10, 5)) {
1079 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1080 CmdArgs.push_back(Str);
1081 }
1082 }
1083
SupportsObjCGC() const1084 bool Darwin::SupportsObjCGC() const {
1085 return isTargetMacOS();
1086 }
1087
CheckObjCARC() const1088 void Darwin::CheckObjCARC() const {
1089 if (isTargetIOSBased()|| (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
1090 return;
1091 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
1092 }
1093
1094 /// Generic_GCC - A tool chain using the 'gcc' command to perform
1095 /// all subcommands; this relies on gcc translating the majority of
1096 /// command line options.
1097
1098 /// \brief Parse a GCCVersion object out of a string of text.
1099 ///
1100 /// This is the primary means of forming GCCVersion objects.
1101 /*static*/
Parse(StringRef VersionText)1102 Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
1103 const GCCVersion BadVersion = { VersionText.str(), -1, -1, -1, "", "", "" };
1104 std::pair<StringRef, StringRef> First = VersionText.split('.');
1105 std::pair<StringRef, StringRef> Second = First.second.split('.');
1106
1107 GCCVersion GoodVersion = { VersionText.str(), -1, -1, -1, "", "", "" };
1108 if (First.first.getAsInteger(10, GoodVersion.Major) ||
1109 GoodVersion.Major < 0)
1110 return BadVersion;
1111 GoodVersion.MajorStr = First.first.str();
1112 if (Second.first.getAsInteger(10, GoodVersion.Minor) ||
1113 GoodVersion.Minor < 0)
1114 return BadVersion;
1115 GoodVersion.MinorStr = Second.first.str();
1116
1117 // First look for a number prefix and parse that if present. Otherwise just
1118 // stash the entire patch string in the suffix, and leave the number
1119 // unspecified. This covers versions strings such as:
1120 // 4.4
1121 // 4.4.0
1122 // 4.4.x
1123 // 4.4.2-rc4
1124 // 4.4.x-patched
1125 // And retains any patch number it finds.
1126 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1127 if (!PatchText.empty()) {
1128 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
1129 // Try to parse the number and any suffix.
1130 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1131 GoodVersion.Patch < 0)
1132 return BadVersion;
1133 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
1134 }
1135 }
1136
1137 return GoodVersion;
1138 }
1139
1140 /// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
isOlderThan(int RHSMajor,int RHSMinor,int RHSPatch,StringRef RHSPatchSuffix) const1141 bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1142 int RHSPatch,
1143 StringRef RHSPatchSuffix) const {
1144 if (Major != RHSMajor)
1145 return Major < RHSMajor;
1146 if (Minor != RHSMinor)
1147 return Minor < RHSMinor;
1148 if (Patch != RHSPatch) {
1149 // Note that versions without a specified patch sort higher than those with
1150 // a patch.
1151 if (RHSPatch == -1)
1152 return true;
1153 if (Patch == -1)
1154 return false;
1155
1156 // Otherwise just sort on the patch itself.
1157 return Patch < RHSPatch;
1158 }
1159 if (PatchSuffix != RHSPatchSuffix) {
1160 // Sort empty suffixes higher.
1161 if (RHSPatchSuffix.empty())
1162 return true;
1163 if (PatchSuffix.empty())
1164 return false;
1165
1166 // Provide a lexicographic sort to make this a total ordering.
1167 return PatchSuffix < RHSPatchSuffix;
1168 }
1169
1170 // The versions are equal.
1171 return false;
1172 }
1173
getGCCToolchainDir(const ArgList & Args)1174 static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
1175 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1176 if (A)
1177 return A->getValue();
1178 return GCC_INSTALL_PREFIX;
1179 }
1180
1181 /// \brief Initialize a GCCInstallationDetector from the driver.
1182 ///
1183 /// This performs all of the autodetection and sets up the various paths.
1184 /// Once constructed, a GCCInstallationDetector is essentially immutable.
1185 ///
1186 /// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1187 /// should instead pull the target out of the driver. This is currently
1188 /// necessary because the driver doesn't store the final version of the target
1189 /// triple.
1190 void
init(const Driver & D,const llvm::Triple & TargetTriple,const ArgList & Args)1191 Generic_GCC::GCCInstallationDetector::init(
1192 const Driver &D, const llvm::Triple &TargetTriple, const ArgList &Args) {
1193 llvm::Triple BiarchVariantTriple =
1194 TargetTriple.isArch32Bit() ? TargetTriple.get64BitArchVariant()
1195 : TargetTriple.get32BitArchVariant();
1196 // The library directories which may contain GCC installations.
1197 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
1198 // The compatible GCC triples for this particular architecture.
1199 SmallVector<StringRef, 16> CandidateTripleAliases;
1200 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
1201 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1202 CandidateTripleAliases, CandidateBiarchLibDirs,
1203 CandidateBiarchTripleAliases);
1204
1205 // Compute the set of prefixes for our search.
1206 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1207 D.PrefixDirs.end());
1208
1209 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1210 if (GCCToolchainDir != "") {
1211 if (GCCToolchainDir.back() == '/')
1212 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
1213
1214 Prefixes.push_back(GCCToolchainDir);
1215 } else {
1216 // If we have a SysRoot, try that first.
1217 if (!D.SysRoot.empty()) {
1218 Prefixes.push_back(D.SysRoot);
1219 Prefixes.push_back(D.SysRoot + "/usr");
1220 }
1221
1222 // Then look for gcc installed alongside clang.
1223 Prefixes.push_back(D.InstalledDir + "/..");
1224
1225 // And finally in /usr.
1226 if (D.SysRoot.empty())
1227 Prefixes.push_back("/usr");
1228 }
1229
1230 // Loop over the various components which exist and select the best GCC
1231 // installation available. GCC installs are ranked by version number.
1232 Version = GCCVersion::Parse("0.0.0");
1233 for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) {
1234 if (!llvm::sys::fs::exists(Prefixes[i]))
1235 continue;
1236 for (unsigned j = 0, je = CandidateLibDirs.size(); j < je; ++j) {
1237 const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str();
1238 if (!llvm::sys::fs::exists(LibDir))
1239 continue;
1240 for (unsigned k = 0, ke = CandidateTripleAliases.size(); k < ke; ++k)
1241 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir,
1242 CandidateTripleAliases[k]);
1243 }
1244 for (unsigned j = 0, je = CandidateBiarchLibDirs.size(); j < je; ++j) {
1245 const std::string LibDir = Prefixes[i] + CandidateBiarchLibDirs[j].str();
1246 if (!llvm::sys::fs::exists(LibDir))
1247 continue;
1248 for (unsigned k = 0, ke = CandidateBiarchTripleAliases.size(); k < ke;
1249 ++k)
1250 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir,
1251 CandidateBiarchTripleAliases[k],
1252 /*NeedsBiarchSuffix=*/ true);
1253 }
1254 }
1255 }
1256
print(raw_ostream & OS) const1257 void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
1258 for (const auto &InstallPath : CandidateGCCInstallPaths)
1259 OS << "Found candidate GCC installation: " << InstallPath << "\n";
1260
1261 if (!GCCInstallPath.empty())
1262 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1263
1264 for (const auto &Multilib : Multilibs)
1265 OS << "Candidate multilib: " << Multilib << "\n";
1266
1267 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1268 OS << "Selected multilib: " << SelectedMultilib << "\n";
1269 }
1270
getBiarchSibling(Multilib & M) const1271 bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1272 if (BiarchSibling.hasValue()) {
1273 M = BiarchSibling.getValue();
1274 return true;
1275 }
1276 return false;
1277 }
1278
CollectLibDirsAndTriples(const llvm::Triple & TargetTriple,const llvm::Triple & BiarchTriple,SmallVectorImpl<StringRef> & LibDirs,SmallVectorImpl<StringRef> & TripleAliases,SmallVectorImpl<StringRef> & BiarchLibDirs,SmallVectorImpl<StringRef> & BiarchTripleAliases)1279 /*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
1280 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
1281 SmallVectorImpl<StringRef> &LibDirs,
1282 SmallVectorImpl<StringRef> &TripleAliases,
1283 SmallVectorImpl<StringRef> &BiarchLibDirs,
1284 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
1285 // Declare a bunch of static data sets that we'll select between below. These
1286 // are specifically designed to always refer to string literals to avoid any
1287 // lifetime or initialization issues.
1288 static const char *const AArch64LibDirs[] = { "/lib64", "/lib" };
1289 static const char *const AArch64Triples[] = { "aarch64-none-linux-gnu",
1290 "aarch64-linux-gnu",
1291 "aarch64-linux-android",
1292 "aarch64-redhat-linux" };
1293 static const char *const AArch64beLibDirs[] = { "/lib" };
1294 static const char *const AArch64beTriples[] = { "aarch64_be-none-linux-gnu",
1295 "aarch64_be-linux-gnu" };
1296
1297 static const char *const ARMLibDirs[] = { "/lib" };
1298 static const char *const ARMTriples[] = { "arm-linux-gnueabi",
1299 "arm-linux-androideabi" };
1300 static const char *const ARMHFTriples[] = { "arm-linux-gnueabihf",
1301 "armv7hl-redhat-linux-gnueabi" };
1302 static const char *const ARMebLibDirs[] = { "/lib" };
1303 static const char *const ARMebTriples[] = { "armeb-linux-gnueabi",
1304 "armeb-linux-androideabi" };
1305 static const char *const ARMebHFTriples[] = { "armeb-linux-gnueabihf",
1306 "armebv7hl-redhat-linux-gnueabi" };
1307
1308 static const char *const X86_64LibDirs[] = { "/lib64", "/lib" };
1309 static const char *const X86_64Triples[] = {
1310 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu", "x86_64-pc-linux-gnu",
1311 "x86_64-redhat-linux6E", "x86_64-redhat-linux", "x86_64-suse-linux",
1312 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu", "x86_64-slackware-linux",
1313 "x86_64-linux-android", "x86_64-unknown-linux"
1314 };
1315 static const char *const X32LibDirs[] = { "/libx32" };
1316 static const char *const X86LibDirs[] = { "/lib32", "/lib" };
1317 static const char *const X86Triples[] = {
1318 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu", "i386-linux-gnu",
1319 "i386-redhat-linux6E", "i686-redhat-linux", "i586-redhat-linux",
1320 "i386-redhat-linux", "i586-suse-linux", "i486-slackware-linux",
1321 "i686-montavista-linux", "i686-linux-android", "i586-linux-gnu"
1322 };
1323
1324 static const char *const MIPSLibDirs[] = { "/lib" };
1325 static const char *const MIPSTriples[] = { "mips-linux-gnu",
1326 "mips-mti-linux-gnu",
1327 "mips-img-linux-gnu" };
1328 static const char *const MIPSELLibDirs[] = { "/lib" };
1329 static const char *const MIPSELTriples[] = { "mipsel-linux-gnu",
1330 "mipsel-linux-android",
1331 "mips-img-linux-gnu" };
1332
1333 static const char *const MIPS64LibDirs[] = { "/lib64", "/lib" };
1334 static const char *const MIPS64Triples[] = { "mips64-linux-gnu",
1335 "mips-mti-linux-gnu",
1336 "mips-img-linux-gnu",
1337 "mips64-linux-gnuabi64" };
1338 static const char *const MIPS64ELLibDirs[] = { "/lib64", "/lib" };
1339 static const char *const MIPS64ELTriples[] = { "mips64el-linux-gnu",
1340 "mips-mti-linux-gnu",
1341 "mips-img-linux-gnu",
1342 "mips64el-linux-android",
1343 "mips64el-linux-gnuabi64" };
1344
1345 static const char *const PPCLibDirs[] = { "/lib32", "/lib" };
1346 static const char *const PPCTriples[] = {
1347 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1348 "powerpc-suse-linux", "powerpc-montavista-linuxspe"
1349 };
1350 static const char *const PPC64LibDirs[] = { "/lib64", "/lib" };
1351 static const char *const PPC64Triples[] = { "powerpc64-linux-gnu",
1352 "powerpc64-unknown-linux-gnu",
1353 "powerpc64-suse-linux",
1354 "ppc64-redhat-linux" };
1355 static const char *const PPC64LELibDirs[] = { "/lib64", "/lib" };
1356 static const char *const PPC64LETriples[] = { "powerpc64le-linux-gnu",
1357 "powerpc64le-unknown-linux-gnu",
1358 "powerpc64le-suse-linux",
1359 "ppc64le-redhat-linux" };
1360
1361 static const char *const SPARCv8LibDirs[] = { "/lib32", "/lib" };
1362 static const char *const SPARCv8Triples[] = { "sparc-linux-gnu",
1363 "sparcv8-linux-gnu" };
1364 static const char *const SPARCv9LibDirs[] = { "/lib64", "/lib" };
1365 static const char *const SPARCv9Triples[] = { "sparc64-linux-gnu",
1366 "sparcv9-linux-gnu" };
1367
1368 static const char *const SystemZLibDirs[] = { "/lib64", "/lib" };
1369 static const char *const SystemZTriples[] = {
1370 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1371 "s390x-suse-linux", "s390x-redhat-linux"
1372 };
1373
1374 using std::begin;
1375 using std::end;
1376
1377 switch (TargetTriple.getArch()) {
1378 case llvm::Triple::aarch64:
1379 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1380 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1381 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1382 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1383 break;
1384 case llvm::Triple::aarch64_be:
1385 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1386 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1387 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1388 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1389 break;
1390 case llvm::Triple::arm:
1391 case llvm::Triple::thumb:
1392 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
1393 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
1394 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
1395 } else {
1396 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
1397 }
1398 break;
1399 case llvm::Triple::armeb:
1400 case llvm::Triple::thumbeb:
1401 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
1402 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
1403 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
1404 } else {
1405 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
1406 }
1407 break;
1408 case llvm::Triple::x86_64:
1409 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1410 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1411 // x32 is always available when x86_64 is available, so adding it as
1412 // secondary arch with x86_64 triples
1413 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
1414 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1415 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1416 } else {
1417 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1418 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
1419 }
1420 break;
1421 case llvm::Triple::x86:
1422 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1423 TripleAliases.append(begin(X86Triples), end(X86Triples));
1424 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1425 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1426 break;
1427 case llvm::Triple::mips:
1428 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1429 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1430 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1431 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1432 break;
1433 case llvm::Triple::mipsel:
1434 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1435 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1436 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1437 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1438 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1439 break;
1440 case llvm::Triple::mips64:
1441 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1442 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1443 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1444 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1445 break;
1446 case llvm::Triple::mips64el:
1447 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1448 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1449 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1450 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1451 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1452 break;
1453 case llvm::Triple::ppc:
1454 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1455 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1456 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1457 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1458 break;
1459 case llvm::Triple::ppc64:
1460 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1461 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1462 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1463 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
1464 break;
1465 case llvm::Triple::ppc64le:
1466 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1467 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
1468 break;
1469 case llvm::Triple::sparc:
1470 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1471 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1472 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1473 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1474 break;
1475 case llvm::Triple::sparcv9:
1476 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1477 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1478 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1479 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1480 break;
1481 case llvm::Triple::systemz:
1482 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1483 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
1484 break;
1485
1486 default:
1487 // By default, just rely on the standard lib directories and the original
1488 // triple.
1489 break;
1490 }
1491
1492 // Always append the drivers target triple to the end, in case it doesn't
1493 // match any of our aliases.
1494 TripleAliases.push_back(TargetTriple.str());
1495
1496 // Also include the multiarch variant if it's different.
1497 if (TargetTriple.str() != BiarchTriple.str())
1498 BiarchTripleAliases.push_back(BiarchTriple.str());
1499 }
1500
1501 namespace {
1502 // Filter to remove Multilibs that don't exist as a suffix to Path
1503 class FilterNonExistent : public MultilibSet::FilterCallback {
1504 std::string Base;
1505 public:
FilterNonExistent(std::string Base)1506 FilterNonExistent(std::string Base) : Base(Base) {}
operator ()(const Multilib & M) const1507 bool operator()(const Multilib &M) const override {
1508 return !llvm::sys::fs::exists(Base + M.gccSuffix() + "/crtbegin.o");
1509 }
1510 };
1511 } // end anonymous namespace
1512
addMultilibFlag(bool Enabled,const char * const Flag,std::vector<std::string> & Flags)1513 static void addMultilibFlag(bool Enabled, const char *const Flag,
1514 std::vector<std::string> &Flags) {
1515 if (Enabled)
1516 Flags.push_back(std::string("+") + Flag);
1517 else
1518 Flags.push_back(std::string("-") + Flag);
1519 }
1520
isMipsArch(llvm::Triple::ArchType Arch)1521 static bool isMipsArch(llvm::Triple::ArchType Arch) {
1522 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1523 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1524 }
1525
isMips32(llvm::Triple::ArchType Arch)1526 static bool isMips32(llvm::Triple::ArchType Arch) {
1527 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1528 }
1529
isMips64(llvm::Triple::ArchType Arch)1530 static bool isMips64(llvm::Triple::ArchType Arch) {
1531 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1532 }
1533
isMipsEL(llvm::Triple::ArchType Arch)1534 static bool isMipsEL(llvm::Triple::ArchType Arch) {
1535 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1536 }
1537
isMips16(const ArgList & Args)1538 static bool isMips16(const ArgList &Args) {
1539 Arg *A = Args.getLastArg(options::OPT_mips16,
1540 options::OPT_mno_mips16);
1541 return A && A->getOption().matches(options::OPT_mips16);
1542 }
1543
isMicroMips(const ArgList & Args)1544 static bool isMicroMips(const ArgList &Args) {
1545 Arg *A = Args.getLastArg(options::OPT_mmicromips,
1546 options::OPT_mno_micromips);
1547 return A && A->getOption().matches(options::OPT_mmicromips);
1548 }
1549
1550 struct DetectedMultilibs {
1551 /// The set of multilibs that the detected installation supports.
1552 MultilibSet Multilibs;
1553
1554 /// The primary multilib appropriate for the given flags.
1555 Multilib SelectedMultilib;
1556
1557 /// On Biarch systems, this corresponds to the default multilib when
1558 /// targeting the non-default multilib. Otherwise, it is empty.
1559 llvm::Optional<Multilib> BiarchSibling;
1560 };
1561
makeMultilib(StringRef commonSuffix)1562 static Multilib makeMultilib(StringRef commonSuffix) {
1563 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1564 }
1565
findMIPSMultilibs(const llvm::Triple & TargetTriple,StringRef Path,const llvm::opt::ArgList & Args,DetectedMultilibs & Result)1566 static bool findMIPSMultilibs(const llvm::Triple &TargetTriple, StringRef Path,
1567 const llvm::opt::ArgList &Args,
1568 DetectedMultilibs &Result) {
1569 // Some MIPS toolchains put libraries and object files compiled
1570 // using different options in to the sub-directoris which names
1571 // reflects the flags used for compilation. For example sysroot
1572 // directory might looks like the following examples:
1573 //
1574 // /usr
1575 // /lib <= crt*.o files compiled with '-mips32'
1576 // /mips16
1577 // /usr
1578 // /lib <= crt*.o files compiled with '-mips16'
1579 // /el
1580 // /usr
1581 // /lib <= crt*.o files compiled with '-mips16 -EL'
1582 //
1583 // or
1584 //
1585 // /usr
1586 // /lib <= crt*.o files compiled with '-mips32r2'
1587 // /mips16
1588 // /usr
1589 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1590 // /mips32
1591 // /usr
1592 // /lib <= crt*.o files compiled with '-mips32'
1593
1594 FilterNonExistent NonExistent(Path);
1595
1596 // Check for FSF toolchain multilibs
1597 MultilibSet FSFMipsMultilibs;
1598 {
1599 auto MArchMips32 = makeMultilib("/mips32")
1600 .flag("+m32").flag("-m64").flag("-mmicromips").flag("+march=mips32");
1601
1602 auto MArchMicroMips = makeMultilib("/micromips")
1603 .flag("+m32").flag("-m64").flag("+mmicromips");
1604
1605 auto MArchMips64r2 = makeMultilib("/mips64r2")
1606 .flag("-m32").flag("+m64").flag("+march=mips64r2");
1607
1608 auto MArchMips64 = makeMultilib("/mips64")
1609 .flag("-m32").flag("+m64").flag("-march=mips64r2");
1610
1611 auto MArchDefault = makeMultilib("")
1612 .flag("+m32").flag("-m64").flag("-mmicromips").flag("+march=mips32r2");
1613
1614 auto Mips16 = makeMultilib("/mips16")
1615 .flag("+mips16");
1616
1617 auto UCLibc = makeMultilib("/uclibc")
1618 .flag("+muclibc");
1619
1620 auto MAbi64 = makeMultilib("/64")
1621 .flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
1622
1623 auto BigEndian = makeMultilib("")
1624 .flag("+EB").flag("-EL");
1625
1626 auto LittleEndian = makeMultilib("/el")
1627 .flag("+EL").flag("-EB");
1628
1629 auto SoftFloat = makeMultilib("/sof")
1630 .flag("+msoft-float");
1631
1632 auto Nan2008 = makeMultilib("/nan2008")
1633 .flag("+mnan=2008");
1634
1635 FSFMipsMultilibs = MultilibSet()
1636 .Either(MArchMips32, MArchMicroMips,
1637 MArchMips64r2, MArchMips64, MArchDefault)
1638 .Maybe(UCLibc)
1639 .Maybe(Mips16)
1640 .FilterOut("/mips64/mips16")
1641 .FilterOut("/mips64r2/mips16")
1642 .FilterOut("/micromips/mips16")
1643 .Maybe(MAbi64)
1644 .FilterOut("/micromips/64")
1645 .FilterOut("/mips32/64")
1646 .FilterOut("^/64")
1647 .FilterOut("/mips16/64")
1648 .Either(BigEndian, LittleEndian)
1649 .Maybe(SoftFloat)
1650 .Maybe(Nan2008)
1651 .FilterOut(".*sof/nan2008")
1652 .FilterOut(NonExistent)
1653 .setIncludeDirsCallback([](
1654 StringRef InstallDir, StringRef TripleStr, const Multilib &M) {
1655 std::vector<std::string> Dirs;
1656 Dirs.push_back((InstallDir + "/include").str());
1657 std::string SysRootInc = InstallDir.str() + "/../../../../sysroot";
1658 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1659 Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1660 else
1661 Dirs.push_back(SysRootInc + "/usr/include");
1662 return Dirs;
1663 });
1664 }
1665
1666 // Check for Code Sourcery toolchain multilibs
1667 MultilibSet CSMipsMultilibs;
1668 {
1669 auto MArchMips16 = makeMultilib("/mips16")
1670 .flag("+m32").flag("+mips16");
1671
1672 auto MArchMicroMips = makeMultilib("/micromips")
1673 .flag("+m32").flag("+mmicromips");
1674
1675 auto MArchDefault = makeMultilib("")
1676 .flag("-mips16").flag("-mmicromips");
1677
1678 auto UCLibc = makeMultilib("/uclibc")
1679 .flag("+muclibc");
1680
1681 auto SoftFloat = makeMultilib("/soft-float")
1682 .flag("+msoft-float");
1683
1684 auto Nan2008 = makeMultilib("/nan2008")
1685 .flag("+mnan=2008");
1686
1687 auto DefaultFloat = makeMultilib("")
1688 .flag("-msoft-float").flag("-mnan=2008");
1689
1690 auto BigEndian = makeMultilib("")
1691 .flag("+EB").flag("-EL");
1692
1693 auto LittleEndian = makeMultilib("/el")
1694 .flag("+EL").flag("-EB");
1695
1696 // Note that this one's osSuffix is ""
1697 auto MAbi64 = makeMultilib("")
1698 .gccSuffix("/64")
1699 .includeSuffix("/64")
1700 .flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
1701
1702 CSMipsMultilibs = MultilibSet()
1703 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1704 .Maybe(UCLibc)
1705 .Either(SoftFloat, Nan2008, DefaultFloat)
1706 .FilterOut("/micromips/nan2008")
1707 .FilterOut("/mips16/nan2008")
1708 .Either(BigEndian, LittleEndian)
1709 .Maybe(MAbi64)
1710 .FilterOut("/mips16.*/64")
1711 .FilterOut("/micromips.*/64")
1712 .FilterOut(NonExistent)
1713 .setIncludeDirsCallback([](
1714 StringRef InstallDir, StringRef TripleStr, const Multilib &M) {
1715 std::vector<std::string> Dirs;
1716 Dirs.push_back((InstallDir + "/include").str());
1717 std::string SysRootInc =
1718 InstallDir.str() + "/../../../../" + TripleStr.str();
1719 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1720 Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1721 else
1722 Dirs.push_back(SysRootInc + "/libc/usr/include");
1723 return Dirs;
1724 });
1725 }
1726
1727 MultilibSet AndroidMipsMultilibs = MultilibSet()
1728 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1729 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1730 .FilterOut(NonExistent);
1731
1732 MultilibSet DebianMipsMultilibs;
1733 {
1734 Multilib MAbiN32 = Multilib()
1735 .gccSuffix("/n32")
1736 .includeSuffix("/n32")
1737 .flag("+mabi=n32");
1738
1739 Multilib M64 = Multilib()
1740 .gccSuffix("/64")
1741 .includeSuffix("/64")
1742 .flag("+m64").flag("-m32").flag("-mabi=n32");
1743
1744 Multilib M32 = Multilib()
1745 .flag("-m64").flag("+m32").flag("-mabi=n32");
1746
1747 DebianMipsMultilibs = MultilibSet()
1748 .Either(M32, M64, MAbiN32)
1749 .FilterOut(NonExistent);
1750 }
1751
1752 MultilibSet ImgMultilibs;
1753 {
1754 auto Mips64r6 = makeMultilib("/mips64r6")
1755 .flag("+m64").flag("-m32");
1756
1757 auto LittleEndian = makeMultilib("/el")
1758 .flag("+EL").flag("-EB");
1759
1760 auto MAbi64 = makeMultilib("/64")
1761 .flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
1762
1763 ImgMultilibs = MultilibSet()
1764 .Maybe(Mips64r6)
1765 .Maybe(MAbi64)
1766 .Maybe(LittleEndian)
1767 .FilterOut(NonExistent)
1768 .setIncludeDirsCallback([](
1769 StringRef InstallDir, StringRef TripleStr, const Multilib &M) {
1770 std::vector<std::string> Dirs;
1771 Dirs.push_back((InstallDir + "/include").str());
1772 Dirs.push_back((InstallDir + "/../../../../sysroot/usr/include").str());
1773 return Dirs;
1774 });
1775 }
1776
1777 StringRef CPUName;
1778 StringRef ABIName;
1779 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
1780
1781 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1782
1783 Multilib::flags_list Flags;
1784 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
1785 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
1786 addMultilibFlag(isMips16(Args), "mips16", Flags);
1787 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
1788 addMultilibFlag(CPUName == "mips32r2", "march=mips32r2", Flags);
1789 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
1790 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
1791 addMultilibFlag(CPUName == "mips64r2" || CPUName == "octeon",
1792 "march=mips64r2", Flags);
1793 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
1794 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
1795 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
1796 Flags);
1797 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
1798 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
1799 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
1800 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
1801 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
1802 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
1803
1804 if (TargetTriple.getEnvironment() == llvm::Triple::Android) {
1805 // Select Android toolchain. It's the only choice in that case.
1806 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
1807 Result.Multilibs = AndroidMipsMultilibs;
1808 return true;
1809 }
1810 return false;
1811 }
1812
1813 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1814 TargetTriple.getOS() == llvm::Triple::Linux &&
1815 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
1816 // Select mips-img-linux-gnu toolchain.
1817 if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
1818 Result.Multilibs = ImgMultilibs;
1819 return true;
1820 }
1821 return false;
1822 }
1823
1824 // Sort candidates. Toolchain that best meets the directories goes first.
1825 // Then select the first toolchains matches command line flags.
1826 MultilibSet *candidates[] = { &DebianMipsMultilibs, &FSFMipsMultilibs,
1827 &CSMipsMultilibs };
1828 std::sort(
1829 std::begin(candidates), std::end(candidates),
1830 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
1831 for (const auto &candidate : candidates) {
1832 if (candidate->select(Flags, Result.SelectedMultilib)) {
1833 if (candidate == &DebianMipsMultilibs)
1834 Result.BiarchSibling = Multilib();
1835 Result.Multilibs = *candidate;
1836 return true;
1837 }
1838 }
1839
1840 {
1841 // Fallback to the regular toolchain-tree structure.
1842 Multilib Default;
1843 Result.Multilibs.push_back(Default);
1844 Result.Multilibs.FilterOut(NonExistent);
1845
1846 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
1847 Result.BiarchSibling = Multilib();
1848 return true;
1849 }
1850 }
1851
1852 return false;
1853 }
1854
findBiarchMultilibs(const llvm::Triple & TargetTriple,StringRef Path,const ArgList & Args,bool NeedsBiarchSuffix,DetectedMultilibs & Result)1855 static bool findBiarchMultilibs(const llvm::Triple &TargetTriple,
1856 StringRef Path, const ArgList &Args,
1857 bool NeedsBiarchSuffix,
1858 DetectedMultilibs &Result) {
1859
1860 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
1861 // in what would normally be GCCInstallPath and put the 64-bit
1862 // libs in a subdirectory named 64. The simple logic we follow is that
1863 // *if* there is a subdirectory of the right name with crtbegin.o in it,
1864 // we use that. If not, and if not a biarch triple alias, we look for
1865 // crtbegin.o without the subdirectory.
1866
1867 Multilib Default;
1868 Multilib Alt64 = Multilib()
1869 .gccSuffix("/64")
1870 .includeSuffix("/64")
1871 .flag("-m32").flag("+m64").flag("-mx32");
1872 Multilib Alt32 = Multilib()
1873 .gccSuffix("/32")
1874 .includeSuffix("/32")
1875 .flag("+m32").flag("-m64").flag("-mx32");
1876 Multilib Altx32 = Multilib()
1877 .gccSuffix("/x32")
1878 .includeSuffix("/x32")
1879 .flag("-m32").flag("-m64").flag("+mx32");
1880
1881 FilterNonExistent NonExistent(Path);
1882
1883 // Determine default multilib from: 32, 64, x32
1884 // Also handle cases such as 64 on 32, 32 on 64, etc.
1885 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
1886 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
1887 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
1888 Want = WANT64;
1889 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
1890 Want = WANT64;
1891 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
1892 Want = WANT32;
1893 else {
1894 if (TargetTriple.isArch32Bit())
1895 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
1896 else if (IsX32)
1897 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
1898 else
1899 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
1900 }
1901
1902 if (Want == WANT32)
1903 Default.flag("+m32").flag("-m64").flag("-mx32");
1904 else if (Want == WANT64)
1905 Default.flag("-m32").flag("+m64").flag("-mx32");
1906 else if (Want == WANTX32)
1907 Default.flag("-m32").flag("-m64").flag("+mx32");
1908 else
1909 return false;
1910
1911 Result.Multilibs.push_back(Default);
1912 Result.Multilibs.push_back(Alt64);
1913 Result.Multilibs.push_back(Alt32);
1914 Result.Multilibs.push_back(Altx32);
1915
1916 Result.Multilibs.FilterOut(NonExistent);
1917
1918 Multilib::flags_list Flags;
1919 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
1920 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
1921 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
1922
1923 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
1924 return false;
1925
1926 if (Result.SelectedMultilib == Alt64 ||
1927 Result.SelectedMultilib == Alt32 ||
1928 Result.SelectedMultilib == Altx32)
1929 Result.BiarchSibling = Default;
1930
1931 return true;
1932 }
1933
ScanLibDirForGCCTriple(const llvm::Triple & TargetTriple,const ArgList & Args,const std::string & LibDir,StringRef CandidateTriple,bool NeedsBiarchSuffix)1934 void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
1935 const llvm::Triple &TargetTriple, const ArgList &Args,
1936 const std::string &LibDir, StringRef CandidateTriple,
1937 bool NeedsBiarchSuffix) {
1938 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1939 // There are various different suffixes involving the triple we
1940 // check for. We also record what is necessary to walk from each back
1941 // up to the lib directory.
1942 const std::string LibSuffixes[] = {
1943 "/gcc/" + CandidateTriple.str(),
1944 // Debian puts cross-compilers in gcc-cross
1945 "/gcc-cross/" + CandidateTriple.str(),
1946 "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
1947
1948 // The Freescale PPC SDK has the gcc libraries in
1949 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
1950 "/" + CandidateTriple.str(),
1951
1952 // Ubuntu has a strange mis-matched pair of triples that this happens to
1953 // match.
1954 // FIXME: It may be worthwhile to generalize this and look for a second
1955 // triple.
1956 "/i386-linux-gnu/gcc/" + CandidateTriple.str()
1957 };
1958 const std::string InstallSuffixes[] = {
1959 "/../../..", // gcc/
1960 "/../../..", // gcc-cross/
1961 "/../../../..", // <triple>/gcc/
1962 "/../..", // <triple>/
1963 "/../../../.." // i386-linux-gnu/gcc/<triple>/
1964 };
1965 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
1966 const unsigned NumLibSuffixes =
1967 (llvm::array_lengthof(LibSuffixes) - (TargetArch != llvm::Triple::x86));
1968 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
1969 StringRef LibSuffix = LibSuffixes[i];
1970 std::error_code EC;
1971 for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE;
1972 !EC && LI != LE; LI = LI.increment(EC)) {
1973 StringRef VersionText = llvm::sys::path::filename(LI->path());
1974 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
1975 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
1976 if (!CandidateGCCInstallPaths.insert(LI->path()).second)
1977 continue; // Saw this path before; no need to look at it again.
1978 if (CandidateVersion.isOlderThan(4, 1, 1))
1979 continue;
1980 if (CandidateVersion <= Version)
1981 continue;
1982
1983 DetectedMultilibs Detected;
1984
1985 // Debian mips multilibs behave more like the rest of the biarch ones,
1986 // so handle them there
1987 if (isMipsArch(TargetArch)) {
1988 if (!findMIPSMultilibs(TargetTriple, LI->path(), Args, Detected))
1989 continue;
1990 } else if (!findBiarchMultilibs(TargetTriple, LI->path(), Args,
1991 NeedsBiarchSuffix, Detected)) {
1992 continue;
1993 }
1994
1995 Multilibs = Detected.Multilibs;
1996 SelectedMultilib = Detected.SelectedMultilib;
1997 BiarchSibling = Detected.BiarchSibling;
1998 Version = CandidateVersion;
1999 GCCTriple.setTriple(CandidateTriple);
2000 // FIXME: We hack together the directory name here instead of
2001 // using LI to ensure stable path separators across Windows and
2002 // Linux.
2003 GCCInstallPath = LibDir + LibSuffixes[i] + "/" + VersionText.str();
2004 GCCParentLibPath = GCCInstallPath + InstallSuffixes[i];
2005 IsValid = true;
2006 }
2007 }
2008 }
2009
Generic_GCC(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2010 Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple,
2011 const ArgList &Args)
2012 : ToolChain(D, Triple, Args), GCCInstallation() {
2013 getProgramPaths().push_back(getDriver().getInstalledDir());
2014 if (getDriver().getInstalledDir() != getDriver().Dir)
2015 getProgramPaths().push_back(getDriver().Dir);
2016 }
2017
~Generic_GCC()2018 Generic_GCC::~Generic_GCC() {
2019 }
2020
getTool(Action::ActionClass AC) const2021 Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
2022 switch (AC) {
2023 case Action::PreprocessJobClass:
2024 if (!Preprocess)
2025 Preprocess.reset(new tools::gcc::Preprocess(*this));
2026 return Preprocess.get();
2027 case Action::CompileJobClass:
2028 if (!Compile)
2029 Compile.reset(new tools::gcc::Compile(*this));
2030 return Compile.get();
2031 default:
2032 return ToolChain::getTool(AC);
2033 }
2034 }
2035
buildAssembler() const2036 Tool *Generic_GCC::buildAssembler() const {
2037 return new tools::gnutools::Assemble(*this);
2038 }
2039
buildLinker() const2040 Tool *Generic_GCC::buildLinker() const {
2041 return new tools::gcc::Link(*this);
2042 }
2043
printVerboseInfo(raw_ostream & OS) const2044 void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2045 // Print the information about how we detected the GCC installation.
2046 GCCInstallation.print(OS);
2047 }
2048
IsUnwindTablesDefault() const2049 bool Generic_GCC::IsUnwindTablesDefault() const {
2050 return getArch() == llvm::Triple::x86_64;
2051 }
2052
isPICDefault() const2053 bool Generic_GCC::isPICDefault() const {
2054 return false;
2055 }
2056
isPIEDefault() const2057 bool Generic_GCC::isPIEDefault() const {
2058 return false;
2059 }
2060
isPICDefaultForced() const2061 bool Generic_GCC::isPICDefaultForced() const {
2062 return false;
2063 }
2064
IsIntegratedAssemblerDefault() const2065 bool Generic_GCC::IsIntegratedAssemblerDefault() const {
2066 return getTriple().getArch() == llvm::Triple::x86 ||
2067 getTriple().getArch() == llvm::Triple::x86_64 ||
2068 getTriple().getArch() == llvm::Triple::aarch64 ||
2069 getTriple().getArch() == llvm::Triple::aarch64_be ||
2070 getTriple().getArch() == llvm::Triple::arm ||
2071 getTriple().getArch() == llvm::Triple::armeb ||
2072 getTriple().getArch() == llvm::Triple::thumb ||
2073 getTriple().getArch() == llvm::Triple::thumbeb ||
2074 getTriple().getArch() == llvm::Triple::ppc ||
2075 getTriple().getArch() == llvm::Triple::ppc64 ||
2076 getTriple().getArch() == llvm::Triple::ppc64le ||
2077 getTriple().getArch() == llvm::Triple::sparc ||
2078 getTriple().getArch() == llvm::Triple::sparcv9 ||
2079 getTriple().getArch() == llvm::Triple::systemz;
2080 }
2081
addClangTargetOptions(const ArgList & DriverArgs,ArgStringList & CC1Args) const2082 void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2083 ArgStringList &CC1Args) const {
2084 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
2085 bool UseInitArrayDefault =
2086 getTriple().getArch() == llvm::Triple::aarch64 ||
2087 getTriple().getArch() == llvm::Triple::aarch64_be ||
2088 (getTriple().getOS() == llvm::Triple::Linux &&
2089 (!V.isOlderThan(4, 7, 0) ||
2090 getTriple().getEnvironment() == llvm::Triple::Android));
2091
2092 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
2093 options::OPT_fno_use_init_array,
2094 UseInitArrayDefault))
2095 CC1Args.push_back("-fuse-init-array");
2096 }
2097
2098 /// Hexagon Toolchain
2099
GetGnuDir(const std::string & InstalledDir,const ArgList & Args)2100 std::string Hexagon_TC::GetGnuDir(const std::string &InstalledDir,
2101 const ArgList &Args) {
2102
2103 // Locate the rest of the toolchain ...
2104 std::string GccToolchain = getGCCToolchainDir(Args);
2105
2106 if (!GccToolchain.empty())
2107 return GccToolchain;
2108
2109 std::string InstallRelDir = InstalledDir + "/../../gnu";
2110 if (llvm::sys::fs::exists(InstallRelDir))
2111 return InstallRelDir;
2112
2113 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
2114 if (llvm::sys::fs::exists(PrefixRelDir))
2115 return PrefixRelDir;
2116
2117 return InstallRelDir;
2118 }
2119
GetHexagonLibraryPaths(const ArgList & Args,const std::string & Ver,const std::string & MarchString,const std::string & InstalledDir,ToolChain::path_list * LibPaths)2120 static void GetHexagonLibraryPaths(
2121 const ArgList &Args,
2122 const std::string &Ver,
2123 const std::string &MarchString,
2124 const std::string &InstalledDir,
2125 ToolChain::path_list *LibPaths)
2126 {
2127 bool buildingLib = Args.hasArg(options::OPT_shared);
2128
2129 //----------------------------------------------------------------------------
2130 // -L Args
2131 //----------------------------------------------------------------------------
2132 for (arg_iterator
2133 it = Args.filtered_begin(options::OPT_L),
2134 ie = Args.filtered_end();
2135 it != ie;
2136 ++it) {
2137 for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i)
2138 LibPaths->push_back((*it)->getValue(i));
2139 }
2140
2141 //----------------------------------------------------------------------------
2142 // Other standard paths
2143 //----------------------------------------------------------------------------
2144 const std::string MarchSuffix = "/" + MarchString;
2145 const std::string G0Suffix = "/G0";
2146 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
2147 const std::string RootDir = Hexagon_TC::GetGnuDir(InstalledDir, Args) + "/";
2148
2149 // lib/gcc/hexagon/...
2150 std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
2151 if (buildingLib) {
2152 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
2153 LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
2154 }
2155 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
2156 LibPaths->push_back(LibGCCHexagonDir + Ver);
2157
2158 // lib/gcc/...
2159 LibPaths->push_back(RootDir + "lib/gcc");
2160
2161 // hexagon/lib/...
2162 std::string HexagonLibDir = RootDir + "hexagon/lib";
2163 if (buildingLib) {
2164 LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
2165 LibPaths->push_back(HexagonLibDir + G0Suffix);
2166 }
2167 LibPaths->push_back(HexagonLibDir + MarchSuffix);
2168 LibPaths->push_back(HexagonLibDir);
2169 }
2170
Hexagon_TC(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2171 Hexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple &Triple,
2172 const ArgList &Args)
2173 : Linux(D, Triple, Args) {
2174 const std::string InstalledDir(getDriver().getInstalledDir());
2175 const std::string GnuDir = Hexagon_TC::GetGnuDir(InstalledDir, Args);
2176
2177 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2178 // program paths
2179 const std::string BinDir(GnuDir + "/bin");
2180 if (llvm::sys::fs::exists(BinDir))
2181 getProgramPaths().push_back(BinDir);
2182
2183 // Determine version of GCC libraries and headers to use.
2184 const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
2185 std::error_code ec;
2186 GCCVersion MaxVersion= GCCVersion::Parse("0.0.0");
2187 for (llvm::sys::fs::directory_iterator di(HexagonDir, ec), de;
2188 !ec && di != de; di = di.increment(ec)) {
2189 GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->path()));
2190 if (MaxVersion < cv)
2191 MaxVersion = cv;
2192 }
2193 GCCLibAndIncVersion = MaxVersion;
2194
2195 ToolChain::path_list *LibPaths= &getFilePaths();
2196
2197 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2198 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2199 // support 'linux' we'll need to fix this up
2200 LibPaths->clear();
2201
2202 GetHexagonLibraryPaths(
2203 Args,
2204 GetGCCLibAndIncVersion(),
2205 GetTargetCPU(Args),
2206 InstalledDir,
2207 LibPaths);
2208 }
2209
~Hexagon_TC()2210 Hexagon_TC::~Hexagon_TC() {
2211 }
2212
buildAssembler() const2213 Tool *Hexagon_TC::buildAssembler() const {
2214 return new tools::hexagon::Assemble(*this);
2215 }
2216
buildLinker() const2217 Tool *Hexagon_TC::buildLinker() const {
2218 return new tools::hexagon::Link(*this);
2219 }
2220
AddClangSystemIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2221 void Hexagon_TC::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2222 ArgStringList &CC1Args) const {
2223 const Driver &D = getDriver();
2224
2225 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2226 DriverArgs.hasArg(options::OPT_nostdlibinc))
2227 return;
2228
2229 std::string Ver(GetGCCLibAndIncVersion());
2230 std::string GnuDir = Hexagon_TC::GetGnuDir(D.InstalledDir, DriverArgs);
2231 std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
2232 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
2233 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
2234 addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
2235 }
2236
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2237 void Hexagon_TC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2238 ArgStringList &CC1Args) const {
2239
2240 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2241 DriverArgs.hasArg(options::OPT_nostdincxx))
2242 return;
2243
2244 const Driver &D = getDriver();
2245 std::string Ver(GetGCCLibAndIncVersion());
2246 SmallString<128> IncludeDir(
2247 Hexagon_TC::GetGnuDir(D.InstalledDir, DriverArgs));
2248
2249 llvm::sys::path::append(IncludeDir, "hexagon/include/c++/");
2250 llvm::sys::path::append(IncludeDir, Ver);
2251 addSystemInclude(DriverArgs, CC1Args, IncludeDir.str());
2252 }
2253
2254 ToolChain::CXXStdlibType
GetCXXStdlibType(const ArgList & Args) const2255 Hexagon_TC::GetCXXStdlibType(const ArgList &Args) const {
2256 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2257 if (!A)
2258 return ToolChain::CST_Libstdcxx;
2259
2260 StringRef Value = A->getValue();
2261 if (Value != "libstdc++") {
2262 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2263 << A->getAsString(Args);
2264 }
2265
2266 return ToolChain::CST_Libstdcxx;
2267 }
2268
getHexagonVersion(const ArgList & Args)2269 static int getHexagonVersion(const ArgList &Args) {
2270 Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ);
2271 // Select the default CPU (v4) if none was given.
2272 if (!A)
2273 return 4;
2274
2275 // FIXME: produce errors if we cannot parse the version.
2276 StringRef WhichHexagon = A->getValue();
2277 if (WhichHexagon.startswith("hexagonv")) {
2278 int Val;
2279 if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val))
2280 return Val;
2281 }
2282 if (WhichHexagon.startswith("v")) {
2283 int Val;
2284 if (!WhichHexagon.substr(1).getAsInteger(10, Val))
2285 return Val;
2286 }
2287
2288 // FIXME: should probably be an error.
2289 return 4;
2290 }
2291
GetTargetCPU(const ArgList & Args)2292 StringRef Hexagon_TC::GetTargetCPU(const ArgList &Args)
2293 {
2294 int V = getHexagonVersion(Args);
2295 // FIXME: We don't support versions < 4. We should error on them.
2296 switch (V) {
2297 default:
2298 llvm_unreachable("Unexpected version");
2299 case 5:
2300 return "v5";
2301 case 4:
2302 return "v4";
2303 case 3:
2304 return "v3";
2305 case 2:
2306 return "v2";
2307 case 1:
2308 return "v1";
2309 }
2310 }
2311 // End Hexagon
2312
2313 /// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2314 /// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2315 /// Currently does not support anything else but compilation.
2316
TCEToolChain(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2317 TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple& Triple,
2318 const ArgList &Args)
2319 : ToolChain(D, Triple, Args) {
2320 // Path mangling to find libexec
2321 std::string Path(getDriver().Dir);
2322
2323 Path += "/../libexec";
2324 getProgramPaths().push_back(Path);
2325 }
2326
~TCEToolChain()2327 TCEToolChain::~TCEToolChain() {
2328 }
2329
IsMathErrnoDefault() const2330 bool TCEToolChain::IsMathErrnoDefault() const {
2331 return true;
2332 }
2333
isPICDefault() const2334 bool TCEToolChain::isPICDefault() const {
2335 return false;
2336 }
2337
isPIEDefault() const2338 bool TCEToolChain::isPIEDefault() const {
2339 return false;
2340 }
2341
isPICDefaultForced() const2342 bool TCEToolChain::isPICDefaultForced() const {
2343 return false;
2344 }
2345
2346 /// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
2347
OpenBSD(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2348 OpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
2349 : Generic_ELF(D, Triple, Args) {
2350 getFilePaths().push_back(getDriver().Dir + "/../lib");
2351 getFilePaths().push_back("/usr/lib");
2352 }
2353
buildAssembler() const2354 Tool *OpenBSD::buildAssembler() const {
2355 return new tools::openbsd::Assemble(*this);
2356 }
2357
buildLinker() const2358 Tool *OpenBSD::buildLinker() const {
2359 return new tools::openbsd::Link(*this);
2360 }
2361
2362 /// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
2363
Bitrig(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2364 Bitrig::Bitrig(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
2365 : Generic_ELF(D, Triple, Args) {
2366 getFilePaths().push_back(getDriver().Dir + "/../lib");
2367 getFilePaths().push_back("/usr/lib");
2368 }
2369
buildAssembler() const2370 Tool *Bitrig::buildAssembler() const {
2371 return new tools::bitrig::Assemble(*this);
2372 }
2373
buildLinker() const2374 Tool *Bitrig::buildLinker() const {
2375 return new tools::bitrig::Link(*this);
2376 }
2377
2378 ToolChain::CXXStdlibType
GetCXXStdlibType(const ArgList & Args) const2379 Bitrig::GetCXXStdlibType(const ArgList &Args) const {
2380 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2381 StringRef Value = A->getValue();
2382 if (Value == "libstdc++")
2383 return ToolChain::CST_Libstdcxx;
2384 if (Value == "libc++")
2385 return ToolChain::CST_Libcxx;
2386
2387 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2388 << A->getAsString(Args);
2389 }
2390 return ToolChain::CST_Libcxx;
2391 }
2392
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2393 void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2394 ArgStringList &CC1Args) const {
2395 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2396 DriverArgs.hasArg(options::OPT_nostdincxx))
2397 return;
2398
2399 switch (GetCXXStdlibType(DriverArgs)) {
2400 case ToolChain::CST_Libcxx:
2401 addSystemInclude(DriverArgs, CC1Args,
2402 getDriver().SysRoot + "/usr/include/c++/v1");
2403 break;
2404 case ToolChain::CST_Libstdcxx:
2405 addSystemInclude(DriverArgs, CC1Args,
2406 getDriver().SysRoot + "/usr/include/c++/stdc++");
2407 addSystemInclude(DriverArgs, CC1Args,
2408 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
2409
2410 StringRef Triple = getTriple().str();
2411 if (Triple.startswith("amd64"))
2412 addSystemInclude(DriverArgs, CC1Args,
2413 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
2414 Triple.substr(5));
2415 else
2416 addSystemInclude(DriverArgs, CC1Args,
2417 getDriver().SysRoot + "/usr/include/c++/stdc++/" +
2418 Triple);
2419 break;
2420 }
2421 }
2422
AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const2423 void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
2424 ArgStringList &CmdArgs) const {
2425 switch (GetCXXStdlibType(Args)) {
2426 case ToolChain::CST_Libcxx:
2427 CmdArgs.push_back("-lc++");
2428 CmdArgs.push_back("-lc++abi");
2429 CmdArgs.push_back("-lpthread");
2430 break;
2431 case ToolChain::CST_Libstdcxx:
2432 CmdArgs.push_back("-lstdc++");
2433 break;
2434 }
2435 }
2436
2437 /// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
2438
FreeBSD(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2439 FreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
2440 : Generic_ELF(D, Triple, Args) {
2441
2442 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
2443 // back to '/usr/lib' if it doesn't exist.
2444 if ((Triple.getArch() == llvm::Triple::x86 ||
2445 Triple.getArch() == llvm::Triple::ppc) &&
2446 llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
2447 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
2448 else
2449 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
2450 }
2451
2452 ToolChain::CXXStdlibType
GetCXXStdlibType(const ArgList & Args) const2453 FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
2454 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2455 StringRef Value = A->getValue();
2456 if (Value == "libstdc++")
2457 return ToolChain::CST_Libstdcxx;
2458 if (Value == "libc++")
2459 return ToolChain::CST_Libcxx;
2460
2461 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2462 << A->getAsString(Args);
2463 }
2464 if (getTriple().getOSMajorVersion() >= 10)
2465 return ToolChain::CST_Libcxx;
2466 return ToolChain::CST_Libstdcxx;
2467 }
2468
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2469 void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2470 ArgStringList &CC1Args) const {
2471 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2472 DriverArgs.hasArg(options::OPT_nostdincxx))
2473 return;
2474
2475 switch (GetCXXStdlibType(DriverArgs)) {
2476 case ToolChain::CST_Libcxx:
2477 addSystemInclude(DriverArgs, CC1Args,
2478 getDriver().SysRoot + "/usr/include/c++/v1");
2479 break;
2480 case ToolChain::CST_Libstdcxx:
2481 addSystemInclude(DriverArgs, CC1Args,
2482 getDriver().SysRoot + "/usr/include/c++/4.2");
2483 addSystemInclude(DriverArgs, CC1Args,
2484 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
2485 break;
2486 }
2487 }
2488
buildAssembler() const2489 Tool *FreeBSD::buildAssembler() const {
2490 return new tools::freebsd::Assemble(*this);
2491 }
2492
buildLinker() const2493 Tool *FreeBSD::buildLinker() const {
2494 return new tools::freebsd::Link(*this);
2495 }
2496
UseSjLjExceptions() const2497 bool FreeBSD::UseSjLjExceptions() const {
2498 // FreeBSD uses SjLj exceptions on ARM oabi.
2499 switch (getTriple().getEnvironment()) {
2500 case llvm::Triple::GNUEABIHF:
2501 case llvm::Triple::GNUEABI:
2502 case llvm::Triple::EABI:
2503 return false;
2504
2505 default:
2506 return (getTriple().getArch() == llvm::Triple::arm ||
2507 getTriple().getArch() == llvm::Triple::thumb);
2508 }
2509 }
2510
HasNativeLLVMSupport() const2511 bool FreeBSD::HasNativeLLVMSupport() const {
2512 return true;
2513 }
2514
isPIEDefault() const2515 bool FreeBSD::isPIEDefault() const {
2516 return getSanitizerArgs().requiresPIE();
2517 }
2518
2519 /// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
2520
NetBSD(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2521 NetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
2522 : Generic_ELF(D, Triple, Args) {
2523
2524 if (getDriver().UseStdLib) {
2525 // When targeting a 32-bit platform, try the special directory used on
2526 // 64-bit hosts, and only fall back to the main library directory if that
2527 // doesn't work.
2528 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
2529 // what all logic is needed to emulate the '=' prefix here.
2530 switch (Triple.getArch()) {
2531 case llvm::Triple::x86:
2532 getFilePaths().push_back("=/usr/lib/i386");
2533 break;
2534 case llvm::Triple::arm:
2535 case llvm::Triple::armeb:
2536 case llvm::Triple::thumb:
2537 case llvm::Triple::thumbeb:
2538 switch (Triple.getEnvironment()) {
2539 case llvm::Triple::EABI:
2540 case llvm::Triple::GNUEABI:
2541 getFilePaths().push_back("=/usr/lib/eabi");
2542 break;
2543 case llvm::Triple::EABIHF:
2544 case llvm::Triple::GNUEABIHF:
2545 getFilePaths().push_back("=/usr/lib/eabihf");
2546 break;
2547 default:
2548 getFilePaths().push_back("=/usr/lib/oabi");
2549 break;
2550 }
2551 break;
2552 case llvm::Triple::mips64:
2553 case llvm::Triple::mips64el:
2554 if (tools::mips::hasMipsAbiArg(Args, "o32"))
2555 getFilePaths().push_back("=/usr/lib/o32");
2556 else if (tools::mips::hasMipsAbiArg(Args, "64"))
2557 getFilePaths().push_back("=/usr/lib/64");
2558 break;
2559 case llvm::Triple::ppc:
2560 getFilePaths().push_back("=/usr/lib/powerpc");
2561 break;
2562 case llvm::Triple::sparc:
2563 getFilePaths().push_back("=/usr/lib/sparc");
2564 break;
2565 default:
2566 break;
2567 }
2568
2569 getFilePaths().push_back("=/usr/lib");
2570 }
2571 }
2572
buildAssembler() const2573 Tool *NetBSD::buildAssembler() const {
2574 return new tools::netbsd::Assemble(*this);
2575 }
2576
buildLinker() const2577 Tool *NetBSD::buildLinker() const {
2578 return new tools::netbsd::Link(*this);
2579 }
2580
2581 ToolChain::CXXStdlibType
GetCXXStdlibType(const ArgList & Args) const2582 NetBSD::GetCXXStdlibType(const ArgList &Args) const {
2583 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2584 StringRef Value = A->getValue();
2585 if (Value == "libstdc++")
2586 return ToolChain::CST_Libstdcxx;
2587 if (Value == "libc++")
2588 return ToolChain::CST_Libcxx;
2589
2590 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2591 << A->getAsString(Args);
2592 }
2593
2594 unsigned Major, Minor, Micro;
2595 getTriple().getOSVersion(Major, Minor, Micro);
2596 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
2597 switch (getArch()) {
2598 case llvm::Triple::aarch64:
2599 case llvm::Triple::arm:
2600 case llvm::Triple::armeb:
2601 case llvm::Triple::thumb:
2602 case llvm::Triple::thumbeb:
2603 case llvm::Triple::ppc:
2604 case llvm::Triple::ppc64:
2605 case llvm::Triple::ppc64le:
2606 case llvm::Triple::x86:
2607 case llvm::Triple::x86_64:
2608 return ToolChain::CST_Libcxx;
2609 default:
2610 break;
2611 }
2612 }
2613 return ToolChain::CST_Libstdcxx;
2614 }
2615
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2616 void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2617 ArgStringList &CC1Args) const {
2618 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2619 DriverArgs.hasArg(options::OPT_nostdincxx))
2620 return;
2621
2622 switch (GetCXXStdlibType(DriverArgs)) {
2623 case ToolChain::CST_Libcxx:
2624 addSystemInclude(DriverArgs, CC1Args,
2625 getDriver().SysRoot + "/usr/include/c++/");
2626 break;
2627 case ToolChain::CST_Libstdcxx:
2628 addSystemInclude(DriverArgs, CC1Args,
2629 getDriver().SysRoot + "/usr/include/g++");
2630 addSystemInclude(DriverArgs, CC1Args,
2631 getDriver().SysRoot + "/usr/include/g++/backward");
2632 break;
2633 }
2634 }
2635
2636 /// Minix - Minix tool chain which can call as(1) and ld(1) directly.
2637
Minix(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2638 Minix::Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
2639 : Generic_ELF(D, Triple, Args) {
2640
2641 if (getDriver().UseStdLib) {
2642 // When targeting a 32-bit platform, try the special directory used on
2643 // 64-bit hosts, and only fall back to the main library directory if that
2644 // doesn't work.
2645 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
2646 // what all logic is needed to emulate the '=' prefix here.
2647 switch (Triple.getArch()) {
2648 case llvm::Triple::x86:
2649 getFilePaths().push_back("=/usr/lib/i386");
2650 break;
2651 #if 0 // LSC: Not yet useful for MINIX, but kept to simplify comparison with NetBSD
2652 case llvm::Triple::arm:
2653 case llvm::Triple::armeb:
2654 case llvm::Triple::thumb:
2655 case llvm::Triple::thumbeb:
2656 switch (Triple.getEnvironment()) {
2657 case llvm::Triple::EABI:
2658 case llvm::Triple::GNUEABI:
2659 getFilePaths().push_back("=/usr/lib/eabi");
2660 break;
2661 case llvm::Triple::EABIHF:
2662 case llvm::Triple::GNUEABIHF:
2663 getFilePaths().push_back("=/usr/lib/eabihf");
2664 break;
2665 default:
2666 getFilePaths().push_back("=/usr/lib/oabi");
2667 break;
2668 }
2669 break;
2670 case llvm::Triple::mips64:
2671 case llvm::Triple::mips64el:
2672 if (tools::mips::hasMipsAbiArg(Args, "o32"))
2673 getFilePaths().push_back("=/usr/lib/o32");
2674 else if (tools::mips::hasMipsAbiArg(Args, "64"))
2675 getFilePaths().push_back("=/usr/lib/64");
2676 break;
2677 case llvm::Triple::ppc:
2678 getFilePaths().push_back("=/usr/lib/powerpc");
2679 break;
2680 case llvm::Triple::sparc:
2681 getFilePaths().push_back("=/usr/lib/sparc");
2682 break;
2683 #endif /* 0 */
2684 default:
2685 break;
2686 }
2687
2688 getFilePaths().push_back("=/usr/lib");
2689 }
2690 }
2691
buildAssembler() const2692 Tool *Minix::buildAssembler() const {
2693 return new tools::minix::Assemble(*this);
2694 }
2695
buildLinker() const2696 Tool *Minix::buildLinker() const {
2697 return new tools::minix::Link(*this);
2698 }
2699
2700 ToolChain::CXXStdlibType
GetCXXStdlibType(const ArgList & Args) const2701 Minix::GetCXXStdlibType(const ArgList &Args) const {
2702 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2703 StringRef Value = A->getValue();
2704 if (Value == "libstdc++")
2705 return ToolChain::CST_Libstdcxx;
2706 if (Value == "libc++")
2707 return ToolChain::CST_Libcxx;
2708
2709 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2710 << A->getAsString(Args);
2711 }
2712
2713 #if 0 /* LSC: We only us libcxx by default */
2714 unsigned Major, Minor, Micro;
2715 getTriple().getOSVersion(Major, Minor, Micro);
2716 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
2717 switch (getArch()) {
2718 case llvm::Triple::aarch64:
2719 case llvm::Triple::arm:
2720 case llvm::Triple::armeb:
2721 case llvm::Triple::thumb:
2722 case llvm::Triple::thumbeb:
2723 case llvm::Triple::ppc:
2724 case llvm::Triple::ppc64:
2725 case llvm::Triple::ppc64le:
2726 case llvm::Triple::x86:
2727 case llvm::Triple::x86_64:
2728 return ToolChain::CST_Libcxx;
2729 default:
2730 break;
2731 }
2732 }
2733 return ToolChain::CST_Libstdcxx;
2734 #else
2735 return ToolChain::CST_Libcxx;
2736 #endif /* 0 */
2737 }
2738
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2739 void Minix::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2740 ArgStringList &CC1Args) const {
2741 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2742 DriverArgs.hasArg(options::OPT_nostdincxx))
2743 return;
2744
2745 switch (GetCXXStdlibType(DriverArgs)) {
2746 case ToolChain::CST_Libcxx:
2747 addSystemInclude(DriverArgs, CC1Args,
2748 getDriver().SysRoot + "/usr/include/c++/");
2749 break;
2750 case ToolChain::CST_Libstdcxx:
2751 addSystemInclude(DriverArgs, CC1Args,
2752 getDriver().SysRoot + "/usr/include/g++");
2753 addSystemInclude(DriverArgs, CC1Args,
2754 getDriver().SysRoot + "/usr/include/g++/backward");
2755 break;
2756 }
2757 }
2758
2759 /// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
2760
Solaris(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2761 Solaris::Solaris(const Driver &D, const llvm::Triple& Triple,
2762 const ArgList &Args)
2763 : Generic_GCC(D, Triple, Args) {
2764
2765 getProgramPaths().push_back(getDriver().getInstalledDir());
2766 if (getDriver().getInstalledDir() != getDriver().Dir)
2767 getProgramPaths().push_back(getDriver().Dir);
2768
2769 getFilePaths().push_back(getDriver().Dir + "/../lib");
2770 getFilePaths().push_back("/usr/lib");
2771 }
2772
buildAssembler() const2773 Tool *Solaris::buildAssembler() const {
2774 return new tools::solaris::Assemble(*this);
2775 }
2776
buildLinker() const2777 Tool *Solaris::buildLinker() const {
2778 return new tools::solaris::Link(*this);
2779 }
2780
2781 /// Distribution (very bare-bones at the moment).
2782
2783 enum Distro {
2784 ArchLinux,
2785 DebianLenny,
2786 DebianSqueeze,
2787 DebianWheezy,
2788 DebianJessie,
2789 Exherbo,
2790 RHEL4,
2791 RHEL5,
2792 RHEL6,
2793 Fedora,
2794 OpenSUSE,
2795 UbuntuHardy,
2796 UbuntuIntrepid,
2797 UbuntuJaunty,
2798 UbuntuKarmic,
2799 UbuntuLucid,
2800 UbuntuMaverick,
2801 UbuntuNatty,
2802 UbuntuOneiric,
2803 UbuntuPrecise,
2804 UbuntuQuantal,
2805 UbuntuRaring,
2806 UbuntuSaucy,
2807 UbuntuTrusty,
2808 UnknownDistro
2809 };
2810
IsRedhat(enum Distro Distro)2811 static bool IsRedhat(enum Distro Distro) {
2812 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL6);
2813 }
2814
IsOpenSUSE(enum Distro Distro)2815 static bool IsOpenSUSE(enum Distro Distro) {
2816 return Distro == OpenSUSE;
2817 }
2818
IsDebian(enum Distro Distro)2819 static bool IsDebian(enum Distro Distro) {
2820 return Distro >= DebianLenny && Distro <= DebianJessie;
2821 }
2822
IsUbuntu(enum Distro Distro)2823 static bool IsUbuntu(enum Distro Distro) {
2824 return Distro >= UbuntuHardy && Distro <= UbuntuTrusty;
2825 }
2826
DetectDistro(llvm::Triple::ArchType Arch)2827 static Distro DetectDistro(llvm::Triple::ArchType Arch) {
2828 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
2829 llvm::MemoryBuffer::getFile("/etc/lsb-release");
2830 if (File) {
2831 StringRef Data = File.get()->getBuffer();
2832 SmallVector<StringRef, 16> Lines;
2833 Data.split(Lines, "\n");
2834 Distro Version = UnknownDistro;
2835 for (unsigned i = 0, s = Lines.size(); i != s; ++i)
2836 if (Version == UnknownDistro && Lines[i].startswith("DISTRIB_CODENAME="))
2837 Version = llvm::StringSwitch<Distro>(Lines[i].substr(17))
2838 .Case("hardy", UbuntuHardy)
2839 .Case("intrepid", UbuntuIntrepid)
2840 .Case("jaunty", UbuntuJaunty)
2841 .Case("karmic", UbuntuKarmic)
2842 .Case("lucid", UbuntuLucid)
2843 .Case("maverick", UbuntuMaverick)
2844 .Case("natty", UbuntuNatty)
2845 .Case("oneiric", UbuntuOneiric)
2846 .Case("precise", UbuntuPrecise)
2847 .Case("quantal", UbuntuQuantal)
2848 .Case("raring", UbuntuRaring)
2849 .Case("saucy", UbuntuSaucy)
2850 .Case("trusty", UbuntuTrusty)
2851 .Default(UnknownDistro);
2852 return Version;
2853 }
2854
2855 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
2856 if (File) {
2857 StringRef Data = File.get()->getBuffer();
2858 if (Data.startswith("Fedora release"))
2859 return Fedora;
2860 if (Data.startswith("Red Hat Enterprise Linux") ||
2861 Data.startswith("CentOS")) {
2862 if (Data.find("release 6") != StringRef::npos)
2863 return RHEL6;
2864 else if (Data.find("release 5") != StringRef::npos)
2865 return RHEL5;
2866 else if (Data.find("release 4") != StringRef::npos)
2867 return RHEL4;
2868 }
2869 return UnknownDistro;
2870 }
2871
2872 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
2873 if (File) {
2874 StringRef Data = File.get()->getBuffer();
2875 if (Data[0] == '5')
2876 return DebianLenny;
2877 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
2878 return DebianSqueeze;
2879 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
2880 return DebianWheezy;
2881 else if (Data.startswith("jessie/sid") || Data[0] == '8')
2882 return DebianJessie;
2883 return UnknownDistro;
2884 }
2885
2886 if (llvm::sys::fs::exists("/etc/SuSE-release"))
2887 return OpenSUSE;
2888
2889 if (llvm::sys::fs::exists("/etc/exherbo-release"))
2890 return Exherbo;
2891
2892 if (llvm::sys::fs::exists("/etc/arch-release"))
2893 return ArchLinux;
2894
2895 return UnknownDistro;
2896 }
2897
2898 /// \brief Get our best guess at the multiarch triple for a target.
2899 ///
2900 /// Debian-based systems are starting to use a multiarch setup where they use
2901 /// a target-triple directory in the library and header search paths.
2902 /// Unfortunately, this triple does not align with the vanilla target triple,
2903 /// so we provide a rough mapping here.
getMultiarchTriple(const llvm::Triple & TargetTriple,StringRef SysRoot)2904 static std::string getMultiarchTriple(const llvm::Triple &TargetTriple,
2905 StringRef SysRoot) {
2906 // For most architectures, just use whatever we have rather than trying to be
2907 // clever.
2908 switch (TargetTriple.getArch()) {
2909 default:
2910 return TargetTriple.str();
2911
2912 // We use the existence of '/lib/<triple>' as a directory to detect some
2913 // common linux triples that don't quite match the Clang triple for both
2914 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
2915 // regardless of what the actual target triple is.
2916 case llvm::Triple::arm:
2917 case llvm::Triple::thumb:
2918 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
2919 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf"))
2920 return "arm-linux-gnueabihf";
2921 } else {
2922 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi"))
2923 return "arm-linux-gnueabi";
2924 }
2925 return TargetTriple.str();
2926 case llvm::Triple::armeb:
2927 case llvm::Triple::thumbeb:
2928 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
2929 if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
2930 return "armeb-linux-gnueabihf";
2931 } else {
2932 if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabi"))
2933 return "armeb-linux-gnueabi";
2934 }
2935 return TargetTriple.str();
2936 case llvm::Triple::x86:
2937 if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
2938 return "i386-linux-gnu";
2939 return TargetTriple.str();
2940 case llvm::Triple::x86_64:
2941 // We don't want this for x32, otherwise it will match x86_64 libs
2942 if (TargetTriple.getEnvironment() != llvm::Triple::GNUX32 &&
2943 llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
2944 return "x86_64-linux-gnu";
2945 return TargetTriple.str();
2946 case llvm::Triple::aarch64:
2947 if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64-linux-gnu"))
2948 return "aarch64-linux-gnu";
2949 return TargetTriple.str();
2950 case llvm::Triple::aarch64_be:
2951 if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
2952 return "aarch64_be-linux-gnu";
2953 return TargetTriple.str();
2954 case llvm::Triple::mips:
2955 if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu"))
2956 return "mips-linux-gnu";
2957 return TargetTriple.str();
2958 case llvm::Triple::mipsel:
2959 if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu"))
2960 return "mipsel-linux-gnu";
2961 return TargetTriple.str();
2962 case llvm::Triple::mips64:
2963 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnu"))
2964 return "mips64-linux-gnu";
2965 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
2966 return "mips64-linux-gnuabi64";
2967 return TargetTriple.str();
2968 case llvm::Triple::mips64el:
2969 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnu"))
2970 return "mips64el-linux-gnu";
2971 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
2972 return "mips64el-linux-gnuabi64";
2973 return TargetTriple.str();
2974 case llvm::Triple::ppc:
2975 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
2976 return "powerpc-linux-gnuspe";
2977 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu"))
2978 return "powerpc-linux-gnu";
2979 return TargetTriple.str();
2980 case llvm::Triple::ppc64:
2981 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu"))
2982 return "powerpc64-linux-gnu";
2983 case llvm::Triple::ppc64le:
2984 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
2985 return "powerpc64le-linux-gnu";
2986 return TargetTriple.str();
2987 }
2988 }
2989
addPathIfExists(Twine Path,ToolChain::path_list & Paths)2990 static void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
2991 if (llvm::sys::fs::exists(Path)) Paths.push_back(Path.str());
2992 }
2993
getOSLibDir(const llvm::Triple & Triple,const ArgList & Args)2994 static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
2995 if (isMipsArch(Triple.getArch())) {
2996 // lib32 directory has a special meaning on MIPS targets.
2997 // It contains N32 ABI binaries. Use this folder if produce
2998 // code for N32 ABI only.
2999 if (tools::mips::hasMipsAbiArg(Args, "n32"))
3000 return "lib32";
3001 return Triple.isArch32Bit() ? "lib" : "lib64";
3002 }
3003
3004 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
3005 // using that variant while targeting other architectures causes problems
3006 // because the libraries are laid out in shared system roots that can't cope
3007 // with a 'lib32' library search path being considered. So we only enable
3008 // them when we know we may need it.
3009 //
3010 // FIXME: This is a bit of a hack. We should really unify this code for
3011 // reasoning about oslibdir spellings with the lib dir spellings in the
3012 // GCCInstallationDetector, but that is a more significant refactoring.
3013 if (Triple.getArch() == llvm::Triple::x86 ||
3014 Triple.getArch() == llvm::Triple::ppc)
3015 return "lib32";
3016
3017 if (Triple.getArch() == llvm::Triple::x86_64 &&
3018 Triple.getEnvironment() == llvm::Triple::GNUX32)
3019 return "libx32";
3020
3021 return Triple.isArch32Bit() ? "lib" : "lib64";
3022 }
3023
Linux(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)3024 Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3025 : Generic_ELF(D, Triple, Args) {
3026 GCCInstallation.init(D, Triple, Args);
3027 Multilibs = GCCInstallation.getMultilibs();
3028 llvm::Triple::ArchType Arch = Triple.getArch();
3029 std::string SysRoot = computeSysRoot();
3030
3031 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
3032 // least) put various tools in a triple-prefixed directory off of the parent
3033 // of the GCC installation. We use the GCC triple here to ensure that we end
3034 // up with tools that support the same amount of cross compiling as the
3035 // detected GCC installation. For example, if we find a GCC installation
3036 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3037 // used to target i386.
3038 // FIXME: This seems unlikely to be Linux-specific.
3039 ToolChain::path_list &PPaths = getProgramPaths();
3040 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
3041 GCCInstallation.getTriple().str() + "/bin").str());
3042
3043 Linker = GetLinkerPath();
3044
3045 Distro Distro = DetectDistro(Arch);
3046
3047 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
3048 ExtraOpts.push_back("-z");
3049 ExtraOpts.push_back("relro");
3050 }
3051
3052 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
3053 ExtraOpts.push_back("-X");
3054
3055 const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android;
3056 const bool IsMips = isMipsArch(Arch);
3057
3058 if (IsMips && !SysRoot.empty())
3059 ExtraOpts.push_back("--sysroot=" + SysRoot);
3060
3061 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3062 // and the MIPS ABI require .dynsym to be sorted in different ways.
3063 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3064 // ABI requires a mapping between the GOT and the symbol table.
3065 // Android loader does not support .gnu.hash.
3066 if (!IsMips && !IsAndroid) {
3067 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
3068 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
3069 ExtraOpts.push_back("--hash-style=gnu");
3070
3071 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
3072 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3073 ExtraOpts.push_back("--hash-style=both");
3074 }
3075
3076 if (IsRedhat(Distro))
3077 ExtraOpts.push_back("--no-add-needed");
3078
3079 if (Distro == DebianSqueeze || Distro == DebianWheezy ||
3080 Distro == DebianJessie || IsOpenSUSE(Distro) ||
3081 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
3082 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
3083 ExtraOpts.push_back("--build-id");
3084
3085 if (IsOpenSUSE(Distro))
3086 ExtraOpts.push_back("--enable-new-dtags");
3087
3088 // The selection of paths to try here is designed to match the patterns which
3089 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3090 // This was determined by running GCC in a fake filesystem, creating all
3091 // possible permutations of these directories, and seeing which ones it added
3092 // to the link paths.
3093 path_list &Paths = getFilePaths();
3094
3095 const std::string OSLibDir = getOSLibDir(Triple, Args);
3096 const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
3097
3098 // Add the multilib suffixed paths where they are available.
3099 if (GCCInstallation.isValid()) {
3100 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3101 const std::string &LibPath = GCCInstallation.getParentLibPath();
3102 const Multilib &Multilib = GCCInstallation.getMultilib();
3103
3104 // Sourcery CodeBench MIPS toolchain holds some libraries under
3105 // a biarch-like suffix of the GCC installation.
3106 addPathIfExists((GCCInstallation.getInstallPath() +
3107 Multilib.gccSuffix()),
3108 Paths);
3109
3110 // GCC cross compiling toolchains will install target libraries which ship
3111 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3112 // any part of the GCC installation in
3113 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3114 // debatable, but is the reality today. We need to search this tree even
3115 // when we have a sysroot somewhere else. It is the responsibility of
3116 // whomever is doing the cross build targeting a sysroot using a GCC
3117 // installation that is *not* within the system root to ensure two things:
3118 //
3119 // 1) Any DSOs that are linked in from this tree or from the install path
3120 // above must be present on the system root and found via an
3121 // appropriate rpath.
3122 // 2) There must not be libraries installed into
3123 // <prefix>/<triple>/<libdir> unless they should be preferred over
3124 // those within the system root.
3125 //
3126 // Note that this matches the GCC behavior. See the below comment for where
3127 // Clang diverges from GCC's behavior.
3128 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + OSLibDir +
3129 Multilib.osSuffix(),
3130 Paths);
3131
3132 // If the GCC installation we found is inside of the sysroot, we want to
3133 // prefer libraries installed in the parent prefix of the GCC installation.
3134 // It is important to *not* use these paths when the GCC installation is
3135 // outside of the system root as that can pick up unintended libraries.
3136 // This usually happens when there is an external cross compiler on the
3137 // host system, and a more minimal sysroot available that is the target of
3138 // the cross. Note that GCC does include some of these directories in some
3139 // configurations but this seems somewhere between questionable and simply
3140 // a bug.
3141 if (StringRef(LibPath).startswith(SysRoot)) {
3142 addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
3143 addPathIfExists(LibPath + "/../" + OSLibDir, Paths);
3144 }
3145 }
3146
3147 // Similar to the logic for GCC above, if we currently running Clang inside
3148 // of the requested system root, add its parent library paths to
3149 // those searched.
3150 // FIXME: It's not clear whether we should use the driver's installed
3151 // directory ('Dir' below) or the ResourceDir.
3152 if (StringRef(D.Dir).startswith(SysRoot)) {
3153 addPathIfExists(D.Dir + "/../lib/" + MultiarchTriple, Paths);
3154 addPathIfExists(D.Dir + "/../" + OSLibDir, Paths);
3155 }
3156
3157 addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
3158 addPathIfExists(SysRoot + "/lib/../" + OSLibDir, Paths);
3159 addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3160 addPathIfExists(SysRoot + "/usr/lib/../" + OSLibDir, Paths);
3161
3162 // Try walking via the GCC triple path in case of biarch or multiarch GCC
3163 // installations with strange symlinks.
3164 if (GCCInstallation.isValid()) {
3165 addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
3166 "/../../" + OSLibDir, Paths);
3167
3168 // Add the 'other' biarch variant path
3169 Multilib BiarchSibling;
3170 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
3171 addPathIfExists(GCCInstallation.getInstallPath() +
3172 BiarchSibling.gccSuffix(), Paths);
3173 }
3174
3175 // See comments above on the multilib variant for details of why this is
3176 // included even from outside the sysroot.
3177 const std::string &LibPath = GCCInstallation.getParentLibPath();
3178 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3179 const Multilib &Multilib = GCCInstallation.getMultilib();
3180 addPathIfExists(LibPath + "/../" + GCCTriple.str() +
3181 "/lib" + Multilib.osSuffix(), Paths);
3182
3183 // See comments above on the multilib variant for details of why this is
3184 // only included from within the sysroot.
3185 if (StringRef(LibPath).startswith(SysRoot))
3186 addPathIfExists(LibPath, Paths);
3187 }
3188
3189 // Similar to the logic for GCC above, if we are currently running Clang
3190 // inside of the requested system root, add its parent library path to those
3191 // searched.
3192 // FIXME: It's not clear whether we should use the driver's installed
3193 // directory ('Dir' below) or the ResourceDir.
3194 if (StringRef(D.Dir).startswith(SysRoot))
3195 addPathIfExists(D.Dir + "/../lib", Paths);
3196
3197 addPathIfExists(SysRoot + "/lib", Paths);
3198 addPathIfExists(SysRoot + "/usr/lib", Paths);
3199 }
3200
HasNativeLLVMSupport() const3201 bool Linux::HasNativeLLVMSupport() const {
3202 return true;
3203 }
3204
buildLinker() const3205 Tool *Linux::buildLinker() const {
3206 return new tools::gnutools::Link(*this);
3207 }
3208
buildAssembler() const3209 Tool *Linux::buildAssembler() const {
3210 return new tools::gnutools::Assemble(*this);
3211 }
3212
computeSysRoot() const3213 std::string Linux::computeSysRoot() const {
3214 if (!getDriver().SysRoot.empty())
3215 return getDriver().SysRoot;
3216
3217 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3218 return std::string();
3219
3220 // Standalone MIPS toolchains use different names for sysroot folder
3221 // and put it into different places. Here we try to check some known
3222 // variants.
3223
3224 const StringRef InstallDir = GCCInstallation.getInstallPath();
3225 const StringRef TripleStr = GCCInstallation.getTriple().str();
3226 const Multilib &Multilib = GCCInstallation.getMultilib();
3227
3228 std::string Path = (InstallDir + "/../../../../" + TripleStr + "/libc" +
3229 Multilib.osSuffix()).str();
3230
3231 if (llvm::sys::fs::exists(Path))
3232 return Path;
3233
3234 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
3235
3236 if (llvm::sys::fs::exists(Path))
3237 return Path;
3238
3239 return std::string();
3240 }
3241
AddClangSystemIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const3242 void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3243 ArgStringList &CC1Args) const {
3244 const Driver &D = getDriver();
3245 std::string SysRoot = computeSysRoot();
3246
3247 if (DriverArgs.hasArg(options::OPT_nostdinc))
3248 return;
3249
3250 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
3251 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
3252
3253 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
3254 SmallString<128> P(D.ResourceDir);
3255 llvm::sys::path::append(P, "include");
3256 addSystemInclude(DriverArgs, CC1Args, P.str());
3257 }
3258
3259 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3260 return;
3261
3262 // Check for configure-time C include directories.
3263 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3264 if (CIncludeDirs != "") {
3265 SmallVector<StringRef, 5> dirs;
3266 CIncludeDirs.split(dirs, ":");
3267 for (StringRef dir : dirs) {
3268 StringRef Prefix =
3269 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
3270 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
3271 }
3272 return;
3273 }
3274
3275 // Lacking those, try to detect the correct set of system includes for the
3276 // target triple.
3277
3278 // Add include directories specific to the selected multilib set and multilib.
3279 if (GCCInstallation.isValid()) {
3280 auto Callback = Multilibs.includeDirsCallback();
3281 if (Callback) {
3282 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3283 GCCInstallation.getTriple().str(),
3284 GCCInstallation.getMultilib());
3285 for (const auto &Path : IncludePaths)
3286 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3287 }
3288 }
3289
3290 // Implement generic Debian multiarch support.
3291 const StringRef X86_64MultiarchIncludeDirs[] = {
3292 "/usr/include/x86_64-linux-gnu",
3293
3294 // FIXME: These are older forms of multiarch. It's not clear that they're
3295 // in use in any released version of Debian, so we should consider
3296 // removing them.
3297 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"
3298 };
3299 const StringRef X86MultiarchIncludeDirs[] = {
3300 "/usr/include/i386-linux-gnu",
3301
3302 // FIXME: These are older forms of multiarch. It's not clear that they're
3303 // in use in any released version of Debian, so we should consider
3304 // removing them.
3305 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3306 "/usr/include/i486-linux-gnu"
3307 };
3308 const StringRef AArch64MultiarchIncludeDirs[] = {
3309 "/usr/include/aarch64-linux-gnu"
3310 };
3311 const StringRef ARMMultiarchIncludeDirs[] = {
3312 "/usr/include/arm-linux-gnueabi"
3313 };
3314 const StringRef ARMHFMultiarchIncludeDirs[] = {
3315 "/usr/include/arm-linux-gnueabihf"
3316 };
3317 const StringRef MIPSMultiarchIncludeDirs[] = {
3318 "/usr/include/mips-linux-gnu"
3319 };
3320 const StringRef MIPSELMultiarchIncludeDirs[] = {
3321 "/usr/include/mipsel-linux-gnu"
3322 };
3323 const StringRef MIPS64MultiarchIncludeDirs[] = {
3324 "/usr/include/mips64-linux-gnu",
3325 "/usr/include/mips64-linux-gnuabi64"
3326 };
3327 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
3328 "/usr/include/mips64el-linux-gnu",
3329 "/usr/include/mips64el-linux-gnuabi64"
3330 };
3331 const StringRef PPCMultiarchIncludeDirs[] = {
3332 "/usr/include/powerpc-linux-gnu"
3333 };
3334 const StringRef PPC64MultiarchIncludeDirs[] = {
3335 "/usr/include/powerpc64-linux-gnu"
3336 };
3337 const StringRef PPC64LEMultiarchIncludeDirs[] = {
3338 "/usr/include/powerpc64le-linux-gnu"
3339 };
3340 ArrayRef<StringRef> MultiarchIncludeDirs;
3341 if (getTriple().getArch() == llvm::Triple::x86_64) {
3342 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
3343 } else if (getTriple().getArch() == llvm::Triple::x86) {
3344 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
3345 } else if (getTriple().getArch() == llvm::Triple::aarch64 ||
3346 getTriple().getArch() == llvm::Triple::aarch64_be) {
3347 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
3348 } else if (getTriple().getArch() == llvm::Triple::arm) {
3349 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3350 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3351 else
3352 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
3353 } else if (getTriple().getArch() == llvm::Triple::mips) {
3354 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
3355 } else if (getTriple().getArch() == llvm::Triple::mipsel) {
3356 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
3357 } else if (getTriple().getArch() == llvm::Triple::mips64) {
3358 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
3359 } else if (getTriple().getArch() == llvm::Triple::mips64el) {
3360 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
3361 } else if (getTriple().getArch() == llvm::Triple::ppc) {
3362 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
3363 } else if (getTriple().getArch() == llvm::Triple::ppc64) {
3364 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
3365 } else if (getTriple().getArch() == llvm::Triple::ppc64le) {
3366 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
3367 }
3368 for (StringRef Dir : MultiarchIncludeDirs) {
3369 if (llvm::sys::fs::exists(SysRoot + Dir)) {
3370 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
3371 break;
3372 }
3373 }
3374
3375 if (getTriple().getOS() == llvm::Triple::RTEMS)
3376 return;
3377
3378 // Add an include of '/include' directly. This isn't provided by default by
3379 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
3380 // add even when Clang is acting as-if it were a system compiler.
3381 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
3382
3383 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
3384 }
3385
3386 /// \brief Helper to add the variant paths of a libstdc++ installation.
addLibStdCXXIncludePaths(Twine Base,Twine Suffix,StringRef GCCTriple,StringRef GCCMultiarchTriple,StringRef TargetMultiarchTriple,Twine IncludeSuffix,const ArgList & DriverArgs,ArgStringList & CC1Args)3387 /*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine Suffix,
3388 StringRef GCCTriple,
3389 StringRef GCCMultiarchTriple,
3390 StringRef TargetMultiarchTriple,
3391 Twine IncludeSuffix,
3392 const ArgList &DriverArgs,
3393 ArgStringList &CC1Args) {
3394 if (!llvm::sys::fs::exists(Base + Suffix))
3395 return false;
3396
3397 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
3398
3399 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
3400 // that path exists or we have neither a GCC nor target multiarch triple, use
3401 // this vanilla search path.
3402 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
3403 llvm::sys::fs::exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
3404 addSystemInclude(DriverArgs, CC1Args,
3405 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
3406 } else {
3407 // Otherwise try to use multiarch naming schemes which have normalized the
3408 // triples and put the triple before the suffix.
3409 //
3410 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
3411 // the target triple, so we support that here.
3412 addSystemInclude(DriverArgs, CC1Args,
3413 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
3414 addSystemInclude(DriverArgs, CC1Args,
3415 Base + "/" + TargetMultiarchTriple + Suffix);
3416 }
3417
3418 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
3419 return true;
3420 }
3421
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const3422 void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3423 ArgStringList &CC1Args) const {
3424 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3425 DriverArgs.hasArg(options::OPT_nostdincxx))
3426 return;
3427
3428 // Check if libc++ has been enabled and provide its include paths if so.
3429 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
3430 const std::string LibCXXIncludePathCandidates[] = {
3431 // The primary location is within the Clang installation.
3432 // FIXME: We shouldn't hard code 'v1' here to make Clang future proof to
3433 // newer ABI versions.
3434 getDriver().Dir + "/../include/c++/v1",
3435
3436 // We also check the system as for a long time this is the only place Clang looked.
3437 // FIXME: We should really remove this. It doesn't make any sense.
3438 getDriver().SysRoot + "/usr/include/c++/v1"
3439 };
3440 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
3441 if (!llvm::sys::fs::exists(IncludePath))
3442 continue;
3443 // Add the first candidate that exists.
3444 addSystemInclude(DriverArgs, CC1Args, IncludePath);
3445 break;
3446 }
3447 return;
3448 }
3449
3450 // We need a detected GCC installation on Linux to provide libstdc++'s
3451 // headers. We handled the libc++ case above.
3452 if (!GCCInstallation.isValid())
3453 return;
3454
3455 // By default, look for the C++ headers in an include directory adjacent to
3456 // the lib directory of the GCC installation. Note that this is expect to be
3457 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
3458 StringRef LibDir = GCCInstallation.getParentLibPath();
3459 StringRef InstallDir = GCCInstallation.getInstallPath();
3460 StringRef TripleStr = GCCInstallation.getTriple().str();
3461 const Multilib &Multilib = GCCInstallation.getMultilib();
3462 const std::string GCCMultiarchTriple =
3463 getMultiarchTriple(GCCInstallation.getTriple(), getDriver().SysRoot);
3464 const std::string TargetMultiarchTriple =
3465 getMultiarchTriple(getTriple(), getDriver().SysRoot);
3466 const GCCVersion &Version = GCCInstallation.getVersion();
3467
3468 // The primary search for libstdc++ supports multiarch variants.
3469 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
3470 "/c++/" + Version.Text, TripleStr, GCCMultiarchTriple,
3471 TargetMultiarchTriple,
3472 Multilib.includeSuffix(), DriverArgs, CC1Args))
3473 return;
3474
3475 // Otherwise, fall back on a bunch of options which don't use multiarch
3476 // layouts for simplicity.
3477 const std::string LibStdCXXIncludePathCandidates[] = {
3478 // Gentoo is weird and places its headers inside the GCC install, so if the
3479 // first attempt to find the headers fails, try these patterns.
3480 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
3481 Version.MinorStr,
3482 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
3483 // Android standalone toolchain has C++ headers in yet another place.
3484 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
3485 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
3486 // without a subdirectory corresponding to the gcc version.
3487 LibDir.str() + "/../include/c++",
3488 };
3489
3490 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
3491 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
3492 /*GCCMultiarchTriple*/ "",
3493 /*TargetMultiarchTriple*/ "",
3494 Multilib.includeSuffix(), DriverArgs, CC1Args))
3495 break;
3496 }
3497 }
3498
isPIEDefault() const3499 bool Linux::isPIEDefault() const {
3500 return getSanitizerArgs().requiresPIE();
3501 }
3502
3503 /// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
3504
DragonFly(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)3505 DragonFly::DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
3506 : Generic_ELF(D, Triple, Args) {
3507
3508 // Path mangling to find libexec
3509 getProgramPaths().push_back(getDriver().getInstalledDir());
3510 if (getDriver().getInstalledDir() != getDriver().Dir)
3511 getProgramPaths().push_back(getDriver().Dir);
3512
3513 getFilePaths().push_back(getDriver().Dir + "/../lib");
3514 getFilePaths().push_back("/usr/lib");
3515 if (llvm::sys::fs::exists("/usr/lib/gcc47"))
3516 getFilePaths().push_back("/usr/lib/gcc47");
3517 else
3518 getFilePaths().push_back("/usr/lib/gcc44");
3519 }
3520
buildAssembler() const3521 Tool *DragonFly::buildAssembler() const {
3522 return new tools::dragonfly::Assemble(*this);
3523 }
3524
buildLinker() const3525 Tool *DragonFly::buildLinker() const {
3526 return new tools::dragonfly::Link(*this);
3527 }
3528
3529
3530 /// XCore tool chain
XCore(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)3531 XCore::XCore(const Driver &D, const llvm::Triple &Triple,
3532 const ArgList &Args) : ToolChain(D, Triple, Args) {
3533 // ProgramPaths are found via 'PATH' environment variable.
3534 }
3535
buildAssembler() const3536 Tool *XCore::buildAssembler() const {
3537 return new tools::XCore::Assemble(*this);
3538 }
3539
buildLinker() const3540 Tool *XCore::buildLinker() const {
3541 return new tools::XCore::Link(*this);
3542 }
3543
isPICDefault() const3544 bool XCore::isPICDefault() const {
3545 return false;
3546 }
3547
isPIEDefault() const3548 bool XCore::isPIEDefault() const {
3549 return false;
3550 }
3551
isPICDefaultForced() const3552 bool XCore::isPICDefaultForced() const {
3553 return false;
3554 }
3555
SupportsProfiling() const3556 bool XCore::SupportsProfiling() const {
3557 return false;
3558 }
3559
hasBlocksRuntime() const3560 bool XCore::hasBlocksRuntime() const {
3561 return false;
3562 }
3563
AddClangSystemIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const3564 void XCore::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3565 ArgStringList &CC1Args) const {
3566 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
3567 DriverArgs.hasArg(options::OPT_nostdlibinc))
3568 return;
3569 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
3570 SmallVector<StringRef, 4> Dirs;
3571 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,'\0'};
3572 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3573 ArrayRef<StringRef> DirVec(Dirs);
3574 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3575 }
3576 }
3577
addClangTargetOptions(const llvm::opt::ArgList & DriverArgs,llvm::opt::ArgStringList & CC1Args) const3578 void XCore::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
3579 llvm::opt::ArgStringList &CC1Args) const {
3580 CC1Args.push_back("-nostdsysteminc");
3581 }
3582
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const3583 void XCore::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3584 ArgStringList &CC1Args) const {
3585 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
3586 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3587 DriverArgs.hasArg(options::OPT_nostdincxx))
3588 return;
3589 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
3590 SmallVector<StringRef, 4> Dirs;
3591 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,'\0'};
3592 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3593 ArrayRef<StringRef> DirVec(Dirs);
3594 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3595 }
3596 }
3597
AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const3598 void XCore::AddCXXStdlibLibArgs(const ArgList &Args,
3599 ArgStringList &CmdArgs) const {
3600 // We don't output any lib args. This is handled by xcc.
3601 }
3602