blob: cb4ec03a4ca125c99eb4a28dbfc87c17fcddf8c6 [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) {
107 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
108 if (ArchKind == llvm::ARM::AK_INVALID)
109 return nullptr;
110 StringRef Arch = llvm::ARMTargetParser::getArchName(ArchKind);
111
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");
2331 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib32");
2332 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()) {
2383 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002384 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002385 break;
2386 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002387 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002388 break;
2389 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002390 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002391 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002392 case llvm::Triple::mipsel:
2393 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2394 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002395 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002396 return;
2397 }
2398
2399 addSystemInclude(DriverArgs, CC1Args, P.str());
2400 llvm::sys::path::remove_filename(P);
2401 llvm::sys::path::remove_filename(P);
2402 llvm::sys::path::append(P, "include");
2403 addSystemInclude(DriverArgs, CC1Args, P.str());
2404}
2405
Douglas Katzman54366072015-07-27 16:53:08 +00002406void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2407 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002408 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2409 // if the value is libc++, and emits an error for other values.
2410 GetCXXStdlibType(Args);
2411 CmdArgs.push_back("-lc++");
2412}
2413
Douglas Katzman54366072015-07-27 16:53:08 +00002414void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2415 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002416 const Driver &D = getDriver();
2417 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2418 DriverArgs.hasArg(options::OPT_nostdincxx))
2419 return;
2420
2421 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2422 // if the value is libc++, and emits an error for other values.
2423 GetCXXStdlibType(DriverArgs);
2424
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002425 SmallString<128> P(D.Dir + "/../");
2426 switch (getTriple().getArch()) {
2427 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002428 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2429 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002430 break;
2431 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002432 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2433 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002434 break;
2435 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002436 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2437 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002438 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002439 case llvm::Triple::mipsel:
2440 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2441 addSystemInclude(DriverArgs, CC1Args, P.str());
2442 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002443 default:
2444 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002445 }
2446}
2447
Douglas Katzman54366072015-07-27 16:53:08 +00002448ToolChain::CXXStdlibType
2449NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002450 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2451 StringRef Value = A->getValue();
2452 if (Value == "libc++")
2453 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002454 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002455 }
2456
2457 return ToolChain::CST_Libcxx;
2458}
2459
Douglas Katzman54366072015-07-27 16:53:08 +00002460std::string
2461NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2462 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002463 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2464 if (TheTriple.getArch() == llvm::Triple::arm &&
2465 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2466 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2467 return TheTriple.getTriple();
2468}
2469
Douglas Katzman54366072015-07-27 16:53:08 +00002470Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002471 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002472}
2473
Douglas Katzman54366072015-07-27 16:53:08 +00002474Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002475 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002476 return new tools::nacltools::AssemblerARM(*this);
2477 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002478}
2479// End NaCl
2480
Chris Lattner09797542010-03-04 21:07:38 +00002481/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2482/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2483/// Currently does not support anything else but compilation.
2484
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002485TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002486 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002487 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002488 // Path mangling to find libexec
2489 std::string Path(getDriver().Dir);
2490
2491 Path += "/../libexec";
2492 getProgramPaths().push_back(Path);
2493}
2494
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002495TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002496
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002497bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002498
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002499bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002500
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002501bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002502
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002503bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002504
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002505// CloudABI - CloudABI tool chain which can call ld(1) directly.
2506
2507CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2508 const ArgList &Args)
2509 : Generic_ELF(D, Triple, Args) {
2510 SmallString<128> P(getDriver().Dir);
2511 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2512 getFilePaths().push_back(P.str());
2513}
2514
2515void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2516 ArgStringList &CC1Args) const {
2517 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2518 DriverArgs.hasArg(options::OPT_nostdincxx))
2519 return;
2520
2521 SmallString<128> P(getDriver().Dir);
2522 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2523 addSystemInclude(DriverArgs, CC1Args, P.str());
2524}
2525
2526void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
2527 ArgStringList &CmdArgs) const {
2528 CmdArgs.push_back("-lc++");
2529 CmdArgs.push_back("-lc++abi");
2530 CmdArgs.push_back("-lunwind");
2531}
2532
Douglas Katzman95354292015-06-23 20:42:09 +00002533Tool *CloudABI::buildLinker() const {
2534 return new tools::cloudabi::Linker(*this);
2535}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002536
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002537/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
2538
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002539OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
2540 const ArgList &Args)
2541 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00002542 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002543 getFilePaths().push_back("/usr/lib");
2544}
2545
Rafael Espindola7cf32212013-03-20 03:05:54 +00002546Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002547 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002548}
2549
Douglas Katzman95354292015-06-23 20:42:09 +00002550Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002551
Eli Friedman9fa28852012-08-08 23:57:20 +00002552/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
2553
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002554Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2555 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00002556 getFilePaths().push_back(getDriver().Dir + "/../lib");
2557 getFilePaths().push_back("/usr/lib");
2558}
2559
Rafael Espindola7cf32212013-03-20 03:05:54 +00002560Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002561 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002562}
2563
Douglas Katzman95354292015-06-23 20:42:09 +00002564Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00002565
Douglas Katzman95354292015-06-23 20:42:09 +00002566ToolChain::CXXStdlibType Bitrig::GetCXXStdlibType(const ArgList &Args) const {
Richard Smith51af5192014-05-01 23:24:24 +00002567 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2568 StringRef Value = A->getValue();
2569 if (Value == "libstdc++")
2570 return ToolChain::CST_Libstdcxx;
2571 if (Value == "libc++")
2572 return ToolChain::CST_Libcxx;
2573
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002574 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Richard Smith51af5192014-05-01 23:24:24 +00002575 }
2576 return ToolChain::CST_Libcxx;
2577}
2578
Eli Friedman9fa28852012-08-08 23:57:20 +00002579void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2580 ArgStringList &CC1Args) const {
2581 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2582 DriverArgs.hasArg(options::OPT_nostdincxx))
2583 return;
2584
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002585 switch (GetCXXStdlibType(DriverArgs)) {
2586 case ToolChain::CST_Libcxx:
2587 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00002588 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002589 break;
2590 case ToolChain::CST_Libstdcxx:
2591 addSystemInclude(DriverArgs, CC1Args,
2592 getDriver().SysRoot + "/usr/include/c++/stdc++");
2593 addSystemInclude(DriverArgs, CC1Args,
2594 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00002595
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002596 StringRef Triple = getTriple().str();
2597 if (Triple.startswith("amd64"))
2598 addSystemInclude(DriverArgs, CC1Args,
2599 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002600 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002601 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002602 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
2603 "/usr/include/c++/stdc++/" +
2604 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002605 break;
2606 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002607}
2608
2609void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
2610 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002611 switch (GetCXXStdlibType(Args)) {
2612 case ToolChain::CST_Libcxx:
2613 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00002614 CmdArgs.push_back("-lc++abi");
2615 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002616 break;
2617 case ToolChain::CST_Libstdcxx:
2618 CmdArgs.push_back("-lstdc++");
2619 break;
2620 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002621}
2622
Daniel Dunbare24297c2009-03-30 21:06:03 +00002623/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
2624
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002625FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
2626 const ArgList &Args)
2627 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00002628
Chandler Carruth0b1756b2012-01-26 01:35:15 +00002629 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
2630 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002631 if ((Triple.getArch() == llvm::Triple::x86 ||
2632 Triple.getArch() == llvm::Triple::ppc) &&
Chandler Carruth0b1756b2012-01-26 01:35:15 +00002633 llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002634 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
2635 else
2636 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00002637}
2638
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002639ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
David Chisnall867ccd82013-11-09 15:10:56 +00002640 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2641 StringRef Value = A->getValue();
2642 if (Value == "libstdc++")
2643 return ToolChain::CST_Libstdcxx;
2644 if (Value == "libc++")
2645 return ToolChain::CST_Libcxx;
2646
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002647 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
David Chisnall867ccd82013-11-09 15:10:56 +00002648 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002649 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00002650 return ToolChain::CST_Libcxx;
2651 return ToolChain::CST_Libstdcxx;
2652}
2653
2654void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2655 ArgStringList &CC1Args) const {
2656 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2657 DriverArgs.hasArg(options::OPT_nostdincxx))
2658 return;
2659
2660 switch (GetCXXStdlibType(DriverArgs)) {
2661 case ToolChain::CST_Libcxx:
2662 addSystemInclude(DriverArgs, CC1Args,
2663 getDriver().SysRoot + "/usr/include/c++/v1");
2664 break;
2665 case ToolChain::CST_Libstdcxx:
2666 addSystemInclude(DriverArgs, CC1Args,
2667 getDriver().SysRoot + "/usr/include/c++/4.2");
2668 addSystemInclude(DriverArgs, CC1Args,
2669 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
2670 break;
2671 }
2672}
2673
Rafael Espindola7cf32212013-03-20 03:05:54 +00002674Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002675 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002676}
2677
Douglas Katzman95354292015-06-23 20:42:09 +00002678Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00002679
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002680bool FreeBSD::UseSjLjExceptions() const {
2681 // FreeBSD uses SjLj exceptions on ARM oabi.
2682 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00002683 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002684 case llvm::Triple::GNUEABI:
2685 case llvm::Triple::EABI:
2686 return false;
2687
2688 default:
2689 return (getTriple().getArch() == llvm::Triple::arm ||
2690 getTriple().getArch() == llvm::Triple::thumb);
2691 }
2692}
2693
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002694bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002695
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002696bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002697
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00002698SanitizerMask FreeBSD::getSupportedSanitizers() const {
2699 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
2700 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
2701 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
2702 getTriple().getArch() == llvm::Triple::mips64el;
2703 SanitizerMask Res = ToolChain::getSupportedSanitizers();
2704 Res |= SanitizerKind::Address;
2705 Res |= SanitizerKind::Vptr;
2706 if (IsX86_64 || IsMIPS64) {
2707 Res |= SanitizerKind::Leak;
2708 Res |= SanitizerKind::Thread;
2709 }
2710 if (IsX86 || IsX86_64) {
2711 Res |= SanitizerKind::SafeStack;
2712 }
2713 return Res;
2714}
2715
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002716/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
2717
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002718NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2719 : Generic_ELF(D, Triple, Args) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002720
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00002721 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00002722 // When targeting a 32-bit platform, try the special directory used on
2723 // 64-bit hosts, and only fall back to the main library directory if that
2724 // doesn't work.
2725 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
2726 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002727 switch (Triple.getArch()) {
2728 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00002729 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002730 break;
2731 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00002732 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002733 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00002734 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002735 switch (Triple.getEnvironment()) {
2736 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002737 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002738 getFilePaths().push_back("=/usr/lib/eabi");
2739 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00002740 case llvm::Triple::EABIHF:
2741 case llvm::Triple::GNUEABIHF:
2742 getFilePaths().push_back("=/usr/lib/eabihf");
2743 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002744 default:
2745 getFilePaths().push_back("=/usr/lib/oabi");
2746 break;
2747 }
2748 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002749 case llvm::Triple::mips64:
2750 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002751 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002752 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002753 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002754 getFilePaths().push_back("=/usr/lib/64");
2755 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00002756 case llvm::Triple::ppc:
2757 getFilePaths().push_back("=/usr/lib/powerpc");
2758 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00002759 case llvm::Triple::sparc:
2760 getFilePaths().push_back("=/usr/lib/sparc");
2761 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002762 default:
2763 break;
2764 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00002765
2766 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002767 }
2768}
2769
Rafael Espindola7cf32212013-03-20 03:05:54 +00002770Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002771 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002772}
2773
Douglas Katzman95354292015-06-23 20:42:09 +00002774Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002775
Douglas Katzman95354292015-06-23 20:42:09 +00002776ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002777 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2778 StringRef Value = A->getValue();
2779 if (Value == "libstdc++")
2780 return ToolChain::CST_Libstdcxx;
2781 if (Value == "libc++")
2782 return ToolChain::CST_Libcxx;
2783
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002784 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002785 }
2786
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002787 unsigned Major, Minor, Micro;
2788 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00002789 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002790 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00002791 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00002792 case llvm::Triple::arm:
2793 case llvm::Triple::armeb:
2794 case llvm::Triple::thumb:
2795 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00002796 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00002797 case llvm::Triple::ppc64:
2798 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002799 case llvm::Triple::x86:
2800 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002801 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002802 default:
2803 break;
2804 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002805 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002806 return ToolChain::CST_Libstdcxx;
2807}
2808
2809void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2810 ArgStringList &CC1Args) const {
2811 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2812 DriverArgs.hasArg(options::OPT_nostdincxx))
2813 return;
2814
2815 switch (GetCXXStdlibType(DriverArgs)) {
2816 case ToolChain::CST_Libcxx:
2817 addSystemInclude(DriverArgs, CC1Args,
2818 getDriver().SysRoot + "/usr/include/c++/");
2819 break;
2820 case ToolChain::CST_Libstdcxx:
2821 addSystemInclude(DriverArgs, CC1Args,
2822 getDriver().SysRoot + "/usr/include/g++");
2823 addSystemInclude(DriverArgs, CC1Args,
2824 getDriver().SysRoot + "/usr/include/g++/backward");
2825 break;
2826 }
2827}
2828
Chris Lattner3e2ee142010-07-07 16:01:42 +00002829/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
2830
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002831Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2832 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00002833 getFilePaths().push_back(getDriver().Dir + "/../lib");
2834 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00002835}
2836
Rafael Espindola7cf32212013-03-20 03:05:54 +00002837Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002838 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002839}
2840
Douglas Katzman95354292015-06-23 20:42:09 +00002841Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00002842
David Chisnallf571cde2012-02-15 13:39:01 +00002843/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
2844
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002845Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002846 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002847 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00002848
2849 getProgramPaths().push_back(getDriver().getInstalledDir());
2850 if (getDriver().getInstalledDir() != getDriver().Dir)
2851 getProgramPaths().push_back(getDriver().Dir);
2852
2853 getFilePaths().push_back(getDriver().Dir + "/../lib");
2854 getFilePaths().push_back("/usr/lib");
2855}
2856
Rafael Espindola7cf32212013-03-20 03:05:54 +00002857Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002858 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002859}
2860
Douglas Katzman95354292015-06-23 20:42:09 +00002861Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00002862
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002863/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00002864
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002865enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00002866 // NB: Releases of a particular Linux distro should be kept together
2867 // in this enum, because some tests are done by integer comparison against
2868 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00002869 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002870 DebianLenny,
2871 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00002872 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00002873 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002874 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00002875 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00002876 RHEL4,
2877 RHEL5,
2878 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002879 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00002880 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00002881 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00002882 UbuntuHardy,
2883 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00002884 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00002885 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002886 UbuntuLucid,
2887 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00002888 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00002889 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00002890 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00002891 UbuntuQuantal,
2892 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00002893 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00002894 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002895 UbuntuUtopic,
2896 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00002897 UbuntuWily,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002898 UnknownDistro
2899};
2900
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002901static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002902 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002903}
2904
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002905static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002906
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002907static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002908 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002909}
2910
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002911static bool IsUbuntu(enum Distro Distro) {
Benjamin Kramer2d469802015-07-09 15:31:17 +00002912 return Distro >= UbuntuHardy && Distro <= UbuntuWily;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002913}
2914
Rafael Espindolaa8398552013-10-28 23:14:34 +00002915static Distro DetectDistro(llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00002916 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
2917 llvm::MemoryBuffer::getFile("/etc/lsb-release");
2918 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002919 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00002920 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002921 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002922 Distro Version = UnknownDistro;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002923 for (const StringRef Line : Lines)
2924 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
2925 Version = llvm::StringSwitch<Distro>(Line.substr(17))
2926 .Case("hardy", UbuntuHardy)
2927 .Case("intrepid", UbuntuIntrepid)
2928 .Case("jaunty", UbuntuJaunty)
2929 .Case("karmic", UbuntuKarmic)
2930 .Case("lucid", UbuntuLucid)
2931 .Case("maverick", UbuntuMaverick)
2932 .Case("natty", UbuntuNatty)
2933 .Case("oneiric", UbuntuOneiric)
2934 .Case("precise", UbuntuPrecise)
2935 .Case("quantal", UbuntuQuantal)
2936 .Case("raring", UbuntuRaring)
2937 .Case("saucy", UbuntuSaucy)
2938 .Case("trusty", UbuntuTrusty)
2939 .Case("utopic", UbuntuUtopic)
2940 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00002941 .Case("wily", UbuntuWily)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002942 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00002943 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002944 }
2945
Rafael Espindola2d2b4202014-07-06 17:43:24 +00002946 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
2947 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002948 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00002949 if (Data.startswith("Fedora release"))
2950 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00002951 if (Data.startswith("Red Hat Enterprise Linux") ||
2952 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002953 if (Data.find("release 7") != StringRef::npos)
2954 return RHEL7;
2955 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00002956 return RHEL6;
2957 else if (Data.find("release 5") != StringRef::npos)
2958 return RHEL5;
2959 else if (Data.find("release 4") != StringRef::npos)
2960 return RHEL4;
2961 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002962 return UnknownDistro;
2963 }
2964
Rafael Espindola2d2b4202014-07-06 17:43:24 +00002965 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
2966 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002967 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002968 if (Data[0] == '5')
2969 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00002970 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002971 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002972 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00002973 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002974 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00002975 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002976 else if (Data.startswith("stretch/sid") || Data[0] == '9')
2977 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002978 return UnknownDistro;
2979 }
2980
Rafael Espindolaa8398552013-10-28 23:14:34 +00002981 if (llvm::sys::fs::exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00002982 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002983
Rafael Espindolaa8398552013-10-28 23:14:34 +00002984 if (llvm::sys::fs::exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00002985 return Exherbo;
2986
Rafael Espindolaa8398552013-10-28 23:14:34 +00002987 if (llvm::sys::fs::exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00002988 return ArchLinux;
2989
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002990 return UnknownDistro;
2991}
2992
Chandler Carruthfb7fa242011-10-31 08:42:24 +00002993/// \brief Get our best guess at the multiarch triple for a target.
2994///
2995/// Debian-based systems are starting to use a multiarch setup where they use
2996/// a target-triple directory in the library and header search paths.
2997/// Unfortunately, this triple does not align with the vanilla target triple,
2998/// so we provide a rough mapping here.
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00002999static std::string getMultiarchTriple(const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003000 StringRef SysRoot) {
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003001 llvm::Triple::EnvironmentType TargetEnvironment = TargetTriple.getEnvironment();
3002
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003003 // For most architectures, just use whatever we have rather than trying to be
3004 // clever.
3005 switch (TargetTriple.getArch()) {
3006 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003007 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003008
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003009 // We use the existence of '/lib/<triple>' as a directory to detect some
3010 // common linux triples that don't quite match the Clang triple for both
3011 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3012 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003013 case llvm::Triple::arm:
3014 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003015 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003016 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf"))
3017 return "arm-linux-gnueabihf";
3018 } else {
3019 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi"))
3020 return "arm-linux-gnueabi";
3021 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003022 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003023 case llvm::Triple::armeb:
3024 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003025 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003026 if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
3027 return "armeb-linux-gnueabihf";
3028 } else {
3029 if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabi"))
3030 return "armeb-linux-gnueabi";
3031 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003032 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003033 case llvm::Triple::x86:
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003034 if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
3035 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003036 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003037 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003038 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003039 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00003040 llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003041 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003042 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003043 case llvm::Triple::aarch64:
3044 if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64-linux-gnu"))
3045 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003046 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003047 case llvm::Triple::aarch64_be:
3048 if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
3049 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003050 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003051 case llvm::Triple::mips:
3052 if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu"))
3053 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003054 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003055 case llvm::Triple::mipsel:
3056 if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu"))
3057 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003058 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003059 case llvm::Triple::mips64:
3060 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnu"))
3061 return "mips64-linux-gnu";
3062 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
3063 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003064 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003065 case llvm::Triple::mips64el:
3066 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnu"))
3067 return "mips64el-linux-gnu";
3068 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
3069 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003070 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003071 case llvm::Triple::ppc:
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003072 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
3073 return "powerpc-linux-gnuspe";
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003074 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu"))
3075 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003076 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003077 case llvm::Triple::ppc64:
3078 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu"))
3079 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003080 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003081 case llvm::Triple::ppc64le:
3082 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
3083 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003084 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003085 case llvm::Triple::sparc:
3086 if (llvm::sys::fs::exists(SysRoot + "/lib/sparc-linux-gnu"))
3087 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003088 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003089 case llvm::Triple::sparcv9:
3090 if (llvm::sys::fs::exists(SysRoot + "/lib/sparc64-linux-gnu"))
3091 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003092 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003093 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003094 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003095}
3096
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003097static void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003098 if (llvm::sys::fs::exists(Path))
3099 Paths.push_back(Path.str());
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003100}
3101
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003102static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003103 if (isMipsArch(Triple.getArch())) {
3104 // lib32 directory has a special meaning on MIPS targets.
3105 // It contains N32 ABI binaries. Use this folder if produce
3106 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003107 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003108 return "lib32";
3109 return Triple.isArch32Bit() ? "lib" : "lib64";
3110 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003111
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003112 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003113 // using that variant while targeting other architectures causes problems
3114 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003115 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003116 // them when we know we may need it.
3117 //
3118 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003119 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003120 // GCCInstallationDetector, but that is a more significant refactoring.
3121 if (Triple.getArch() == llvm::Triple::x86 ||
3122 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003123 return "lib32";
3124
Zinovy Nis1db95732014-07-10 15:27:19 +00003125 if (Triple.getArch() == llvm::Triple::x86_64 &&
3126 Triple.getEnvironment() == llvm::Triple::GNUX32)
3127 return "libx32";
3128
Simon Atanasyand4413882012-09-14 11:27:24 +00003129 return Triple.isArch32Bit() ? "lib" : "lib64";
3130}
3131
Rafael Espindola1af7c212012-02-19 01:38:32 +00003132Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003133 : Generic_ELF(D, Triple, Args) {
Roman Divacky326d9982013-12-06 18:32:18 +00003134 GCCInstallation.init(D, Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003135 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003136 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003137 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003138
Rafael Espindola10a63c22013-07-03 14:14:00 +00003139 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003140 // least) put various tools in a triple-prefixed directory off of the parent
3141 // of the GCC installation. We use the GCC triple here to ensure that we end
3142 // up with tools that support the same amount of cross compiling as the
3143 // detected GCC installation. For example, if we find a GCC installation
3144 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3145 // used to target i386.
3146 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003147 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003148 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003149 GCCInstallation.getTriple().str() + "/bin")
3150 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003151
Logan Chieneb9162f2014-06-26 14:23:45 +00003152 Linker = GetLinkerPath();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003153
Rafael Espindolaa8398552013-10-28 23:14:34 +00003154 Distro Distro = DetectDistro(Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003155
Rafael Espindola10a63c22013-07-03 14:14:00 +00003156 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003157 ExtraOpts.push_back("-z");
3158 ExtraOpts.push_back("relro");
3159 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003160
Douglas Gregord9bb1522011-03-06 19:11:49 +00003161 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003162 ExtraOpts.push_back("-X");
3163
Logan Chienc6fd8202012-09-02 09:30:11 +00003164 const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003165 const bool IsMips = isMipsArch(Arch);
3166
3167 if (IsMips && !SysRoot.empty())
3168 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003169
Chandler Carruth0b842912011-12-09 04:45:18 +00003170 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3171 // and the MIPS ABI require .dynsym to be sorted in different ways.
3172 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3173 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003174 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003175 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003176 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003177 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003178 ExtraOpts.push_back("--hash-style=gnu");
3179
Rafael Espindola10a63c22013-07-03 14:14:00 +00003180 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003181 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3182 ExtraOpts.push_back("--hash-style=both");
3183 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003184
Chris Lattner84e38552011-05-22 05:36:06 +00003185 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003186 ExtraOpts.push_back("--no-add-needed");
3187
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003188 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003189 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003190 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003191 ExtraOpts.push_back("--build-id");
3192
Rafael Espindola10a63c22013-07-03 14:14:00 +00003193 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003194 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003195
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003196 // The selection of paths to try here is designed to match the patterns which
3197 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3198 // This was determined by running GCC in a fake filesystem, creating all
3199 // possible permutations of these directories, and seeing which ones it added
3200 // to the link paths.
3201 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003202
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003203 const std::string OSLibDir = getOSLibDir(Triple, Args);
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003204 const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003205
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003206 // Add the multilib suffixed paths where they are available.
3207 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003208 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003209 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003210 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003211
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003212 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003213 // a biarch-like suffix of the GCC installation.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003214 addPathIfExists((GCCInstallation.getInstallPath() + Multilib.gccSuffix()),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003215 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003216
3217 // GCC cross compiling toolchains will install target libraries which ship
3218 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3219 // any part of the GCC installation in
3220 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3221 // debatable, but is the reality today. We need to search this tree even
3222 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003223 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003224 // installation that is *not* within the system root to ensure two things:
3225 //
3226 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003227 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003228 // appropriate rpath.
3229 // 2) There must not be libraries installed into
3230 // <prefix>/<triple>/<libdir> unless they should be preferred over
3231 // those within the system root.
3232 //
3233 // Note that this matches the GCC behavior. See the below comment for where
3234 // Clang diverges from GCC's behavior.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003235 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + OSLibDir +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003236 Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003237 Paths);
3238
Chandler Carruth69a125b2012-04-06 16:32:06 +00003239 // If the GCC installation we found is inside of the sysroot, we want to
3240 // prefer libraries installed in the parent prefix of the GCC installation.
3241 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003242 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003243 // This usually happens when there is an external cross compiler on the
3244 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003245 // the cross. Note that GCC does include some of these directories in some
3246 // configurations but this seems somewhere between questionable and simply
3247 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003248 if (StringRef(LibPath).startswith(SysRoot)) {
Chandler Carruth69a125b2012-04-06 16:32:06 +00003249 addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003250 addPathIfExists(LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003251 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003252 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003253
3254 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003255 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003256 // those searched.
3257 // FIXME: It's not clear whether we should use the driver's installed
3258 // directory ('Dir' below) or the ResourceDir.
3259 if (StringRef(D.Dir).startswith(SysRoot)) {
3260 addPathIfExists(D.Dir + "/../lib/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003261 addPathIfExists(D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003262 }
3263
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003264 addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003265 addPathIfExists(SysRoot + "/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003266 addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003267 addPathIfExists(SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003268
Chandler Carruthb427c562013-06-22 11:35:51 +00003269 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003270 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003271 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003272 addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003273 "/../../" + OSLibDir,
3274 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003275
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003276 // Add the 'other' biarch variant path
3277 Multilib BiarchSibling;
3278 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003279 addPathIfExists(
3280 GCCInstallation.getInstallPath() + BiarchSibling.gccSuffix(), Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003281 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003282
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003283 // See comments above on the multilib variant for details of why this is
3284 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003285 const std::string &LibPath = GCCInstallation.getParentLibPath();
3286 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3287 const Multilib &Multilib = GCCInstallation.getMultilib();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003288 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib" +
3289 Multilib.osSuffix(),
3290 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003291
3292 // See comments above on the multilib variant for details of why this is
3293 // only included from within the sysroot.
3294 if (StringRef(LibPath).startswith(SysRoot))
Chandler Carruth69a125b2012-04-06 16:32:06 +00003295 addPathIfExists(LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003296 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003297
3298 // Similar to the logic for GCC above, if we are currently running Clang
3299 // inside of the requested system root, add its parent library path to those
3300 // searched.
3301 // FIXME: It's not clear whether we should use the driver's installed
3302 // directory ('Dir' below) or the ResourceDir.
3303 if (StringRef(D.Dir).startswith(SysRoot))
3304 addPathIfExists(D.Dir + "/../lib", Paths);
3305
Chandler Carruth2a649c72011-10-03 06:41:08 +00003306 addPathIfExists(SysRoot + "/lib", Paths);
3307 addPathIfExists(SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003308}
3309
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003310bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003311
Douglas Katzman95354292015-06-23 20:42:09 +00003312Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003313
3314Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003315 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003316}
3317
Simon Atanasyana0d89572013-10-05 14:37:55 +00003318std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003319 if (!getDriver().SysRoot.empty())
3320 return getDriver().SysRoot;
3321
3322 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3323 return std::string();
3324
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003325 // Standalone MIPS toolchains use different names for sysroot folder
3326 // and put it into different places. Here we try to check some known
3327 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003328
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003329 const StringRef InstallDir = GCCInstallation.getInstallPath();
3330 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003331 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003332
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003333 std::string Path =
3334 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3335 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003336
3337 if (llvm::sys::fs::exists(Path))
3338 return Path;
3339
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003340 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003341
3342 if (llvm::sys::fs::exists(Path))
3343 return Path;
3344
3345 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003346}
3347
Chandler Carrutha796f532011-11-05 20:17:13 +00003348void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3349 ArgStringList &CC1Args) const {
3350 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003351 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003352
3353 if (DriverArgs.hasArg(options::OPT_nostdinc))
3354 return;
3355
3356 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003357 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003358
3359 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003360 SmallString<128> P(D.ResourceDir);
3361 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003362 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003363 }
3364
3365 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3366 return;
3367
3368 // Check for configure-time C include directories.
3369 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3370 if (CIncludeDirs != "") {
3371 SmallVector<StringRef, 5> dirs;
3372 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003373 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003374 StringRef Prefix =
3375 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003376 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003377 }
3378 return;
3379 }
3380
3381 // Lacking those, try to detect the correct set of system includes for the
3382 // target triple.
3383
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003384 // Add include directories specific to the selected multilib set and multilib.
3385 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003386 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003387 if (Callback) {
3388 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3389 GCCInstallation.getTriple().str(),
3390 GCCInstallation.getMultilib());
3391 for (const auto &Path : IncludePaths)
3392 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3393 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003394 }
3395
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003396 // Implement generic Debian multiarch support.
3397 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003398 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003399
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003400 // FIXME: These are older forms of multiarch. It's not clear that they're
3401 // in use in any released version of Debian, so we should consider
3402 // removing them.
3403 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003404 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003405 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003406
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003407 // FIXME: These are older forms of multiarch. It's not clear that they're
3408 // in use in any released version of Debian, so we should consider
3409 // removing them.
3410 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3411 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003412 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003413 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003414 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003415 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003416 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003417 "/usr/include/arm-linux-gnueabihf"};
3418 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003419 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003420 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003421 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003422 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003423 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003424 "/usr/include/mips64el-linux-gnu",
3425 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003426 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003427 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003428 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003429 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003430 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003431 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003432 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003433 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003434 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003435 "/usr/include/sparc64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003436 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003437 switch (getTriple().getArch()) {
3438 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003439 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003440 break;
3441 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003442 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003443 break;
3444 case llvm::Triple::aarch64:
3445 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003446 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003447 break;
3448 case llvm::Triple::arm:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003449 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3450 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3451 else
3452 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003453 break;
3454 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00003455 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003456 break;
3457 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00003458 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003459 break;
3460 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003461 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003462 break;
3463 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003464 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003465 break;
3466 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003467 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003468 break;
3469 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003470 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003471 break;
3472 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003473 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003474 break;
3475 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00003476 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003477 break;
3478 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00003479 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003480 break;
3481 default:
3482 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003483 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003484 for (StringRef Dir : MultiarchIncludeDirs) {
3485 if (llvm::sys::fs::exists(SysRoot + Dir)) {
3486 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003487 break;
3488 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003489 }
3490
3491 if (getTriple().getOS() == llvm::Triple::RTEMS)
3492 return;
3493
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003494 // Add an include of '/include' directly. This isn't provided by default by
3495 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
3496 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003497 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003498
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003499 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003500}
3501
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003502/// \brief Helper to add the variant paths of a libstdc++ installation.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003503/*static*/ bool Linux::addLibStdCXXIncludePaths(
3504 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
3505 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
3506 const ArgList &DriverArgs, ArgStringList &CC1Args) {
Chandler Carruthc26a79d2014-08-27 18:21:27 +00003507 if (!llvm::sys::fs::exists(Base + Suffix))
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003508 return false;
Chandler Carrutha796f532011-11-05 20:17:13 +00003509
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003510 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003511
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003512 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
3513 // that path exists or we have neither a GCC nor target multiarch triple, use
3514 // this vanilla search path.
3515 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
3516 llvm::sys::fs::exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
3517 addSystemInclude(DriverArgs, CC1Args,
3518 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
3519 } else {
3520 // Otherwise try to use multiarch naming schemes which have normalized the
3521 // triples and put the triple before the suffix.
3522 //
3523 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
3524 // the target triple, so we support that here.
3525 addSystemInclude(DriverArgs, CC1Args,
3526 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
3527 addSystemInclude(DriverArgs, CC1Args,
3528 Base + "/" + TargetMultiarchTriple + Suffix);
3529 }
3530
3531 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003532 return true;
3533}
3534
Chandler Carrutha796f532011-11-05 20:17:13 +00003535void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3536 ArgStringList &CC1Args) const {
3537 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3538 DriverArgs.hasArg(options::OPT_nostdincxx))
3539 return;
3540
Chandler Carruthf4701732011-11-07 09:01:17 +00003541 // Check if libc++ has been enabled and provide its include paths if so.
3542 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003543 const std::string LibCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003544 // The primary location is within the Clang installation.
3545 // FIXME: We shouldn't hard code 'v1' here to make Clang future proof to
3546 // newer ABI versions.
3547 getDriver().Dir + "/../include/c++/v1",
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003548
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003549 // We also check the system as for a long time this is the only place
3550 // Clang looked.
3551 // FIXME: We should really remove this. It doesn't make any sense.
3552 getDriver().SysRoot + "/usr/include/c++/v1"};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003553 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
3554 if (!llvm::sys::fs::exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003555 continue;
3556 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003557 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003558 break;
3559 }
Chandler Carruthf4701732011-11-07 09:01:17 +00003560 return;
3561 }
3562
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00003563 // We need a detected GCC installation on Linux to provide libstdc++'s
3564 // headers. We handled the libc++ case above.
3565 if (!GCCInstallation.isValid())
3566 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00003567
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003568 // By default, look for the C++ headers in an include directory adjacent to
3569 // the lib directory of the GCC installation. Note that this is expect to be
3570 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
3571 StringRef LibDir = GCCInstallation.getParentLibPath();
3572 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003573 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003574 const Multilib &Multilib = GCCInstallation.getMultilib();
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003575 const std::string GCCMultiarchTriple =
3576 getMultiarchTriple(GCCInstallation.getTriple(), getDriver().SysRoot);
3577 const std::string TargetMultiarchTriple =
3578 getMultiarchTriple(getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00003579 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003580
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003581 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00003582 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003583 "/c++/" + Version.Text, TripleStr,
3584 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003585 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003586 return;
3587
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003588 // Otherwise, fall back on a bunch of options which don't use multiarch
3589 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003590 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003591 // Gentoo is weird and places its headers inside the GCC install,
3592 // so if the first attempt to find the headers fails, try these patterns.
3593 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
3594 Version.MinorStr,
3595 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
3596 // Android standalone toolchain has C++ headers in yet another place.
3597 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
3598 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
3599 // without a subdirectory corresponding to the gcc version.
3600 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003601 };
3602
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003603 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003604 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
3605 /*GCCMultiarchTriple*/ "",
3606 /*TargetMultiarchTriple*/ "",
3607 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003608 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003609 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003610}
3611
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003612bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003613
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003614SanitizerMask Linux::getSupportedSanitizers() const {
3615 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3616 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3617 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3618 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00003619 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
3620 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003621 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
3622 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003623 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3624 Res |= SanitizerKind::Address;
3625 Res |= SanitizerKind::KernelAddress;
3626 Res |= SanitizerKind::Vptr;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003627 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003628 Res |= SanitizerKind::DataFlow;
Renato Golind45c2df2015-08-05 18:42:41 +00003629 if (IsX86_64 || IsMIPS64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003630 Res |= SanitizerKind::Leak;
Renato Golind45c2df2015-08-05 18:42:41 +00003631 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003632 Res |= SanitizerKind::Thread;
Jay Foade967dd02015-06-25 10:35:19 +00003633 if (IsX86_64 || IsMIPS64 || IsPowerPC64)
3634 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003635 if (IsX86 || IsX86_64) {
3636 Res |= SanitizerKind::Function;
3637 Res |= SanitizerKind::SafeStack;
3638 }
3639 return Res;
3640}
3641
Daniel Dunbarcc912342009-05-02 18:28:39 +00003642/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
3643
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003644DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
3645 const ArgList &Args)
3646 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00003647
3648 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00003649 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00003650 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00003651 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00003652
Daniel Dunbar083edf72009-12-21 18:54:17 +00003653 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00003654 getFilePaths().push_back("/usr/lib");
John McCall65b8da02013-04-11 22:55:55 +00003655 if (llvm::sys::fs::exists("/usr/lib/gcc47"))
3656 getFilePaths().push_back("/usr/lib/gcc47");
3657 else
3658 getFilePaths().push_back("/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00003659}
3660
Rafael Espindola7cf32212013-03-20 03:05:54 +00003661Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003662 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003663}
3664
3665Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003666 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00003667}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003668
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003669/// Stub for CUDA toolchain. At the moment we don't have assembler or
3670/// linker and need toolchain mainly to propagate device-side options
3671/// to CC1.
3672
3673CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
3674 const ArgList &Args)
3675 : Linux(D, Triple, Args) {}
3676
3677void
3678CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
3679 llvm::opt::ArgStringList &CC1Args) const {
3680 Linux::addClangTargetOptions(DriverArgs, CC1Args);
3681 CC1Args.push_back("-fcuda-is-device");
3682}
3683
3684llvm::opt::DerivedArgList *
3685CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
3686 const char *BoundArch) const {
3687 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
3688 const OptTable &Opts = getDriver().getOpts();
3689
3690 for (Arg *A : Args) {
3691 if (A->getOption().matches(options::OPT_Xarch__)) {
3692 // Skip this argument unless the architecture matches BoundArch
3693 if (A->getValue(0) != StringRef(BoundArch))
3694 continue;
3695
3696 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
3697 unsigned Prev = Index;
3698 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
3699
3700 // If the argument parsing failed or more than one argument was
3701 // consumed, the -Xarch_ argument's parameter tried to consume
3702 // extra arguments. Emit an error and ignore.
3703 //
3704 // We also want to disallow any options which would alter the
3705 // driver behavior; that isn't going to work in our model. We
3706 // use isDriverOption() as an approximation, although things
3707 // like -O4 are going to slip through.
3708 if (!XarchArg || Index > Prev + 1) {
3709 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
3710 << A->getAsString(Args);
3711 continue;
3712 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
3713 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
3714 << A->getAsString(Args);
3715 continue;
3716 }
3717 XarchArg->setBaseArg(A);
3718 A = XarchArg.release();
3719 DAL->AddSynthesizedArg(A);
3720 }
3721 DAL->append(A);
3722 }
3723
3724 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
3725 return DAL;
3726}
3727
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003728/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00003729XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
3730 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003731 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003732 // ProgramPaths are found via 'PATH' environment variable.
3733}
3734
Douglas Katzman54366072015-07-27 16:53:08 +00003735Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003736 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003737}
3738
Douglas Katzman54366072015-07-27 16:53:08 +00003739Tool *XCoreToolChain::buildLinker() const {
3740 return new tools::XCore::Linker(*this);
3741}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003742
Douglas Katzman54366072015-07-27 16:53:08 +00003743bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003744
Douglas Katzman54366072015-07-27 16:53:08 +00003745bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003746
Douglas Katzman54366072015-07-27 16:53:08 +00003747bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003748
Douglas Katzman54366072015-07-27 16:53:08 +00003749bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003750
Douglas Katzman54366072015-07-27 16:53:08 +00003751bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003752
Douglas Katzman54366072015-07-27 16:53:08 +00003753void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3754 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003755 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
3756 DriverArgs.hasArg(options::OPT_nostdlibinc))
3757 return;
3758 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
3759 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003760 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003761 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3762 ArrayRef<StringRef> DirVec(Dirs);
3763 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3764 }
3765}
3766
Douglas Katzman54366072015-07-27 16:53:08 +00003767void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
3768 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003769 CC1Args.push_back("-nostdsysteminc");
3770}
3771
Douglas Katzman54366072015-07-27 16:53:08 +00003772void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
3773 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003774 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00003775 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3776 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003777 return;
3778 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
3779 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003780 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003781 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3782 ArrayRef<StringRef> DirVec(Dirs);
3783 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3784 }
3785}
3786
Douglas Katzman54366072015-07-27 16:53:08 +00003787void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
3788 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003789 // We don't output any lib args. This is handled by xcc.
3790}
Douglas Katzman84a75642015-06-19 14:55:19 +00003791
3792// SHAVEToolChain does not call Clang's C compiler.
3793// We override SelectTool to avoid testing ShouldUseClangCompiler().
3794Tool *SHAVEToolChain::SelectTool(const JobAction &JA) const {
3795 switch (JA.getKind()) {
3796 case Action::CompileJobClass:
3797 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00003798 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00003799 return Compiler.get();
3800 case Action::AssembleJobClass:
3801 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00003802 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00003803 return Assembler.get();
3804 default:
3805 return ToolChain::getTool(JA.getKind());
3806 }
3807}
3808
3809SHAVEToolChain::SHAVEToolChain(const Driver &D, const llvm::Triple &Triple,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003810 const ArgList &Args)
Douglas Katzman84a75642015-06-19 14:55:19 +00003811 : Generic_GCC(D, Triple, Args) {}
3812
3813SHAVEToolChain::~SHAVEToolChain() {}
3814
3815/// Following are methods necessary to avoid having moviClang be an abstract
3816/// class.
3817
3818Tool *SHAVEToolChain::getTool(Action::ActionClass AC) const {
3819 // SelectTool() must find a tool using the method in the superclass.
3820 // There's nothing we can do if that fails.
3821 llvm_unreachable("SHAVEToolChain can't getTool");
3822}
3823
3824Tool *SHAVEToolChain::buildLinker() const {
3825 // SHAVEToolChain executables can not be linked except by the vendor tools.
3826 llvm_unreachable("SHAVEToolChain can't buildLinker");
3827}
3828
3829Tool *SHAVEToolChain::buildAssembler() const {
3830 // This one you'd think should be reachable since we expose an
3831 // assembler to the driver, except not the way it expects.
3832 llvm_unreachable("SHAVEToolChain can't buildAssembler");
3833}