blob: 592542d5fb56d31a11abbed0b316ad63fed28b97 [file] [log] [blame]
Nick Lewycky6da90772010-12-31 17:31:54 +00001//===--- ToolChains.cpp - ToolChain Implementations -----------------------===//
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002//
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"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "clang/Basic/ObjCRuntime.h"
12#include "clang/Basic/Version.h"
Alp Toker1d257e12014-06-04 03:28:55 +000013#include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
Daniel Dunbar6232d342010-05-20 21:48:38 +000014#include "clang/Driver/Compilation.h"
Daniel Dunbar76ce7412009-03-23 16:15:50 +000015#include "clang/Driver/Driver.h"
Daniel Dunbaraabb0b12009-03-25 06:12:34 +000016#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000017#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000018#include "clang/Driver/SanitizerArgs.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "llvm/ADT/STLExtras.h"
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +000020#include "llvm/ADT/SmallString.h"
Daniel Dunbar76ce7412009-03-23 16:15:50 +000021#include "llvm/ADT/StringExtras.h"
Bob Wilson997a97f2011-10-07 00:37:57 +000022#include "llvm/ADT/StringSwitch.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000023#include "llvm/Option/Arg.h"
24#include "llvm/Option/ArgList.h"
25#include "llvm/Option/OptTable.h"
26#include "llvm/Option/Option.h"
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +000027#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000028#include "llvm/Support/FileSystem.h"
Rafael Espindolac8f008f2010-11-07 20:14:31 +000029#include "llvm/Support/MemoryBuffer.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000030#include "llvm/Support/Path.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000031#include "llvm/Support/Program.h"
Renato Golin33e1f822015-05-28 15:49:28 +000032#include "llvm/Support/TargetParser.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000033#include "llvm/Support/raw_ostream.h"
Daniel Dunbarb5023e92009-04-10 21:00:07 +000034#include <cstdlib> // ::getenv
Rafael Espindola8a8e5542014-06-12 17:19:42 +000035#include <system_error>
Daniel Dunbarb5023e92009-04-10 21:00:07 +000036
Daniel Dunbar59e5e882009-03-20 00:20:03 +000037using namespace clang::driver;
38using namespace clang::driver::toolchains;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000039using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000040using namespace llvm::opt;
Daniel Dunbar59e5e882009-03-20 00:20:03 +000041
Douglas Katzmana67e50c2015-06-26 15:47:46 +000042MachO::MachO(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
43 : ToolChain(D, Triple, Args) {
Tim Northover15ff71d2014-05-22 13:12:14 +000044 // We expect 'as', 'ld', etc. to be adjacent to our install dir.
45 getProgramPaths().push_back(getDriver().getInstalledDir());
46 if (getDriver().getInstalledDir() != getDriver().Dir)
47 getProgramPaths().push_back(getDriver().Dir);
Tim Northover157d9112014-01-16 08:48:16 +000048}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +000049
Tim Northover157d9112014-01-16 08:48:16 +000050/// Darwin - Darwin tool chain for i386 and x86_64.
Alexey Samsonov905c8022015-06-18 21:46:05 +000051Darwin::Darwin(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
52 : MachO(D, Triple, Args), TargetInitialized(false) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +000053
Tim Northover157d9112014-01-16 08:48:16 +000054types::ID MachO::LookupTypeForExtension(const char *Ext) const {
Daniel Dunbarcc7df6c2010-08-02 05:43:56 +000055 types::ID Ty = types::lookupTypeForExtension(Ext);
56
57 // Darwin always preprocesses assembly files (unless -x is used explicitly).
58 if (Ty == types::TY_PP_Asm)
59 return types::TY_Asm;
60
61 return Ty;
62}
63
Douglas Katzmana67e50c2015-06-26 15:47:46 +000064bool MachO::HasNativeLLVMSupport() const { return true; }
Daniel Dunbar62123a12010-09-17 00:24:52 +000065
John McCall24fc0de2011-07-06 00:26:06 +000066/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
John McCall5fb5df92012-06-20 06:18:46 +000067ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
Tim Northover9c7e0352013-12-12 11:55:52 +000068 if (isTargetIOSBased())
John McCall5fb5df92012-06-20 06:18:46 +000069 return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
Bob Wilson5ad5a952012-11-09 01:59:30 +000070 if (isNonFragile)
71 return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
72 return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
John McCall24fc0de2011-07-06 00:26:06 +000073}
74
John McCall7959fee2011-09-09 20:41:01 +000075/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
76bool Darwin::hasBlocksRuntime() const {
Tim Northover9c7e0352013-12-12 11:55:52 +000077 if (isTargetIOSBased())
John McCall7959fee2011-09-09 20:41:01 +000078 return !isIPhoneOSVersionLT(3, 2);
Tim Northover9c7e0352013-12-12 11:55:52 +000079 else {
Tim Northover157d9112014-01-16 08:48:16 +000080 assert(isTargetMacOS() && "unexpected darwin target");
81 return !isMacosxVersionLT(10, 6);
Tim Northover9c7e0352013-12-12 11:55:52 +000082 }
John McCall7959fee2011-09-09 20:41:01 +000083}
84
Renato Golin33e1f822015-05-28 15:49:28 +000085// This is just a MachO name translation routine and there's no
86// way to join this into ARMTargetParser without breaking all
87// other assumptions. Maybe MachO should consider standardising
88// their nomenclature.
89static const char *ArmMachOArchName(StringRef Arch) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000090 return llvm::StringSwitch<const char *>(Arch)
91 .Case("armv6k", "armv6")
92 .Case("armv6m", "armv6m")
93 .Case("armv5tej", "armv5")
94 .Case("xscale", "xscale")
95 .Case("armv4t", "armv4t")
96 .Case("armv7", "armv7")
97 .Cases("armv7a", "armv7-a", "armv7")
98 .Cases("armv7r", "armv7-r", "armv7")
99 .Cases("armv7em", "armv7e-m", "armv7em")
100 .Cases("armv7k", "armv7-k", "armv7k")
101 .Cases("armv7m", "armv7-m", "armv7m")
102 .Cases("armv7s", "armv7-s", "armv7s")
103 .Default(nullptr);
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000104}
105
Renato Golin33e1f822015-05-28 15:49:28 +0000106static const char *ArmMachOArchNameCPU(StringRef CPU) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000107 unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
Renato Golin33e1f822015-05-28 15:49:28 +0000108 if (ArchKind == llvm::ARM::AK_INVALID)
109 return nullptr;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000110 StringRef Arch = llvm::ARM::getArchName(ArchKind);
Renato Golin33e1f822015-05-28 15:49:28 +0000111
112 // FIXME: Make sure this MachO triple mangling is really necessary.
113 // ARMv5* normalises to ARMv5.
114 if (Arch.startswith("armv5"))
115 Arch = Arch.substr(0, 5);
116 // ARMv6*, except ARMv6M, normalises to ARMv6.
117 else if (Arch.startswith("armv6") && !Arch.endswith("6m"))
118 Arch = Arch.substr(0, 5);
119 // ARMv7A normalises to ARMv7.
120 else if (Arch.endswith("v7a"))
121 Arch = Arch.substr(0, 5);
122 return Arch.data();
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000123}
124
Tim Northover9c7e0352013-12-12 11:55:52 +0000125static bool isSoftFloatABI(const ArgList &Args) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000126 Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
Tim Northover9c7e0352013-12-12 11:55:52 +0000127 options::OPT_mfloat_abi_EQ);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000128 if (!A)
129 return false;
Rafael Auler3f7abf72014-09-29 21:50:34 +0000130
Tim Northover9c7e0352013-12-12 11:55:52 +0000131 return A->getOption().matches(options::OPT_msoft_float) ||
132 (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
133 A->getValue() == StringRef("soft"));
134}
135
Tim Northover157d9112014-01-16 08:48:16 +0000136StringRef MachO::getMachOArchName(const ArgList &Args) const {
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000137 switch (getTriple().getArch()) {
138 default:
Rafael Espindolaed1233e2014-08-28 21:23:05 +0000139 return getDefaultUniversalArchName();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000140
Tim Northover40956e62014-07-23 12:32:58 +0000141 case llvm::Triple::aarch64:
142 return "arm64";
143
Douglas Gregord9bb1522011-03-06 19:11:49 +0000144 case llvm::Triple::thumb:
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000145 case llvm::Triple::arm: {
146 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000147 if (const char *Arch = ArmMachOArchName(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000148 return Arch;
149
150 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000151 if (const char *Arch = ArmMachOArchNameCPU(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000152 return Arch;
153
154 return "arm";
155 }
156 }
157}
158
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000159Darwin::~Darwin() {}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000160
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000161MachO::~MachO() {}
Tim Northover157d9112014-01-16 08:48:16 +0000162
163std::string MachO::ComputeEffectiveClangTriple(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000164 types::ID InputType) const {
Tim Northover157d9112014-01-16 08:48:16 +0000165 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
166
167 return Triple.getTriple();
168}
169
Chad Rosierd3a0f952011-09-20 20:44:06 +0000170std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
171 types::ID InputType) const {
172 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000173
174 // If the target isn't initialized (e.g., an unknown Darwin platform, return
175 // the default triple).
176 if (!isTargetInitialized())
177 return Triple.getTriple();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000178
Tim Northover157d9112014-01-16 08:48:16 +0000179 SmallString<16> Str;
180 Str += isTargetIOSBased() ? "ios" : "macosx";
181 Str += getTargetVersion().getAsString();
182 Triple.setOSName(Str);
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000183
184 return Triple.getTriple();
185}
186
David Blaikie68e081d2011-12-20 02:48:34 +0000187void Generic_ELF::anchor() {}
188
Tim Northover157d9112014-01-16 08:48:16 +0000189Tool *MachO::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +0000190 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000191 case Action::LipoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000192 if (!Lipo)
193 Lipo.reset(new tools::darwin::Lipo(*this));
194 return Lipo.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000195 case Action::DsymutilJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000196 if (!Dsymutil)
197 Dsymutil.reset(new tools::darwin::Dsymutil(*this));
198 return Dsymutil.get();
Ben Langmuir9b9a8d32014-02-06 18:53:25 +0000199 case Action::VerifyDebugInfoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000200 if (!VerifyDebug)
201 VerifyDebug.reset(new tools::darwin::VerifyDebug(*this));
202 return VerifyDebug.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +0000203 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000204 return ToolChain::getTool(AC);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000205 }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000206}
207
Douglas Katzman95354292015-06-23 20:42:09 +0000208Tool *MachO::buildLinker() const { return new tools::darwin::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +0000209
Tim Northover157d9112014-01-16 08:48:16 +0000210Tool *MachO::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +0000211 return new tools::darwin::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +0000212}
Daniel Dunbar26d482a2009-09-18 08:15:03 +0000213
Douglas Katzman95354292015-06-23 20:42:09 +0000214DarwinClang::DarwinClang(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +0000215 const ArgList &Args)
Douglas Katzman95354292015-06-23 20:42:09 +0000216 : Darwin(D, Triple, Args) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +0000217
Tim Northover336f1892014-03-29 13:16:12 +0000218void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
219 // For iOS, 64-bit, promote certain warnings to errors.
220 if (!isTargetMacOS() && getTriple().isArch64Bit()) {
221 // Always enable -Wdeprecated-objc-isa-usage and promote it
222 // to an error.
223 CC1Args.push_back("-Wdeprecated-objc-isa-usage");
224 CC1Args.push_back("-Werror=deprecated-objc-isa-usage");
225
226 // Also error about implicit function declarations, as that
227 // can impact calling conventions.
228 CC1Args.push_back("-Werror=implicit-function-declaration");
229 }
230}
231
Tim Northover157d9112014-01-16 08:48:16 +0000232/// \brief Determine whether Objective-C automated reference counting is
233/// enabled.
234static bool isObjCAutoRefCount(const ArgList &Args) {
235 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
236}
237
John McCall31168b02011-06-15 23:02:42 +0000238void DarwinClang::AddLinkARCArgs(const ArgList &Args,
239 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000240 // Avoid linking compatibility stubs on i386 mac.
241 if (isTargetMacOS() && getArch() == llvm::Triple::x86)
242 return;
243
244 ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true);
245
246 if ((runtime.hasNativeARC() || !isObjCAutoRefCount(Args)) &&
247 runtime.hasSubscripting())
248 return;
Eric Christopher551ef452011-08-23 17:56:55 +0000249
250 CmdArgs.push_back("-force_load");
Rafael Espindola358256c2013-06-26 02:13:00 +0000251 SmallString<128> P(getDriver().ClangExecutable);
252 llvm::sys::path::remove_filename(P); // 'clang'
253 llvm::sys::path::remove_filename(P); // 'bin'
Benjamin Kramer17381a02013-06-28 16:25:46 +0000254 llvm::sys::path::append(P, "lib", "arc", "libarclite_");
John McCall31168b02011-06-15 23:02:42 +0000255 // Mash in the platform.
Argyrios Kyrtzidis058b4512011-10-18 17:40:15 +0000256 if (isTargetIOSSimulator())
Rafael Espindola358256c2013-06-26 02:13:00 +0000257 P += "iphonesimulator";
Argyrios Kyrtzidis058b4512011-10-18 17:40:15 +0000258 else if (isTargetIPhoneOS())
Rafael Espindola358256c2013-06-26 02:13:00 +0000259 P += "iphoneos";
John McCall31168b02011-06-15 23:02:42 +0000260 else
Rafael Espindola358256c2013-06-26 02:13:00 +0000261 P += "macosx";
262 P += ".a";
John McCall31168b02011-06-15 23:02:42 +0000263
Rafael Espindola358256c2013-06-26 02:13:00 +0000264 CmdArgs.push_back(Args.MakeArgString(P));
John McCall31168b02011-06-15 23:02:42 +0000265}
266
Tim Northover157d9112014-01-16 08:48:16 +0000267void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
Kuba Brecka2735a0252014-10-31 00:08:57 +0000268 StringRef DarwinLibName, bool AlwaysLink,
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000269 bool IsEmbedded, bool AddRPath) const {
270 SmallString<128> Dir(getDriver().ResourceDir);
271 llvm::sys::path::append(Dir, "lib", IsEmbedded ? "macho_embedded" : "darwin");
272
273 SmallString<128> P(Dir);
274 llvm::sys::path::append(P, DarwinLibName);
Eric Christopher551ef452011-08-23 17:56:55 +0000275
Eric Christopherc235d0c62011-06-22 17:41:40 +0000276 // For now, allow missing resource libraries to support developers who may
Alexey Samsonov8368b372012-11-21 14:17:42 +0000277 // not have compiler-rt checked out or integrated into their build (unless
278 // we explicitly force linking with this library).
Yaron Keren92e1b622015-03-18 10:17:07 +0000279 if (AlwaysLink || llvm::sys::fs::exists(P))
280 CmdArgs.push_back(Args.MakeArgString(P));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000281
282 // Adding the rpaths might negatively interact when other rpaths are involved,
283 // so we should make sure we add the rpaths last, after all user-specified
284 // rpaths. This is currently true from this place, but we need to be
285 // careful if this function is ever called before user's rpaths are emitted.
286 if (AddRPath) {
287 assert(DarwinLibName.endswith(".dylib") && "must be a dynamic library");
288
289 // Add @executable_path to rpath to support having the dylib copied with
290 // the executable.
291 CmdArgs.push_back("-rpath");
292 CmdArgs.push_back("@executable_path");
293
294 // Add the path to the resource dir to rpath to support using the dylib
295 // from the default location without copying.
296 CmdArgs.push_back("-rpath");
Yaron Keren92e1b622015-03-18 10:17:07 +0000297 CmdArgs.push_back(Args.MakeArgString(Dir));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000298 }
Eric Christopherc235d0c62011-06-22 17:41:40 +0000299}
300
Justin Bogner2fd95f62015-05-12 06:30:48 +0000301void Darwin::addProfileRTLibs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000302 ArgStringList &CmdArgs) const {
Justin Bognerc7701242015-05-12 05:44:36 +0000303 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
304 false) ||
305 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +0000306 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bognerc7701242015-05-12 05:44:36 +0000307 Args.hasArg(options::OPT_fprofile_instr_generate) ||
308 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
309 Args.hasArg(options::OPT_fcreate_profile) ||
310 Args.hasArg(options::OPT_coverage)))
311 return;
312
313 // Select the appropriate runtime library for the target.
314 if (isTargetIOSBased())
315 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a",
316 /*AlwaysLink*/ true);
317 else
318 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a",
319 /*AlwaysLink*/ true);
320}
321
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000322void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
323 ArgStringList &CmdArgs,
324 StringRef Sanitizer) const {
325 if (!Args.hasArg(options::OPT_dynamiclib) &&
326 !Args.hasArg(options::OPT_bundle)) {
327 // Sanitizer runtime libraries requires C++.
328 AddCXXStdlibLibArgs(Args, CmdArgs);
329 }
330 assert(isTargetMacOS() || isTargetIOSSimulator());
331 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000332 AddLinkRuntimeLib(
333 Args, CmdArgs,
334 (Twine("libclang_rt.") + Sanitizer + "_" + OS + "_dynamic.dylib").str(),
335 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
336 /*AddRPath*/ true);
Hans Wennborg10821e52015-04-09 18:47:01 +0000337
338 if (GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) {
339 // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
340 // all RTTI-related symbols that UBSan uses.
341 CmdArgs.push_back("-lc++abi");
342 }
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000343}
344
Daniel Dunbar6276f992009-09-18 08:15:13 +0000345void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
346 ArgStringList &CmdArgs) const {
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000347 // Darwin only supports the compiler-rt based runtime libraries.
348 switch (GetRuntimeLibType(Args)) {
349 case ToolChain::RLT_CompilerRT:
350 break;
351 default:
352 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000353 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000354 return;
355 }
356
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000357 // Darwin doesn't support real static executables, don't link any runtime
358 // libraries with -static.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000359 if (Args.hasArg(options::OPT_static) ||
360 Args.hasArg(options::OPT_fapple_kext) ||
361 Args.hasArg(options::OPT_mkernel))
Daniel Dunbar6276f992009-09-18 08:15:13 +0000362 return;
Daniel Dunbar6276f992009-09-18 08:15:13 +0000363
364 // Reject -static-libgcc for now, we can deal with this when and if someone
365 // cares. This is useful in situations where someone wants to statically link
366 // something like libstdc++, and needs its runtime support routines.
367 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000368 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
Daniel Dunbar6276f992009-09-18 08:15:13 +0000369 return;
370 }
371
Peter Collingbourne32701642013-11-01 18:16:25 +0000372 const SanitizerArgs &Sanitize = getSanitizerArgs();
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +0000373 if (Sanitize.needsAsanRt())
374 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
375 if (Sanitize.needsUbsanRt())
376 AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
Daniel Dunbar1d6469f2011-12-01 23:40:18 +0000377
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000378 // Otherwise link libSystem, then the dynamic runtime library, and finally any
379 // target specific static runtime library.
Daniel Dunbar6276f992009-09-18 08:15:13 +0000380 CmdArgs.push_back("-lSystem");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000381
382 // Select the dynamic runtime library and the target specific static library.
Tim Northover9c7e0352013-12-12 11:55:52 +0000383 if (isTargetIOSBased()) {
Daniel Dunbar2f31fb92011-04-30 04:25:16 +0000384 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
385 // it never went into the SDK.
Bob Wilson102be442011-10-07 17:54:41 +0000386 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
Tim Northovera2ee4332014-03-29 15:09:45 +0000387 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
Tim Northover40956e62014-07-23 12:32:58 +0000388 getTriple().getArch() != llvm::Triple::aarch64)
Bob Wilson102be442011-10-07 17:54:41 +0000389 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000390
Daniel Dunbard1076382011-04-18 23:48:36 +0000391 // We currently always need a static runtime library for iOS.
Eric Christopherc235d0c62011-06-22 17:41:40 +0000392 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000393 } else {
Tim Northover9c7e0352013-12-12 11:55:52 +0000394 assert(isTargetMacOS() && "unexpected non MacOS platform");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000395 // The dynamic runtime library was merged with libSystem for 10.6 and
396 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000397 if (isMacosxVersionLT(10, 5))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000398 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000399 else if (isMacosxVersionLT(10, 6))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000400 CmdArgs.push_back("-lgcc_s.10.5");
401
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000402 // For OS X, we thought we would only need a static runtime library when
Chris Lattner57540c52011-04-15 05:22:18 +0000403 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000404 // omitted from 10.4.dylib.
405 //
406 // Unfortunately, that turned out to not be true, because Darwin system
407 // headers can still use eprintf on i386, and it is not exported from
408 // libSystem. Therefore, we still must provide a runtime library just for
409 // the tiny tiny handful of projects that *might* use that symbol.
410 if (isMacosxVersionLT(10, 5)) {
Eric Christopherc235d0c62011-06-22 17:41:40 +0000411 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000412 } else {
413 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopherc235d0c62011-06-22 17:41:40 +0000414 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
415 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000416 }
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000417 }
Daniel Dunbar6276f992009-09-18 08:15:13 +0000418}
419
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000420void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +0000421 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000422
Daniel Dunbar455a0492012-08-17 18:43:50 +0000423 // Support allowing the SDKROOT environment variable used by xcrun and other
424 // Xcode tools to define the default sysroot, by making it the default for
425 // isysroot.
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000426 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
427 // Warn if the path does not exist.
Rafael Espindola355670d2013-06-25 15:14:22 +0000428 if (!llvm::sys::fs::exists(A->getValue()))
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000429 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
430 } else {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000431 if (char *env = ::getenv("SDKROOT")) {
Daniel Dunbarb2543042013-01-15 20:33:56 +0000432 // We only use this value as the default if it is an absolute path,
433 // exists, and it is not the root path.
434 if (llvm::sys::path::is_absolute(env) && llvm::sys::fs::exists(env) &&
435 StringRef(env) != "/") {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000436 Args.append(Args.MakeSeparateArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000437 nullptr, Opts.getOption(options::OPT_isysroot), env));
Daniel Dunbar455a0492012-08-17 18:43:50 +0000438 }
439 }
440 }
441
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000442 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000443 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
Eli Friedman027e9c32012-01-11 02:41:15 +0000444
Bob Wilson7f294b52014-10-10 23:10:10 +0000445 if (OSXVersion && iOSVersion) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000446 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000447 << OSXVersion->getAsString(Args) << iOSVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000448 iOSVersion = nullptr;
449 } else if (!OSXVersion && !iOSVersion) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000450 // If no deployment target was specified on the command line, check for
Daniel Dunbard54669d2010-01-26 01:45:19 +0000451 // environment defines.
Alexey Samsonov905c8022015-06-18 21:46:05 +0000452 std::string OSXTarget;
453 std::string iOSTarget;
Chad Rosier64707fe2011-08-31 20:56:25 +0000454 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
455 OSXTarget = env;
456 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
457 iOSTarget = env;
Daniel Dunbarb5023e92009-04-10 21:00:07 +0000458
Steven Wu7a1372c2015-06-25 01:59:35 +0000459 // If there is no command-line argument to specify the Target version and
460 // no environment variable defined, see if we can set the default based
461 // on -isysroot.
462 if (iOSTarget.empty() && OSXTarget.empty() &&
463 Args.hasArg(options::OPT_isysroot)) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000464 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000465 StringRef isysroot = A->getValue();
Steven Wu7a1372c2015-06-25 01:59:35 +0000466 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
467 size_t BeginSDK = isysroot.rfind("SDKs/");
468 size_t EndSDK = isysroot.rfind(".sdk");
469 if (BeginSDK != StringRef::npos && EndSDK != StringRef::npos) {
470 StringRef SDK = isysroot.slice(BeginSDK + 5, EndSDK);
471 // Slice the version number out.
472 // Version number is between the first and the last number.
473 size_t StartVer = SDK.find_first_of("0123456789");
474 size_t EndVer = SDK.find_last_of("0123456789");
475 if (StartVer != StringRef::npos && EndVer > StartVer) {
476 StringRef Version = SDK.slice(StartVer, EndVer + 1);
477 if (SDK.startswith("iPhoneOS") ||
478 SDK.startswith("iPhoneSimulator"))
479 iOSTarget = Version;
480 else if (SDK.startswith("MacOSX"))
481 OSXTarget = Version;
482 }
483 }
Chad Rosier64707fe2011-08-31 20:56:25 +0000484 }
485 }
Daniel Dunbard54669d2010-01-26 01:45:19 +0000486
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000487 // If no OSX or iOS target has been specified, try to guess platform
Alexey Samsonov905c8022015-06-18 21:46:05 +0000488 // from arch name and compute the version from the triple.
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000489 if (OSXTarget.empty() && iOSTarget.empty()) {
490 StringRef MachOArchName = getMachOArchName(Args);
Alexey Samsonov905c8022015-06-18 21:46:05 +0000491 unsigned Major, Minor, Micro;
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000492 if (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
Alexey Samsonov905c8022015-06-18 21:46:05 +0000493 MachOArchName == "arm64") {
494 getTriple().getiOSVersion(Major, Minor, Micro);
495 llvm::raw_string_ostream(iOSTarget) << Major << '.' << Minor << '.'
496 << Micro;
497 } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
498 MachOArchName != "armv7em") {
499 if (!getTriple().getMacOSXVersion(Major, Minor, Micro)) {
500 getDriver().Diag(diag::err_drv_invalid_darwin_version)
501 << getTriple().getOSName();
502 }
503 llvm::raw_string_ostream(OSXTarget) << Major << '.' << Minor << '.'
504 << Micro;
505 }
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000506 }
Chad Rosierfe6fd362011-09-28 00:46:32 +0000507
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000508 // Allow conflicts among OSX and iOS for historical reasons, but choose the
509 // default platform.
Chad Rosier64707fe2011-08-31 20:56:25 +0000510 if (!OSXTarget.empty() && !iOSTarget.empty()) {
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000511 if (getTriple().getArch() == llvm::Triple::arm ||
Tim Northover573cbee2014-05-24 12:52:07 +0000512 getTriple().getArch() == llvm::Triple::aarch64 ||
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000513 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosier64707fe2011-08-31 20:56:25 +0000514 OSXTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000515 else
Chad Rosier64707fe2011-08-31 20:56:25 +0000516 iOSTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000517 }
Daniel Dunbar65969842010-01-29 17:02:25 +0000518
Chad Rosier64707fe2011-08-31 20:56:25 +0000519 if (!OSXTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000520 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000521 OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000522 Args.append(OSXVersion);
Chad Rosier64707fe2011-08-31 20:56:25 +0000523 } else if (!iOSTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000524 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000525 iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000526 Args.append(iOSVersion);
Daniel Dunbar84e727f2009-09-04 18:35:21 +0000527 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000528 }
Mike Stump11289f42009-09-09 15:08:12 +0000529
Tim Northover9c7e0352013-12-12 11:55:52 +0000530 DarwinPlatformKind Platform;
531 if (OSXVersion)
532 Platform = MacOS;
533 else if (iOSVersion)
534 Platform = IPhoneOS;
Tim Northover9c7e0352013-12-12 11:55:52 +0000535 else
Tim Northover157d9112014-01-16 08:48:16 +0000536 llvm_unreachable("Unable to infer Darwin variant");
Tim Northover9c7e0352013-12-12 11:55:52 +0000537
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000538 // Set the tool chain target information.
539 unsigned Major, Minor, Micro;
540 bool HadExtra;
Tim Northover9c7e0352013-12-12 11:55:52 +0000541 if (Platform == MacOS) {
Bob Wilson7f294b52014-10-10 23:10:10 +0000542 assert(!iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000543 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, Micro,
544 HadExtra) ||
545 HadExtra || Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000546 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000547 << OSXVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000548 } else if (Platform == IPhoneOS) {
549 assert(iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000550 if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
551 HadExtra) ||
552 HadExtra || Major >= 10 || Minor >= 100 || Micro >= 100)
Eli Friedman027e9c32012-01-11 02:41:15 +0000553 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000554 << iOSVersion->getAsString(Args);
Tim Northover157d9112014-01-16 08:48:16 +0000555 } else
556 llvm_unreachable("unknown kind of Darwin platform");
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000557
Bob Wilson7f294b52014-10-10 23:10:10 +0000558 // Recognize iOS targets with an x86 architecture as the iOS simulator.
Daniel Dunbarb1189432011-04-30 04:18:16 +0000559 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
560 getTriple().getArch() == llvm::Triple::x86_64))
Tim Northover9c7e0352013-12-12 11:55:52 +0000561 Platform = IPhoneOSSimulator;
Daniel Dunbarb1189432011-04-30 04:18:16 +0000562
Tim Northover9c7e0352013-12-12 11:55:52 +0000563 setTarget(Platform, Major, Minor, Micro);
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000564}
565
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000566void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000567 ArgStringList &CmdArgs) const {
568 CXXStdlibType Type = GetCXXStdlibType(Args);
569
570 switch (Type) {
571 case ToolChain::CST_Libcxx:
572 CmdArgs.push_back("-lc++");
573 break;
574
575 case ToolChain::CST_Libstdcxx: {
576 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
577 // it was previously found in the gcc lib dir. However, for all the Darwin
578 // platforms we care about it was -lstdc++.6, so we search for that
579 // explicitly if we can't see an obvious -lstdc++ candidate.
580
581 // Check in the sysroot first.
582 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000583 SmallString<128> P(A->getValue());
Benjamin Kramer17381a02013-06-28 16:25:46 +0000584 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000585
Yaron Keren92e1b622015-03-18 10:17:07 +0000586 if (!llvm::sys::fs::exists(P)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000587 llvm::sys::path::remove_filename(P);
588 llvm::sys::path::append(P, "libstdc++.6.dylib");
Yaron Keren92e1b622015-03-18 10:17:07 +0000589 if (llvm::sys::fs::exists(P)) {
590 CmdArgs.push_back(Args.MakeArgString(P));
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000591 return;
592 }
593 }
594 }
595
596 // Otherwise, look in the root.
Bob Wilson1a9ad0f2011-11-11 07:47:04 +0000597 // FIXME: This should be removed someday when we don't have to care about
598 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
Rafael Espindola355670d2013-06-25 15:14:22 +0000599 if (!llvm::sys::fs::exists("/usr/lib/libstdc++.dylib") &&
600 llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib")) {
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000601 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
602 return;
603 }
604
605 // Otherwise, let the linker search.
606 CmdArgs.push_back("-lstdc++");
607 break;
608 }
609 }
610}
611
Shantonu Senafeb03b2010-09-17 18:39:08 +0000612void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
613 ArgStringList &CmdArgs) const {
614
615 // For Darwin platforms, use the compiler-rt-based support library
616 // instead of the gcc-provided one (which is also incidentally
617 // only present in the gcc lib dir, which makes it hard to find).
618
Rafael Espindola358256c2013-06-26 02:13:00 +0000619 SmallString<128> P(getDriver().ResourceDir);
Benjamin Kramer17381a02013-06-28 16:25:46 +0000620 llvm::sys::path::append(P, "lib", "darwin");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000621
622 // Use the newer cc_kext for iOS ARM after 6.0.
623 if (!isTargetIPhoneOS() || isTargetIOSSimulator() ||
Tim Northover573cbee2014-05-24 12:52:07 +0000624 getTriple().getArch() == llvm::Triple::aarch64 ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000625 !isIPhoneOSVersionLT(6, 0)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000626 llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000627 } else {
Rafael Espindola358256c2013-06-26 02:13:00 +0000628 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios5.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000629 }
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000630
Shantonu Senafeb03b2010-09-17 18:39:08 +0000631 // For now, allow missing resource libraries to support developers who may
632 // not have compiler-rt checked out or integrated into their build.
Yaron Keren92e1b622015-03-18 10:17:07 +0000633 if (llvm::sys::fs::exists(P))
634 CmdArgs.push_back(Args.MakeArgString(P));
Shantonu Senafeb03b2010-09-17 18:39:08 +0000635}
636
Tim Northover157d9112014-01-16 08:48:16 +0000637DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
638 const char *BoundArch) const {
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000639 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
640 const OptTable &Opts = getDriver().getOpts();
641
642 // FIXME: We really want to get out of the tool chain level argument
643 // translation business, as it makes the driver functionality much
644 // more opaque. For now, we follow gcc closely solely for the
645 // purpose of easily achieving feature parity & testability. Once we
646 // have something that works, we should reevaluate each translation
647 // and try to push it down into tool specific logic.
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000648
Simon Atanasyan6f657c42014-05-08 19:32:46 +0000649 for (Arg *A : Args) {
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000650 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar471c4f82011-06-21 00:20:17 +0000651 // Skip this argument unless the architecture matches either the toolchain
652 // triple arch, or the arch being bound.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000653 llvm::Triple::ArchType XarchArch =
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000654 tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
655 if (!(XarchArch == getArch() ||
656 (BoundArch &&
657 XarchArch ==
658 tools::darwin::getArchTypeForMachOArchName(BoundArch))))
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000659 continue;
660
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000661 Arg *OriginalArg = A;
Richard Smithbd55daf2012-11-01 04:30:05 +0000662 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000663 unsigned Prev = Index;
Nico Webera04d5f82014-05-11 17:27:13 +0000664 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
Mike Stump11289f42009-09-09 15:08:12 +0000665
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000666 // If the argument parsing failed or more than one argument was
667 // consumed, the -Xarch_ argument's parameter tried to consume
668 // extra arguments. Emit an error and ignore.
669 //
670 // We also want to disallow any options which would alter the
671 // driver behavior; that isn't going to work in our model. We
672 // use isDriverOption() as an approximation, although things
673 // like -O4 are going to slip through.
Daniel Dunbar5a784c82011-04-21 17:41:34 +0000674 if (!XarchArg || Index > Prev + 1) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000675 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000676 << A->getAsString(Args);
Daniel Dunbar6914a982011-04-21 17:32:21 +0000677 continue;
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000678 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000679 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000680 << A->getAsString(Args);
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000681 continue;
682 }
683
Daniel Dunbar53b406f2009-03-29 22:29:05 +0000684 XarchArg->setBaseArg(A);
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000685
Nico Webera04d5f82014-05-11 17:27:13 +0000686 A = XarchArg.release();
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000687 DAL->AddSynthesizedArg(A);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000688
689 // Linker input arguments require custom handling. The problem is that we
690 // have already constructed the phase actions, so we can not treat them as
691 // "input arguments".
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000692 if (A->getOption().hasFlag(options::LinkerInput)) {
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000693 // Convert the argument into individual Zlinker_input_args.
Douglas Katzman6bbffc42015-06-25 18:51:37 +0000694 for (const char *Value : A->getValues()) {
695 DAL->AddSeparateArg(
696 OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000697 }
698 continue;
699 }
Mike Stump11289f42009-09-09 15:08:12 +0000700 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000701
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000702 // Sob. These is strictly gcc compatible for the time being. Apple
703 // gcc translates options twice, which means that self-expanding
704 // options add duplicates.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000705 switch ((options::ID)A->getOption().getID()) {
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000706 default:
707 DAL->append(A);
708 break;
709
710 case options::OPT_mkernel:
711 case options::OPT_fapple_kext:
712 DAL->append(A);
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000713 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000714 break;
Mike Stump11289f42009-09-09 15:08:12 +0000715
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000716 case options::OPT_dependency_file:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000717 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000718 break;
719
720 case options::OPT_gfull:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000721 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000722 DAL->AddFlagArg(
723 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000724 break;
725
726 case options::OPT_gused:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000727 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000728 DAL->AddFlagArg(
729 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000730 break;
731
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000732 case options::OPT_shared:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000733 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000734 break;
735
736 case options::OPT_fconstant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000737 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000738 break;
739
740 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000741 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000742 break;
743
744 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000745 DAL->AddFlagArg(A,
746 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000747 break;
748
749 case options::OPT_Wno_nonportable_cfstrings:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000750 DAL->AddFlagArg(
751 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000752 break;
753
754 case options::OPT_fpascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000755 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000756 break;
757
758 case options::OPT_fno_pascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000759 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000760 break;
761 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000762 }
763
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000764 if (getTriple().getArch() == llvm::Triple::x86 ||
765 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbarfffd1812009-11-19 04:00:53 +0000766 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000767 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
768 "core2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000769
770 // Add the arch options based on the particular spelling of -arch, to match
Chad Rosier7c5d9082012-04-27 14:58:16 +0000771 // how the driver driver works.
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000772 if (BoundArch) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000773 StringRef Name = BoundArch;
Michael J. Spencerfc790902012-10-19 22:36:40 +0000774 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
775 const Option MArch = Opts.getOption(options::OPT_march_EQ);
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000776
777 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
778 // which defines the list of which architectures we accept.
779 if (Name == "ppc")
780 ;
781 else if (Name == "ppc601")
Craig Topper92fc2df2014-05-17 16:56:41 +0000782 DAL->AddJoinedArg(nullptr, MCpu, "601");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000783 else if (Name == "ppc603")
Craig Topper92fc2df2014-05-17 16:56:41 +0000784 DAL->AddJoinedArg(nullptr, MCpu, "603");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000785 else if (Name == "ppc604")
Craig Topper92fc2df2014-05-17 16:56:41 +0000786 DAL->AddJoinedArg(nullptr, MCpu, "604");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000787 else if (Name == "ppc604e")
Craig Topper92fc2df2014-05-17 16:56:41 +0000788 DAL->AddJoinedArg(nullptr, MCpu, "604e");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000789 else if (Name == "ppc750")
Craig Topper92fc2df2014-05-17 16:56:41 +0000790 DAL->AddJoinedArg(nullptr, MCpu, "750");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000791 else if (Name == "ppc7400")
Craig Topper92fc2df2014-05-17 16:56:41 +0000792 DAL->AddJoinedArg(nullptr, MCpu, "7400");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000793 else if (Name == "ppc7450")
Craig Topper92fc2df2014-05-17 16:56:41 +0000794 DAL->AddJoinedArg(nullptr, MCpu, "7450");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000795 else if (Name == "ppc970")
Craig Topper92fc2df2014-05-17 16:56:41 +0000796 DAL->AddJoinedArg(nullptr, MCpu, "970");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000797
Bill Schmidt778d3872013-07-26 01:36:11 +0000798 else if (Name == "ppc64" || Name == "ppc64le")
Craig Topper92fc2df2014-05-17 16:56:41 +0000799 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000800
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000801 else if (Name == "i386")
802 ;
803 else if (Name == "i486")
Craig Topper92fc2df2014-05-17 16:56:41 +0000804 DAL->AddJoinedArg(nullptr, MArch, "i486");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000805 else if (Name == "i586")
Craig Topper92fc2df2014-05-17 16:56:41 +0000806 DAL->AddJoinedArg(nullptr, MArch, "i586");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000807 else if (Name == "i686")
Craig Topper92fc2df2014-05-17 16:56:41 +0000808 DAL->AddJoinedArg(nullptr, MArch, "i686");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000809 else if (Name == "pentium")
Craig Topper92fc2df2014-05-17 16:56:41 +0000810 DAL->AddJoinedArg(nullptr, MArch, "pentium");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000811 else if (Name == "pentium2")
Craig Topper92fc2df2014-05-17 16:56:41 +0000812 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000813 else if (Name == "pentpro")
Craig Topper92fc2df2014-05-17 16:56:41 +0000814 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000815 else if (Name == "pentIIm3")
Craig Topper92fc2df2014-05-17 16:56:41 +0000816 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000817
818 else if (Name == "x86_64")
Craig Topper92fc2df2014-05-17 16:56:41 +0000819 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Jim Grosbach82eee262013-11-16 00:53:35 +0000820 else if (Name == "x86_64h") {
Craig Topper92fc2df2014-05-17 16:56:41 +0000821 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
822 DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
Jim Grosbach82eee262013-11-16 00:53:35 +0000823 }
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000824
825 else if (Name == "arm")
Craig Topper92fc2df2014-05-17 16:56:41 +0000826 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000827 else if (Name == "armv4t")
Craig Topper92fc2df2014-05-17 16:56:41 +0000828 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000829 else if (Name == "armv5")
Craig Topper92fc2df2014-05-17 16:56:41 +0000830 DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000831 else if (Name == "xscale")
Craig Topper92fc2df2014-05-17 16:56:41 +0000832 DAL->AddJoinedArg(nullptr, MArch, "xscale");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000833 else if (Name == "armv6")
Craig Topper92fc2df2014-05-17 16:56:41 +0000834 DAL->AddJoinedArg(nullptr, MArch, "armv6k");
Bob Wilson743bf672013-03-04 22:37:49 +0000835 else if (Name == "armv6m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000836 DAL->AddJoinedArg(nullptr, MArch, "armv6m");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000837 else if (Name == "armv7")
Craig Topper92fc2df2014-05-17 16:56:41 +0000838 DAL->AddJoinedArg(nullptr, MArch, "armv7a");
Bob Wilson743bf672013-03-04 22:37:49 +0000839 else if (Name == "armv7em")
Craig Topper92fc2df2014-05-17 16:56:41 +0000840 DAL->AddJoinedArg(nullptr, MArch, "armv7em");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000841 else if (Name == "armv7k")
Craig Topper92fc2df2014-05-17 16:56:41 +0000842 DAL->AddJoinedArg(nullptr, MArch, "armv7k");
Bob Wilson743bf672013-03-04 22:37:49 +0000843 else if (Name == "armv7m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000844 DAL->AddJoinedArg(nullptr, MArch, "armv7m");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000845 else if (Name == "armv7s")
Craig Topper92fc2df2014-05-17 16:56:41 +0000846 DAL->AddJoinedArg(nullptr, MArch, "armv7s");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000847 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000848
Tim Northover157d9112014-01-16 08:48:16 +0000849 return DAL;
850}
851
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000852void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
853 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000854 // Embedded targets are simple at the moment, not supporting sanitizers and
855 // with different libraries for each member of the product { static, PIC } x
856 // { hard-float, soft-float }
857 llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
858 CompilerRT +=
859 tools::arm::getARMFloatABI(getDriver(), Args, getTriple()) == "hard"
860 ? "hard"
861 : "soft";
862 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
863
864 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
865}
866
Tim Northover157d9112014-01-16 08:48:16 +0000867DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
868 const char *BoundArch) const {
869 // First get the generic Apple args, before moving onto Darwin-specific ones.
870 DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
871 const OptTable &Opts = getDriver().getOpts();
872
Bob Wilsonf8cf1612014-02-21 00:20:07 +0000873 // If no architecture is bound, none of the translations here are relevant.
874 if (!BoundArch)
875 return DAL;
876
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000877 // Add an explicit version min argument for the deployment target. We do this
878 // after argument translation because -Xarch_ arguments may add a version min
879 // argument.
Bob Wilsonf8cf1612014-02-21 00:20:07 +0000880 AddDeploymentTarget(*DAL);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000881
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000882 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
883 // FIXME: It would be far better to avoid inserting those -static arguments,
884 // but we can't check the deployment target in the translation code until
885 // it is set here.
Bob Wilson5f4346d2014-12-02 00:27:35 +0000886 if (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000887 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie;) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000888 Arg *A = *it;
889 ++it;
890 if (A->getOption().getID() != options::OPT_mkernel &&
891 A->getOption().getID() != options::OPT_fapple_kext)
892 continue;
893 assert(it != ie && "unexpected argument translation");
894 A = *it;
895 assert(A->getOption().getID() == options::OPT_static &&
896 "missing expected -static argument");
897 it = DAL->getArgs().erase(it);
898 }
899 }
900
Bob Wilson0f7445b2013-11-02 23:19:53 +0000901 // Default to use libc++ on OS X 10.9+ and iOS 7+.
902 if (((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
Tim Northover9c7e0352013-12-12 11:55:52 +0000903 (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0))) &&
Bob Wilson0f7445b2013-11-02 23:19:53 +0000904 !Args.getLastArg(options::OPT_stdlib_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000905 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
906 "libc++");
Bob Wilson0f7445b2013-11-02 23:19:53 +0000907
Bob Wilson102be442011-10-07 17:54:41 +0000908 // Validate the C++ standard library choice.
909 CXXStdlibType Type = GetCXXStdlibType(*DAL);
910 if (Type == ToolChain::CST_Libcxx) {
John McCall5fb5df92012-06-20 06:18:46 +0000911 // Check whether the target provides libc++.
912 StringRef where;
913
Alp Tokerf6a24ce2013-12-05 16:25:25 +0000914 // Complain about targeting iOS < 5.0 in any way.
Tim Northover9c7e0352013-12-12 11:55:52 +0000915 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
Bob Wilson5ad5a952012-11-09 01:59:30 +0000916 where = "iOS 5.0";
John McCall5fb5df92012-06-20 06:18:46 +0000917
918 if (where != StringRef()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000919 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where;
Bob Wilson102be442011-10-07 17:54:41 +0000920 }
921 }
922
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000923 return DAL;
Mike Stump11289f42009-09-09 15:08:12 +0000924}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000925
Tim Northover157d9112014-01-16 08:48:16 +0000926bool MachO::IsUnwindTablesDefault() const {
Rafael Espindolae8bd4e52012-10-07 03:23:40 +0000927 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000928}
929
Tim Northover157d9112014-01-16 08:48:16 +0000930bool MachO::UseDwarfDebugFlags() const {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +0000931 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
932 return S[0] != '\0';
933 return false;
934}
935
Daniel Dunbar3241d402010-02-10 18:49:11 +0000936bool Darwin::UseSjLjExceptions() const {
937 // Darwin uses SjLj exceptions on ARM.
938 return (getTriple().getArch() == llvm::Triple::arm ||
939 getTriple().getArch() == llvm::Triple::thumb);
940}
941
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000942bool MachO::isPICDefault() const { return true; }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000943
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000944bool MachO::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +0000945
Tim Northover157d9112014-01-16 08:48:16 +0000946bool MachO::isPICDefaultForced() const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000947 return (getArch() == llvm::Triple::x86_64 ||
Tim Northover573cbee2014-05-24 12:52:07 +0000948 getArch() == llvm::Triple::aarch64);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000949}
950
Tim Northover157d9112014-01-16 08:48:16 +0000951bool MachO::SupportsProfiling() const {
Daniel Dunbar733b0f82011-03-01 18:49:30 +0000952 // Profiling instrumentation is only supported on x86.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000953 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
Daniel Dunbar733b0f82011-03-01 18:49:30 +0000954}
955
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000956void Darwin::addMinVersionArgs(const ArgList &Args,
957 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000958 VersionTuple TargetVersion = getTargetVersion();
959
Bob Wilson771b7cd2014-10-10 19:38:34 +0000960 if (isTargetIOSSimulator())
Tim Northover157d9112014-01-16 08:48:16 +0000961 CmdArgs.push_back("-ios_simulator_version_min");
Bob Wilson5cfc55e2014-02-01 21:06:21 +0000962 else if (isTargetIOSBased())
Tim Northover157d9112014-01-16 08:48:16 +0000963 CmdArgs.push_back("-iphoneos_version_min");
964 else {
965 assert(isTargetMacOS() && "unexpected target");
966 CmdArgs.push_back("-macosx_version_min");
967 }
968
969 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
970}
971
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000972void Darwin::addStartObjectFileArgs(const ArgList &Args,
973 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000974 // Derived from startfile spec.
975 if (Args.hasArg(options::OPT_dynamiclib)) {
976 // Derived from darwin_dylib1 spec.
977 if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +0000978 ; // iOS simulator does not need dylib1.o.
Tim Northover157d9112014-01-16 08:48:16 +0000979 } else if (isTargetIPhoneOS()) {
980 if (isIPhoneOSVersionLT(3, 1))
981 CmdArgs.push_back("-ldylib1.o");
982 } else {
983 if (isMacosxVersionLT(10, 5))
984 CmdArgs.push_back("-ldylib1.o");
985 else if (isMacosxVersionLT(10, 6))
986 CmdArgs.push_back("-ldylib1.10.5.o");
987 }
988 } else {
989 if (Args.hasArg(options::OPT_bundle)) {
990 if (!Args.hasArg(options::OPT_static)) {
991 // Derived from darwin_bundle1 spec.
992 if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +0000993 ; // iOS simulator does not need bundle1.o.
Tim Northover157d9112014-01-16 08:48:16 +0000994 } else if (isTargetIPhoneOS()) {
995 if (isIPhoneOSVersionLT(3, 1))
996 CmdArgs.push_back("-lbundle1.o");
997 } else {
998 if (isMacosxVersionLT(10, 6))
999 CmdArgs.push_back("-lbundle1.o");
1000 }
1001 }
1002 } else {
1003 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1004 if (Args.hasArg(options::OPT_static) ||
1005 Args.hasArg(options::OPT_object) ||
1006 Args.hasArg(options::OPT_preload)) {
1007 CmdArgs.push_back("-lgcrt0.o");
1008 } else {
1009 CmdArgs.push_back("-lgcrt1.o");
1010
1011 // darwin_crt2 spec is empty.
1012 }
1013 // By default on OS X 10.8 and later, we don't link with a crt1.o
1014 // file and the linker knows to use _main as the entry point. But,
1015 // when compiling with -pg, we need to link with the gcrt1.o file,
1016 // so pass the -no_new_main option to tell the linker to use the
1017 // "start" symbol as the entry point.
1018 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1019 CmdArgs.push_back("-no_new_main");
1020 } else {
1021 if (Args.hasArg(options::OPT_static) ||
1022 Args.hasArg(options::OPT_object) ||
1023 Args.hasArg(options::OPT_preload)) {
1024 CmdArgs.push_back("-lcrt0.o");
1025 } else {
1026 // Derived from darwin_crt1 spec.
1027 if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001028 ; // iOS simulator does not need crt1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001029 } else if (isTargetIPhoneOS()) {
Tim Northover40956e62014-07-23 12:32:58 +00001030 if (getArch() == llvm::Triple::aarch64)
Tim Northovera2ee4332014-03-29 15:09:45 +00001031 ; // iOS does not need any crt1 files for arm64
1032 else if (isIPhoneOSVersionLT(3, 1))
Tim Northover157d9112014-01-16 08:48:16 +00001033 CmdArgs.push_back("-lcrt1.o");
1034 else if (isIPhoneOSVersionLT(6, 0))
1035 CmdArgs.push_back("-lcrt1.3.1.o");
1036 } else {
1037 if (isMacosxVersionLT(10, 5))
1038 CmdArgs.push_back("-lcrt1.o");
1039 else if (isMacosxVersionLT(10, 6))
1040 CmdArgs.push_back("-lcrt1.10.5.o");
1041 else if (isMacosxVersionLT(10, 8))
1042 CmdArgs.push_back("-lcrt1.10.6.o");
1043
1044 // darwin_crt2 spec is empty.
1045 }
1046 }
1047 }
1048 }
1049 }
1050
1051 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
1052 isMacosxVersionLT(10, 5)) {
1053 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1054 CmdArgs.push_back(Str);
1055 }
1056}
1057
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001058bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
Daniel Dunbar16334e12010-04-10 16:20:23 +00001059
John McCall3deb1ad2012-08-21 02:47:43 +00001060void Darwin::CheckObjCARC() const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001061 if (isTargetIOSBased() || (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
John McCall3deb1ad2012-08-21 02:47:43 +00001062 return;
John McCall93207072012-08-27 01:56:21 +00001063 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00001064}
1065
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001066SanitizerMask Darwin::getSupportedSanitizers() const {
1067 SanitizerMask Res = ToolChain::getSupportedSanitizers();
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001068 if (isTargetMacOS() || isTargetIOSSimulator())
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001069 Res |= SanitizerKind::Address;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001070 if (isTargetMacOS()) {
1071 if (!isMacosxVersionLT(10, 9))
1072 Res |= SanitizerKind::Vptr;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001073 Res |= SanitizerKind::SafeStack;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001074 }
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001075 return Res;
1076}
1077
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001078/// Generic_GCC - A tool chain using the 'gcc' command to perform
1079/// all subcommands; this relies on gcc translating the majority of
1080/// command line options.
1081
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001082/// \brief Parse a GCCVersion object out of a string of text.
1083///
1084/// This is the primary means of forming GCCVersion objects.
1085/*static*/
1086Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001087 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001088 std::pair<StringRef, StringRef> First = VersionText.split('.');
1089 std::pair<StringRef, StringRef> Second = First.second.split('.');
1090
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001091 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1092 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001093 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001094 GoodVersion.MajorStr = First.first.str();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001095 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001096 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001097 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001098
1099 // First look for a number prefix and parse that if present. Otherwise just
1100 // stash the entire patch string in the suffix, and leave the number
1101 // unspecified. This covers versions strings such as:
1102 // 4.4
1103 // 4.4.0
1104 // 4.4.x
1105 // 4.4.2-rc4
1106 // 4.4.x-patched
1107 // And retains any patch number it finds.
1108 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1109 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001110 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001111 // Try to parse the number and any suffix.
1112 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1113 GoodVersion.Patch < 0)
1114 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001115 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001116 }
1117 }
1118
1119 return GoodVersion;
1120}
1121
1122/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001123bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1124 int RHSPatch,
1125 StringRef RHSPatchSuffix) const {
1126 if (Major != RHSMajor)
1127 return Major < RHSMajor;
1128 if (Minor != RHSMinor)
1129 return Minor < RHSMinor;
1130 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001131 // Note that versions without a specified patch sort higher than those with
1132 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001133 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001134 return true;
1135 if (Patch == -1)
1136 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001137
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001138 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001139 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001140 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001141 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001142 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001143 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001144 return true;
1145 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001146 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001147
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001148 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001149 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001150 }
1151
1152 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001153 return false;
1154}
1155
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001156static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001157 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1158 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001159 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001160 return GCC_INSTALL_PREFIX;
1161}
1162
Roman Divacky326d9982013-12-06 18:32:18 +00001163/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001164///
1165/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001166/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001167///
1168/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1169/// should instead pull the target out of the driver. This is currently
1170/// necessary because the driver doesn't store the final version of the target
1171/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001172void Generic_GCC::GCCInstallationDetector::init(
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001173 const Driver &D, const llvm::Triple &TargetTriple, const ArgList &Args,
1174 const ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001175 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1176 ? TargetTriple.get64BitArchVariant()
1177 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001178 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001179 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001180 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001181 SmallVector<StringRef, 16> CandidateTripleAliases;
1182 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001183 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1184 CandidateTripleAliases, CandidateBiarchLibDirs,
1185 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001186
1187 // Compute the set of prefixes for our search.
1188 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1189 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001190
Rafael Espindola1af7c212012-02-19 01:38:32 +00001191 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1192 if (GCCToolchainDir != "") {
1193 if (GCCToolchainDir.back() == '/')
1194 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001195
Rafael Espindola1af7c212012-02-19 01:38:32 +00001196 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001197 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001198 // If we have a SysRoot, try that first.
1199 if (!D.SysRoot.empty()) {
1200 Prefixes.push_back(D.SysRoot);
1201 Prefixes.push_back(D.SysRoot + "/usr");
1202 }
1203
1204 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001205 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001206
1207 // And finally in /usr.
1208 if (D.SysRoot.empty())
1209 Prefixes.push_back("/usr");
Rafael Espindolac29af942012-02-03 01:01:20 +00001210 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001211
1212 // Loop over the various components which exist and select the best GCC
1213 // installation available. GCC installs are ranked by version number.
1214 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001215 for (const std::string &Prefix : Prefixes) {
1216 if (!llvm::sys::fs::exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001217 continue;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001218 for (const StringRef Suffix : CandidateLibDirs) {
1219 const std::string LibDir = Prefix + Suffix.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001220 if (!llvm::sys::fs::exists(LibDir))
1221 continue;
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001222 for (const StringRef Candidate : ExtraTripleAliases) // Try these first.
1223 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001224 for (const StringRef Candidate : CandidateTripleAliases)
1225 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001226 }
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001227 for (const StringRef Suffix : CandidateBiarchLibDirs) {
1228 const std::string LibDir = Prefix + Suffix.str();
Chandler Carruth866faab2012-01-25 07:21:38 +00001229 if (!llvm::sys::fs::exists(LibDir))
1230 continue;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001231 for (const StringRef Candidate : CandidateBiarchTripleAliases)
1232 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001233 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001234 }
1235 }
1236}
1237
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001238void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001239 for (const auto &InstallPath : CandidateGCCInstallPaths)
1240 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001241
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001242 if (!GCCInstallPath.empty())
1243 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1244
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001245 for (const auto &Multilib : Multilibs)
1246 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001247
1248 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1249 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001250}
1251
1252bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1253 if (BiarchSibling.hasValue()) {
1254 M = BiarchSibling.getValue();
1255 return true;
1256 }
1257 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001258}
1259
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001260/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001261 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001262 SmallVectorImpl<StringRef> &LibDirs,
1263 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001264 SmallVectorImpl<StringRef> &BiarchLibDirs,
1265 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001266 // Declare a bunch of static data sets that we'll select between below. These
1267 // are specifically designed to always refer to string literals to avoid any
1268 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001269 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1270 static const char *const AArch64Triples[] = {
1271 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1272 "aarch64-redhat-linux"};
1273 static const char *const AArch64beLibDirs[] = {"/lib"};
1274 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1275 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001276
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001277 static const char *const ARMLibDirs[] = {"/lib"};
1278 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1279 "arm-linux-androideabi"};
1280 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1281 "armv7hl-redhat-linux-gnueabi"};
1282 static const char *const ARMebLibDirs[] = {"/lib"};
1283 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1284 "armeb-linux-androideabi"};
1285 static const char *const ARMebHFTriples[] = {
1286 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001287
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001288 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001289 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001290 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1291 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1292 "x86_64-redhat-linux", "x86_64-suse-linux",
1293 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1294 "x86_64-slackware-linux", "x86_64-linux-android",
1295 "x86_64-unknown-linux"};
1296 static const char *const X32LibDirs[] = {"/libx32"};
1297 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001298 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001299 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1300 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1301 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1302 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1303 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001304
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001305 static const char *const MIPSLibDirs[] = {"/lib"};
1306 static const char *const MIPSTriples[] = {
1307 "mips-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu"};
1308 static const char *const MIPSELLibDirs[] = {"/lib"};
1309 static const char *const MIPSELTriples[] = {
1310 "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001311
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001312 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1313 static const char *const MIPS64Triples[] = {
1314 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1315 "mips64-linux-gnuabi64"};
1316 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1317 static const char *const MIPS64ELTriples[] = {
1318 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1319 "mips64el-linux-android", "mips64el-linux-gnuabi64"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001320
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001321 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001322 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001323 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1324 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1325 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1326 static const char *const PPC64Triples[] = {
1327 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1328 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1329 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1330 static const char *const PPC64LETriples[] = {
1331 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1332 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001333
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001334 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1335 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1336 "sparcv8-linux-gnu"};
1337 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1338 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1339 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001340
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001341 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001342 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001343 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1344 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001345
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001346 // Solaris.
1347 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1348 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1349 "i386-pc-solaris2.11"};
1350
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001351 using std::begin;
1352 using std::end;
1353
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001354 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1355 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1356 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001357 return;
1358 }
1359
Chandler Carruth866faab2012-01-25 07:21:38 +00001360 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001361 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001362 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1363 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1364 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1365 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001366 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001367 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001368 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1369 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1370 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1371 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001372 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001373 case llvm::Triple::arm:
1374 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001375 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001376 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001377 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001378 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001379 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001380 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001381 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001382 case llvm::Triple::armeb:
1383 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001384 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001385 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001386 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001387 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001388 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001389 }
1390 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001391 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001392 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1393 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1394 // x32 is always available when x86_64 is available, so adding it as
1395 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001396 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001397 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1398 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001399 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001400 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1401 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001402 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001403 break;
1404 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001405 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1406 TripleAliases.append(begin(X86Triples), end(X86Triples));
1407 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1408 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001409 break;
1410 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001411 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1412 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1413 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1414 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001415 break;
1416 case llvm::Triple::mipsel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001417 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1418 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1419 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1420 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1421 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001422 break;
1423 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001424 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1425 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1426 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1427 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001428 break;
1429 case llvm::Triple::mips64el:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001430 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1431 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1432 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1433 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1434 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001435 break;
1436 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001437 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1438 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1439 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1440 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001441 break;
1442 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001443 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1444 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1445 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1446 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001447 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001448 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001449 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1450 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001451 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001452 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001453 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001454 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1455 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1456 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1457 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001458 break;
1459 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001460 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1461 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1462 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1463 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001464 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001465 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001466 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1467 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001468 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001469
1470 default:
1471 // By default, just rely on the standard lib directories and the original
1472 // triple.
1473 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001474 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001475
1476 // Always append the drivers target triple to the end, in case it doesn't
1477 // match any of our aliases.
1478 TripleAliases.push_back(TargetTriple.str());
1479
1480 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001481 if (TargetTriple.str() != BiarchTriple.str())
1482 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001483}
1484
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001485namespace {
1486// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001487class FilterNonExistent {
1488 StringRef Base;
1489
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001490public:
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001491 FilterNonExistent(StringRef Base) : Base(Base) {}
1492 bool operator()(const Multilib &M) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001493 return !llvm::sys::fs::exists(Base + M.gccSuffix() + "/crtbegin.o");
1494 }
1495};
1496} // end anonymous namespace
1497
1498static void addMultilibFlag(bool Enabled, const char *const Flag,
1499 std::vector<std::string> &Flags) {
1500 if (Enabled)
1501 Flags.push_back(std::string("+") + Flag);
1502 else
1503 Flags.push_back(std::string("-") + Flag);
1504}
1505
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001506static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001507 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1508 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1509}
1510
1511static bool isMips32(llvm::Triple::ArchType Arch) {
1512 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1513}
1514
1515static bool isMips64(llvm::Triple::ArchType Arch) {
1516 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1517}
1518
1519static bool isMipsEL(llvm::Triple::ArchType Arch) {
1520 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1521}
1522
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001523static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001524 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001525 return A && A->getOption().matches(options::OPT_mips16);
1526}
1527
1528static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001529 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001530 return A && A->getOption().matches(options::OPT_mmicromips);
1531}
1532
Simon Atanasyan60280b42014-05-12 07:37:51 +00001533struct DetectedMultilibs {
1534 /// The set of multilibs that the detected installation supports.
1535 MultilibSet Multilibs;
1536
1537 /// The primary multilib appropriate for the given flags.
1538 Multilib SelectedMultilib;
1539
1540 /// On Biarch systems, this corresponds to the default multilib when
1541 /// targeting the non-default multilib. Otherwise, it is empty.
1542 llvm::Optional<Multilib> BiarchSibling;
1543};
1544
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001545static Multilib makeMultilib(StringRef commonSuffix) {
1546 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1547}
1548
Simon Atanasyan60280b42014-05-12 07:37:51 +00001549static bool findMIPSMultilibs(const llvm::Triple &TargetTriple, StringRef Path,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001550 const ArgList &Args, DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001551 // Some MIPS toolchains put libraries and object files compiled
1552 // using different options in to the sub-directoris which names
1553 // reflects the flags used for compilation. For example sysroot
1554 // directory might looks like the following examples:
1555 //
1556 // /usr
1557 // /lib <= crt*.o files compiled with '-mips32'
1558 // /mips16
1559 // /usr
1560 // /lib <= crt*.o files compiled with '-mips16'
1561 // /el
1562 // /usr
1563 // /lib <= crt*.o files compiled with '-mips16 -EL'
1564 //
1565 // or
1566 //
1567 // /usr
1568 // /lib <= crt*.o files compiled with '-mips32r2'
1569 // /mips16
1570 // /usr
1571 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1572 // /mips32
1573 // /usr
1574 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001575
Alp Tokerf45fa3d2014-02-25 04:21:44 +00001576 FilterNonExistent NonExistent(Path);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001577
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001578 // Check for FSF toolchain multilibs
1579 MultilibSet FSFMipsMultilibs;
1580 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001581 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001582 .flag("+m32")
1583 .flag("-m64")
1584 .flag("-mmicromips")
1585 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001586
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001587 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001588 .flag("+m32")
1589 .flag("-m64")
1590 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001591
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001592 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001593 .flag("-m32")
1594 .flag("+m64")
1595 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001596
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001597 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1598 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001599
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001600 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001601 .flag("+m32")
1602 .flag("-m64")
1603 .flag("-mmicromips")
1604 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001605
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001606 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001607
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001608 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001609
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001610 auto MAbi64 =
1611 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001612
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001613 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001614
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001615 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001616
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001617 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001618
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001619 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001620
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001621 FSFMipsMultilibs =
1622 MultilibSet()
1623 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1624 MArchDefault)
1625 .Maybe(UCLibc)
1626 .Maybe(Mips16)
1627 .FilterOut("/mips64/mips16")
1628 .FilterOut("/mips64r2/mips16")
1629 .FilterOut("/micromips/mips16")
1630 .Maybe(MAbi64)
1631 .FilterOut("/micromips/64")
1632 .FilterOut("/mips32/64")
1633 .FilterOut("^/64")
1634 .FilterOut("/mips16/64")
1635 .Either(BigEndian, LittleEndian)
1636 .Maybe(SoftFloat)
1637 .Maybe(Nan2008)
1638 .FilterOut(".*sof/nan2008")
1639 .FilterOut(NonExistent)
1640 .setIncludeDirsCallback([](StringRef InstallDir,
1641 StringRef TripleStr, const Multilib &M) {
1642 std::vector<std::string> Dirs;
1643 Dirs.push_back((InstallDir + "/include").str());
1644 std::string SysRootInc =
1645 InstallDir.str() + "/../../../../sysroot";
1646 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1647 Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1648 else
1649 Dirs.push_back(SysRootInc + "/usr/include");
1650 return Dirs;
1651 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001652 }
1653
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001654 // Check for Code Sourcery toolchain multilibs
1655 MultilibSet CSMipsMultilibs;
1656 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001657 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001658
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001659 auto MArchMicroMips =
1660 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001661
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001662 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001663
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001664 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001665
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001666 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001667
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001668 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001669
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001670 auto DefaultFloat =
1671 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001672
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001673 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001674
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001675 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001676
1677 // Note that this one's osSuffix is ""
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001678 auto MAbi64 = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001679 .gccSuffix("/64")
1680 .includeSuffix("/64")
1681 .flag("+mabi=n64")
1682 .flag("-mabi=n32")
1683 .flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001684
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001685 CSMipsMultilibs =
1686 MultilibSet()
1687 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1688 .Maybe(UCLibc)
1689 .Either(SoftFloat, Nan2008, DefaultFloat)
1690 .FilterOut("/micromips/nan2008")
1691 .FilterOut("/mips16/nan2008")
1692 .Either(BigEndian, LittleEndian)
1693 .Maybe(MAbi64)
1694 .FilterOut("/mips16.*/64")
1695 .FilterOut("/micromips.*/64")
1696 .FilterOut(NonExistent)
1697 .setIncludeDirsCallback([](StringRef InstallDir,
1698 StringRef TripleStr, const Multilib &M) {
1699 std::vector<std::string> Dirs;
1700 Dirs.push_back((InstallDir + "/include").str());
1701 std::string SysRootInc =
1702 InstallDir.str() + "/../../../../" + TripleStr.str();
1703 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1704 Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1705 else
1706 Dirs.push_back(SysRootInc + "/libc/usr/include");
1707 return Dirs;
1708 });
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001709 }
1710
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001711 MultilibSet AndroidMipsMultilibs =
1712 MultilibSet()
1713 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1714 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1715 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001716
1717 MultilibSet DebianMipsMultilibs;
1718 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001719 Multilib MAbiN32 =
1720 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001721
1722 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001723 .gccSuffix("/64")
1724 .includeSuffix("/64")
1725 .flag("+m64")
1726 .flag("-m32")
1727 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001728
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001729 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001730
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001731 DebianMipsMultilibs =
1732 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001733 }
1734
Daniel Sanders2bf13662014-07-10 14:40:57 +00001735 MultilibSet ImgMultilibs;
1736 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001737 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001738
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001739 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001740
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001741 auto MAbi64 =
1742 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001743
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001744 ImgMultilibs =
1745 MultilibSet()
1746 .Maybe(Mips64r6)
1747 .Maybe(MAbi64)
1748 .Maybe(LittleEndian)
1749 .FilterOut(NonExistent)
1750 .setIncludeDirsCallback([](StringRef InstallDir,
1751 StringRef TripleStr, const Multilib &M) {
1752 std::vector<std::string> Dirs;
1753 Dirs.push_back((InstallDir + "/include").str());
1754 Dirs.push_back(
1755 (InstallDir + "/../../../../sysroot/usr/include").str());
1756 return Dirs;
1757 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00001758 }
1759
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001760 StringRef CPUName;
1761 StringRef ABIName;
1762 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
1763
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001764 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1765
1766 Multilib::flags_list Flags;
1767 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
1768 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
1769 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001770 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001771 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
1772 CPUName == "mips32r5",
1773 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00001774 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001775 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001776 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
1777 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001778 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001779 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001780 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00001781 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
1782 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001783 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
1784 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001785 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001786 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001787 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001788 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001789
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001790 if (TargetTriple.getEnvironment() == llvm::Triple::Android) {
1791 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00001792 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
1793 Result.Multilibs = AndroidMipsMultilibs;
1794 return true;
1795 }
1796 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001797 }
1798
Daniel Sanders2bf13662014-07-10 14:40:57 +00001799 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1800 TargetTriple.getOS() == llvm::Triple::Linux &&
1801 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
1802 // Select mips-img-linux-gnu toolchain.
1803 if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
1804 Result.Multilibs = ImgMultilibs;
1805 return true;
1806 }
1807 return false;
1808 }
1809
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001810 // Sort candidates. Toolchain that best meets the directories goes first.
1811 // Then select the first toolchains matches command line flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001812 MultilibSet *candidates[] = {&DebianMipsMultilibs, &FSFMipsMultilibs,
1813 &CSMipsMultilibs};
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001814 std::sort(
1815 std::begin(candidates), std::end(candidates),
1816 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
1817 for (const auto &candidate : candidates) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001818 if (candidate->select(Flags, Result.SelectedMultilib)) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001819 if (candidate == &DebianMipsMultilibs)
Simon Atanasyan60280b42014-05-12 07:37:51 +00001820 Result.BiarchSibling = Multilib();
1821 Result.Multilibs = *candidate;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001822 return true;
1823 }
1824 }
1825
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00001826 {
1827 // Fallback to the regular toolchain-tree structure.
1828 Multilib Default;
1829 Result.Multilibs.push_back(Default);
1830 Result.Multilibs.FilterOut(NonExistent);
1831
1832 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
1833 Result.BiarchSibling = Multilib();
1834 return true;
1835 }
1836 }
1837
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001838 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001839}
1840
Simon Atanasyan60280b42014-05-12 07:37:51 +00001841static bool findBiarchMultilibs(const llvm::Triple &TargetTriple,
1842 StringRef Path, const ArgList &Args,
1843 bool NeedsBiarchSuffix,
1844 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001845
1846 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
1847 // in what would normally be GCCInstallPath and put the 64-bit
1848 // libs in a subdirectory named 64. The simple logic we follow is that
1849 // *if* there is a subdirectory of the right name with crtbegin.o in it,
1850 // we use that. If not, and if not a biarch triple alias, we look for
1851 // crtbegin.o without the subdirectory.
1852
1853 Multilib Default;
1854 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001855 .gccSuffix("/64")
1856 .includeSuffix("/64")
1857 .flag("-m32")
1858 .flag("+m64")
1859 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001860 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001861 .gccSuffix("/32")
1862 .includeSuffix("/32")
1863 .flag("+m32")
1864 .flag("-m64")
1865 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00001866 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001867 .gccSuffix("/x32")
1868 .includeSuffix("/x32")
1869 .flag("-m32")
1870 .flag("-m64")
1871 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001872
Alp Tokerf45fa3d2014-02-25 04:21:44 +00001873 FilterNonExistent NonExistent(Path);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001874
Zinovy Nis1db95732014-07-10 15:27:19 +00001875 // Determine default multilib from: 32, 64, x32
1876 // Also handle cases such as 64 on 32, 32 on 64, etc.
1877 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00001878 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00001879 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00001880 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001881 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00001882 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001883 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00001884 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001885 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00001886 if (TargetTriple.isArch32Bit())
1887 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001888 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00001889 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001890 else
Zinovy Nis1db95732014-07-10 15:27:19 +00001891 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00001892 }
1893
Zinovy Nis1db95732014-07-10 15:27:19 +00001894 if (Want == WANT32)
1895 Default.flag("+m32").flag("-m64").flag("-mx32");
1896 else if (Want == WANT64)
1897 Default.flag("-m32").flag("+m64").flag("-mx32");
1898 else if (Want == WANTX32)
1899 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001900 else
Zinovy Nis1db95732014-07-10 15:27:19 +00001901 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001902
Simon Atanasyan60280b42014-05-12 07:37:51 +00001903 Result.Multilibs.push_back(Default);
1904 Result.Multilibs.push_back(Alt64);
1905 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00001906 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001907
Simon Atanasyan60280b42014-05-12 07:37:51 +00001908 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001909
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001910 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001911 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001912 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001913 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001914
Simon Atanasyan60280b42014-05-12 07:37:51 +00001915 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001916 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001917
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001918 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00001919 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00001920 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001921
1922 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001923}
1924
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001925void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
1926 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
1927 const std::string &LibDir, StringRef CandidateTriple,
1928 bool NeedsBiarchSuffix) {
1929 // Solaris is a special case. The GCC installation is under
1930 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
1931 // need to iterate twice.
1932 std::error_code EC;
1933 for (llvm::sys::fs::directory_iterator LI(LibDir, EC), LE; !EC && LI != LE;
1934 LI = LI.increment(EC)) {
1935 StringRef VersionText = llvm::sys::path::filename(LI->path());
1936 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
1937
1938 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
1939 if (!CandidateGCCInstallPaths.insert(LI->path()).second)
1940 continue; // Saw this path before; no need to look at it again.
1941 if (CandidateVersion.isOlderThan(4, 1, 1))
1942 continue;
1943 if (CandidateVersion <= Version)
1944 continue;
1945
1946 GCCInstallPath =
1947 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
1948 if (!llvm::sys::fs::exists(GCCInstallPath))
1949 continue;
1950
1951 // If we make it here there has to be at least one GCC version, let's just
1952 // use the latest one.
1953 std::error_code EEC;
1954 for (llvm::sys::fs::directory_iterator LLI(GCCInstallPath, EEC), LLE;
1955 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
1956
1957 StringRef SubVersionText = llvm::sys::path::filename(LLI->path());
1958 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
1959
1960 if (CandidateSubVersion > Version)
1961 Version = CandidateSubVersion;
1962 }
1963
1964 GCCTriple.setTriple(CandidateTriple);
1965
1966 GCCInstallPath += "/" + Version.Text;
1967 GCCParentLibPath = GCCInstallPath + "/../../../../";
1968
1969 IsValid = true;
1970 }
1971}
1972
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001973void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001974 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00001975 const std::string &LibDir, StringRef CandidateTriple,
1976 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001977 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001978 // There are various different suffixes involving the triple we
1979 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00001980 // up to the lib directory. Specifically, the number of "up" steps
1981 // in the second half of each row is 1 + the number of path separators
1982 // in the first half.
1983 const std::string LibAndInstallSuffixes[][2] = {
1984 {"/gcc/" + CandidateTriple.str(), "/../../.."},
1985
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001986 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00001987 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
1988
1989 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
1990 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001991
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001992 // The Freescale PPC SDK has the gcc libraries in
1993 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00001994 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00001995
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001996 // Ubuntu has a strange mis-matched pair of triples that this happens to
1997 // match.
1998 // FIXME: It may be worthwhile to generalize this and look for a second
1999 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002000 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2001
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002002 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2003 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2004 NeedsBiarchSuffix);
2005 return;
2006 }
2007
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002008 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002009 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2010 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002011 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002012 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002013 std::error_code EC;
Chandler Carruth866faab2012-01-25 07:21:38 +00002014 for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002015 !EC && LI != LE; LI = LI.increment(EC)) {
2016 StringRef VersionText = llvm::sys::path::filename(LI->path());
2017 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002018 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
2019 if (!CandidateGCCInstallPaths.insert(LI->path()).second)
2020 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002021 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002022 continue;
2023 if (CandidateVersion <= Version)
2024 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002025
Simon Atanasyan60280b42014-05-12 07:37:51 +00002026 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002027
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002028 // Debian mips multilibs behave more like the rest of the biarch ones,
2029 // so handle them there
2030 if (isMipsArch(TargetArch)) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00002031 if (!findMIPSMultilibs(TargetTriple, LI->path(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002032 continue;
2033 } else if (!findBiarchMultilibs(TargetTriple, LI->path(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002034 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002035 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002036 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002037
Simon Atanasyan60280b42014-05-12 07:37:51 +00002038 Multilibs = Detected.Multilibs;
2039 SelectedMultilib = Detected.SelectedMultilib;
2040 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002041 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002042 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002043 // FIXME: We hack together the directory name here instead of
2044 // using LI to ensure stable path separators across Windows and
2045 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002046 GCCInstallPath =
2047 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2048 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002049 IsValid = true;
2050 }
2051 }
2052}
2053
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002054Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002055 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002056 : ToolChain(D, Triple, Args), GCCInstallation() {
Daniel Dunbar88979912010-08-01 22:29:51 +00002057 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002058 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002059 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002060}
2061
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002062Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002063
Rafael Espindola7cf32212013-03-20 03:05:54 +00002064Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002065 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002066 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002067 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002068 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002069 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002070 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002071 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002072 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002073 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002074 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002075 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002076 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002077}
2078
Rafael Espindola7cf32212013-03-20 03:05:54 +00002079Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002080 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002081}
2082
Douglas Katzman95354292015-06-23 20:42:09 +00002083Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002084
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002085void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2086 // Print the information about how we detected the GCC installation.
2087 GCCInstallation.print(OS);
2088}
2089
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002090bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002091 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002092}
2093
David Majnemer17f448b2015-06-28 04:23:33 +00002094bool Generic_GCC::isPICDefault() const {
2095 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2096}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002097
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002098bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002099
David Majnemer17f448b2015-06-28 04:23:33 +00002100bool Generic_GCC::isPICDefaultForced() const {
2101 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2102}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002103
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002104bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002105 switch (getTriple().getArch()) {
2106 case llvm::Triple::x86:
2107 case llvm::Triple::x86_64:
2108 case llvm::Triple::aarch64:
2109 case llvm::Triple::aarch64_be:
2110 case llvm::Triple::arm:
2111 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002112 case llvm::Triple::bpfel:
2113 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002114 case llvm::Triple::thumb:
2115 case llvm::Triple::thumbeb:
2116 case llvm::Triple::ppc:
2117 case llvm::Triple::ppc64:
2118 case llvm::Triple::ppc64le:
2119 case llvm::Triple::sparc:
2120 case llvm::Triple::sparcel:
2121 case llvm::Triple::sparcv9:
2122 case llvm::Triple::systemz:
2123 return true;
2124 default:
2125 return false;
2126 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002127}
2128
Kristof Beylsfb387292014-01-10 13:44:34 +00002129void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2130 ArgStringList &CC1Args) const {
2131 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002132 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002133 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002134 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002135 (getTriple().getOS() == llvm::Triple::Linux &&
2136 (!V.isOlderThan(4, 7, 0) ||
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002137 getTriple().getEnvironment() == llvm::Triple::Android)) ||
2138 getTriple().getOS() == llvm::Triple::NaCl;
Kristof Beylsfb387292014-01-10 13:44:34 +00002139
2140 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002141 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002142 CC1Args.push_back("-fuse-init-array");
2143}
2144
Tony Linthicum76329bf2011-12-12 21:14:55 +00002145/// Hexagon Toolchain
2146
Douglas Katzman54366072015-07-27 16:53:08 +00002147std::string HexagonToolChain::GetGnuDir(const std::string &InstalledDir,
2148 const ArgList &Args) {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002149 // Locate the rest of the toolchain ...
Samuel Antaoc909c992014-11-07 17:48:03 +00002150 std::string GccToolchain = getGCCToolchainDir(Args);
2151
2152 if (!GccToolchain.empty())
2153 return GccToolchain;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002154
2155 std::string InstallRelDir = InstalledDir + "/../../gnu";
2156 if (llvm::sys::fs::exists(InstallRelDir))
2157 return InstallRelDir;
2158
2159 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
2160 if (llvm::sys::fs::exists(PrefixRelDir))
2161 return PrefixRelDir;
2162
2163 return InstallRelDir;
2164}
2165
Douglas Katzman54366072015-07-27 16:53:08 +00002166const char *HexagonToolChain::GetSmallDataThreshold(const ArgList &Args) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002167 Arg *A;
2168
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002169 A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002170 options::OPT_msmall_data_threshold_EQ);
2171 if (A)
2172 return A->getValue();
2173
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002174 A = Args.getLastArg(options::OPT_shared, options::OPT_fpic,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002175 options::OPT_fPIC);
2176 if (A)
2177 return "0";
2178
2179 return 0;
2180}
2181
Douglas Katzman54366072015-07-27 16:53:08 +00002182bool HexagonToolChain::UsesG0(const char *smallDataThreshold) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002183 return smallDataThreshold && smallDataThreshold[0] == '0';
2184}
2185
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002186static void GetHexagonLibraryPaths(const ArgList &Args, const std::string &Ver,
2187 const std::string &MarchString,
2188 const std::string &InstalledDir,
2189 ToolChain::path_list *LibPaths) {
Matthew Curtise689b052012-12-06 15:46:07 +00002190 bool buildingLib = Args.hasArg(options::OPT_shared);
2191
2192 //----------------------------------------------------------------------------
2193 // -L Args
2194 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002195 for (Arg *A : Args.filtered(options::OPT_L))
2196 for (const char *Value : A->getValues())
2197 LibPaths->push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002198
2199 //----------------------------------------------------------------------------
2200 // Other standard paths
2201 //----------------------------------------------------------------------------
2202 const std::string MarchSuffix = "/" + MarchString;
2203 const std::string G0Suffix = "/G0";
2204 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Douglas Katzman54366072015-07-27 16:53:08 +00002205 const std::string RootDir =
2206 HexagonToolChain::GetGnuDir(InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00002207
2208 // lib/gcc/hexagon/...
2209 std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
2210 if (buildingLib) {
2211 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
2212 LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
2213 }
2214 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
2215 LibPaths->push_back(LibGCCHexagonDir + Ver);
2216
2217 // lib/gcc/...
2218 LibPaths->push_back(RootDir + "lib/gcc");
2219
2220 // hexagon/lib/...
2221 std::string HexagonLibDir = RootDir + "hexagon/lib";
2222 if (buildingLib) {
2223 LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
2224 LibPaths->push_back(HexagonLibDir + G0Suffix);
2225 }
2226 LibPaths->push_back(HexagonLibDir + MarchSuffix);
2227 LibPaths->push_back(HexagonLibDir);
2228}
2229
Douglas Katzman54366072015-07-27 16:53:08 +00002230HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
2231 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002232 : Linux(D, Triple, Args) {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002233 const std::string InstalledDir(getDriver().getInstalledDir());
Douglas Katzman54366072015-07-27 16:53:08 +00002234 const std::string GnuDir = HexagonToolChain::GetGnuDir(InstalledDir, Args);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002235
2236 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2237 // program paths
2238 const std::string BinDir(GnuDir + "/bin");
2239 if (llvm::sys::fs::exists(BinDir))
2240 getProgramPaths().push_back(BinDir);
2241
2242 // Determine version of GCC libraries and headers to use.
2243 const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
Rafael Espindolac0809172014-06-12 14:02:15 +00002244 std::error_code ec;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002245 GCCVersion MaxVersion = GCCVersion::Parse("0.0.0");
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002246 for (llvm::sys::fs::directory_iterator di(HexagonDir, ec), de;
2247 !ec && di != de; di = di.increment(ec)) {
2248 GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->path()));
2249 if (MaxVersion < cv)
2250 MaxVersion = cv;
2251 }
2252 GCCLibAndIncVersion = MaxVersion;
Matthew Curtise689b052012-12-06 15:46:07 +00002253
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002254 ToolChain::path_list *LibPaths = &getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002255
2256 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2257 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2258 // support 'linux' we'll need to fix this up
2259 LibPaths->clear();
2260
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002261 GetHexagonLibraryPaths(Args, GetGCCLibAndIncVersion(), GetTargetCPU(Args),
2262 InstalledDir, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002263}
2264
Douglas Katzman54366072015-07-27 16:53:08 +00002265HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002266
Douglas Katzman54366072015-07-27 16:53:08 +00002267Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002268 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002269}
2270
Douglas Katzman54366072015-07-27 16:53:08 +00002271Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002272 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002273}
2274
Douglas Katzman54366072015-07-27 16:53:08 +00002275void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2276 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002277 const Driver &D = getDriver();
2278
2279 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2280 DriverArgs.hasArg(options::OPT_nostdlibinc))
2281 return;
2282
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002283 std::string Ver(GetGCCLibAndIncVersion());
Douglas Katzman54366072015-07-27 16:53:08 +00002284 std::string GnuDir = HexagonToolChain::GetGnuDir(D.InstalledDir, DriverArgs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002285 std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
2286 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
2287 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
2288 addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002289}
2290
Douglas Katzman54366072015-07-27 16:53:08 +00002291void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2292 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002293 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2294 DriverArgs.hasArg(options::OPT_nostdincxx))
2295 return;
2296
2297 const Driver &D = getDriver();
2298 std::string Ver(GetGCCLibAndIncVersion());
Samuel Antaoc909c992014-11-07 17:48:03 +00002299 SmallString<128> IncludeDir(
Douglas Katzman54366072015-07-27 16:53:08 +00002300 HexagonToolChain::GetGnuDir(D.InstalledDir, DriverArgs));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002301
Rafael Espindola358256c2013-06-26 02:13:00 +00002302 llvm::sys::path::append(IncludeDir, "hexagon/include/c++/");
2303 llvm::sys::path::append(IncludeDir, Ver);
Yaron Keren92e1b622015-03-18 10:17:07 +00002304 addSystemInclude(DriverArgs, CC1Args, IncludeDir);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002305}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002306
Matthew Curtise689b052012-12-06 15:46:07 +00002307ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002308HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002309 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2310 if (!A)
2311 return ToolChain::CST_Libstdcxx;
2312
2313 StringRef Value = A->getValue();
2314 if (Value != "libstdc++") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002315 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002316 }
2317
2318 return ToolChain::CST_Libstdcxx;
2319}
2320
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002321static int getHexagonVersion(const ArgList &Args) {
2322 Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ);
2323 // Select the default CPU (v4) if none was given.
2324 if (!A)
2325 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002326
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002327 // FIXME: produce errors if we cannot parse the version.
2328 StringRef WhichHexagon = A->getValue();
2329 if (WhichHexagon.startswith("hexagonv")) {
2330 int Val;
2331 if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val))
2332 return Val;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002333 }
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002334 if (WhichHexagon.startswith("v")) {
2335 int Val;
2336 if (!WhichHexagon.substr(1).getAsInteger(10, Val))
2337 return Val;
2338 }
2339
2340 // FIXME: should probably be an error.
2341 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002342}
2343
Douglas Katzman54366072015-07-27 16:53:08 +00002344StringRef HexagonToolChain::GetTargetCPU(const ArgList &Args) {
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002345 int V = getHexagonVersion(Args);
2346 // FIXME: We don't support versions < 4. We should error on them.
2347 switch (V) {
2348 default:
2349 llvm_unreachable("Unexpected version");
2350 case 5:
2351 return "v5";
2352 case 4:
2353 return "v4";
2354 case 3:
2355 return "v3";
2356 case 2:
2357 return "v2";
2358 case 1:
2359 return "v1";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002360 }
Matthew Curtisf10a5952012-12-06 14:16:43 +00002361}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002362// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002363
Tom Stellard8fa33092015-07-18 01:49:05 +00002364/// AMDGPU Toolchain
2365AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2366 const ArgList &Args)
2367 : Generic_ELF(D, Triple, Args) { }
2368
2369Tool *AMDGPUToolChain::buildLinker() const {
2370 return new tools::amdgpu::Linker(*this);
2371}
2372// End AMDGPU
2373
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002374/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00002375NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2376 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002377 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002378
2379 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2380 // default paths, and must instead only use the paths provided
2381 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002382 path_list &file_paths = getFilePaths();
2383 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002384
2385 file_paths.clear();
2386 prog_paths.clear();
2387
2388 // Path for library files (libc.a, ...)
2389 std::string FilePath(getDriver().Dir + "/../");
2390
2391 // Path for tools (clang, ld, etc..)
2392 std::string ProgPath(getDriver().Dir + "/../");
2393
2394 // Path for toolchain libraries (libgcc.a, ...)
2395 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2396
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002397 switch (Triple.getArch()) {
2398 case llvm::Triple::x86: {
2399 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00002400 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002401 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2402 file_paths.push_back(ToolPath + "i686-nacl");
2403 break;
2404 }
2405 case llvm::Triple::x86_64: {
2406 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2407 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2408 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2409 file_paths.push_back(ToolPath + "x86_64-nacl");
2410 break;
2411 }
2412 case llvm::Triple::arm: {
2413 file_paths.push_back(FilePath + "arm-nacl/lib");
2414 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2415 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2416 file_paths.push_back(ToolPath + "arm-nacl");
2417 break;
2418 }
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002419 case llvm::Triple::mipsel: {
2420 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2421 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2422 prog_paths.push_back(ProgPath + "bin");
2423 file_paths.push_back(ToolPath + "mipsel-nacl");
2424 break;
2425 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002426 default:
2427 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002428 }
2429
2430 // Use provided linker, not system linker
Derek Schuffef465d72015-08-24 23:53:25 +00002431 Linker = GetLinkerPath();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002432 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2433}
2434
Douglas Katzman54366072015-07-27 16:53:08 +00002435void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2436 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002437 const Driver &D = getDriver();
2438 if (DriverArgs.hasArg(options::OPT_nostdinc))
2439 return;
2440
2441 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2442 SmallString<128> P(D.ResourceDir);
2443 llvm::sys::path::append(P, "include");
2444 addSystemInclude(DriverArgs, CC1Args, P.str());
2445 }
2446
2447 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2448 return;
2449
2450 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002451 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00002452 case llvm::Triple::x86:
2453 // x86 is special because multilib style uses x86_64-nacl/include for libc
2454 // headers but the SDK wants i686-nacl/usr/include. The other architectures
2455 // have the same substring.
2456 llvm::sys::path::append(P, "i686-nacl/usr/include");
2457 addSystemInclude(DriverArgs, CC1Args, P.str());
2458 llvm::sys::path::remove_filename(P);
2459 llvm::sys::path::remove_filename(P);
2460 llvm::sys::path::remove_filename(P);
2461 llvm::sys::path::append(P, "x86_64-nacl/include");
2462 addSystemInclude(DriverArgs, CC1Args, P.str());
2463 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002464 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002465 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002466 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002467 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002468 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002469 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002470 case llvm::Triple::mipsel:
2471 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2472 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002473 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002474 return;
2475 }
2476
2477 addSystemInclude(DriverArgs, CC1Args, P.str());
2478 llvm::sys::path::remove_filename(P);
2479 llvm::sys::path::remove_filename(P);
2480 llvm::sys::path::append(P, "include");
2481 addSystemInclude(DriverArgs, CC1Args, P.str());
2482}
2483
Douglas Katzman54366072015-07-27 16:53:08 +00002484void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2485 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002486 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2487 // if the value is libc++, and emits an error for other values.
2488 GetCXXStdlibType(Args);
2489 CmdArgs.push_back("-lc++");
2490}
2491
Douglas Katzman54366072015-07-27 16:53:08 +00002492void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2493 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002494 const Driver &D = getDriver();
2495 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2496 DriverArgs.hasArg(options::OPT_nostdincxx))
2497 return;
2498
2499 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2500 // if the value is libc++, and emits an error for other values.
2501 GetCXXStdlibType(DriverArgs);
2502
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002503 SmallString<128> P(D.Dir + "/../");
2504 switch (getTriple().getArch()) {
2505 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002506 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2507 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002508 break;
2509 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002510 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2511 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002512 break;
2513 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002514 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2515 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002516 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002517 case llvm::Triple::mipsel:
2518 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2519 addSystemInclude(DriverArgs, CC1Args, P.str());
2520 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002521 default:
2522 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002523 }
2524}
2525
Douglas Katzman54366072015-07-27 16:53:08 +00002526ToolChain::CXXStdlibType
2527NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002528 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2529 StringRef Value = A->getValue();
2530 if (Value == "libc++")
2531 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002532 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002533 }
2534
2535 return ToolChain::CST_Libcxx;
2536}
2537
Douglas Katzman54366072015-07-27 16:53:08 +00002538std::string
2539NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2540 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002541 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2542 if (TheTriple.getArch() == llvm::Triple::arm &&
2543 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2544 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2545 return TheTriple.getTriple();
2546}
2547
Douglas Katzman54366072015-07-27 16:53:08 +00002548Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002549 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002550}
2551
Douglas Katzman54366072015-07-27 16:53:08 +00002552Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002553 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002554 return new tools::nacltools::AssemblerARM(*this);
2555 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002556}
2557// End NaCl
2558
Chris Lattner09797542010-03-04 21:07:38 +00002559/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2560/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2561/// Currently does not support anything else but compilation.
2562
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002563TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002564 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002565 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002566 // Path mangling to find libexec
2567 std::string Path(getDriver().Dir);
2568
2569 Path += "/../libexec";
2570 getProgramPaths().push_back(Path);
2571}
2572
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002573TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002574
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002575bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002576
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002577bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002578
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002579bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002580
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002581bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002582
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002583// CloudABI - CloudABI tool chain which can call ld(1) directly.
2584
2585CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2586 const ArgList &Args)
2587 : Generic_ELF(D, Triple, Args) {
2588 SmallString<128> P(getDriver().Dir);
2589 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2590 getFilePaths().push_back(P.str());
2591}
2592
2593void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2594 ArgStringList &CC1Args) const {
2595 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2596 DriverArgs.hasArg(options::OPT_nostdincxx))
2597 return;
2598
2599 SmallString<128> P(getDriver().Dir);
2600 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2601 addSystemInclude(DriverArgs, CC1Args, P.str());
2602}
2603
2604void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
2605 ArgStringList &CmdArgs) const {
2606 CmdArgs.push_back("-lc++");
2607 CmdArgs.push_back("-lc++abi");
2608 CmdArgs.push_back("-lunwind");
2609}
2610
Douglas Katzman95354292015-06-23 20:42:09 +00002611Tool *CloudABI::buildLinker() const {
2612 return new tools::cloudabi::Linker(*this);
2613}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002614
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002615/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
2616
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002617OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
2618 const ArgList &Args)
2619 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00002620 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002621 getFilePaths().push_back("/usr/lib");
2622}
2623
Rafael Espindola7cf32212013-03-20 03:05:54 +00002624Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002625 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002626}
2627
Douglas Katzman95354292015-06-23 20:42:09 +00002628Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002629
Eli Friedman9fa28852012-08-08 23:57:20 +00002630/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
2631
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002632Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2633 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00002634 getFilePaths().push_back(getDriver().Dir + "/../lib");
2635 getFilePaths().push_back("/usr/lib");
2636}
2637
Rafael Espindola7cf32212013-03-20 03:05:54 +00002638Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002639 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002640}
2641
Douglas Katzman95354292015-06-23 20:42:09 +00002642Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00002643
Douglas Katzman95354292015-06-23 20:42:09 +00002644ToolChain::CXXStdlibType Bitrig::GetCXXStdlibType(const ArgList &Args) const {
Richard Smith51af5192014-05-01 23:24:24 +00002645 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2646 StringRef Value = A->getValue();
2647 if (Value == "libstdc++")
2648 return ToolChain::CST_Libstdcxx;
2649 if (Value == "libc++")
2650 return ToolChain::CST_Libcxx;
2651
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002652 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Richard Smith51af5192014-05-01 23:24:24 +00002653 }
2654 return ToolChain::CST_Libcxx;
2655}
2656
Eli Friedman9fa28852012-08-08 23:57:20 +00002657void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2658 ArgStringList &CC1Args) const {
2659 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2660 DriverArgs.hasArg(options::OPT_nostdincxx))
2661 return;
2662
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002663 switch (GetCXXStdlibType(DriverArgs)) {
2664 case ToolChain::CST_Libcxx:
2665 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00002666 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002667 break;
2668 case ToolChain::CST_Libstdcxx:
2669 addSystemInclude(DriverArgs, CC1Args,
2670 getDriver().SysRoot + "/usr/include/c++/stdc++");
2671 addSystemInclude(DriverArgs, CC1Args,
2672 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00002673
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002674 StringRef Triple = getTriple().str();
2675 if (Triple.startswith("amd64"))
2676 addSystemInclude(DriverArgs, CC1Args,
2677 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002678 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002679 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002680 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
2681 "/usr/include/c++/stdc++/" +
2682 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002683 break;
2684 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002685}
2686
2687void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
2688 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002689 switch (GetCXXStdlibType(Args)) {
2690 case ToolChain::CST_Libcxx:
2691 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00002692 CmdArgs.push_back("-lc++abi");
2693 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002694 break;
2695 case ToolChain::CST_Libstdcxx:
2696 CmdArgs.push_back("-lstdc++");
2697 break;
2698 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002699}
2700
Daniel Dunbare24297c2009-03-30 21:06:03 +00002701/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
2702
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002703FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
2704 const ArgList &Args)
2705 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00002706
Chandler Carruth0b1756b2012-01-26 01:35:15 +00002707 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
2708 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002709 if ((Triple.getArch() == llvm::Triple::x86 ||
2710 Triple.getArch() == llvm::Triple::ppc) &&
Chandler Carruth0b1756b2012-01-26 01:35:15 +00002711 llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002712 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
2713 else
2714 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00002715}
2716
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002717ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
David Chisnall867ccd82013-11-09 15:10:56 +00002718 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2719 StringRef Value = A->getValue();
2720 if (Value == "libstdc++")
2721 return ToolChain::CST_Libstdcxx;
2722 if (Value == "libc++")
2723 return ToolChain::CST_Libcxx;
2724
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002725 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
David Chisnall867ccd82013-11-09 15:10:56 +00002726 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002727 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00002728 return ToolChain::CST_Libcxx;
2729 return ToolChain::CST_Libstdcxx;
2730}
2731
2732void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2733 ArgStringList &CC1Args) const {
2734 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2735 DriverArgs.hasArg(options::OPT_nostdincxx))
2736 return;
2737
2738 switch (GetCXXStdlibType(DriverArgs)) {
2739 case ToolChain::CST_Libcxx:
2740 addSystemInclude(DriverArgs, CC1Args,
2741 getDriver().SysRoot + "/usr/include/c++/v1");
2742 break;
2743 case ToolChain::CST_Libstdcxx:
2744 addSystemInclude(DriverArgs, CC1Args,
2745 getDriver().SysRoot + "/usr/include/c++/4.2");
2746 addSystemInclude(DriverArgs, CC1Args,
2747 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
2748 break;
2749 }
2750}
2751
Rafael Espindola7cf32212013-03-20 03:05:54 +00002752Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002753 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002754}
2755
Douglas Katzman95354292015-06-23 20:42:09 +00002756Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00002757
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002758bool FreeBSD::UseSjLjExceptions() const {
2759 // FreeBSD uses SjLj exceptions on ARM oabi.
2760 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00002761 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002762 case llvm::Triple::GNUEABI:
2763 case llvm::Triple::EABI:
2764 return false;
2765
2766 default:
2767 return (getTriple().getArch() == llvm::Triple::arm ||
2768 getTriple().getArch() == llvm::Triple::thumb);
2769 }
2770}
2771
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002772bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002773
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002774bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002775
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00002776SanitizerMask FreeBSD::getSupportedSanitizers() const {
2777 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
2778 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
2779 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
2780 getTriple().getArch() == llvm::Triple::mips64el;
2781 SanitizerMask Res = ToolChain::getSupportedSanitizers();
2782 Res |= SanitizerKind::Address;
2783 Res |= SanitizerKind::Vptr;
2784 if (IsX86_64 || IsMIPS64) {
2785 Res |= SanitizerKind::Leak;
2786 Res |= SanitizerKind::Thread;
2787 }
2788 if (IsX86 || IsX86_64) {
2789 Res |= SanitizerKind::SafeStack;
2790 }
2791 return Res;
2792}
2793
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002794/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
2795
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002796NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2797 : Generic_ELF(D, Triple, Args) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002798
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00002799 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00002800 // When targeting a 32-bit platform, try the special directory used on
2801 // 64-bit hosts, and only fall back to the main library directory if that
2802 // doesn't work.
2803 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
2804 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002805 switch (Triple.getArch()) {
2806 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00002807 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002808 break;
2809 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00002810 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002811 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00002812 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002813 switch (Triple.getEnvironment()) {
2814 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002815 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002816 getFilePaths().push_back("=/usr/lib/eabi");
2817 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00002818 case llvm::Triple::EABIHF:
2819 case llvm::Triple::GNUEABIHF:
2820 getFilePaths().push_back("=/usr/lib/eabihf");
2821 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002822 default:
2823 getFilePaths().push_back("=/usr/lib/oabi");
2824 break;
2825 }
2826 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002827 case llvm::Triple::mips64:
2828 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002829 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002830 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002831 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002832 getFilePaths().push_back("=/usr/lib/64");
2833 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00002834 case llvm::Triple::ppc:
2835 getFilePaths().push_back("=/usr/lib/powerpc");
2836 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00002837 case llvm::Triple::sparc:
2838 getFilePaths().push_back("=/usr/lib/sparc");
2839 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002840 default:
2841 break;
2842 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00002843
2844 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002845 }
2846}
2847
Rafael Espindola7cf32212013-03-20 03:05:54 +00002848Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002849 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002850}
2851
Douglas Katzman95354292015-06-23 20:42:09 +00002852Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002853
Douglas Katzman95354292015-06-23 20:42:09 +00002854ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002855 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2856 StringRef Value = A->getValue();
2857 if (Value == "libstdc++")
2858 return ToolChain::CST_Libstdcxx;
2859 if (Value == "libc++")
2860 return ToolChain::CST_Libcxx;
2861
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002862 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002863 }
2864
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002865 unsigned Major, Minor, Micro;
2866 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00002867 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002868 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00002869 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00002870 case llvm::Triple::arm:
2871 case llvm::Triple::armeb:
2872 case llvm::Triple::thumb:
2873 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00002874 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00002875 case llvm::Triple::ppc64:
2876 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002877 case llvm::Triple::x86:
2878 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002879 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002880 default:
2881 break;
2882 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002883 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002884 return ToolChain::CST_Libstdcxx;
2885}
2886
2887void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2888 ArgStringList &CC1Args) const {
2889 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2890 DriverArgs.hasArg(options::OPT_nostdincxx))
2891 return;
2892
2893 switch (GetCXXStdlibType(DriverArgs)) {
2894 case ToolChain::CST_Libcxx:
2895 addSystemInclude(DriverArgs, CC1Args,
2896 getDriver().SysRoot + "/usr/include/c++/");
2897 break;
2898 case ToolChain::CST_Libstdcxx:
2899 addSystemInclude(DriverArgs, CC1Args,
2900 getDriver().SysRoot + "/usr/include/g++");
2901 addSystemInclude(DriverArgs, CC1Args,
2902 getDriver().SysRoot + "/usr/include/g++/backward");
2903 break;
2904 }
2905}
2906
Chris Lattner3e2ee142010-07-07 16:01:42 +00002907/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
2908
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002909Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2910 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00002911 getFilePaths().push_back(getDriver().Dir + "/../lib");
2912 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00002913}
2914
Rafael Espindola7cf32212013-03-20 03:05:54 +00002915Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002916 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002917}
2918
Douglas Katzman95354292015-06-23 20:42:09 +00002919Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00002920
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002921static void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
2922 if (llvm::sys::fs::exists(Path))
2923 Paths.push_back(Path.str());
2924}
2925
David Chisnallf571cde2012-02-15 13:39:01 +00002926/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
2927
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002928Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002929 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002930 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00002931
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002932 GCCInstallation.init(D, Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00002933
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002934 path_list &Paths = getFilePaths();
2935 if (GCCInstallation.isValid())
2936 addPathIfExists(GCCInstallation.getInstallPath(), Paths);
2937
2938 addPathIfExists(getDriver().getInstalledDir(), Paths);
2939 if (getDriver().getInstalledDir() != getDriver().Dir)
2940 addPathIfExists(getDriver().Dir, Paths);
2941
2942 addPathIfExists(getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
2943
2944 std::string LibPath = "/usr/lib/";
2945 switch (Triple.getArch()) {
2946 case llvm::Triple::x86:
2947 case llvm::Triple::sparc:
2948 break;
2949 case llvm::Triple::x86_64:
2950 LibPath += "amd64/";
2951 break;
2952 case llvm::Triple::sparcv9:
2953 LibPath += "sparcv9/";
2954 break;
2955 default:
2956 llvm_unreachable("Unsupported architecture");
2957 }
2958
2959 addPathIfExists(getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00002960}
2961
Rafael Espindola7cf32212013-03-20 03:05:54 +00002962Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002963 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002964}
2965
Douglas Katzman95354292015-06-23 20:42:09 +00002966Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00002967
Rafael Espindolad5117262015-09-09 13:36:00 +00002968void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2969 ArgStringList &CC1Args) const {
2970 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2971 DriverArgs.hasArg(options::OPT_nostdincxx))
2972 return;
2973
2974 // Include the support directory for things like xlocale and fudged system
2975 // headers.
2976 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
2977
2978 if (GCCInstallation.isValid()) {
2979 GCCVersion Version = GCCInstallation.getVersion();
2980 addSystemInclude(DriverArgs, CC1Args,
2981 getDriver().SysRoot + "/usr/gcc/" +
2982 Version.MajorStr + "." +
2983 Version.MinorStr +
2984 "/include/c++/" + Version.Text);
2985 addSystemInclude(DriverArgs, CC1Args,
2986 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
2987 "." + Version.MinorStr + "/include/c++/" +
2988 Version.Text + "/" +
2989 GCCInstallation.getTriple().str());
2990 }
2991}
2992
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002993/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00002994
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002995enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00002996 // NB: Releases of a particular Linux distro should be kept together
2997 // in this enum, because some tests are done by integer comparison against
2998 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00002999 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003000 DebianLenny,
3001 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003002 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003003 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003004 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003005 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003006 RHEL4,
3007 RHEL5,
3008 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003009 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003010 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003011 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003012 UbuntuHardy,
3013 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003014 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003015 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003016 UbuntuLucid,
3017 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003018 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003019 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003020 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003021 UbuntuQuantal,
3022 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003023 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003024 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003025 UbuntuUtopic,
3026 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003027 UbuntuWily,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003028 UnknownDistro
3029};
3030
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003031static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003032 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003033}
3034
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003035static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003036
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003037static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003038 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003039}
3040
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003041static bool IsUbuntu(enum Distro Distro) {
Benjamin Kramer2d469802015-07-09 15:31:17 +00003042 return Distro >= UbuntuHardy && Distro <= UbuntuWily;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003043}
3044
Rafael Espindolaa8398552013-10-28 23:14:34 +00003045static Distro DetectDistro(llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003046 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3047 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3048 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003049 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003050 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003051 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003052 Distro Version = UnknownDistro;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003053 for (const StringRef Line : Lines)
3054 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3055 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3056 .Case("hardy", UbuntuHardy)
3057 .Case("intrepid", UbuntuIntrepid)
3058 .Case("jaunty", UbuntuJaunty)
3059 .Case("karmic", UbuntuKarmic)
3060 .Case("lucid", UbuntuLucid)
3061 .Case("maverick", UbuntuMaverick)
3062 .Case("natty", UbuntuNatty)
3063 .Case("oneiric", UbuntuOneiric)
3064 .Case("precise", UbuntuPrecise)
3065 .Case("quantal", UbuntuQuantal)
3066 .Case("raring", UbuntuRaring)
3067 .Case("saucy", UbuntuSaucy)
3068 .Case("trusty", UbuntuTrusty)
3069 .Case("utopic", UbuntuUtopic)
3070 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003071 .Case("wily", UbuntuWily)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003072 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003073 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003074 }
3075
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003076 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3077 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003078 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003079 if (Data.startswith("Fedora release"))
3080 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003081 if (Data.startswith("Red Hat Enterprise Linux") ||
3082 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003083 if (Data.find("release 7") != StringRef::npos)
3084 return RHEL7;
3085 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003086 return RHEL6;
3087 else if (Data.find("release 5") != StringRef::npos)
3088 return RHEL5;
3089 else if (Data.find("release 4") != StringRef::npos)
3090 return RHEL4;
3091 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003092 return UnknownDistro;
3093 }
3094
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003095 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3096 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003097 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003098 if (Data[0] == '5')
3099 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003100 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003101 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003102 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003103 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003104 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003105 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003106 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3107 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003108 return UnknownDistro;
3109 }
3110
Rafael Espindolaa8398552013-10-28 23:14:34 +00003111 if (llvm::sys::fs::exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003112 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003113
Rafael Espindolaa8398552013-10-28 23:14:34 +00003114 if (llvm::sys::fs::exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003115 return Exherbo;
3116
Rafael Espindolaa8398552013-10-28 23:14:34 +00003117 if (llvm::sys::fs::exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003118 return ArchLinux;
3119
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003120 return UnknownDistro;
3121}
3122
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003123/// \brief Get our best guess at the multiarch triple for a target.
3124///
3125/// Debian-based systems are starting to use a multiarch setup where they use
3126/// a target-triple directory in the library and header search paths.
3127/// Unfortunately, this triple does not align with the vanilla target triple,
3128/// so we provide a rough mapping here.
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00003129static std::string getMultiarchTriple(const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003130 StringRef SysRoot) {
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003131 llvm::Triple::EnvironmentType TargetEnvironment = TargetTriple.getEnvironment();
3132
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003133 // For most architectures, just use whatever we have rather than trying to be
3134 // clever.
3135 switch (TargetTriple.getArch()) {
3136 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003137 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003138
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003139 // We use the existence of '/lib/<triple>' as a directory to detect some
3140 // common linux triples that don't quite match the Clang triple for both
3141 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3142 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003143 case llvm::Triple::arm:
3144 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003145 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003146 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf"))
3147 return "arm-linux-gnueabihf";
3148 } else {
3149 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi"))
3150 return "arm-linux-gnueabi";
3151 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003152 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003153 case llvm::Triple::armeb:
3154 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003155 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003156 if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
3157 return "armeb-linux-gnueabihf";
3158 } else {
3159 if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabi"))
3160 return "armeb-linux-gnueabi";
3161 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003162 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003163 case llvm::Triple::x86:
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003164 if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
3165 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003166 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003167 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003168 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003169 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00003170 llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003171 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003172 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003173 case llvm::Triple::aarch64:
3174 if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64-linux-gnu"))
3175 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003176 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003177 case llvm::Triple::aarch64_be:
3178 if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
3179 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003180 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003181 case llvm::Triple::mips:
3182 if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu"))
3183 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003184 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003185 case llvm::Triple::mipsel:
3186 if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu"))
3187 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003188 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003189 case llvm::Triple::mips64:
3190 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnu"))
3191 return "mips64-linux-gnu";
3192 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
3193 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003194 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003195 case llvm::Triple::mips64el:
3196 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnu"))
3197 return "mips64el-linux-gnu";
3198 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
3199 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003200 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003201 case llvm::Triple::ppc:
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003202 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
3203 return "powerpc-linux-gnuspe";
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003204 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu"))
3205 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003206 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003207 case llvm::Triple::ppc64:
3208 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu"))
3209 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003210 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003211 case llvm::Triple::ppc64le:
3212 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
3213 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003214 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003215 case llvm::Triple::sparc:
3216 if (llvm::sys::fs::exists(SysRoot + "/lib/sparc-linux-gnu"))
3217 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003218 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003219 case llvm::Triple::sparcv9:
3220 if (llvm::sys::fs::exists(SysRoot + "/lib/sparc64-linux-gnu"))
3221 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003222 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003223 case llvm::Triple::systemz:
3224 if (llvm::sys::fs::exists(SysRoot + "/lib/s390x-linux-gnu"))
3225 return "s390x-linux-gnu";
3226 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003227 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003228 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003229}
3230
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003231static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003232 if (isMipsArch(Triple.getArch())) {
3233 // lib32 directory has a special meaning on MIPS targets.
3234 // It contains N32 ABI binaries. Use this folder if produce
3235 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003236 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003237 return "lib32";
3238 return Triple.isArch32Bit() ? "lib" : "lib64";
3239 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003240
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003241 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003242 // using that variant while targeting other architectures causes problems
3243 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003244 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003245 // them when we know we may need it.
3246 //
3247 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003248 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003249 // GCCInstallationDetector, but that is a more significant refactoring.
3250 if (Triple.getArch() == llvm::Triple::x86 ||
3251 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003252 return "lib32";
3253
Zinovy Nis1db95732014-07-10 15:27:19 +00003254 if (Triple.getArch() == llvm::Triple::x86_64 &&
3255 Triple.getEnvironment() == llvm::Triple::GNUX32)
3256 return "libx32";
3257
Simon Atanasyand4413882012-09-14 11:27:24 +00003258 return Triple.isArch32Bit() ? "lib" : "lib64";
3259}
3260
Rafael Espindola1af7c212012-02-19 01:38:32 +00003261Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003262 : Generic_ELF(D, Triple, Args) {
Roman Divacky326d9982013-12-06 18:32:18 +00003263 GCCInstallation.init(D, Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003264 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003265 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003266 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003267
Rafael Espindola10a63c22013-07-03 14:14:00 +00003268 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003269 // least) put various tools in a triple-prefixed directory off of the parent
3270 // of the GCC installation. We use the GCC triple here to ensure that we end
3271 // up with tools that support the same amount of cross compiling as the
3272 // detected GCC installation. For example, if we find a GCC installation
3273 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3274 // used to target i386.
3275 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003276 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003277 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003278 GCCInstallation.getTriple().str() + "/bin")
3279 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003280
Logan Chieneb9162f2014-06-26 14:23:45 +00003281 Linker = GetLinkerPath();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003282
Rafael Espindolaa8398552013-10-28 23:14:34 +00003283 Distro Distro = DetectDistro(Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003284
Rafael Espindola10a63c22013-07-03 14:14:00 +00003285 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003286 ExtraOpts.push_back("-z");
3287 ExtraOpts.push_back("relro");
3288 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003289
Douglas Gregord9bb1522011-03-06 19:11:49 +00003290 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003291 ExtraOpts.push_back("-X");
3292
Logan Chienc6fd8202012-09-02 09:30:11 +00003293 const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003294 const bool IsMips = isMipsArch(Arch);
3295
3296 if (IsMips && !SysRoot.empty())
3297 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003298
Chandler Carruth0b842912011-12-09 04:45:18 +00003299 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3300 // and the MIPS ABI require .dynsym to be sorted in different ways.
3301 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3302 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003303 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003304 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003305 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003306 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003307 ExtraOpts.push_back("--hash-style=gnu");
3308
Rafael Espindola10a63c22013-07-03 14:14:00 +00003309 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003310 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3311 ExtraOpts.push_back("--hash-style=both");
3312 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003313
Chris Lattner84e38552011-05-22 05:36:06 +00003314 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003315 ExtraOpts.push_back("--no-add-needed");
3316
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003317 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003318 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003319 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003320 ExtraOpts.push_back("--build-id");
3321
Rafael Espindola10a63c22013-07-03 14:14:00 +00003322 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003323 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003324
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003325 // The selection of paths to try here is designed to match the patterns which
3326 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3327 // This was determined by running GCC in a fake filesystem, creating all
3328 // possible permutations of these directories, and seeing which ones it added
3329 // to the link paths.
3330 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003331
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003332 const std::string OSLibDir = getOSLibDir(Triple, Args);
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003333 const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003334
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003335 // Add the multilib suffixed paths where they are available.
3336 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003337 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003338 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003339 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003340
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003341 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003342 // a biarch-like suffix of the GCC installation.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003343 addPathIfExists((GCCInstallation.getInstallPath() + Multilib.gccSuffix()),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003344 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003345
3346 // GCC cross compiling toolchains will install target libraries which ship
3347 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3348 // any part of the GCC installation in
3349 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3350 // debatable, but is the reality today. We need to search this tree even
3351 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003352 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003353 // installation that is *not* within the system root to ensure two things:
3354 //
3355 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003356 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003357 // appropriate rpath.
3358 // 2) There must not be libraries installed into
3359 // <prefix>/<triple>/<libdir> unless they should be preferred over
3360 // those within the system root.
3361 //
3362 // Note that this matches the GCC behavior. See the below comment for where
3363 // Clang diverges from GCC's behavior.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003364 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + OSLibDir +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003365 Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003366 Paths);
3367
Chandler Carruth69a125b2012-04-06 16:32:06 +00003368 // If the GCC installation we found is inside of the sysroot, we want to
3369 // prefer libraries installed in the parent prefix of the GCC installation.
3370 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003371 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003372 // This usually happens when there is an external cross compiler on the
3373 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003374 // the cross. Note that GCC does include some of these directories in some
3375 // configurations but this seems somewhere between questionable and simply
3376 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003377 if (StringRef(LibPath).startswith(SysRoot)) {
Chandler Carruth69a125b2012-04-06 16:32:06 +00003378 addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003379 addPathIfExists(LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003380 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003381 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003382
3383 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003384 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003385 // those searched.
3386 // FIXME: It's not clear whether we should use the driver's installed
3387 // directory ('Dir' below) or the ResourceDir.
3388 if (StringRef(D.Dir).startswith(SysRoot)) {
3389 addPathIfExists(D.Dir + "/../lib/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003390 addPathIfExists(D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003391 }
3392
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003393 addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003394 addPathIfExists(SysRoot + "/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003395 addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003396 addPathIfExists(SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003397
Chandler Carruthb427c562013-06-22 11:35:51 +00003398 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003399 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003400 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003401 addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003402 "/../../" + OSLibDir,
3403 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003404
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003405 // Add the 'other' biarch variant path
3406 Multilib BiarchSibling;
3407 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003408 addPathIfExists(
3409 GCCInstallation.getInstallPath() + BiarchSibling.gccSuffix(), Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003410 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003411
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003412 // See comments above on the multilib variant for details of why this is
3413 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003414 const std::string &LibPath = GCCInstallation.getParentLibPath();
3415 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3416 const Multilib &Multilib = GCCInstallation.getMultilib();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003417 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib" +
3418 Multilib.osSuffix(),
3419 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003420
3421 // See comments above on the multilib variant for details of why this is
3422 // only included from within the sysroot.
3423 if (StringRef(LibPath).startswith(SysRoot))
Chandler Carruth69a125b2012-04-06 16:32:06 +00003424 addPathIfExists(LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003425 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003426
3427 // Similar to the logic for GCC above, if we are currently running Clang
3428 // inside of the requested system root, add its parent library path to those
3429 // searched.
3430 // FIXME: It's not clear whether we should use the driver's installed
3431 // directory ('Dir' below) or the ResourceDir.
3432 if (StringRef(D.Dir).startswith(SysRoot))
3433 addPathIfExists(D.Dir + "/../lib", Paths);
3434
Chandler Carruth2a649c72011-10-03 06:41:08 +00003435 addPathIfExists(SysRoot + "/lib", Paths);
3436 addPathIfExists(SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003437}
3438
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003439bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003440
Douglas Katzman95354292015-06-23 20:42:09 +00003441Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003442
3443Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003444 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003445}
3446
Simon Atanasyana0d89572013-10-05 14:37:55 +00003447std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003448 if (!getDriver().SysRoot.empty())
3449 return getDriver().SysRoot;
3450
3451 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3452 return std::string();
3453
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003454 // Standalone MIPS toolchains use different names for sysroot folder
3455 // and put it into different places. Here we try to check some known
3456 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003457
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003458 const StringRef InstallDir = GCCInstallation.getInstallPath();
3459 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003460 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003461
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003462 std::string Path =
3463 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3464 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003465
3466 if (llvm::sys::fs::exists(Path))
3467 return Path;
3468
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003469 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003470
3471 if (llvm::sys::fs::exists(Path))
3472 return Path;
3473
3474 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003475}
3476
Chandler Carrutha796f532011-11-05 20:17:13 +00003477void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3478 ArgStringList &CC1Args) const {
3479 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003480 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003481
3482 if (DriverArgs.hasArg(options::OPT_nostdinc))
3483 return;
3484
3485 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003486 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003487
3488 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003489 SmallString<128> P(D.ResourceDir);
3490 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003491 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003492 }
3493
3494 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3495 return;
3496
3497 // Check for configure-time C include directories.
3498 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3499 if (CIncludeDirs != "") {
3500 SmallVector<StringRef, 5> dirs;
3501 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003502 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003503 StringRef Prefix =
3504 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003505 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003506 }
3507 return;
3508 }
3509
3510 // Lacking those, try to detect the correct set of system includes for the
3511 // target triple.
3512
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003513 // Add include directories specific to the selected multilib set and multilib.
3514 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003515 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003516 if (Callback) {
3517 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3518 GCCInstallation.getTriple().str(),
3519 GCCInstallation.getMultilib());
3520 for (const auto &Path : IncludePaths)
3521 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3522 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003523 }
3524
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003525 // Implement generic Debian multiarch support.
3526 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003527 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003528
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003529 // FIXME: These are older forms of multiarch. It's not clear that they're
3530 // in use in any released version of Debian, so we should consider
3531 // removing them.
3532 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003533 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003534 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003535
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003536 // FIXME: These are older forms of multiarch. It's not clear that they're
3537 // in use in any released version of Debian, so we should consider
3538 // removing them.
3539 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3540 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003541 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003542 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003543 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003544 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003545 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003546 "/usr/include/arm-linux-gnueabihf"};
3547 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003548 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003549 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003550 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003551 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003552 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003553 "/usr/include/mips64el-linux-gnu",
3554 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003555 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003556 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003557 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003558 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003559 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003560 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003561 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003562 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003563 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003564 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003565 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
3566 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003567 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003568 switch (getTriple().getArch()) {
3569 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003570 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003571 break;
3572 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003573 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003574 break;
3575 case llvm::Triple::aarch64:
3576 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003577 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003578 break;
3579 case llvm::Triple::arm:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003580 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3581 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3582 else
3583 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003584 break;
3585 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00003586 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003587 break;
3588 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00003589 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003590 break;
3591 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003592 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003593 break;
3594 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003595 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003596 break;
3597 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003598 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003599 break;
3600 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003601 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003602 break;
3603 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003604 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003605 break;
3606 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00003607 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003608 break;
3609 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00003610 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003611 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003612 case llvm::Triple::systemz:
3613 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
3614 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003615 default:
3616 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003617 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003618 for (StringRef Dir : MultiarchIncludeDirs) {
3619 if (llvm::sys::fs::exists(SysRoot + Dir)) {
3620 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003621 break;
3622 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003623 }
3624
3625 if (getTriple().getOS() == llvm::Triple::RTEMS)
3626 return;
3627
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003628 // Add an include of '/include' directly. This isn't provided by default by
3629 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
3630 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003631 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003632
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003633 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003634}
3635
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003636/// \brief Helper to add the variant paths of a libstdc++ installation.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003637/*static*/ bool Linux::addLibStdCXXIncludePaths(
3638 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
3639 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
3640 const ArgList &DriverArgs, ArgStringList &CC1Args) {
Chandler Carruthc26a79d2014-08-27 18:21:27 +00003641 if (!llvm::sys::fs::exists(Base + Suffix))
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003642 return false;
Chandler Carrutha796f532011-11-05 20:17:13 +00003643
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003644 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003645
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003646 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
3647 // that path exists or we have neither a GCC nor target multiarch triple, use
3648 // this vanilla search path.
3649 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
3650 llvm::sys::fs::exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
3651 addSystemInclude(DriverArgs, CC1Args,
3652 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
3653 } else {
3654 // Otherwise try to use multiarch naming schemes which have normalized the
3655 // triples and put the triple before the suffix.
3656 //
3657 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
3658 // the target triple, so we support that here.
3659 addSystemInclude(DriverArgs, CC1Args,
3660 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
3661 addSystemInclude(DriverArgs, CC1Args,
3662 Base + "/" + TargetMultiarchTriple + Suffix);
3663 }
3664
3665 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003666 return true;
3667}
3668
Chandler Carrutha796f532011-11-05 20:17:13 +00003669void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3670 ArgStringList &CC1Args) const {
3671 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3672 DriverArgs.hasArg(options::OPT_nostdincxx))
3673 return;
3674
Chandler Carruthf4701732011-11-07 09:01:17 +00003675 // Check if libc++ has been enabled and provide its include paths if so.
3676 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003677 const std::string LibCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003678 // The primary location is within the Clang installation.
3679 // FIXME: We shouldn't hard code 'v1' here to make Clang future proof to
3680 // newer ABI versions.
3681 getDriver().Dir + "/../include/c++/v1",
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003682
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003683 // We also check the system as for a long time this is the only place
3684 // Clang looked.
3685 // FIXME: We should really remove this. It doesn't make any sense.
3686 getDriver().SysRoot + "/usr/include/c++/v1"};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003687 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
3688 if (!llvm::sys::fs::exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003689 continue;
3690 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003691 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003692 break;
3693 }
Chandler Carruthf4701732011-11-07 09:01:17 +00003694 return;
3695 }
3696
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00003697 // We need a detected GCC installation on Linux to provide libstdc++'s
3698 // headers. We handled the libc++ case above.
3699 if (!GCCInstallation.isValid())
3700 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00003701
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003702 // By default, look for the C++ headers in an include directory adjacent to
3703 // the lib directory of the GCC installation. Note that this is expect to be
3704 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
3705 StringRef LibDir = GCCInstallation.getParentLibPath();
3706 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003707 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003708 const Multilib &Multilib = GCCInstallation.getMultilib();
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003709 const std::string GCCMultiarchTriple =
3710 getMultiarchTriple(GCCInstallation.getTriple(), getDriver().SysRoot);
3711 const std::string TargetMultiarchTriple =
3712 getMultiarchTriple(getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00003713 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003714
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003715 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00003716 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003717 "/c++/" + Version.Text, TripleStr,
3718 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003719 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003720 return;
3721
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003722 // Otherwise, fall back on a bunch of options which don't use multiarch
3723 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003724 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003725 // Gentoo is weird and places its headers inside the GCC install,
3726 // so if the first attempt to find the headers fails, try these patterns.
3727 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
3728 Version.MinorStr,
3729 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
3730 // Android standalone toolchain has C++ headers in yet another place.
3731 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
3732 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
3733 // without a subdirectory corresponding to the gcc version.
3734 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003735 };
3736
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003737 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003738 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
3739 /*GCCMultiarchTriple*/ "",
3740 /*TargetMultiarchTriple*/ "",
3741 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003742 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003743 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003744}
3745
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003746bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003747
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003748SanitizerMask Linux::getSupportedSanitizers() const {
3749 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3750 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3751 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3752 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00003753 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
3754 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003755 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
3756 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003757 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3758 Res |= SanitizerKind::Address;
3759 Res |= SanitizerKind::KernelAddress;
3760 Res |= SanitizerKind::Vptr;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003761 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003762 Res |= SanitizerKind::DataFlow;
Renato Golind45c2df2015-08-05 18:42:41 +00003763 if (IsX86_64 || IsMIPS64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003764 Res |= SanitizerKind::Leak;
Renato Golind45c2df2015-08-05 18:42:41 +00003765 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003766 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00003767 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00003768 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003769 if (IsX86 || IsX86_64) {
3770 Res |= SanitizerKind::Function;
3771 Res |= SanitizerKind::SafeStack;
3772 }
3773 return Res;
3774}
3775
Daniel Dunbarcc912342009-05-02 18:28:39 +00003776/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
3777
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003778DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
3779 const ArgList &Args)
3780 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00003781
3782 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00003783 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00003784 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00003785 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00003786
Daniel Dunbar083edf72009-12-21 18:54:17 +00003787 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00003788 getFilePaths().push_back("/usr/lib");
John McCall65b8da02013-04-11 22:55:55 +00003789 if (llvm::sys::fs::exists("/usr/lib/gcc47"))
3790 getFilePaths().push_back("/usr/lib/gcc47");
3791 else
3792 getFilePaths().push_back("/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00003793}
3794
Rafael Espindola7cf32212013-03-20 03:05:54 +00003795Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003796 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003797}
3798
3799Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003800 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00003801}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003802
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003803/// Stub for CUDA toolchain. At the moment we don't have assembler or
3804/// linker and need toolchain mainly to propagate device-side options
3805/// to CC1.
3806
3807CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
3808 const ArgList &Args)
3809 : Linux(D, Triple, Args) {}
3810
3811void
3812CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
3813 llvm::opt::ArgStringList &CC1Args) const {
3814 Linux::addClangTargetOptions(DriverArgs, CC1Args);
3815 CC1Args.push_back("-fcuda-is-device");
3816}
3817
3818llvm::opt::DerivedArgList *
3819CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
3820 const char *BoundArch) const {
3821 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
3822 const OptTable &Opts = getDriver().getOpts();
3823
3824 for (Arg *A : Args) {
3825 if (A->getOption().matches(options::OPT_Xarch__)) {
3826 // Skip this argument unless the architecture matches BoundArch
3827 if (A->getValue(0) != StringRef(BoundArch))
3828 continue;
3829
3830 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
3831 unsigned Prev = Index;
3832 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
3833
3834 // If the argument parsing failed or more than one argument was
3835 // consumed, the -Xarch_ argument's parameter tried to consume
3836 // extra arguments. Emit an error and ignore.
3837 //
3838 // We also want to disallow any options which would alter the
3839 // driver behavior; that isn't going to work in our model. We
3840 // use isDriverOption() as an approximation, although things
3841 // like -O4 are going to slip through.
3842 if (!XarchArg || Index > Prev + 1) {
3843 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
3844 << A->getAsString(Args);
3845 continue;
3846 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
3847 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
3848 << A->getAsString(Args);
3849 continue;
3850 }
3851 XarchArg->setBaseArg(A);
3852 A = XarchArg.release();
3853 DAL->AddSynthesizedArg(A);
3854 }
3855 DAL->append(A);
3856 }
3857
3858 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
3859 return DAL;
3860}
3861
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003862/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00003863XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
3864 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003865 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003866 // ProgramPaths are found via 'PATH' environment variable.
3867}
3868
Douglas Katzman54366072015-07-27 16:53:08 +00003869Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003870 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003871}
3872
Douglas Katzman54366072015-07-27 16:53:08 +00003873Tool *XCoreToolChain::buildLinker() const {
3874 return new tools::XCore::Linker(*this);
3875}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003876
Douglas Katzman54366072015-07-27 16:53:08 +00003877bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003878
Douglas Katzman54366072015-07-27 16:53:08 +00003879bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003880
Douglas Katzman54366072015-07-27 16:53:08 +00003881bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003882
Douglas Katzman54366072015-07-27 16:53:08 +00003883bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003884
Douglas Katzman54366072015-07-27 16:53:08 +00003885bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003886
Douglas Katzman54366072015-07-27 16:53:08 +00003887void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3888 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003889 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
3890 DriverArgs.hasArg(options::OPT_nostdlibinc))
3891 return;
3892 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
3893 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003894 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003895 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3896 ArrayRef<StringRef> DirVec(Dirs);
3897 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3898 }
3899}
3900
Douglas Katzman54366072015-07-27 16:53:08 +00003901void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
3902 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003903 CC1Args.push_back("-nostdsysteminc");
3904}
3905
Douglas Katzman54366072015-07-27 16:53:08 +00003906void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
3907 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003908 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00003909 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3910 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003911 return;
3912 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
3913 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003914 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003915 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3916 ArrayRef<StringRef> DirVec(Dirs);
3917 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3918 }
3919}
3920
Douglas Katzman54366072015-07-27 16:53:08 +00003921void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
3922 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003923 // We don't output any lib args. This is handled by xcc.
3924}
Douglas Katzman84a75642015-06-19 14:55:19 +00003925
Douglas Katzmand6e597c2015-09-17 19:56:40 +00003926MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
3927 const ArgList &Args)
3928 : Generic_GCC(D, Triple, Args) {
3929 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
3930 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
3931 // This won't work to find gcc. Instead we give the installation detector an
3932 // extra triple, which is preferable to further hacks of the logic that at
3933 // present is based solely on getArch(). In particular, it would be wrong to
3934 // choose the myriad installation when targeting a non-myriad sparc install.
3935 switch (Triple.getArch()) {
3936 default:
3937 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName() << "myriad";
3938 case llvm::Triple::sparc:
3939 case llvm::Triple::sparcel:
3940 case llvm::Triple::shave:
3941 GCCInstallation.init(D, Triple, Args, {"sparc-myriad-elf"});
3942 }
3943}
3944
3945MyriadToolChain::~MyriadToolChain() {}
3946
3947// MyriadToolChain handles several triples:
3948// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
3949Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
3950 // The inherited method works fine if not targeting the SHAVE.
3951 if (!isShaveCompilation(getTriple()))
3952 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00003953 switch (JA.getKind()) {
3954 case Action::CompileJobClass:
3955 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00003956 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00003957 return Compiler.get();
3958 case Action::AssembleJobClass:
3959 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00003960 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00003961 return Assembler.get();
3962 default:
3963 return ToolChain::getTool(JA.getKind());
3964 }
3965}
3966
Douglas Katzmand6e597c2015-09-17 19:56:40 +00003967void MyriadToolChain::getCompilerSupportDir(std::string &Dir) const {
3968 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
3969 // These files are tied to a particular version of gcc.
3970 SmallString<128> Result(GCCInstallation.getInstallPath());
3971 // There are actually 4 choices: {le,be} x {fpu,nofpu}
3972 // but as this toolchain is for LEON sparc, it can assume FPU.
3973 if (this->getTriple().getArch() == llvm::Triple::sparcel)
3974 llvm::sys::path::append(Result, "le");
3975 Dir.assign(Result.str());
3976}
3977void MyriadToolChain::getBuiltinLibDir(std::string &Dir) const {
3978 // The contents of LibDir are independent of the version of gcc.
3979 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
3980 SmallString<128> Result(GCCInstallation.getParentLibPath());
3981 if (this->getTriple().getArch() == llvm::Triple::sparcel)
3982 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib/le");
3983 else
3984 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib");
3985 Dir.assign(Result.str());
Douglas Katzman84a75642015-06-19 14:55:19 +00003986}
3987
Douglas Katzmand6e597c2015-09-17 19:56:40 +00003988Tool *MyriadToolChain::buildLinker() const {
3989 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00003990}
Dan Gohmanc2853072015-09-03 22:51:53 +00003991
3992bool WebAssembly::IsMathErrnoDefault() const { return false; }
3993
3994bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
3995
3996bool WebAssembly::UseObjCMixedDispatch() const { return true; }
3997
3998bool WebAssembly::isPICDefault() const { return false; }
3999
4000bool WebAssembly::isPIEDefault() const { return false; }
4001
4002bool WebAssembly::isPICDefaultForced() const { return false; }
4003
4004bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4005
4006// TODO: Support Objective C stuff.
4007bool WebAssembly::SupportsObjCGC() const { return false; }
4008
4009bool WebAssembly::hasBlocksRuntime() const { return false; }
4010
4011// TODO: Support profiling.
4012bool WebAssembly::SupportsProfiling() const { return false; }
4013
4014void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4015 ArgStringList &CC1Args) const {
4016 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4017 options::OPT_fno_use_init_array, true))
4018 CC1Args.push_back("-fuse-init-array");
4019}