blob: 54201aab703f7a6bca4700ea8c4716589aeccead [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(
Roman Divacky326d9982013-12-06 18:32:18 +00001173 const Driver &D, const llvm::Triple &TargetTriple, const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001174 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1175 ? TargetTriple.get64BitArchVariant()
1176 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001177 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001178 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001179 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001180 SmallVector<StringRef, 16> CandidateTripleAliases;
1181 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001182 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1183 CandidateTripleAliases, CandidateBiarchLibDirs,
1184 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001185
1186 // Compute the set of prefixes for our search.
1187 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1188 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001189
Rafael Espindola1af7c212012-02-19 01:38:32 +00001190 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1191 if (GCCToolchainDir != "") {
1192 if (GCCToolchainDir.back() == '/')
1193 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001194
Rafael Espindola1af7c212012-02-19 01:38:32 +00001195 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001196 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001197 // If we have a SysRoot, try that first.
1198 if (!D.SysRoot.empty()) {
1199 Prefixes.push_back(D.SysRoot);
1200 Prefixes.push_back(D.SysRoot + "/usr");
1201 }
1202
1203 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001204 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001205
1206 // And finally in /usr.
1207 if (D.SysRoot.empty())
1208 Prefixes.push_back("/usr");
Rafael Espindolac29af942012-02-03 01:01:20 +00001209 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001210
1211 // Loop over the various components which exist and select the best GCC
1212 // installation available. GCC installs are ranked by version number.
1213 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001214 for (const std::string &Prefix : Prefixes) {
1215 if (!llvm::sys::fs::exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001216 continue;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001217 for (const StringRef Suffix : CandidateLibDirs) {
1218 const std::string LibDir = Prefix + Suffix.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001219 if (!llvm::sys::fs::exists(LibDir))
1220 continue;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001221 for (const StringRef Candidate : CandidateTripleAliases)
1222 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001223 }
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001224 for (const StringRef Suffix : CandidateBiarchLibDirs) {
1225 const std::string LibDir = Prefix + Suffix.str();
Chandler Carruth866faab2012-01-25 07:21:38 +00001226 if (!llvm::sys::fs::exists(LibDir))
1227 continue;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001228 for (const StringRef Candidate : CandidateBiarchTripleAliases)
1229 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001230 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001231 }
1232 }
1233}
1234
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001235void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001236 for (const auto &InstallPath : CandidateGCCInstallPaths)
1237 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001238
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001239 if (!GCCInstallPath.empty())
1240 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1241
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001242 for (const auto &Multilib : Multilibs)
1243 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001244
1245 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1246 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001247}
1248
1249bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1250 if (BiarchSibling.hasValue()) {
1251 M = BiarchSibling.getValue();
1252 return true;
1253 }
1254 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001255}
1256
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001257/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001258 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001259 SmallVectorImpl<StringRef> &LibDirs,
1260 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001261 SmallVectorImpl<StringRef> &BiarchLibDirs,
1262 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001263 // Declare a bunch of static data sets that we'll select between below. These
1264 // are specifically designed to always refer to string literals to avoid any
1265 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001266 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1267 static const char *const AArch64Triples[] = {
1268 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1269 "aarch64-redhat-linux"};
1270 static const char *const AArch64beLibDirs[] = {"/lib"};
1271 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1272 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001273
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001274 static const char *const ARMLibDirs[] = {"/lib"};
1275 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1276 "arm-linux-androideabi"};
1277 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1278 "armv7hl-redhat-linux-gnueabi"};
1279 static const char *const ARMebLibDirs[] = {"/lib"};
1280 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1281 "armeb-linux-androideabi"};
1282 static const char *const ARMebHFTriples[] = {
1283 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001284
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001285 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001286 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001287 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1288 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1289 "x86_64-redhat-linux", "x86_64-suse-linux",
1290 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1291 "x86_64-slackware-linux", "x86_64-linux-android",
1292 "x86_64-unknown-linux"};
1293 static const char *const X32LibDirs[] = {"/libx32"};
1294 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001295 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001296 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1297 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1298 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1299 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1300 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001301
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001302 static const char *const MIPSLibDirs[] = {"/lib"};
1303 static const char *const MIPSTriples[] = {
1304 "mips-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu"};
1305 static const char *const MIPSELLibDirs[] = {"/lib"};
1306 static const char *const MIPSELTriples[] = {
1307 "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001308
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001309 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1310 static const char *const MIPS64Triples[] = {
1311 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1312 "mips64-linux-gnuabi64"};
1313 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1314 static const char *const MIPS64ELTriples[] = {
1315 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1316 "mips64el-linux-android", "mips64el-linux-gnuabi64"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001317
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001318 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001319 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001320 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1321 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1322 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1323 static const char *const PPC64Triples[] = {
1324 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1325 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1326 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1327 static const char *const PPC64LETriples[] = {
1328 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1329 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001330
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001331 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1332 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1333 "sparcv8-linux-gnu"};
1334 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1335 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1336 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001337
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001338 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001339 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001340 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1341 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001342
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001343 using std::begin;
1344 using std::end;
1345
Chandler Carruth866faab2012-01-25 07:21:38 +00001346 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001347 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001348 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1349 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1350 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1351 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001352 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001353 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001354 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1355 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1356 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1357 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001358 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001359 case llvm::Triple::arm:
1360 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001361 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001362 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001363 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001364 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001365 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001366 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001367 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001368 case llvm::Triple::armeb:
1369 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001370 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001371 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001372 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001373 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001374 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001375 }
1376 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001377 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001378 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1379 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1380 // x32 is always available when x86_64 is available, so adding it as
1381 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001382 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001383 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1384 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001385 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001386 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1387 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001388 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001389 break;
1390 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001391 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1392 TripleAliases.append(begin(X86Triples), end(X86Triples));
1393 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1394 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001395 break;
1396 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001397 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1398 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1399 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1400 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001401 break;
1402 case llvm::Triple::mipsel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001403 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1404 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1405 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1406 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1407 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001408 break;
1409 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001410 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1411 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1412 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1413 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001414 break;
1415 case llvm::Triple::mips64el:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001416 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1417 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1418 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1419 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1420 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001421 break;
1422 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001423 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1424 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1425 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1426 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001427 break;
1428 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001429 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1430 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1431 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1432 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001433 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001434 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001435 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1436 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001437 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001438 case llvm::Triple::sparc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001439 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1440 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1441 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1442 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001443 break;
1444 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001445 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1446 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1447 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1448 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001449 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001450 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001451 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1452 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001453 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001454
1455 default:
1456 // By default, just rely on the standard lib directories and the original
1457 // triple.
1458 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001459 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001460
1461 // Always append the drivers target triple to the end, in case it doesn't
1462 // match any of our aliases.
1463 TripleAliases.push_back(TargetTriple.str());
1464
1465 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001466 if (TargetTriple.str() != BiarchTriple.str())
1467 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001468}
1469
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001470namespace {
1471// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001472class FilterNonExistent {
1473 StringRef Base;
1474
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001475public:
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001476 FilterNonExistent(StringRef Base) : Base(Base) {}
1477 bool operator()(const Multilib &M) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001478 return !llvm::sys::fs::exists(Base + M.gccSuffix() + "/crtbegin.o");
1479 }
1480};
1481} // end anonymous namespace
1482
1483static void addMultilibFlag(bool Enabled, const char *const Flag,
1484 std::vector<std::string> &Flags) {
1485 if (Enabled)
1486 Flags.push_back(std::string("+") + Flag);
1487 else
1488 Flags.push_back(std::string("-") + Flag);
1489}
1490
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001491static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001492 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1493 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1494}
1495
1496static bool isMips32(llvm::Triple::ArchType Arch) {
1497 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1498}
1499
1500static bool isMips64(llvm::Triple::ArchType Arch) {
1501 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1502}
1503
1504static bool isMipsEL(llvm::Triple::ArchType Arch) {
1505 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1506}
1507
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001508static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001509 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001510 return A && A->getOption().matches(options::OPT_mips16);
1511}
1512
1513static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001514 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001515 return A && A->getOption().matches(options::OPT_mmicromips);
1516}
1517
Simon Atanasyan60280b42014-05-12 07:37:51 +00001518struct DetectedMultilibs {
1519 /// The set of multilibs that the detected installation supports.
1520 MultilibSet Multilibs;
1521
1522 /// The primary multilib appropriate for the given flags.
1523 Multilib SelectedMultilib;
1524
1525 /// On Biarch systems, this corresponds to the default multilib when
1526 /// targeting the non-default multilib. Otherwise, it is empty.
1527 llvm::Optional<Multilib> BiarchSibling;
1528};
1529
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001530static Multilib makeMultilib(StringRef commonSuffix) {
1531 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1532}
1533
Simon Atanasyan60280b42014-05-12 07:37:51 +00001534static bool findMIPSMultilibs(const llvm::Triple &TargetTriple, StringRef Path,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001535 const ArgList &Args, DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001536 // Some MIPS toolchains put libraries and object files compiled
1537 // using different options in to the sub-directoris which names
1538 // reflects the flags used for compilation. For example sysroot
1539 // directory might looks like the following examples:
1540 //
1541 // /usr
1542 // /lib <= crt*.o files compiled with '-mips32'
1543 // /mips16
1544 // /usr
1545 // /lib <= crt*.o files compiled with '-mips16'
1546 // /el
1547 // /usr
1548 // /lib <= crt*.o files compiled with '-mips16 -EL'
1549 //
1550 // or
1551 //
1552 // /usr
1553 // /lib <= crt*.o files compiled with '-mips32r2'
1554 // /mips16
1555 // /usr
1556 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1557 // /mips32
1558 // /usr
1559 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001560
Alp Tokerf45fa3d2014-02-25 04:21:44 +00001561 FilterNonExistent NonExistent(Path);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001562
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001563 // Check for FSF toolchain multilibs
1564 MultilibSet FSFMipsMultilibs;
1565 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001566 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001567 .flag("+m32")
1568 .flag("-m64")
1569 .flag("-mmicromips")
1570 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001571
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001572 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001573 .flag("+m32")
1574 .flag("-m64")
1575 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001576
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001577 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001578 .flag("-m32")
1579 .flag("+m64")
1580 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001581
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001582 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1583 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001584
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001585 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001586 .flag("+m32")
1587 .flag("-m64")
1588 .flag("-mmicromips")
1589 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001590
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001591 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001592
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001593 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001594
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001595 auto MAbi64 =
1596 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001597
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001598 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001599
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001600 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001601
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001602 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001603
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001604 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001605
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001606 FSFMipsMultilibs =
1607 MultilibSet()
1608 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1609 MArchDefault)
1610 .Maybe(UCLibc)
1611 .Maybe(Mips16)
1612 .FilterOut("/mips64/mips16")
1613 .FilterOut("/mips64r2/mips16")
1614 .FilterOut("/micromips/mips16")
1615 .Maybe(MAbi64)
1616 .FilterOut("/micromips/64")
1617 .FilterOut("/mips32/64")
1618 .FilterOut("^/64")
1619 .FilterOut("/mips16/64")
1620 .Either(BigEndian, LittleEndian)
1621 .Maybe(SoftFloat)
1622 .Maybe(Nan2008)
1623 .FilterOut(".*sof/nan2008")
1624 .FilterOut(NonExistent)
1625 .setIncludeDirsCallback([](StringRef InstallDir,
1626 StringRef TripleStr, const Multilib &M) {
1627 std::vector<std::string> Dirs;
1628 Dirs.push_back((InstallDir + "/include").str());
1629 std::string SysRootInc =
1630 InstallDir.str() + "/../../../../sysroot";
1631 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1632 Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1633 else
1634 Dirs.push_back(SysRootInc + "/usr/include");
1635 return Dirs;
1636 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001637 }
1638
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001639 // Check for Code Sourcery toolchain multilibs
1640 MultilibSet CSMipsMultilibs;
1641 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001642 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001643
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001644 auto MArchMicroMips =
1645 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001646
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001647 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001648
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001649 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001650
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001651 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001652
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001653 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001654
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001655 auto DefaultFloat =
1656 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001657
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001658 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001659
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001660 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001661
1662 // Note that this one's osSuffix is ""
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001663 auto MAbi64 = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001664 .gccSuffix("/64")
1665 .includeSuffix("/64")
1666 .flag("+mabi=n64")
1667 .flag("-mabi=n32")
1668 .flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001669
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001670 CSMipsMultilibs =
1671 MultilibSet()
1672 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1673 .Maybe(UCLibc)
1674 .Either(SoftFloat, Nan2008, DefaultFloat)
1675 .FilterOut("/micromips/nan2008")
1676 .FilterOut("/mips16/nan2008")
1677 .Either(BigEndian, LittleEndian)
1678 .Maybe(MAbi64)
1679 .FilterOut("/mips16.*/64")
1680 .FilterOut("/micromips.*/64")
1681 .FilterOut(NonExistent)
1682 .setIncludeDirsCallback([](StringRef InstallDir,
1683 StringRef TripleStr, const Multilib &M) {
1684 std::vector<std::string> Dirs;
1685 Dirs.push_back((InstallDir + "/include").str());
1686 std::string SysRootInc =
1687 InstallDir.str() + "/../../../../" + TripleStr.str();
1688 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1689 Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1690 else
1691 Dirs.push_back(SysRootInc + "/libc/usr/include");
1692 return Dirs;
1693 });
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001694 }
1695
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001696 MultilibSet AndroidMipsMultilibs =
1697 MultilibSet()
1698 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1699 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1700 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001701
1702 MultilibSet DebianMipsMultilibs;
1703 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001704 Multilib MAbiN32 =
1705 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001706
1707 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001708 .gccSuffix("/64")
1709 .includeSuffix("/64")
1710 .flag("+m64")
1711 .flag("-m32")
1712 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001713
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001714 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001715
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001716 DebianMipsMultilibs =
1717 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001718 }
1719
Daniel Sanders2bf13662014-07-10 14:40:57 +00001720 MultilibSet ImgMultilibs;
1721 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001722 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001723
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001724 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001725
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001726 auto MAbi64 =
1727 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001728
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001729 ImgMultilibs =
1730 MultilibSet()
1731 .Maybe(Mips64r6)
1732 .Maybe(MAbi64)
1733 .Maybe(LittleEndian)
1734 .FilterOut(NonExistent)
1735 .setIncludeDirsCallback([](StringRef InstallDir,
1736 StringRef TripleStr, const Multilib &M) {
1737 std::vector<std::string> Dirs;
1738 Dirs.push_back((InstallDir + "/include").str());
1739 Dirs.push_back(
1740 (InstallDir + "/../../../../sysroot/usr/include").str());
1741 return Dirs;
1742 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00001743 }
1744
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001745 StringRef CPUName;
1746 StringRef ABIName;
1747 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
1748
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001749 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1750
1751 Multilib::flags_list Flags;
1752 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
1753 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
1754 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001755 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001756 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
1757 CPUName == "mips32r5",
1758 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00001759 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001760 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001761 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
1762 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001763 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001764 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001765 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00001766 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
1767 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001768 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
1769 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001770 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001771 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001772 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001773 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001774
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001775 if (TargetTriple.getEnvironment() == llvm::Triple::Android) {
1776 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00001777 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
1778 Result.Multilibs = AndroidMipsMultilibs;
1779 return true;
1780 }
1781 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001782 }
1783
Daniel Sanders2bf13662014-07-10 14:40:57 +00001784 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1785 TargetTriple.getOS() == llvm::Triple::Linux &&
1786 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
1787 // Select mips-img-linux-gnu toolchain.
1788 if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
1789 Result.Multilibs = ImgMultilibs;
1790 return true;
1791 }
1792 return false;
1793 }
1794
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001795 // Sort candidates. Toolchain that best meets the directories goes first.
1796 // Then select the first toolchains matches command line flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001797 MultilibSet *candidates[] = {&DebianMipsMultilibs, &FSFMipsMultilibs,
1798 &CSMipsMultilibs};
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001799 std::sort(
1800 std::begin(candidates), std::end(candidates),
1801 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
1802 for (const auto &candidate : candidates) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001803 if (candidate->select(Flags, Result.SelectedMultilib)) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001804 if (candidate == &DebianMipsMultilibs)
Simon Atanasyan60280b42014-05-12 07:37:51 +00001805 Result.BiarchSibling = Multilib();
1806 Result.Multilibs = *candidate;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001807 return true;
1808 }
1809 }
1810
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00001811 {
1812 // Fallback to the regular toolchain-tree structure.
1813 Multilib Default;
1814 Result.Multilibs.push_back(Default);
1815 Result.Multilibs.FilterOut(NonExistent);
1816
1817 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
1818 Result.BiarchSibling = Multilib();
1819 return true;
1820 }
1821 }
1822
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001823 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001824}
1825
Simon Atanasyan60280b42014-05-12 07:37:51 +00001826static bool findBiarchMultilibs(const llvm::Triple &TargetTriple,
1827 StringRef Path, const ArgList &Args,
1828 bool NeedsBiarchSuffix,
1829 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001830
1831 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
1832 // in what would normally be GCCInstallPath and put the 64-bit
1833 // libs in a subdirectory named 64. The simple logic we follow is that
1834 // *if* there is a subdirectory of the right name with crtbegin.o in it,
1835 // we use that. If not, and if not a biarch triple alias, we look for
1836 // crtbegin.o without the subdirectory.
1837
1838 Multilib Default;
1839 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001840 .gccSuffix("/64")
1841 .includeSuffix("/64")
1842 .flag("-m32")
1843 .flag("+m64")
1844 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001845 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001846 .gccSuffix("/32")
1847 .includeSuffix("/32")
1848 .flag("+m32")
1849 .flag("-m64")
1850 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00001851 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001852 .gccSuffix("/x32")
1853 .includeSuffix("/x32")
1854 .flag("-m32")
1855 .flag("-m64")
1856 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001857
Alp Tokerf45fa3d2014-02-25 04:21:44 +00001858 FilterNonExistent NonExistent(Path);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001859
Zinovy Nis1db95732014-07-10 15:27:19 +00001860 // Determine default multilib from: 32, 64, x32
1861 // Also handle cases such as 64 on 32, 32 on 64, etc.
1862 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00001863 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00001864 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00001865 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001866 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00001867 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001868 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00001869 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001870 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00001871 if (TargetTriple.isArch32Bit())
1872 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001873 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00001874 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001875 else
Zinovy Nis1db95732014-07-10 15:27:19 +00001876 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00001877 }
1878
Zinovy Nis1db95732014-07-10 15:27:19 +00001879 if (Want == WANT32)
1880 Default.flag("+m32").flag("-m64").flag("-mx32");
1881 else if (Want == WANT64)
1882 Default.flag("-m32").flag("+m64").flag("-mx32");
1883 else if (Want == WANTX32)
1884 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001885 else
Zinovy Nis1db95732014-07-10 15:27:19 +00001886 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001887
Simon Atanasyan60280b42014-05-12 07:37:51 +00001888 Result.Multilibs.push_back(Default);
1889 Result.Multilibs.push_back(Alt64);
1890 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00001891 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001892
Simon Atanasyan60280b42014-05-12 07:37:51 +00001893 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001894
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001895 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001896 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001897 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001898 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001899
Simon Atanasyan60280b42014-05-12 07:37:51 +00001900 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001901 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001902
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001903 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00001904 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00001905 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001906
1907 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001908}
1909
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001910void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001911 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00001912 const std::string &LibDir, StringRef CandidateTriple,
1913 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001914 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001915 // There are various different suffixes involving the triple we
1916 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00001917 // up to the lib directory. Specifically, the number of "up" steps
1918 // in the second half of each row is 1 + the number of path separators
1919 // in the first half.
1920 const std::string LibAndInstallSuffixes[][2] = {
1921 {"/gcc/" + CandidateTriple.str(), "/../../.."},
1922
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001923 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00001924 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
1925
1926 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
1927 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001928
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001929 // The Freescale PPC SDK has the gcc libraries in
1930 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00001931 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00001932
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001933 // Ubuntu has a strange mis-matched pair of triples that this happens to
1934 // match.
1935 // FIXME: It may be worthwhile to generalize this and look for a second
1936 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00001937 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
1938
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001939 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00001940 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
1941 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00001942 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00001943 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00001944 std::error_code EC;
Chandler Carruth866faab2012-01-25 07:21:38 +00001945 for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001946 !EC && LI != LE; LI = LI.increment(EC)) {
1947 StringRef VersionText = llvm::sys::path::filename(LI->path());
1948 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00001949 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
1950 if (!CandidateGCCInstallPaths.insert(LI->path()).second)
1951 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001952 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001953 continue;
1954 if (CandidateVersion <= Version)
1955 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00001956
Simon Atanasyan60280b42014-05-12 07:37:51 +00001957 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001958
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001959 // Debian mips multilibs behave more like the rest of the biarch ones,
1960 // so handle them there
1961 if (isMipsArch(TargetArch)) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001962 if (!findMIPSMultilibs(TargetTriple, LI->path(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001963 continue;
1964 } else if (!findBiarchMultilibs(TargetTriple, LI->path(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00001965 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001966 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00001967 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001968
Simon Atanasyan60280b42014-05-12 07:37:51 +00001969 Multilibs = Detected.Multilibs;
1970 SelectedMultilib = Detected.SelectedMultilib;
1971 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001972 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00001973 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001974 // FIXME: We hack together the directory name here instead of
1975 // using LI to ensure stable path separators across Windows and
1976 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00001977 GCCInstallPath =
1978 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
1979 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001980 IsValid = true;
1981 }
1982 }
1983}
1984
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001985Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00001986 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001987 : ToolChain(D, Triple, Args), GCCInstallation() {
Daniel Dunbar88979912010-08-01 22:29:51 +00001988 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00001989 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00001990 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00001991}
1992
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001993Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001994
Rafael Espindola7cf32212013-03-20 03:05:54 +00001995Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00001996 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00001997 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00001998 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00001999 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002000 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002001 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002002 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002003 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002004 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002005 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002006 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002007 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002008}
2009
Rafael Espindola7cf32212013-03-20 03:05:54 +00002010Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002011 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002012}
2013
Douglas Katzman95354292015-06-23 20:42:09 +00002014Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002015
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002016void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2017 // Print the information about how we detected the GCC installation.
2018 GCCInstallation.print(OS);
2019}
2020
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002021bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002022 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002023}
2024
David Majnemer17f448b2015-06-28 04:23:33 +00002025bool Generic_GCC::isPICDefault() const {
2026 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2027}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002028
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002029bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002030
David Majnemer17f448b2015-06-28 04:23:33 +00002031bool Generic_GCC::isPICDefaultForced() const {
2032 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2033}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002034
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002035bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002036 switch (getTriple().getArch()) {
2037 case llvm::Triple::x86:
2038 case llvm::Triple::x86_64:
2039 case llvm::Triple::aarch64:
2040 case llvm::Triple::aarch64_be:
2041 case llvm::Triple::arm:
2042 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002043 case llvm::Triple::bpfel:
2044 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002045 case llvm::Triple::thumb:
2046 case llvm::Triple::thumbeb:
2047 case llvm::Triple::ppc:
2048 case llvm::Triple::ppc64:
2049 case llvm::Triple::ppc64le:
2050 case llvm::Triple::sparc:
2051 case llvm::Triple::sparcel:
2052 case llvm::Triple::sparcv9:
2053 case llvm::Triple::systemz:
2054 return true;
2055 default:
2056 return false;
2057 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002058}
2059
Kristof Beylsfb387292014-01-10 13:44:34 +00002060void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2061 ArgStringList &CC1Args) const {
2062 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002063 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002064 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002065 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002066 (getTriple().getOS() == llvm::Triple::Linux &&
2067 (!V.isOlderThan(4, 7, 0) ||
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002068 getTriple().getEnvironment() == llvm::Triple::Android)) ||
2069 getTriple().getOS() == llvm::Triple::NaCl;
Kristof Beylsfb387292014-01-10 13:44:34 +00002070
2071 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002072 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002073 CC1Args.push_back("-fuse-init-array");
2074}
2075
Tony Linthicum76329bf2011-12-12 21:14:55 +00002076/// Hexagon Toolchain
2077
Douglas Katzman54366072015-07-27 16:53:08 +00002078std::string HexagonToolChain::GetGnuDir(const std::string &InstalledDir,
2079 const ArgList &Args) {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002080 // Locate the rest of the toolchain ...
Samuel Antaoc909c992014-11-07 17:48:03 +00002081 std::string GccToolchain = getGCCToolchainDir(Args);
2082
2083 if (!GccToolchain.empty())
2084 return GccToolchain;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002085
2086 std::string InstallRelDir = InstalledDir + "/../../gnu";
2087 if (llvm::sys::fs::exists(InstallRelDir))
2088 return InstallRelDir;
2089
2090 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
2091 if (llvm::sys::fs::exists(PrefixRelDir))
2092 return PrefixRelDir;
2093
2094 return InstallRelDir;
2095}
2096
Douglas Katzman54366072015-07-27 16:53:08 +00002097const char *HexagonToolChain::GetSmallDataThreshold(const ArgList &Args) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002098 Arg *A;
2099
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002100 A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002101 options::OPT_msmall_data_threshold_EQ);
2102 if (A)
2103 return A->getValue();
2104
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002105 A = Args.getLastArg(options::OPT_shared, options::OPT_fpic,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002106 options::OPT_fPIC);
2107 if (A)
2108 return "0";
2109
2110 return 0;
2111}
2112
Douglas Katzman54366072015-07-27 16:53:08 +00002113bool HexagonToolChain::UsesG0(const char *smallDataThreshold) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002114 return smallDataThreshold && smallDataThreshold[0] == '0';
2115}
2116
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002117static void GetHexagonLibraryPaths(const ArgList &Args, const std::string &Ver,
2118 const std::string &MarchString,
2119 const std::string &InstalledDir,
2120 ToolChain::path_list *LibPaths) {
Matthew Curtise689b052012-12-06 15:46:07 +00002121 bool buildingLib = Args.hasArg(options::OPT_shared);
2122
2123 //----------------------------------------------------------------------------
2124 // -L Args
2125 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002126 for (Arg *A : Args.filtered(options::OPT_L))
2127 for (const char *Value : A->getValues())
2128 LibPaths->push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002129
2130 //----------------------------------------------------------------------------
2131 // Other standard paths
2132 //----------------------------------------------------------------------------
2133 const std::string MarchSuffix = "/" + MarchString;
2134 const std::string G0Suffix = "/G0";
2135 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Douglas Katzman54366072015-07-27 16:53:08 +00002136 const std::string RootDir =
2137 HexagonToolChain::GetGnuDir(InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00002138
2139 // lib/gcc/hexagon/...
2140 std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
2141 if (buildingLib) {
2142 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
2143 LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
2144 }
2145 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
2146 LibPaths->push_back(LibGCCHexagonDir + Ver);
2147
2148 // lib/gcc/...
2149 LibPaths->push_back(RootDir + "lib/gcc");
2150
2151 // hexagon/lib/...
2152 std::string HexagonLibDir = RootDir + "hexagon/lib";
2153 if (buildingLib) {
2154 LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
2155 LibPaths->push_back(HexagonLibDir + G0Suffix);
2156 }
2157 LibPaths->push_back(HexagonLibDir + MarchSuffix);
2158 LibPaths->push_back(HexagonLibDir);
2159}
2160
Douglas Katzman54366072015-07-27 16:53:08 +00002161HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
2162 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002163 : Linux(D, Triple, Args) {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002164 const std::string InstalledDir(getDriver().getInstalledDir());
Douglas Katzman54366072015-07-27 16:53:08 +00002165 const std::string GnuDir = HexagonToolChain::GetGnuDir(InstalledDir, Args);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002166
2167 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2168 // program paths
2169 const std::string BinDir(GnuDir + "/bin");
2170 if (llvm::sys::fs::exists(BinDir))
2171 getProgramPaths().push_back(BinDir);
2172
2173 // Determine version of GCC libraries and headers to use.
2174 const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
Rafael Espindolac0809172014-06-12 14:02:15 +00002175 std::error_code ec;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002176 GCCVersion MaxVersion = GCCVersion::Parse("0.0.0");
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002177 for (llvm::sys::fs::directory_iterator di(HexagonDir, ec), de;
2178 !ec && di != de; di = di.increment(ec)) {
2179 GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->path()));
2180 if (MaxVersion < cv)
2181 MaxVersion = cv;
2182 }
2183 GCCLibAndIncVersion = MaxVersion;
Matthew Curtise689b052012-12-06 15:46:07 +00002184
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002185 ToolChain::path_list *LibPaths = &getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002186
2187 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2188 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2189 // support 'linux' we'll need to fix this up
2190 LibPaths->clear();
2191
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002192 GetHexagonLibraryPaths(Args, GetGCCLibAndIncVersion(), GetTargetCPU(Args),
2193 InstalledDir, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002194}
2195
Douglas Katzman54366072015-07-27 16:53:08 +00002196HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002197
Douglas Katzman54366072015-07-27 16:53:08 +00002198Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002199 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002200}
2201
Douglas Katzman54366072015-07-27 16:53:08 +00002202Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002203 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002204}
2205
Douglas Katzman54366072015-07-27 16:53:08 +00002206void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2207 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002208 const Driver &D = getDriver();
2209
2210 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2211 DriverArgs.hasArg(options::OPT_nostdlibinc))
2212 return;
2213
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002214 std::string Ver(GetGCCLibAndIncVersion());
Douglas Katzman54366072015-07-27 16:53:08 +00002215 std::string GnuDir = HexagonToolChain::GetGnuDir(D.InstalledDir, DriverArgs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002216 std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
2217 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
2218 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
2219 addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002220}
2221
Douglas Katzman54366072015-07-27 16:53:08 +00002222void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2223 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002224 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2225 DriverArgs.hasArg(options::OPT_nostdincxx))
2226 return;
2227
2228 const Driver &D = getDriver();
2229 std::string Ver(GetGCCLibAndIncVersion());
Samuel Antaoc909c992014-11-07 17:48:03 +00002230 SmallString<128> IncludeDir(
Douglas Katzman54366072015-07-27 16:53:08 +00002231 HexagonToolChain::GetGnuDir(D.InstalledDir, DriverArgs));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002232
Rafael Espindola358256c2013-06-26 02:13:00 +00002233 llvm::sys::path::append(IncludeDir, "hexagon/include/c++/");
2234 llvm::sys::path::append(IncludeDir, Ver);
Yaron Keren92e1b622015-03-18 10:17:07 +00002235 addSystemInclude(DriverArgs, CC1Args, IncludeDir);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002236}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002237
Matthew Curtise689b052012-12-06 15:46:07 +00002238ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002239HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002240 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2241 if (!A)
2242 return ToolChain::CST_Libstdcxx;
2243
2244 StringRef Value = A->getValue();
2245 if (Value != "libstdc++") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002246 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002247 }
2248
2249 return ToolChain::CST_Libstdcxx;
2250}
2251
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002252static int getHexagonVersion(const ArgList &Args) {
2253 Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ);
2254 // Select the default CPU (v4) if none was given.
2255 if (!A)
2256 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002257
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002258 // FIXME: produce errors if we cannot parse the version.
2259 StringRef WhichHexagon = A->getValue();
2260 if (WhichHexagon.startswith("hexagonv")) {
2261 int Val;
2262 if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val))
2263 return Val;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002264 }
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002265 if (WhichHexagon.startswith("v")) {
2266 int Val;
2267 if (!WhichHexagon.substr(1).getAsInteger(10, Val))
2268 return Val;
2269 }
2270
2271 // FIXME: should probably be an error.
2272 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002273}
2274
Douglas Katzman54366072015-07-27 16:53:08 +00002275StringRef HexagonToolChain::GetTargetCPU(const ArgList &Args) {
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002276 int V = getHexagonVersion(Args);
2277 // FIXME: We don't support versions < 4. We should error on them.
2278 switch (V) {
2279 default:
2280 llvm_unreachable("Unexpected version");
2281 case 5:
2282 return "v5";
2283 case 4:
2284 return "v4";
2285 case 3:
2286 return "v3";
2287 case 2:
2288 return "v2";
2289 case 1:
2290 return "v1";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002291 }
Matthew Curtisf10a5952012-12-06 14:16:43 +00002292}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002293// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002294
Tom Stellard8fa33092015-07-18 01:49:05 +00002295/// AMDGPU Toolchain
2296AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2297 const ArgList &Args)
2298 : Generic_ELF(D, Triple, Args) { }
2299
2300Tool *AMDGPUToolChain::buildLinker() const {
2301 return new tools::amdgpu::Linker(*this);
2302}
2303// End AMDGPU
2304
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002305/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00002306NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2307 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002308 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002309
2310 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2311 // default paths, and must instead only use the paths provided
2312 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002313 path_list &file_paths = getFilePaths();
2314 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002315
2316 file_paths.clear();
2317 prog_paths.clear();
2318
2319 // Path for library files (libc.a, ...)
2320 std::string FilePath(getDriver().Dir + "/../");
2321
2322 // Path for tools (clang, ld, etc..)
2323 std::string ProgPath(getDriver().Dir + "/../");
2324
2325 // Path for toolchain libraries (libgcc.a, ...)
2326 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2327
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002328 switch (Triple.getArch()) {
2329 case llvm::Triple::x86: {
2330 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00002331 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002332 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2333 file_paths.push_back(ToolPath + "i686-nacl");
2334 break;
2335 }
2336 case llvm::Triple::x86_64: {
2337 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2338 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2339 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2340 file_paths.push_back(ToolPath + "x86_64-nacl");
2341 break;
2342 }
2343 case llvm::Triple::arm: {
2344 file_paths.push_back(FilePath + "arm-nacl/lib");
2345 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2346 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2347 file_paths.push_back(ToolPath + "arm-nacl");
2348 break;
2349 }
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002350 case llvm::Triple::mipsel: {
2351 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2352 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2353 prog_paths.push_back(ProgPath + "bin");
2354 file_paths.push_back(ToolPath + "mipsel-nacl");
2355 break;
2356 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002357 default:
2358 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002359 }
2360
2361 // Use provided linker, not system linker
Derek Schuffef465d72015-08-24 23:53:25 +00002362 Linker = GetLinkerPath();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002363 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2364}
2365
Douglas Katzman54366072015-07-27 16:53:08 +00002366void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2367 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002368 const Driver &D = getDriver();
2369 if (DriverArgs.hasArg(options::OPT_nostdinc))
2370 return;
2371
2372 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2373 SmallString<128> P(D.ResourceDir);
2374 llvm::sys::path::append(P, "include");
2375 addSystemInclude(DriverArgs, CC1Args, P.str());
2376 }
2377
2378 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2379 return;
2380
2381 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002382 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00002383 case llvm::Triple::x86:
2384 // x86 is special because multilib style uses x86_64-nacl/include for libc
2385 // headers but the SDK wants i686-nacl/usr/include. The other architectures
2386 // have the same substring.
2387 llvm::sys::path::append(P, "i686-nacl/usr/include");
2388 addSystemInclude(DriverArgs, CC1Args, P.str());
2389 llvm::sys::path::remove_filename(P);
2390 llvm::sys::path::remove_filename(P);
2391 llvm::sys::path::remove_filename(P);
2392 llvm::sys::path::append(P, "x86_64-nacl/include");
2393 addSystemInclude(DriverArgs, CC1Args, P.str());
2394 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002395 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002396 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002397 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002398 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002399 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002400 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002401 case llvm::Triple::mipsel:
2402 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2403 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002404 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002405 return;
2406 }
2407
2408 addSystemInclude(DriverArgs, CC1Args, P.str());
2409 llvm::sys::path::remove_filename(P);
2410 llvm::sys::path::remove_filename(P);
2411 llvm::sys::path::append(P, "include");
2412 addSystemInclude(DriverArgs, CC1Args, P.str());
2413}
2414
Douglas Katzman54366072015-07-27 16:53:08 +00002415void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2416 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002417 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2418 // if the value is libc++, and emits an error for other values.
2419 GetCXXStdlibType(Args);
2420 CmdArgs.push_back("-lc++");
2421}
2422
Douglas Katzman54366072015-07-27 16:53:08 +00002423void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2424 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002425 const Driver &D = getDriver();
2426 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2427 DriverArgs.hasArg(options::OPT_nostdincxx))
2428 return;
2429
2430 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2431 // if the value is libc++, and emits an error for other values.
2432 GetCXXStdlibType(DriverArgs);
2433
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002434 SmallString<128> P(D.Dir + "/../");
2435 switch (getTriple().getArch()) {
2436 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002437 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2438 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002439 break;
2440 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002441 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2442 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002443 break;
2444 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002445 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2446 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002447 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002448 case llvm::Triple::mipsel:
2449 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2450 addSystemInclude(DriverArgs, CC1Args, P.str());
2451 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002452 default:
2453 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002454 }
2455}
2456
Douglas Katzman54366072015-07-27 16:53:08 +00002457ToolChain::CXXStdlibType
2458NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002459 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2460 StringRef Value = A->getValue();
2461 if (Value == "libc++")
2462 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002463 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002464 }
2465
2466 return ToolChain::CST_Libcxx;
2467}
2468
Douglas Katzman54366072015-07-27 16:53:08 +00002469std::string
2470NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2471 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002472 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2473 if (TheTriple.getArch() == llvm::Triple::arm &&
2474 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2475 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2476 return TheTriple.getTriple();
2477}
2478
Douglas Katzman54366072015-07-27 16:53:08 +00002479Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002480 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002481}
2482
Douglas Katzman54366072015-07-27 16:53:08 +00002483Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002484 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002485 return new tools::nacltools::AssemblerARM(*this);
2486 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002487}
2488// End NaCl
2489
Chris Lattner09797542010-03-04 21:07:38 +00002490/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2491/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2492/// Currently does not support anything else but compilation.
2493
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002494TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002495 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002496 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002497 // Path mangling to find libexec
2498 std::string Path(getDriver().Dir);
2499
2500 Path += "/../libexec";
2501 getProgramPaths().push_back(Path);
2502}
2503
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002504TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002505
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002506bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002507
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002508bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002509
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002510bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002511
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002512bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002513
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002514// CloudABI - CloudABI tool chain which can call ld(1) directly.
2515
2516CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2517 const ArgList &Args)
2518 : Generic_ELF(D, Triple, Args) {
2519 SmallString<128> P(getDriver().Dir);
2520 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2521 getFilePaths().push_back(P.str());
2522}
2523
2524void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2525 ArgStringList &CC1Args) const {
2526 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2527 DriverArgs.hasArg(options::OPT_nostdincxx))
2528 return;
2529
2530 SmallString<128> P(getDriver().Dir);
2531 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2532 addSystemInclude(DriverArgs, CC1Args, P.str());
2533}
2534
2535void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
2536 ArgStringList &CmdArgs) const {
2537 CmdArgs.push_back("-lc++");
2538 CmdArgs.push_back("-lc++abi");
2539 CmdArgs.push_back("-lunwind");
2540}
2541
Douglas Katzman95354292015-06-23 20:42:09 +00002542Tool *CloudABI::buildLinker() const {
2543 return new tools::cloudabi::Linker(*this);
2544}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002545
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002546/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
2547
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002548OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
2549 const ArgList &Args)
2550 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00002551 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002552 getFilePaths().push_back("/usr/lib");
2553}
2554
Rafael Espindola7cf32212013-03-20 03:05:54 +00002555Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002556 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002557}
2558
Douglas Katzman95354292015-06-23 20:42:09 +00002559Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002560
Eli Friedman9fa28852012-08-08 23:57:20 +00002561/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
2562
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002563Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2564 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00002565 getFilePaths().push_back(getDriver().Dir + "/../lib");
2566 getFilePaths().push_back("/usr/lib");
2567}
2568
Rafael Espindola7cf32212013-03-20 03:05:54 +00002569Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002570 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002571}
2572
Douglas Katzman95354292015-06-23 20:42:09 +00002573Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00002574
Douglas Katzman95354292015-06-23 20:42:09 +00002575ToolChain::CXXStdlibType Bitrig::GetCXXStdlibType(const ArgList &Args) const {
Richard Smith51af5192014-05-01 23:24:24 +00002576 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2577 StringRef Value = A->getValue();
2578 if (Value == "libstdc++")
2579 return ToolChain::CST_Libstdcxx;
2580 if (Value == "libc++")
2581 return ToolChain::CST_Libcxx;
2582
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002583 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Richard Smith51af5192014-05-01 23:24:24 +00002584 }
2585 return ToolChain::CST_Libcxx;
2586}
2587
Eli Friedman9fa28852012-08-08 23:57:20 +00002588void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2589 ArgStringList &CC1Args) const {
2590 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2591 DriverArgs.hasArg(options::OPT_nostdincxx))
2592 return;
2593
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002594 switch (GetCXXStdlibType(DriverArgs)) {
2595 case ToolChain::CST_Libcxx:
2596 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00002597 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002598 break;
2599 case ToolChain::CST_Libstdcxx:
2600 addSystemInclude(DriverArgs, CC1Args,
2601 getDriver().SysRoot + "/usr/include/c++/stdc++");
2602 addSystemInclude(DriverArgs, CC1Args,
2603 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00002604
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002605 StringRef Triple = getTriple().str();
2606 if (Triple.startswith("amd64"))
2607 addSystemInclude(DriverArgs, CC1Args,
2608 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002609 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002610 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002611 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
2612 "/usr/include/c++/stdc++/" +
2613 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002614 break;
2615 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002616}
2617
2618void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
2619 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002620 switch (GetCXXStdlibType(Args)) {
2621 case ToolChain::CST_Libcxx:
2622 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00002623 CmdArgs.push_back("-lc++abi");
2624 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002625 break;
2626 case ToolChain::CST_Libstdcxx:
2627 CmdArgs.push_back("-lstdc++");
2628 break;
2629 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002630}
2631
Daniel Dunbare24297c2009-03-30 21:06:03 +00002632/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
2633
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002634FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
2635 const ArgList &Args)
2636 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00002637
Chandler Carruth0b1756b2012-01-26 01:35:15 +00002638 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
2639 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002640 if ((Triple.getArch() == llvm::Triple::x86 ||
2641 Triple.getArch() == llvm::Triple::ppc) &&
Chandler Carruth0b1756b2012-01-26 01:35:15 +00002642 llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002643 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
2644 else
2645 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00002646}
2647
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002648ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
David Chisnall867ccd82013-11-09 15:10:56 +00002649 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2650 StringRef Value = A->getValue();
2651 if (Value == "libstdc++")
2652 return ToolChain::CST_Libstdcxx;
2653 if (Value == "libc++")
2654 return ToolChain::CST_Libcxx;
2655
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002656 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
David Chisnall867ccd82013-11-09 15:10:56 +00002657 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002658 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00002659 return ToolChain::CST_Libcxx;
2660 return ToolChain::CST_Libstdcxx;
2661}
2662
2663void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2664 ArgStringList &CC1Args) const {
2665 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2666 DriverArgs.hasArg(options::OPT_nostdincxx))
2667 return;
2668
2669 switch (GetCXXStdlibType(DriverArgs)) {
2670 case ToolChain::CST_Libcxx:
2671 addSystemInclude(DriverArgs, CC1Args,
2672 getDriver().SysRoot + "/usr/include/c++/v1");
2673 break;
2674 case ToolChain::CST_Libstdcxx:
2675 addSystemInclude(DriverArgs, CC1Args,
2676 getDriver().SysRoot + "/usr/include/c++/4.2");
2677 addSystemInclude(DriverArgs, CC1Args,
2678 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
2679 break;
2680 }
2681}
2682
Rafael Espindola7cf32212013-03-20 03:05:54 +00002683Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002684 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002685}
2686
Douglas Katzman95354292015-06-23 20:42:09 +00002687Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00002688
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002689bool FreeBSD::UseSjLjExceptions() const {
2690 // FreeBSD uses SjLj exceptions on ARM oabi.
2691 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00002692 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002693 case llvm::Triple::GNUEABI:
2694 case llvm::Triple::EABI:
2695 return false;
2696
2697 default:
2698 return (getTriple().getArch() == llvm::Triple::arm ||
2699 getTriple().getArch() == llvm::Triple::thumb);
2700 }
2701}
2702
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002703bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002704
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002705bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002706
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00002707SanitizerMask FreeBSD::getSupportedSanitizers() const {
2708 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
2709 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
2710 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
2711 getTriple().getArch() == llvm::Triple::mips64el;
2712 SanitizerMask Res = ToolChain::getSupportedSanitizers();
2713 Res |= SanitizerKind::Address;
2714 Res |= SanitizerKind::Vptr;
2715 if (IsX86_64 || IsMIPS64) {
2716 Res |= SanitizerKind::Leak;
2717 Res |= SanitizerKind::Thread;
2718 }
2719 if (IsX86 || IsX86_64) {
2720 Res |= SanitizerKind::SafeStack;
2721 }
2722 return Res;
2723}
2724
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002725/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
2726
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002727NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2728 : Generic_ELF(D, Triple, Args) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002729
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00002730 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00002731 // When targeting a 32-bit platform, try the special directory used on
2732 // 64-bit hosts, and only fall back to the main library directory if that
2733 // doesn't work.
2734 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
2735 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002736 switch (Triple.getArch()) {
2737 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00002738 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002739 break;
2740 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00002741 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002742 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00002743 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002744 switch (Triple.getEnvironment()) {
2745 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002746 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002747 getFilePaths().push_back("=/usr/lib/eabi");
2748 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00002749 case llvm::Triple::EABIHF:
2750 case llvm::Triple::GNUEABIHF:
2751 getFilePaths().push_back("=/usr/lib/eabihf");
2752 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002753 default:
2754 getFilePaths().push_back("=/usr/lib/oabi");
2755 break;
2756 }
2757 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002758 case llvm::Triple::mips64:
2759 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002760 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002761 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002762 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002763 getFilePaths().push_back("=/usr/lib/64");
2764 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00002765 case llvm::Triple::ppc:
2766 getFilePaths().push_back("=/usr/lib/powerpc");
2767 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00002768 case llvm::Triple::sparc:
2769 getFilePaths().push_back("=/usr/lib/sparc");
2770 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002771 default:
2772 break;
2773 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00002774
2775 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002776 }
2777}
2778
Rafael Espindola7cf32212013-03-20 03:05:54 +00002779Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002780 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002781}
2782
Douglas Katzman95354292015-06-23 20:42:09 +00002783Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002784
Douglas Katzman95354292015-06-23 20:42:09 +00002785ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002786 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2787 StringRef Value = A->getValue();
2788 if (Value == "libstdc++")
2789 return ToolChain::CST_Libstdcxx;
2790 if (Value == "libc++")
2791 return ToolChain::CST_Libcxx;
2792
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002793 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002794 }
2795
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002796 unsigned Major, Minor, Micro;
2797 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00002798 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002799 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00002800 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00002801 case llvm::Triple::arm:
2802 case llvm::Triple::armeb:
2803 case llvm::Triple::thumb:
2804 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00002805 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00002806 case llvm::Triple::ppc64:
2807 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002808 case llvm::Triple::x86:
2809 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002810 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002811 default:
2812 break;
2813 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002814 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002815 return ToolChain::CST_Libstdcxx;
2816}
2817
2818void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2819 ArgStringList &CC1Args) const {
2820 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2821 DriverArgs.hasArg(options::OPT_nostdincxx))
2822 return;
2823
2824 switch (GetCXXStdlibType(DriverArgs)) {
2825 case ToolChain::CST_Libcxx:
2826 addSystemInclude(DriverArgs, CC1Args,
2827 getDriver().SysRoot + "/usr/include/c++/");
2828 break;
2829 case ToolChain::CST_Libstdcxx:
2830 addSystemInclude(DriverArgs, CC1Args,
2831 getDriver().SysRoot + "/usr/include/g++");
2832 addSystemInclude(DriverArgs, CC1Args,
2833 getDriver().SysRoot + "/usr/include/g++/backward");
2834 break;
2835 }
2836}
2837
Chris Lattner3e2ee142010-07-07 16:01:42 +00002838/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
2839
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002840Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2841 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00002842 getFilePaths().push_back(getDriver().Dir + "/../lib");
2843 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00002844}
2845
Rafael Espindola7cf32212013-03-20 03:05:54 +00002846Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002847 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002848}
2849
Douglas Katzman95354292015-06-23 20:42:09 +00002850Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00002851
David Chisnallf571cde2012-02-15 13:39:01 +00002852/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
2853
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002854Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002855 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002856 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00002857
2858 getProgramPaths().push_back(getDriver().getInstalledDir());
2859 if (getDriver().getInstalledDir() != getDriver().Dir)
2860 getProgramPaths().push_back(getDriver().Dir);
2861
2862 getFilePaths().push_back(getDriver().Dir + "/../lib");
2863 getFilePaths().push_back("/usr/lib");
2864}
2865
Rafael Espindola7cf32212013-03-20 03:05:54 +00002866Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002867 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002868}
2869
Douglas Katzman95354292015-06-23 20:42:09 +00002870Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00002871
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002872/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00002873
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002874enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00002875 // NB: Releases of a particular Linux distro should be kept together
2876 // in this enum, because some tests are done by integer comparison against
2877 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00002878 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002879 DebianLenny,
2880 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00002881 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00002882 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002883 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00002884 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00002885 RHEL4,
2886 RHEL5,
2887 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002888 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00002889 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00002890 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00002891 UbuntuHardy,
2892 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00002893 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00002894 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002895 UbuntuLucid,
2896 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00002897 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00002898 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00002899 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00002900 UbuntuQuantal,
2901 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00002902 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00002903 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002904 UbuntuUtopic,
2905 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00002906 UbuntuWily,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002907 UnknownDistro
2908};
2909
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002910static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002911 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002912}
2913
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002914static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002915
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002916static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002917 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002918}
2919
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002920static bool IsUbuntu(enum Distro Distro) {
Benjamin Kramer2d469802015-07-09 15:31:17 +00002921 return Distro >= UbuntuHardy && Distro <= UbuntuWily;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002922}
2923
Rafael Espindolaa8398552013-10-28 23:14:34 +00002924static Distro DetectDistro(llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00002925 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
2926 llvm::MemoryBuffer::getFile("/etc/lsb-release");
2927 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002928 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00002929 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002930 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002931 Distro Version = UnknownDistro;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002932 for (const StringRef Line : Lines)
2933 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
2934 Version = llvm::StringSwitch<Distro>(Line.substr(17))
2935 .Case("hardy", UbuntuHardy)
2936 .Case("intrepid", UbuntuIntrepid)
2937 .Case("jaunty", UbuntuJaunty)
2938 .Case("karmic", UbuntuKarmic)
2939 .Case("lucid", UbuntuLucid)
2940 .Case("maverick", UbuntuMaverick)
2941 .Case("natty", UbuntuNatty)
2942 .Case("oneiric", UbuntuOneiric)
2943 .Case("precise", UbuntuPrecise)
2944 .Case("quantal", UbuntuQuantal)
2945 .Case("raring", UbuntuRaring)
2946 .Case("saucy", UbuntuSaucy)
2947 .Case("trusty", UbuntuTrusty)
2948 .Case("utopic", UbuntuUtopic)
2949 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00002950 .Case("wily", UbuntuWily)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002951 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00002952 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002953 }
2954
Rafael Espindola2d2b4202014-07-06 17:43:24 +00002955 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
2956 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002957 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00002958 if (Data.startswith("Fedora release"))
2959 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00002960 if (Data.startswith("Red Hat Enterprise Linux") ||
2961 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002962 if (Data.find("release 7") != StringRef::npos)
2963 return RHEL7;
2964 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00002965 return RHEL6;
2966 else if (Data.find("release 5") != StringRef::npos)
2967 return RHEL5;
2968 else if (Data.find("release 4") != StringRef::npos)
2969 return RHEL4;
2970 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002971 return UnknownDistro;
2972 }
2973
Rafael Espindola2d2b4202014-07-06 17:43:24 +00002974 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
2975 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002976 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002977 if (Data[0] == '5')
2978 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00002979 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002980 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002981 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00002982 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002983 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00002984 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002985 else if (Data.startswith("stretch/sid") || Data[0] == '9')
2986 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002987 return UnknownDistro;
2988 }
2989
Rafael Espindolaa8398552013-10-28 23:14:34 +00002990 if (llvm::sys::fs::exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00002991 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002992
Rafael Espindolaa8398552013-10-28 23:14:34 +00002993 if (llvm::sys::fs::exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00002994 return Exherbo;
2995
Rafael Espindolaa8398552013-10-28 23:14:34 +00002996 if (llvm::sys::fs::exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00002997 return ArchLinux;
2998
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002999 return UnknownDistro;
3000}
3001
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003002/// \brief Get our best guess at the multiarch triple for a target.
3003///
3004/// Debian-based systems are starting to use a multiarch setup where they use
3005/// a target-triple directory in the library and header search paths.
3006/// Unfortunately, this triple does not align with the vanilla target triple,
3007/// so we provide a rough mapping here.
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00003008static std::string getMultiarchTriple(const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003009 StringRef SysRoot) {
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003010 llvm::Triple::EnvironmentType TargetEnvironment = TargetTriple.getEnvironment();
3011
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003012 // For most architectures, just use whatever we have rather than trying to be
3013 // clever.
3014 switch (TargetTriple.getArch()) {
3015 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003016 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003017
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003018 // We use the existence of '/lib/<triple>' as a directory to detect some
3019 // common linux triples that don't quite match the Clang triple for both
3020 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3021 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003022 case llvm::Triple::arm:
3023 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003024 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003025 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf"))
3026 return "arm-linux-gnueabihf";
3027 } else {
3028 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi"))
3029 return "arm-linux-gnueabi";
3030 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003031 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003032 case llvm::Triple::armeb:
3033 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003034 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003035 if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
3036 return "armeb-linux-gnueabihf";
3037 } else {
3038 if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabi"))
3039 return "armeb-linux-gnueabi";
3040 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003041 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003042 case llvm::Triple::x86:
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003043 if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
3044 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003045 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003046 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003047 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003048 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00003049 llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003050 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003051 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003052 case llvm::Triple::aarch64:
3053 if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64-linux-gnu"))
3054 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003055 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003056 case llvm::Triple::aarch64_be:
3057 if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
3058 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003059 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003060 case llvm::Triple::mips:
3061 if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu"))
3062 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003063 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003064 case llvm::Triple::mipsel:
3065 if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu"))
3066 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003067 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003068 case llvm::Triple::mips64:
3069 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnu"))
3070 return "mips64-linux-gnu";
3071 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
3072 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003073 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003074 case llvm::Triple::mips64el:
3075 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnu"))
3076 return "mips64el-linux-gnu";
3077 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
3078 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003079 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003080 case llvm::Triple::ppc:
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003081 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
3082 return "powerpc-linux-gnuspe";
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003083 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu"))
3084 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003085 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003086 case llvm::Triple::ppc64:
3087 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu"))
3088 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003089 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003090 case llvm::Triple::ppc64le:
3091 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
3092 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003093 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003094 case llvm::Triple::sparc:
3095 if (llvm::sys::fs::exists(SysRoot + "/lib/sparc-linux-gnu"))
3096 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003097 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003098 case llvm::Triple::sparcv9:
3099 if (llvm::sys::fs::exists(SysRoot + "/lib/sparc64-linux-gnu"))
3100 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003101 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003102 case llvm::Triple::systemz:
3103 if (llvm::sys::fs::exists(SysRoot + "/lib/s390x-linux-gnu"))
3104 return "s390x-linux-gnu";
3105 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003106 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003107 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003108}
3109
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003110static void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003111 if (llvm::sys::fs::exists(Path))
3112 Paths.push_back(Path.str());
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003113}
3114
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003115static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003116 if (isMipsArch(Triple.getArch())) {
3117 // lib32 directory has a special meaning on MIPS targets.
3118 // It contains N32 ABI binaries. Use this folder if produce
3119 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003120 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003121 return "lib32";
3122 return Triple.isArch32Bit() ? "lib" : "lib64";
3123 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003124
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003125 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003126 // using that variant while targeting other architectures causes problems
3127 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003128 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003129 // them when we know we may need it.
3130 //
3131 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003132 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003133 // GCCInstallationDetector, but that is a more significant refactoring.
3134 if (Triple.getArch() == llvm::Triple::x86 ||
3135 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003136 return "lib32";
3137
Zinovy Nis1db95732014-07-10 15:27:19 +00003138 if (Triple.getArch() == llvm::Triple::x86_64 &&
3139 Triple.getEnvironment() == llvm::Triple::GNUX32)
3140 return "libx32";
3141
Simon Atanasyand4413882012-09-14 11:27:24 +00003142 return Triple.isArch32Bit() ? "lib" : "lib64";
3143}
3144
Rafael Espindola1af7c212012-02-19 01:38:32 +00003145Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003146 : Generic_ELF(D, Triple, Args) {
Roman Divacky326d9982013-12-06 18:32:18 +00003147 GCCInstallation.init(D, Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003148 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003149 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003150 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003151
Rafael Espindola10a63c22013-07-03 14:14:00 +00003152 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003153 // least) put various tools in a triple-prefixed directory off of the parent
3154 // of the GCC installation. We use the GCC triple here to ensure that we end
3155 // up with tools that support the same amount of cross compiling as the
3156 // detected GCC installation. For example, if we find a GCC installation
3157 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3158 // used to target i386.
3159 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003160 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003161 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003162 GCCInstallation.getTriple().str() + "/bin")
3163 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003164
Logan Chieneb9162f2014-06-26 14:23:45 +00003165 Linker = GetLinkerPath();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003166
Rafael Espindolaa8398552013-10-28 23:14:34 +00003167 Distro Distro = DetectDistro(Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003168
Rafael Espindola10a63c22013-07-03 14:14:00 +00003169 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003170 ExtraOpts.push_back("-z");
3171 ExtraOpts.push_back("relro");
3172 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003173
Douglas Gregord9bb1522011-03-06 19:11:49 +00003174 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003175 ExtraOpts.push_back("-X");
3176
Logan Chienc6fd8202012-09-02 09:30:11 +00003177 const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003178 const bool IsMips = isMipsArch(Arch);
3179
3180 if (IsMips && !SysRoot.empty())
3181 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003182
Chandler Carruth0b842912011-12-09 04:45:18 +00003183 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3184 // and the MIPS ABI require .dynsym to be sorted in different ways.
3185 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3186 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003187 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003188 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003189 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003190 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003191 ExtraOpts.push_back("--hash-style=gnu");
3192
Rafael Espindola10a63c22013-07-03 14:14:00 +00003193 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003194 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3195 ExtraOpts.push_back("--hash-style=both");
3196 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003197
Chris Lattner84e38552011-05-22 05:36:06 +00003198 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003199 ExtraOpts.push_back("--no-add-needed");
3200
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003201 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003202 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003203 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003204 ExtraOpts.push_back("--build-id");
3205
Rafael Espindola10a63c22013-07-03 14:14:00 +00003206 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003207 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003208
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003209 // The selection of paths to try here is designed to match the patterns which
3210 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3211 // This was determined by running GCC in a fake filesystem, creating all
3212 // possible permutations of these directories, and seeing which ones it added
3213 // to the link paths.
3214 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003215
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003216 const std::string OSLibDir = getOSLibDir(Triple, Args);
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003217 const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003218
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003219 // Add the multilib suffixed paths where they are available.
3220 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003221 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003222 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003223 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003224
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003225 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003226 // a biarch-like suffix of the GCC installation.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003227 addPathIfExists((GCCInstallation.getInstallPath() + Multilib.gccSuffix()),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003228 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003229
3230 // GCC cross compiling toolchains will install target libraries which ship
3231 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3232 // any part of the GCC installation in
3233 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3234 // debatable, but is the reality today. We need to search this tree even
3235 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003236 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003237 // installation that is *not* within the system root to ensure two things:
3238 //
3239 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003240 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003241 // appropriate rpath.
3242 // 2) There must not be libraries installed into
3243 // <prefix>/<triple>/<libdir> unless they should be preferred over
3244 // those within the system root.
3245 //
3246 // Note that this matches the GCC behavior. See the below comment for where
3247 // Clang diverges from GCC's behavior.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003248 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + OSLibDir +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003249 Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003250 Paths);
3251
Chandler Carruth69a125b2012-04-06 16:32:06 +00003252 // If the GCC installation we found is inside of the sysroot, we want to
3253 // prefer libraries installed in the parent prefix of the GCC installation.
3254 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003255 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003256 // This usually happens when there is an external cross compiler on the
3257 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003258 // the cross. Note that GCC does include some of these directories in some
3259 // configurations but this seems somewhere between questionable and simply
3260 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003261 if (StringRef(LibPath).startswith(SysRoot)) {
Chandler Carruth69a125b2012-04-06 16:32:06 +00003262 addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003263 addPathIfExists(LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003264 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003265 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003266
3267 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003268 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003269 // those searched.
3270 // FIXME: It's not clear whether we should use the driver's installed
3271 // directory ('Dir' below) or the ResourceDir.
3272 if (StringRef(D.Dir).startswith(SysRoot)) {
3273 addPathIfExists(D.Dir + "/../lib/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003274 addPathIfExists(D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003275 }
3276
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003277 addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003278 addPathIfExists(SysRoot + "/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003279 addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003280 addPathIfExists(SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003281
Chandler Carruthb427c562013-06-22 11:35:51 +00003282 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003283 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003284 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003285 addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003286 "/../../" + OSLibDir,
3287 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003288
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003289 // Add the 'other' biarch variant path
3290 Multilib BiarchSibling;
3291 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003292 addPathIfExists(
3293 GCCInstallation.getInstallPath() + BiarchSibling.gccSuffix(), Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003294 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003295
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003296 // See comments above on the multilib variant for details of why this is
3297 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003298 const std::string &LibPath = GCCInstallation.getParentLibPath();
3299 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3300 const Multilib &Multilib = GCCInstallation.getMultilib();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003301 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib" +
3302 Multilib.osSuffix(),
3303 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003304
3305 // See comments above on the multilib variant for details of why this is
3306 // only included from within the sysroot.
3307 if (StringRef(LibPath).startswith(SysRoot))
Chandler Carruth69a125b2012-04-06 16:32:06 +00003308 addPathIfExists(LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003309 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003310
3311 // Similar to the logic for GCC above, if we are currently running Clang
3312 // inside of the requested system root, add its parent library path to those
3313 // searched.
3314 // FIXME: It's not clear whether we should use the driver's installed
3315 // directory ('Dir' below) or the ResourceDir.
3316 if (StringRef(D.Dir).startswith(SysRoot))
3317 addPathIfExists(D.Dir + "/../lib", Paths);
3318
Chandler Carruth2a649c72011-10-03 06:41:08 +00003319 addPathIfExists(SysRoot + "/lib", Paths);
3320 addPathIfExists(SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003321}
3322
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003323bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003324
Douglas Katzman95354292015-06-23 20:42:09 +00003325Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003326
3327Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003328 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003329}
3330
Simon Atanasyana0d89572013-10-05 14:37:55 +00003331std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003332 if (!getDriver().SysRoot.empty())
3333 return getDriver().SysRoot;
3334
3335 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3336 return std::string();
3337
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003338 // Standalone MIPS toolchains use different names for sysroot folder
3339 // and put it into different places. Here we try to check some known
3340 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003341
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003342 const StringRef InstallDir = GCCInstallation.getInstallPath();
3343 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003344 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003345
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003346 std::string Path =
3347 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3348 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003349
3350 if (llvm::sys::fs::exists(Path))
3351 return Path;
3352
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003353 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003354
3355 if (llvm::sys::fs::exists(Path))
3356 return Path;
3357
3358 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003359}
3360
Chandler Carrutha796f532011-11-05 20:17:13 +00003361void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3362 ArgStringList &CC1Args) const {
3363 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003364 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003365
3366 if (DriverArgs.hasArg(options::OPT_nostdinc))
3367 return;
3368
3369 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003370 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003371
3372 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003373 SmallString<128> P(D.ResourceDir);
3374 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003375 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003376 }
3377
3378 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3379 return;
3380
3381 // Check for configure-time C include directories.
3382 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3383 if (CIncludeDirs != "") {
3384 SmallVector<StringRef, 5> dirs;
3385 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003386 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003387 StringRef Prefix =
3388 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003389 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003390 }
3391 return;
3392 }
3393
3394 // Lacking those, try to detect the correct set of system includes for the
3395 // target triple.
3396
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003397 // Add include directories specific to the selected multilib set and multilib.
3398 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003399 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003400 if (Callback) {
3401 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3402 GCCInstallation.getTriple().str(),
3403 GCCInstallation.getMultilib());
3404 for (const auto &Path : IncludePaths)
3405 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3406 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003407 }
3408
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003409 // Implement generic Debian multiarch support.
3410 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003411 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003412
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003413 // FIXME: These are older forms of multiarch. It's not clear that they're
3414 // in use in any released version of Debian, so we should consider
3415 // removing them.
3416 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003417 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003418 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003419
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003420 // FIXME: These are older forms of multiarch. It's not clear that they're
3421 // in use in any released version of Debian, so we should consider
3422 // removing them.
3423 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3424 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003425 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003426 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003427 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003428 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003429 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003430 "/usr/include/arm-linux-gnueabihf"};
3431 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003432 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003433 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003434 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003435 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003436 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003437 "/usr/include/mips64el-linux-gnu",
3438 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003439 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003440 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003441 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003442 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003443 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003444 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003445 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003446 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003447 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003448 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003449 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
3450 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003451 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003452 switch (getTriple().getArch()) {
3453 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003454 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003455 break;
3456 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003457 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003458 break;
3459 case llvm::Triple::aarch64:
3460 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003461 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003462 break;
3463 case llvm::Triple::arm:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003464 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3465 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3466 else
3467 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003468 break;
3469 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00003470 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003471 break;
3472 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00003473 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003474 break;
3475 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003476 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003477 break;
3478 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003479 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003480 break;
3481 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003482 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003483 break;
3484 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003485 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003486 break;
3487 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003488 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003489 break;
3490 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00003491 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003492 break;
3493 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00003494 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003495 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003496 case llvm::Triple::systemz:
3497 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
3498 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003499 default:
3500 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003501 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003502 for (StringRef Dir : MultiarchIncludeDirs) {
3503 if (llvm::sys::fs::exists(SysRoot + Dir)) {
3504 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003505 break;
3506 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003507 }
3508
3509 if (getTriple().getOS() == llvm::Triple::RTEMS)
3510 return;
3511
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003512 // Add an include of '/include' directly. This isn't provided by default by
3513 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
3514 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003515 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003516
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003517 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003518}
3519
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003520/// \brief Helper to add the variant paths of a libstdc++ installation.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003521/*static*/ bool Linux::addLibStdCXXIncludePaths(
3522 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
3523 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
3524 const ArgList &DriverArgs, ArgStringList &CC1Args) {
Chandler Carruthc26a79d2014-08-27 18:21:27 +00003525 if (!llvm::sys::fs::exists(Base + Suffix))
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003526 return false;
Chandler Carrutha796f532011-11-05 20:17:13 +00003527
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003528 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003529
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003530 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
3531 // that path exists or we have neither a GCC nor target multiarch triple, use
3532 // this vanilla search path.
3533 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
3534 llvm::sys::fs::exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
3535 addSystemInclude(DriverArgs, CC1Args,
3536 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
3537 } else {
3538 // Otherwise try to use multiarch naming schemes which have normalized the
3539 // triples and put the triple before the suffix.
3540 //
3541 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
3542 // the target triple, so we support that here.
3543 addSystemInclude(DriverArgs, CC1Args,
3544 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
3545 addSystemInclude(DriverArgs, CC1Args,
3546 Base + "/" + TargetMultiarchTriple + Suffix);
3547 }
3548
3549 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003550 return true;
3551}
3552
Chandler Carrutha796f532011-11-05 20:17:13 +00003553void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3554 ArgStringList &CC1Args) const {
3555 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3556 DriverArgs.hasArg(options::OPT_nostdincxx))
3557 return;
3558
Chandler Carruthf4701732011-11-07 09:01:17 +00003559 // Check if libc++ has been enabled and provide its include paths if so.
3560 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003561 const std::string LibCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003562 // The primary location is within the Clang installation.
3563 // FIXME: We shouldn't hard code 'v1' here to make Clang future proof to
3564 // newer ABI versions.
3565 getDriver().Dir + "/../include/c++/v1",
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003566
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003567 // We also check the system as for a long time this is the only place
3568 // Clang looked.
3569 // FIXME: We should really remove this. It doesn't make any sense.
3570 getDriver().SysRoot + "/usr/include/c++/v1"};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003571 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
3572 if (!llvm::sys::fs::exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003573 continue;
3574 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003575 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003576 break;
3577 }
Chandler Carruthf4701732011-11-07 09:01:17 +00003578 return;
3579 }
3580
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00003581 // We need a detected GCC installation on Linux to provide libstdc++'s
3582 // headers. We handled the libc++ case above.
3583 if (!GCCInstallation.isValid())
3584 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00003585
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003586 // By default, look for the C++ headers in an include directory adjacent to
3587 // the lib directory of the GCC installation. Note that this is expect to be
3588 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
3589 StringRef LibDir = GCCInstallation.getParentLibPath();
3590 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003591 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003592 const Multilib &Multilib = GCCInstallation.getMultilib();
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003593 const std::string GCCMultiarchTriple =
3594 getMultiarchTriple(GCCInstallation.getTriple(), getDriver().SysRoot);
3595 const std::string TargetMultiarchTriple =
3596 getMultiarchTriple(getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00003597 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003598
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003599 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00003600 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003601 "/c++/" + Version.Text, TripleStr,
3602 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003603 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003604 return;
3605
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003606 // Otherwise, fall back on a bunch of options which don't use multiarch
3607 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003608 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003609 // Gentoo is weird and places its headers inside the GCC install,
3610 // so if the first attempt to find the headers fails, try these patterns.
3611 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
3612 Version.MinorStr,
3613 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
3614 // Android standalone toolchain has C++ headers in yet another place.
3615 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
3616 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
3617 // without a subdirectory corresponding to the gcc version.
3618 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003619 };
3620
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003621 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003622 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
3623 /*GCCMultiarchTriple*/ "",
3624 /*TargetMultiarchTriple*/ "",
3625 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003626 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003627 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003628}
3629
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003630bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003631
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003632SanitizerMask Linux::getSupportedSanitizers() const {
3633 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3634 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3635 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3636 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00003637 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
3638 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003639 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
3640 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003641 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3642 Res |= SanitizerKind::Address;
3643 Res |= SanitizerKind::KernelAddress;
3644 Res |= SanitizerKind::Vptr;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003645 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003646 Res |= SanitizerKind::DataFlow;
Renato Golind45c2df2015-08-05 18:42:41 +00003647 if (IsX86_64 || IsMIPS64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003648 Res |= SanitizerKind::Leak;
Renato Golind45c2df2015-08-05 18:42:41 +00003649 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003650 Res |= SanitizerKind::Thread;
Jay Foade967dd02015-06-25 10:35:19 +00003651 if (IsX86_64 || IsMIPS64 || IsPowerPC64)
3652 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003653 if (IsX86 || IsX86_64) {
3654 Res |= SanitizerKind::Function;
3655 Res |= SanitizerKind::SafeStack;
3656 }
3657 return Res;
3658}
3659
Daniel Dunbarcc912342009-05-02 18:28:39 +00003660/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
3661
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003662DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
3663 const ArgList &Args)
3664 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00003665
3666 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00003667 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00003668 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00003669 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00003670
Daniel Dunbar083edf72009-12-21 18:54:17 +00003671 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00003672 getFilePaths().push_back("/usr/lib");
John McCall65b8da02013-04-11 22:55:55 +00003673 if (llvm::sys::fs::exists("/usr/lib/gcc47"))
3674 getFilePaths().push_back("/usr/lib/gcc47");
3675 else
3676 getFilePaths().push_back("/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00003677}
3678
Rafael Espindola7cf32212013-03-20 03:05:54 +00003679Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003680 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003681}
3682
3683Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003684 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00003685}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003686
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003687/// Stub for CUDA toolchain. At the moment we don't have assembler or
3688/// linker and need toolchain mainly to propagate device-side options
3689/// to CC1.
3690
3691CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
3692 const ArgList &Args)
3693 : Linux(D, Triple, Args) {}
3694
3695void
3696CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
3697 llvm::opt::ArgStringList &CC1Args) const {
3698 Linux::addClangTargetOptions(DriverArgs, CC1Args);
3699 CC1Args.push_back("-fcuda-is-device");
3700}
3701
3702llvm::opt::DerivedArgList *
3703CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
3704 const char *BoundArch) const {
3705 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
3706 const OptTable &Opts = getDriver().getOpts();
3707
3708 for (Arg *A : Args) {
3709 if (A->getOption().matches(options::OPT_Xarch__)) {
3710 // Skip this argument unless the architecture matches BoundArch
3711 if (A->getValue(0) != StringRef(BoundArch))
3712 continue;
3713
3714 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
3715 unsigned Prev = Index;
3716 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
3717
3718 // If the argument parsing failed or more than one argument was
3719 // consumed, the -Xarch_ argument's parameter tried to consume
3720 // extra arguments. Emit an error and ignore.
3721 //
3722 // We also want to disallow any options which would alter the
3723 // driver behavior; that isn't going to work in our model. We
3724 // use isDriverOption() as an approximation, although things
3725 // like -O4 are going to slip through.
3726 if (!XarchArg || Index > Prev + 1) {
3727 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
3728 << A->getAsString(Args);
3729 continue;
3730 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
3731 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
3732 << A->getAsString(Args);
3733 continue;
3734 }
3735 XarchArg->setBaseArg(A);
3736 A = XarchArg.release();
3737 DAL->AddSynthesizedArg(A);
3738 }
3739 DAL->append(A);
3740 }
3741
3742 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
3743 return DAL;
3744}
3745
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003746/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00003747XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
3748 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003749 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003750 // ProgramPaths are found via 'PATH' environment variable.
3751}
3752
Douglas Katzman54366072015-07-27 16:53:08 +00003753Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003754 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003755}
3756
Douglas Katzman54366072015-07-27 16:53:08 +00003757Tool *XCoreToolChain::buildLinker() const {
3758 return new tools::XCore::Linker(*this);
3759}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003760
Douglas Katzman54366072015-07-27 16:53:08 +00003761bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003762
Douglas Katzman54366072015-07-27 16:53:08 +00003763bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003764
Douglas Katzman54366072015-07-27 16:53:08 +00003765bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003766
Douglas Katzman54366072015-07-27 16:53:08 +00003767bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003768
Douglas Katzman54366072015-07-27 16:53:08 +00003769bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003770
Douglas Katzman54366072015-07-27 16:53:08 +00003771void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3772 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003773 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
3774 DriverArgs.hasArg(options::OPT_nostdlibinc))
3775 return;
3776 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
3777 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003778 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003779 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3780 ArrayRef<StringRef> DirVec(Dirs);
3781 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3782 }
3783}
3784
Douglas Katzman54366072015-07-27 16:53:08 +00003785void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
3786 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003787 CC1Args.push_back("-nostdsysteminc");
3788}
3789
Douglas Katzman54366072015-07-27 16:53:08 +00003790void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
3791 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003792 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00003793 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3794 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003795 return;
3796 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
3797 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003798 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003799 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3800 ArrayRef<StringRef> DirVec(Dirs);
3801 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3802 }
3803}
3804
Douglas Katzman54366072015-07-27 16:53:08 +00003805void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
3806 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003807 // We don't output any lib args. This is handled by xcc.
3808}
Douglas Katzman84a75642015-06-19 14:55:19 +00003809
3810// SHAVEToolChain does not call Clang's C compiler.
3811// We override SelectTool to avoid testing ShouldUseClangCompiler().
3812Tool *SHAVEToolChain::SelectTool(const JobAction &JA) const {
3813 switch (JA.getKind()) {
3814 case Action::CompileJobClass:
3815 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00003816 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00003817 return Compiler.get();
3818 case Action::AssembleJobClass:
3819 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00003820 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00003821 return Assembler.get();
3822 default:
3823 return ToolChain::getTool(JA.getKind());
3824 }
3825}
3826
3827SHAVEToolChain::SHAVEToolChain(const Driver &D, const llvm::Triple &Triple,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003828 const ArgList &Args)
Douglas Katzman84a75642015-06-19 14:55:19 +00003829 : Generic_GCC(D, Triple, Args) {}
3830
3831SHAVEToolChain::~SHAVEToolChain() {}
3832
3833/// Following are methods necessary to avoid having moviClang be an abstract
3834/// class.
3835
3836Tool *SHAVEToolChain::getTool(Action::ActionClass AC) const {
3837 // SelectTool() must find a tool using the method in the superclass.
3838 // There's nothing we can do if that fails.
3839 llvm_unreachable("SHAVEToolChain can't getTool");
3840}
3841
3842Tool *SHAVEToolChain::buildLinker() const {
3843 // SHAVEToolChain executables can not be linked except by the vendor tools.
3844 llvm_unreachable("SHAVEToolChain can't buildLinker");
3845}
3846
3847Tool *SHAVEToolChain::buildAssembler() const {
3848 // This one you'd think should be reachable since we expose an
3849 // assembler to the driver, except not the way it expects.
3850 llvm_unreachable("SHAVEToolChain can't buildAssembler");
3851}