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