blob: 685a51a630284321b9468f2313200a936a0f6d31 [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
1917 // up to the lib directory.
Chandler Carruth866faab2012-01-25 07:21:38 +00001918 const std::string LibSuffixes[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001919 "/gcc/" + CandidateTriple.str(),
1920 // Debian puts cross-compilers in gcc-cross
1921 "/gcc-cross/" + CandidateTriple.str(),
1922 "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001923
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001924 // The Freescale PPC SDK has the gcc libraries in
1925 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
1926 "/" + CandidateTriple.str(),
Hal Finkelf3587912012-09-18 22:25:07 +00001927
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001928 // Ubuntu has a strange mis-matched pair of triples that this happens to
1929 // match.
1930 // FIXME: It may be worthwhile to generalize this and look for a second
1931 // triple.
1932 "/i386-linux-gnu/gcc/" + CandidateTriple.str()};
Eli Friedmanbf44f362013-07-26 00:53:40 +00001933 const std::string InstallSuffixes[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001934 "/../../..", // gcc/
1935 "/../../..", // gcc-cross/
1936 "/../../../..", // <triple>/gcc/
1937 "/../..", // <triple>/
1938 "/../../../.." // i386-linux-gnu/gcc/<triple>/
Eli Friedmanbf44f362013-07-26 00:53:40 +00001939 };
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001940 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Chandler Carruthb427c562013-06-22 11:35:51 +00001941 const unsigned NumLibSuffixes =
1942 (llvm::array_lengthof(LibSuffixes) - (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00001943 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
1944 StringRef LibSuffix = LibSuffixes[i];
Rafael Espindolac0809172014-06-12 14:02:15 +00001945 std::error_code EC;
Chandler Carruth866faab2012-01-25 07:21:38 +00001946 for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001947 !EC && LI != LE; LI = LI.increment(EC)) {
1948 StringRef VersionText = llvm::sys::path::filename(LI->path());
1949 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00001950 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
1951 if (!CandidateGCCInstallPaths.insert(LI->path()).second)
1952 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001953 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001954 continue;
1955 if (CandidateVersion <= Version)
1956 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00001957
Simon Atanasyan60280b42014-05-12 07:37:51 +00001958 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001959
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001960 // Debian mips multilibs behave more like the rest of the biarch ones,
1961 // so handle them there
1962 if (isMipsArch(TargetArch)) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001963 if (!findMIPSMultilibs(TargetTriple, LI->path(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001964 continue;
1965 } else if (!findBiarchMultilibs(TargetTriple, LI->path(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00001966 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001967 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00001968 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001969
Simon Atanasyan60280b42014-05-12 07:37:51 +00001970 Multilibs = Detected.Multilibs;
1971 SelectedMultilib = Detected.SelectedMultilib;
1972 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001973 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00001974 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001975 // FIXME: We hack together the directory name here instead of
1976 // using LI to ensure stable path separators across Windows and
1977 // Linux.
Chandler Carruth866faab2012-01-25 07:21:38 +00001978 GCCInstallPath = LibDir + LibSuffixes[i] + "/" + VersionText.str();
Chandler Carruth64cee062012-01-24 19:21:42 +00001979 GCCParentLibPath = GCCInstallPath + InstallSuffixes[i];
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
Samuel Antaoc909c992014-11-07 17:48:03 +00002078std::string Hexagon_TC::GetGnuDir(const std::string &InstalledDir,
2079 const ArgList &Args) {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002080
2081 // Locate the rest of the toolchain ...
Samuel Antaoc909c992014-11-07 17:48:03 +00002082 std::string GccToolchain = getGCCToolchainDir(Args);
2083
2084 if (!GccToolchain.empty())
2085 return GccToolchain;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002086
2087 std::string InstallRelDir = InstalledDir + "/../../gnu";
2088 if (llvm::sys::fs::exists(InstallRelDir))
2089 return InstallRelDir;
2090
2091 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
2092 if (llvm::sys::fs::exists(PrefixRelDir))
2093 return PrefixRelDir;
2094
2095 return InstallRelDir;
2096}
2097
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002098const char *Hexagon_TC::GetSmallDataThreshold(const ArgList &Args) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002099 Arg *A;
2100
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002101 A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002102 options::OPT_msmall_data_threshold_EQ);
2103 if (A)
2104 return A->getValue();
2105
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002106 A = Args.getLastArg(options::OPT_shared, options::OPT_fpic,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002107 options::OPT_fPIC);
2108 if (A)
2109 return "0";
2110
2111 return 0;
2112}
2113
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002114bool Hexagon_TC::UsesG0(const char *smallDataThreshold) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002115 return smallDataThreshold && smallDataThreshold[0] == '0';
2116}
2117
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002118static void GetHexagonLibraryPaths(const ArgList &Args, const std::string &Ver,
2119 const std::string &MarchString,
2120 const std::string &InstalledDir,
2121 ToolChain::path_list *LibPaths) {
Matthew Curtise689b052012-12-06 15:46:07 +00002122 bool buildingLib = Args.hasArg(options::OPT_shared);
2123
2124 //----------------------------------------------------------------------------
2125 // -L Args
2126 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002127 for (Arg *A : Args.filtered(options::OPT_L))
2128 for (const char *Value : A->getValues())
2129 LibPaths->push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002130
2131 //----------------------------------------------------------------------------
2132 // Other standard paths
2133 //----------------------------------------------------------------------------
2134 const std::string MarchSuffix = "/" + MarchString;
2135 const std::string G0Suffix = "/G0";
2136 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00002137 const std::string RootDir = Hexagon_TC::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
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002161Hexagon_TC::Hexagon_TC(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());
Samuel Antaoc909c992014-11-07 17:48:03 +00002165 const std::string GnuDir = Hexagon_TC::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 Katzman95354292015-06-23 20:42:09 +00002196Hexagon_TC::~Hexagon_TC() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002197
Rafael Espindola7cf32212013-03-20 03:05:54 +00002198Tool *Hexagon_TC::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
2202Tool *Hexagon_TC::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
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002206void Hexagon_TC::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2207 ArgStringList &CC1Args) const {
2208 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());
Samuel Antaoc909c992014-11-07 17:48:03 +00002215 std::string GnuDir = Hexagon_TC::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
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002222void Hexagon_TC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2223 ArgStringList &CC1Args) const {
2224
2225 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2226 DriverArgs.hasArg(options::OPT_nostdincxx))
2227 return;
2228
2229 const Driver &D = getDriver();
2230 std::string Ver(GetGCCLibAndIncVersion());
Samuel Antaoc909c992014-11-07 17:48:03 +00002231 SmallString<128> IncludeDir(
2232 Hexagon_TC::GetGnuDir(D.InstalledDir, DriverArgs));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002233
Rafael Espindola358256c2013-06-26 02:13:00 +00002234 llvm::sys::path::append(IncludeDir, "hexagon/include/c++/");
2235 llvm::sys::path::append(IncludeDir, Ver);
Yaron Keren92e1b622015-03-18 10:17:07 +00002236 addSystemInclude(DriverArgs, CC1Args, IncludeDir);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002237}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002238
Matthew Curtise689b052012-12-06 15:46:07 +00002239ToolChain::CXXStdlibType
2240Hexagon_TC::GetCXXStdlibType(const ArgList &Args) const {
2241 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2242 if (!A)
2243 return ToolChain::CST_Libstdcxx;
2244
2245 StringRef Value = A->getValue();
2246 if (Value != "libstdc++") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002247 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002248 }
2249
2250 return ToolChain::CST_Libstdcxx;
2251}
2252
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002253static int getHexagonVersion(const ArgList &Args) {
2254 Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ);
2255 // Select the default CPU (v4) if none was given.
2256 if (!A)
2257 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002258
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002259 // FIXME: produce errors if we cannot parse the version.
2260 StringRef WhichHexagon = A->getValue();
2261 if (WhichHexagon.startswith("hexagonv")) {
2262 int Val;
2263 if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val))
2264 return Val;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002265 }
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002266 if (WhichHexagon.startswith("v")) {
2267 int Val;
2268 if (!WhichHexagon.substr(1).getAsInteger(10, Val))
2269 return Val;
2270 }
2271
2272 // FIXME: should probably be an error.
2273 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002274}
2275
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002276StringRef Hexagon_TC::GetTargetCPU(const ArgList &Args) {
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002277 int V = getHexagonVersion(Args);
2278 // FIXME: We don't support versions < 4. We should error on them.
2279 switch (V) {
2280 default:
2281 llvm_unreachable("Unexpected version");
2282 case 5:
2283 return "v5";
2284 case 4:
2285 return "v4";
2286 case 3:
2287 return "v3";
2288 case 2:
2289 return "v2";
2290 case 1:
2291 return "v1";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002292 }
Matthew Curtisf10a5952012-12-06 14:16:43 +00002293}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002294// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002295
Tom Stellard8fa33092015-07-18 01:49:05 +00002296/// AMDGPU Toolchain
2297AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2298 const ArgList &Args)
2299 : Generic_ELF(D, Triple, Args) { }
2300
2301Tool *AMDGPUToolChain::buildLinker() const {
2302 return new tools::amdgpu::Linker(*this);
2303}
2304// End AMDGPU
2305
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002306/// NaCl Toolchain
2307NaCl_TC::NaCl_TC(const Driver &D, const llvm::Triple &Triple,
2308 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002309 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002310
2311 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2312 // default paths, and must instead only use the paths provided
2313 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002314 path_list &file_paths = getFilePaths();
2315 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002316
2317 file_paths.clear();
2318 prog_paths.clear();
2319
2320 // Path for library files (libc.a, ...)
2321 std::string FilePath(getDriver().Dir + "/../");
2322
2323 // Path for tools (clang, ld, etc..)
2324 std::string ProgPath(getDriver().Dir + "/../");
2325
2326 // Path for toolchain libraries (libgcc.a, ...)
2327 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2328
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002329 switch (Triple.getArch()) {
2330 case llvm::Triple::x86: {
2331 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
2332 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib32");
2333 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2334 file_paths.push_back(ToolPath + "i686-nacl");
2335 break;
2336 }
2337 case llvm::Triple::x86_64: {
2338 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2339 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2340 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2341 file_paths.push_back(ToolPath + "x86_64-nacl");
2342 break;
2343 }
2344 case llvm::Triple::arm: {
2345 file_paths.push_back(FilePath + "arm-nacl/lib");
2346 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2347 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2348 file_paths.push_back(ToolPath + "arm-nacl");
2349 break;
2350 }
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002351 case llvm::Triple::mipsel: {
2352 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2353 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2354 prog_paths.push_back(ProgPath + "bin");
2355 file_paths.push_back(ToolPath + "mipsel-nacl");
2356 break;
2357 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002358 default:
2359 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002360 }
2361
2362 // Use provided linker, not system linker
2363 Linker = GetProgramPath("ld");
2364 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2365}
2366
2367void NaCl_TC::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2368 ArgStringList &CC1Args) const {
2369 const Driver &D = getDriver();
2370 if (DriverArgs.hasArg(options::OPT_nostdinc))
2371 return;
2372
2373 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2374 SmallString<128> P(D.ResourceDir);
2375 llvm::sys::path::append(P, "include");
2376 addSystemInclude(DriverArgs, CC1Args, P.str());
2377 }
2378
2379 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2380 return;
2381
2382 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002383 switch (getTriple().getArch()) {
2384 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002385 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002386 break;
2387 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002388 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002389 break;
2390 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002391 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002392 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002393 case llvm::Triple::mipsel:
2394 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2395 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002396 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002397 return;
2398 }
2399
2400 addSystemInclude(DriverArgs, CC1Args, P.str());
2401 llvm::sys::path::remove_filename(P);
2402 llvm::sys::path::remove_filename(P);
2403 llvm::sys::path::append(P, "include");
2404 addSystemInclude(DriverArgs, CC1Args, P.str());
2405}
2406
2407void NaCl_TC::AddCXXStdlibLibArgs(const ArgList &Args,
2408 ArgStringList &CmdArgs) const {
2409 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2410 // if the value is libc++, and emits an error for other values.
2411 GetCXXStdlibType(Args);
2412 CmdArgs.push_back("-lc++");
2413}
2414
2415void NaCl_TC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2416 ArgStringList &CC1Args) const {
2417 const Driver &D = getDriver();
2418 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2419 DriverArgs.hasArg(options::OPT_nostdincxx))
2420 return;
2421
2422 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2423 // if the value is libc++, and emits an error for other values.
2424 GetCXXStdlibType(DriverArgs);
2425
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002426 SmallString<128> P(D.Dir + "/../");
2427 switch (getTriple().getArch()) {
2428 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002429 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2430 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002431 break;
2432 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002433 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2434 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002435 break;
2436 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002437 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2438 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002439 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002440 case llvm::Triple::mipsel:
2441 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2442 addSystemInclude(DriverArgs, CC1Args, P.str());
2443 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002444 default:
2445 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002446 }
2447}
2448
2449ToolChain::CXXStdlibType NaCl_TC::GetCXXStdlibType(const ArgList &Args) const {
2450 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 Katzmana67e50c2015-06-26 15:47:46 +00002460std::string NaCl_TC::ComputeEffectiveClangTriple(const ArgList &Args,
2461 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002462 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2463 if (TheTriple.getArch() == llvm::Triple::arm &&
2464 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2465 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2466 return TheTriple.getTriple();
2467}
2468
2469Tool *NaCl_TC::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002470 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002471}
2472
2473Tool *NaCl_TC::buildAssembler() const {
2474 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002475 return new tools::nacltools::AssemblerARM(*this);
2476 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002477}
2478// End NaCl
2479
Chris Lattner09797542010-03-04 21:07:38 +00002480/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2481/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2482/// Currently does not support anything else but compilation.
2483
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002484TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002485 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002486 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002487 // Path mangling to find libexec
2488 std::string Path(getDriver().Dir);
2489
2490 Path += "/../libexec";
2491 getProgramPaths().push_back(Path);
2492}
2493
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002494TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002495
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002496bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002497
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002498bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002499
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002500bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002501
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002502bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002503
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002504// CloudABI - CloudABI tool chain which can call ld(1) directly.
2505
2506CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2507 const ArgList &Args)
2508 : Generic_ELF(D, Triple, Args) {
2509 SmallString<128> P(getDriver().Dir);
2510 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2511 getFilePaths().push_back(P.str());
2512}
2513
2514void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2515 ArgStringList &CC1Args) const {
2516 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2517 DriverArgs.hasArg(options::OPT_nostdincxx))
2518 return;
2519
2520 SmallString<128> P(getDriver().Dir);
2521 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2522 addSystemInclude(DriverArgs, CC1Args, P.str());
2523}
2524
2525void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
2526 ArgStringList &CmdArgs) const {
2527 CmdArgs.push_back("-lc++");
2528 CmdArgs.push_back("-lc++abi");
2529 CmdArgs.push_back("-lunwind");
2530}
2531
Douglas Katzman95354292015-06-23 20:42:09 +00002532Tool *CloudABI::buildLinker() const {
2533 return new tools::cloudabi::Linker(*this);
2534}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002535
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002536/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
2537
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002538OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
2539 const ArgList &Args)
2540 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00002541 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002542 getFilePaths().push_back("/usr/lib");
2543}
2544
Rafael Espindola7cf32212013-03-20 03:05:54 +00002545Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002546 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002547}
2548
Douglas Katzman95354292015-06-23 20:42:09 +00002549Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002550
Eli Friedman9fa28852012-08-08 23:57:20 +00002551/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
2552
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002553Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2554 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00002555 getFilePaths().push_back(getDriver().Dir + "/../lib");
2556 getFilePaths().push_back("/usr/lib");
2557}
2558
Rafael Espindola7cf32212013-03-20 03:05:54 +00002559Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002560 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002561}
2562
Douglas Katzman95354292015-06-23 20:42:09 +00002563Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00002564
Douglas Katzman95354292015-06-23 20:42:09 +00002565ToolChain::CXXStdlibType Bitrig::GetCXXStdlibType(const ArgList &Args) const {
Richard Smith51af5192014-05-01 23:24:24 +00002566 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2567 StringRef Value = A->getValue();
2568 if (Value == "libstdc++")
2569 return ToolChain::CST_Libstdcxx;
2570 if (Value == "libc++")
2571 return ToolChain::CST_Libcxx;
2572
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002573 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Richard Smith51af5192014-05-01 23:24:24 +00002574 }
2575 return ToolChain::CST_Libcxx;
2576}
2577
Eli Friedman9fa28852012-08-08 23:57:20 +00002578void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2579 ArgStringList &CC1Args) const {
2580 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2581 DriverArgs.hasArg(options::OPT_nostdincxx))
2582 return;
2583
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002584 switch (GetCXXStdlibType(DriverArgs)) {
2585 case ToolChain::CST_Libcxx:
2586 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00002587 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002588 break;
2589 case ToolChain::CST_Libstdcxx:
2590 addSystemInclude(DriverArgs, CC1Args,
2591 getDriver().SysRoot + "/usr/include/c++/stdc++");
2592 addSystemInclude(DriverArgs, CC1Args,
2593 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00002594
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002595 StringRef Triple = getTriple().str();
2596 if (Triple.startswith("amd64"))
2597 addSystemInclude(DriverArgs, CC1Args,
2598 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002599 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002600 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002601 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
2602 "/usr/include/c++/stdc++/" +
2603 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002604 break;
2605 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002606}
2607
2608void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
2609 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002610 switch (GetCXXStdlibType(Args)) {
2611 case ToolChain::CST_Libcxx:
2612 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00002613 CmdArgs.push_back("-lc++abi");
2614 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002615 break;
2616 case ToolChain::CST_Libstdcxx:
2617 CmdArgs.push_back("-lstdc++");
2618 break;
2619 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002620}
2621
Daniel Dunbare24297c2009-03-30 21:06:03 +00002622/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
2623
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002624FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
2625 const ArgList &Args)
2626 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00002627
Chandler Carruth0b1756b2012-01-26 01:35:15 +00002628 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
2629 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002630 if ((Triple.getArch() == llvm::Triple::x86 ||
2631 Triple.getArch() == llvm::Triple::ppc) &&
Chandler Carruth0b1756b2012-01-26 01:35:15 +00002632 llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002633 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
2634 else
2635 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00002636}
2637
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002638ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
David Chisnall867ccd82013-11-09 15:10:56 +00002639 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2640 StringRef Value = A->getValue();
2641 if (Value == "libstdc++")
2642 return ToolChain::CST_Libstdcxx;
2643 if (Value == "libc++")
2644 return ToolChain::CST_Libcxx;
2645
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002646 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
David Chisnall867ccd82013-11-09 15:10:56 +00002647 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002648 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00002649 return ToolChain::CST_Libcxx;
2650 return ToolChain::CST_Libstdcxx;
2651}
2652
2653void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2654 ArgStringList &CC1Args) const {
2655 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2656 DriverArgs.hasArg(options::OPT_nostdincxx))
2657 return;
2658
2659 switch (GetCXXStdlibType(DriverArgs)) {
2660 case ToolChain::CST_Libcxx:
2661 addSystemInclude(DriverArgs, CC1Args,
2662 getDriver().SysRoot + "/usr/include/c++/v1");
2663 break;
2664 case ToolChain::CST_Libstdcxx:
2665 addSystemInclude(DriverArgs, CC1Args,
2666 getDriver().SysRoot + "/usr/include/c++/4.2");
2667 addSystemInclude(DriverArgs, CC1Args,
2668 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
2669 break;
2670 }
2671}
2672
Rafael Espindola7cf32212013-03-20 03:05:54 +00002673Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002674 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002675}
2676
Douglas Katzman95354292015-06-23 20:42:09 +00002677Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00002678
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002679bool FreeBSD::UseSjLjExceptions() const {
2680 // FreeBSD uses SjLj exceptions on ARM oabi.
2681 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00002682 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002683 case llvm::Triple::GNUEABI:
2684 case llvm::Triple::EABI:
2685 return false;
2686
2687 default:
2688 return (getTriple().getArch() == llvm::Triple::arm ||
2689 getTriple().getArch() == llvm::Triple::thumb);
2690 }
2691}
2692
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002693bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002694
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002695bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002696
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00002697SanitizerMask FreeBSD::getSupportedSanitizers() const {
2698 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
2699 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
2700 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
2701 getTriple().getArch() == llvm::Triple::mips64el;
2702 SanitizerMask Res = ToolChain::getSupportedSanitizers();
2703 Res |= SanitizerKind::Address;
2704 Res |= SanitizerKind::Vptr;
2705 if (IsX86_64 || IsMIPS64) {
2706 Res |= SanitizerKind::Leak;
2707 Res |= SanitizerKind::Thread;
2708 }
2709 if (IsX86 || IsX86_64) {
2710 Res |= SanitizerKind::SafeStack;
2711 }
2712 return Res;
2713}
2714
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002715/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
2716
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002717NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2718 : Generic_ELF(D, Triple, Args) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002719
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00002720 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00002721 // When targeting a 32-bit platform, try the special directory used on
2722 // 64-bit hosts, and only fall back to the main library directory if that
2723 // doesn't work.
2724 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
2725 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002726 switch (Triple.getArch()) {
2727 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00002728 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002729 break;
2730 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00002731 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002732 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00002733 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002734 switch (Triple.getEnvironment()) {
2735 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002736 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002737 getFilePaths().push_back("=/usr/lib/eabi");
2738 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00002739 case llvm::Triple::EABIHF:
2740 case llvm::Triple::GNUEABIHF:
2741 getFilePaths().push_back("=/usr/lib/eabihf");
2742 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002743 default:
2744 getFilePaths().push_back("=/usr/lib/oabi");
2745 break;
2746 }
2747 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002748 case llvm::Triple::mips64:
2749 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002750 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002751 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002752 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002753 getFilePaths().push_back("=/usr/lib/64");
2754 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00002755 case llvm::Triple::ppc:
2756 getFilePaths().push_back("=/usr/lib/powerpc");
2757 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00002758 case llvm::Triple::sparc:
2759 getFilePaths().push_back("=/usr/lib/sparc");
2760 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002761 default:
2762 break;
2763 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00002764
2765 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002766 }
2767}
2768
Rafael Espindola7cf32212013-03-20 03:05:54 +00002769Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002770 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002771}
2772
Douglas Katzman95354292015-06-23 20:42:09 +00002773Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002774
Douglas Katzman95354292015-06-23 20:42:09 +00002775ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002776 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2777 StringRef Value = A->getValue();
2778 if (Value == "libstdc++")
2779 return ToolChain::CST_Libstdcxx;
2780 if (Value == "libc++")
2781 return ToolChain::CST_Libcxx;
2782
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002783 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002784 }
2785
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002786 unsigned Major, Minor, Micro;
2787 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00002788 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002789 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00002790 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00002791 case llvm::Triple::arm:
2792 case llvm::Triple::armeb:
2793 case llvm::Triple::thumb:
2794 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00002795 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00002796 case llvm::Triple::ppc64:
2797 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002798 case llvm::Triple::x86:
2799 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002800 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002801 default:
2802 break;
2803 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002804 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002805 return ToolChain::CST_Libstdcxx;
2806}
2807
2808void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2809 ArgStringList &CC1Args) const {
2810 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2811 DriverArgs.hasArg(options::OPT_nostdincxx))
2812 return;
2813
2814 switch (GetCXXStdlibType(DriverArgs)) {
2815 case ToolChain::CST_Libcxx:
2816 addSystemInclude(DriverArgs, CC1Args,
2817 getDriver().SysRoot + "/usr/include/c++/");
2818 break;
2819 case ToolChain::CST_Libstdcxx:
2820 addSystemInclude(DriverArgs, CC1Args,
2821 getDriver().SysRoot + "/usr/include/g++");
2822 addSystemInclude(DriverArgs, CC1Args,
2823 getDriver().SysRoot + "/usr/include/g++/backward");
2824 break;
2825 }
2826}
2827
Chris Lattner3e2ee142010-07-07 16:01:42 +00002828/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
2829
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002830Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2831 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00002832 getFilePaths().push_back(getDriver().Dir + "/../lib");
2833 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00002834}
2835
Rafael Espindola7cf32212013-03-20 03:05:54 +00002836Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002837 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002838}
2839
Douglas Katzman95354292015-06-23 20:42:09 +00002840Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00002841
David Chisnallf571cde2012-02-15 13:39:01 +00002842/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
2843
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002844Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002845 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002846 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00002847
2848 getProgramPaths().push_back(getDriver().getInstalledDir());
2849 if (getDriver().getInstalledDir() != getDriver().Dir)
2850 getProgramPaths().push_back(getDriver().Dir);
2851
2852 getFilePaths().push_back(getDriver().Dir + "/../lib");
2853 getFilePaths().push_back("/usr/lib");
2854}
2855
Rafael Espindola7cf32212013-03-20 03:05:54 +00002856Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002857 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002858}
2859
Douglas Katzman95354292015-06-23 20:42:09 +00002860Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00002861
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002862/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00002863
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002864enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00002865 // NB: Releases of a particular Linux distro should be kept together
2866 // in this enum, because some tests are done by integer comparison against
2867 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00002868 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002869 DebianLenny,
2870 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00002871 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00002872 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002873 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00002874 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00002875 RHEL4,
2876 RHEL5,
2877 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002878 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00002879 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00002880 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00002881 UbuntuHardy,
2882 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00002883 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00002884 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002885 UbuntuLucid,
2886 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00002887 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00002888 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00002889 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00002890 UbuntuQuantal,
2891 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00002892 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00002893 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002894 UbuntuUtopic,
2895 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00002896 UbuntuWily,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002897 UnknownDistro
2898};
2899
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002900static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002901 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002902}
2903
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002904static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002905
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002906static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002907 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002908}
2909
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002910static bool IsUbuntu(enum Distro Distro) {
Benjamin Kramer2d469802015-07-09 15:31:17 +00002911 return Distro >= UbuntuHardy && Distro <= UbuntuWily;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002912}
2913
Rafael Espindolaa8398552013-10-28 23:14:34 +00002914static Distro DetectDistro(llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00002915 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
2916 llvm::MemoryBuffer::getFile("/etc/lsb-release");
2917 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002918 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00002919 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002920 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00002921 Distro Version = UnknownDistro;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002922 for (const StringRef Line : Lines)
2923 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
2924 Version = llvm::StringSwitch<Distro>(Line.substr(17))
2925 .Case("hardy", UbuntuHardy)
2926 .Case("intrepid", UbuntuIntrepid)
2927 .Case("jaunty", UbuntuJaunty)
2928 .Case("karmic", UbuntuKarmic)
2929 .Case("lucid", UbuntuLucid)
2930 .Case("maverick", UbuntuMaverick)
2931 .Case("natty", UbuntuNatty)
2932 .Case("oneiric", UbuntuOneiric)
2933 .Case("precise", UbuntuPrecise)
2934 .Case("quantal", UbuntuQuantal)
2935 .Case("raring", UbuntuRaring)
2936 .Case("saucy", UbuntuSaucy)
2937 .Case("trusty", UbuntuTrusty)
2938 .Case("utopic", UbuntuUtopic)
2939 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00002940 .Case("wily", UbuntuWily)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002941 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00002942 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002943 }
2944
Rafael Espindola2d2b4202014-07-06 17:43:24 +00002945 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
2946 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002947 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00002948 if (Data.startswith("Fedora release"))
2949 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00002950 if (Data.startswith("Red Hat Enterprise Linux") ||
2951 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002952 if (Data.find("release 7") != StringRef::npos)
2953 return RHEL7;
2954 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00002955 return RHEL6;
2956 else if (Data.find("release 5") != StringRef::npos)
2957 return RHEL5;
2958 else if (Data.find("release 4") != StringRef::npos)
2959 return RHEL4;
2960 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002961 return UnknownDistro;
2962 }
2963
Rafael Espindola2d2b4202014-07-06 17:43:24 +00002964 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
2965 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002966 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002967 if (Data[0] == '5')
2968 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00002969 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002970 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002971 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00002972 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002973 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00002974 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00002975 else if (Data.startswith("stretch/sid") || Data[0] == '9')
2976 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002977 return UnknownDistro;
2978 }
2979
Rafael Espindolaa8398552013-10-28 23:14:34 +00002980 if (llvm::sys::fs::exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00002981 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002982
Rafael Espindolaa8398552013-10-28 23:14:34 +00002983 if (llvm::sys::fs::exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00002984 return Exherbo;
2985
Rafael Espindolaa8398552013-10-28 23:14:34 +00002986 if (llvm::sys::fs::exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00002987 return ArchLinux;
2988
Rafael Espindolac8f008f2010-11-07 20:14:31 +00002989 return UnknownDistro;
2990}
2991
Chandler Carruthfb7fa242011-10-31 08:42:24 +00002992/// \brief Get our best guess at the multiarch triple for a target.
2993///
2994/// Debian-based systems are starting to use a multiarch setup where they use
2995/// a target-triple directory in the library and header search paths.
2996/// Unfortunately, this triple does not align with the vanilla target triple,
2997/// so we provide a rough mapping here.
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00002998static std::string getMultiarchTriple(const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00002999 StringRef SysRoot) {
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003000 llvm::Triple::EnvironmentType TargetEnvironment = TargetTriple.getEnvironment();
3001
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003002 // For most architectures, just use whatever we have rather than trying to be
3003 // clever.
3004 switch (TargetTriple.getArch()) {
3005 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003006 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003007
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003008 // We use the existence of '/lib/<triple>' as a directory to detect some
3009 // common linux triples that don't quite match the Clang triple for both
3010 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3011 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003012 case llvm::Triple::arm:
3013 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003014 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003015 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf"))
3016 return "arm-linux-gnueabihf";
3017 } else {
3018 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi"))
3019 return "arm-linux-gnueabi";
3020 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003021 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003022 case llvm::Triple::armeb:
3023 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003024 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003025 if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
3026 return "armeb-linux-gnueabihf";
3027 } else {
3028 if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabi"))
3029 return "armeb-linux-gnueabi";
3030 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003031 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003032 case llvm::Triple::x86:
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003033 if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
3034 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003035 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003036 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003037 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003038 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00003039 llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003040 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003041 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003042 case llvm::Triple::aarch64:
3043 if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64-linux-gnu"))
3044 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003045 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003046 case llvm::Triple::aarch64_be:
3047 if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
3048 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003049 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003050 case llvm::Triple::mips:
3051 if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu"))
3052 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003053 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003054 case llvm::Triple::mipsel:
3055 if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu"))
3056 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003057 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003058 case llvm::Triple::mips64:
3059 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnu"))
3060 return "mips64-linux-gnu";
3061 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
3062 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003063 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003064 case llvm::Triple::mips64el:
3065 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnu"))
3066 return "mips64el-linux-gnu";
3067 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
3068 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003069 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003070 case llvm::Triple::ppc:
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003071 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
3072 return "powerpc-linux-gnuspe";
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003073 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu"))
3074 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003075 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003076 case llvm::Triple::ppc64:
3077 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu"))
3078 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003079 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003080 case llvm::Triple::ppc64le:
3081 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
3082 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003083 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003084 case llvm::Triple::sparc:
3085 if (llvm::sys::fs::exists(SysRoot + "/lib/sparc-linux-gnu"))
3086 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003087 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003088 case llvm::Triple::sparcv9:
3089 if (llvm::sys::fs::exists(SysRoot + "/lib/sparc64-linux-gnu"))
3090 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003091 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003092 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003093 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003094}
3095
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003096static void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003097 if (llvm::sys::fs::exists(Path))
3098 Paths.push_back(Path.str());
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003099}
3100
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003101static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003102 if (isMipsArch(Triple.getArch())) {
3103 // lib32 directory has a special meaning on MIPS targets.
3104 // It contains N32 ABI binaries. Use this folder if produce
3105 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003106 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003107 return "lib32";
3108 return Triple.isArch32Bit() ? "lib" : "lib64";
3109 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003110
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003111 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003112 // using that variant while targeting other architectures causes problems
3113 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003114 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003115 // them when we know we may need it.
3116 //
3117 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003118 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003119 // GCCInstallationDetector, but that is a more significant refactoring.
3120 if (Triple.getArch() == llvm::Triple::x86 ||
3121 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003122 return "lib32";
3123
Zinovy Nis1db95732014-07-10 15:27:19 +00003124 if (Triple.getArch() == llvm::Triple::x86_64 &&
3125 Triple.getEnvironment() == llvm::Triple::GNUX32)
3126 return "libx32";
3127
Simon Atanasyand4413882012-09-14 11:27:24 +00003128 return Triple.isArch32Bit() ? "lib" : "lib64";
3129}
3130
Rafael Espindola1af7c212012-02-19 01:38:32 +00003131Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003132 : Generic_ELF(D, Triple, Args) {
Roman Divacky326d9982013-12-06 18:32:18 +00003133 GCCInstallation.init(D, Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003134 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003135 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003136 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003137
Rafael Espindola10a63c22013-07-03 14:14:00 +00003138 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003139 // least) put various tools in a triple-prefixed directory off of the parent
3140 // of the GCC installation. We use the GCC triple here to ensure that we end
3141 // up with tools that support the same amount of cross compiling as the
3142 // detected GCC installation. For example, if we find a GCC installation
3143 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3144 // used to target i386.
3145 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003146 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003147 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003148 GCCInstallation.getTriple().str() + "/bin")
3149 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003150
Logan Chieneb9162f2014-06-26 14:23:45 +00003151 Linker = GetLinkerPath();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003152
Rafael Espindolaa8398552013-10-28 23:14:34 +00003153 Distro Distro = DetectDistro(Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003154
Rafael Espindola10a63c22013-07-03 14:14:00 +00003155 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003156 ExtraOpts.push_back("-z");
3157 ExtraOpts.push_back("relro");
3158 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003159
Douglas Gregord9bb1522011-03-06 19:11:49 +00003160 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003161 ExtraOpts.push_back("-X");
3162
Logan Chienc6fd8202012-09-02 09:30:11 +00003163 const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003164 const bool IsMips = isMipsArch(Arch);
3165
3166 if (IsMips && !SysRoot.empty())
3167 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003168
Chandler Carruth0b842912011-12-09 04:45:18 +00003169 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3170 // and the MIPS ABI require .dynsym to be sorted in different ways.
3171 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3172 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003173 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003174 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003175 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003176 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003177 ExtraOpts.push_back("--hash-style=gnu");
3178
Rafael Espindola10a63c22013-07-03 14:14:00 +00003179 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003180 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3181 ExtraOpts.push_back("--hash-style=both");
3182 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003183
Chris Lattner84e38552011-05-22 05:36:06 +00003184 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003185 ExtraOpts.push_back("--no-add-needed");
3186
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003187 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003188 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003189 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003190 ExtraOpts.push_back("--build-id");
3191
Rafael Espindola10a63c22013-07-03 14:14:00 +00003192 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003193 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003194
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003195 // The selection of paths to try here is designed to match the patterns which
3196 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3197 // This was determined by running GCC in a fake filesystem, creating all
3198 // possible permutations of these directories, and seeing which ones it added
3199 // to the link paths.
3200 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003201
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003202 const std::string OSLibDir = getOSLibDir(Triple, Args);
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003203 const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003204
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003205 // Add the multilib suffixed paths where they are available.
3206 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003207 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003208 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003209 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003210
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003211 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003212 // a biarch-like suffix of the GCC installation.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003213 addPathIfExists((GCCInstallation.getInstallPath() + Multilib.gccSuffix()),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003214 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003215
3216 // GCC cross compiling toolchains will install target libraries which ship
3217 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3218 // any part of the GCC installation in
3219 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3220 // debatable, but is the reality today. We need to search this tree even
3221 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003222 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003223 // installation that is *not* within the system root to ensure two things:
3224 //
3225 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003226 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003227 // appropriate rpath.
3228 // 2) There must not be libraries installed into
3229 // <prefix>/<triple>/<libdir> unless they should be preferred over
3230 // those within the system root.
3231 //
3232 // Note that this matches the GCC behavior. See the below comment for where
3233 // Clang diverges from GCC's behavior.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003234 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + OSLibDir +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003235 Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003236 Paths);
3237
Chandler Carruth69a125b2012-04-06 16:32:06 +00003238 // If the GCC installation we found is inside of the sysroot, we want to
3239 // prefer libraries installed in the parent prefix of the GCC installation.
3240 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003241 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003242 // This usually happens when there is an external cross compiler on the
3243 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003244 // the cross. Note that GCC does include some of these directories in some
3245 // configurations but this seems somewhere between questionable and simply
3246 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003247 if (StringRef(LibPath).startswith(SysRoot)) {
Chandler Carruth69a125b2012-04-06 16:32:06 +00003248 addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003249 addPathIfExists(LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003250 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003251 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003252
3253 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003254 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003255 // those searched.
3256 // FIXME: It's not clear whether we should use the driver's installed
3257 // directory ('Dir' below) or the ResourceDir.
3258 if (StringRef(D.Dir).startswith(SysRoot)) {
3259 addPathIfExists(D.Dir + "/../lib/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003260 addPathIfExists(D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003261 }
3262
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003263 addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003264 addPathIfExists(SysRoot + "/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003265 addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003266 addPathIfExists(SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003267
Chandler Carruthb427c562013-06-22 11:35:51 +00003268 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003269 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003270 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003271 addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003272 "/../../" + OSLibDir,
3273 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003274
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003275 // Add the 'other' biarch variant path
3276 Multilib BiarchSibling;
3277 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003278 addPathIfExists(
3279 GCCInstallation.getInstallPath() + BiarchSibling.gccSuffix(), Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003280 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003281
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003282 // See comments above on the multilib variant for details of why this is
3283 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003284 const std::string &LibPath = GCCInstallation.getParentLibPath();
3285 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3286 const Multilib &Multilib = GCCInstallation.getMultilib();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003287 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib" +
3288 Multilib.osSuffix(),
3289 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003290
3291 // See comments above on the multilib variant for details of why this is
3292 // only included from within the sysroot.
3293 if (StringRef(LibPath).startswith(SysRoot))
Chandler Carruth69a125b2012-04-06 16:32:06 +00003294 addPathIfExists(LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003295 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003296
3297 // Similar to the logic for GCC above, if we are currently running Clang
3298 // inside of the requested system root, add its parent library path to those
3299 // searched.
3300 // FIXME: It's not clear whether we should use the driver's installed
3301 // directory ('Dir' below) or the ResourceDir.
3302 if (StringRef(D.Dir).startswith(SysRoot))
3303 addPathIfExists(D.Dir + "/../lib", Paths);
3304
Chandler Carruth2a649c72011-10-03 06:41:08 +00003305 addPathIfExists(SysRoot + "/lib", Paths);
3306 addPathIfExists(SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003307}
3308
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003309bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003310
Douglas Katzman95354292015-06-23 20:42:09 +00003311Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003312
3313Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003314 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003315}
3316
Simon Atanasyana0d89572013-10-05 14:37:55 +00003317std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003318 if (!getDriver().SysRoot.empty())
3319 return getDriver().SysRoot;
3320
3321 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3322 return std::string();
3323
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003324 // Standalone MIPS toolchains use different names for sysroot folder
3325 // and put it into different places. Here we try to check some known
3326 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003327
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003328 const StringRef InstallDir = GCCInstallation.getInstallPath();
3329 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003330 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003331
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003332 std::string Path =
3333 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3334 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003335
3336 if (llvm::sys::fs::exists(Path))
3337 return Path;
3338
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003339 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003340
3341 if (llvm::sys::fs::exists(Path))
3342 return Path;
3343
3344 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003345}
3346
Chandler Carrutha796f532011-11-05 20:17:13 +00003347void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3348 ArgStringList &CC1Args) const {
3349 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003350 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003351
3352 if (DriverArgs.hasArg(options::OPT_nostdinc))
3353 return;
3354
3355 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003356 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003357
3358 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003359 SmallString<128> P(D.ResourceDir);
3360 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003361 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003362 }
3363
3364 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3365 return;
3366
3367 // Check for configure-time C include directories.
3368 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3369 if (CIncludeDirs != "") {
3370 SmallVector<StringRef, 5> dirs;
3371 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003372 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003373 StringRef Prefix =
3374 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003375 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003376 }
3377 return;
3378 }
3379
3380 // Lacking those, try to detect the correct set of system includes for the
3381 // target triple.
3382
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003383 // Add include directories specific to the selected multilib set and multilib.
3384 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003385 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003386 if (Callback) {
3387 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3388 GCCInstallation.getTriple().str(),
3389 GCCInstallation.getMultilib());
3390 for (const auto &Path : IncludePaths)
3391 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3392 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003393 }
3394
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003395 // Implement generic Debian multiarch support.
3396 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003397 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003398
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003399 // FIXME: These are older forms of multiarch. It's not clear that they're
3400 // in use in any released version of Debian, so we should consider
3401 // removing them.
3402 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003403 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003404 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003405
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003406 // FIXME: These are older forms of multiarch. It's not clear that they're
3407 // in use in any released version of Debian, so we should consider
3408 // removing them.
3409 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3410 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003411 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003412 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003413 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003414 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003415 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003416 "/usr/include/arm-linux-gnueabihf"};
3417 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003418 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003419 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003420 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003421 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003422 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003423 "/usr/include/mips64el-linux-gnu",
3424 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003425 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003426 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003427 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003428 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003429 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003430 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003431 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003432 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003433 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003434 "/usr/include/sparc64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003435 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003436 switch (getTriple().getArch()) {
3437 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003438 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003439 break;
3440 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003441 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003442 break;
3443 case llvm::Triple::aarch64:
3444 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003445 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003446 break;
3447 case llvm::Triple::arm:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003448 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3449 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3450 else
3451 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003452 break;
3453 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00003454 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003455 break;
3456 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00003457 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003458 break;
3459 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003460 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003461 break;
3462 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003463 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003464 break;
3465 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003466 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003467 break;
3468 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003469 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003470 break;
3471 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003472 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003473 break;
3474 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00003475 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003476 break;
3477 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00003478 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003479 break;
3480 default:
3481 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003482 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003483 for (StringRef Dir : MultiarchIncludeDirs) {
3484 if (llvm::sys::fs::exists(SysRoot + Dir)) {
3485 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003486 break;
3487 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003488 }
3489
3490 if (getTriple().getOS() == llvm::Triple::RTEMS)
3491 return;
3492
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003493 // Add an include of '/include' directly. This isn't provided by default by
3494 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
3495 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003496 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003497
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003498 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003499}
3500
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003501/// \brief Helper to add the variant paths of a libstdc++ installation.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003502/*static*/ bool Linux::addLibStdCXXIncludePaths(
3503 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
3504 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
3505 const ArgList &DriverArgs, ArgStringList &CC1Args) {
Chandler Carruthc26a79d2014-08-27 18:21:27 +00003506 if (!llvm::sys::fs::exists(Base + Suffix))
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003507 return false;
Chandler Carrutha796f532011-11-05 20:17:13 +00003508
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003509 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003510
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003511 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
3512 // that path exists or we have neither a GCC nor target multiarch triple, use
3513 // this vanilla search path.
3514 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
3515 llvm::sys::fs::exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
3516 addSystemInclude(DriverArgs, CC1Args,
3517 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
3518 } else {
3519 // Otherwise try to use multiarch naming schemes which have normalized the
3520 // triples and put the triple before the suffix.
3521 //
3522 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
3523 // the target triple, so we support that here.
3524 addSystemInclude(DriverArgs, CC1Args,
3525 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
3526 addSystemInclude(DriverArgs, CC1Args,
3527 Base + "/" + TargetMultiarchTriple + Suffix);
3528 }
3529
3530 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003531 return true;
3532}
3533
Chandler Carrutha796f532011-11-05 20:17:13 +00003534void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3535 ArgStringList &CC1Args) const {
3536 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3537 DriverArgs.hasArg(options::OPT_nostdincxx))
3538 return;
3539
Chandler Carruthf4701732011-11-07 09:01:17 +00003540 // Check if libc++ has been enabled and provide its include paths if so.
3541 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003542 const std::string LibCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003543 // The primary location is within the Clang installation.
3544 // FIXME: We shouldn't hard code 'v1' here to make Clang future proof to
3545 // newer ABI versions.
3546 getDriver().Dir + "/../include/c++/v1",
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003547
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003548 // We also check the system as for a long time this is the only place
3549 // Clang looked.
3550 // FIXME: We should really remove this. It doesn't make any sense.
3551 getDriver().SysRoot + "/usr/include/c++/v1"};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003552 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
3553 if (!llvm::sys::fs::exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003554 continue;
3555 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003556 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003557 break;
3558 }
Chandler Carruthf4701732011-11-07 09:01:17 +00003559 return;
3560 }
3561
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00003562 // We need a detected GCC installation on Linux to provide libstdc++'s
3563 // headers. We handled the libc++ case above.
3564 if (!GCCInstallation.isValid())
3565 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00003566
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003567 // By default, look for the C++ headers in an include directory adjacent to
3568 // the lib directory of the GCC installation. Note that this is expect to be
3569 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
3570 StringRef LibDir = GCCInstallation.getParentLibPath();
3571 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003572 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003573 const Multilib &Multilib = GCCInstallation.getMultilib();
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003574 const std::string GCCMultiarchTriple =
3575 getMultiarchTriple(GCCInstallation.getTriple(), getDriver().SysRoot);
3576 const std::string TargetMultiarchTriple =
3577 getMultiarchTriple(getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00003578 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003579
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003580 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00003581 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003582 "/c++/" + Version.Text, TripleStr,
3583 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003584 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003585 return;
3586
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003587 // Otherwise, fall back on a bunch of options which don't use multiarch
3588 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003589 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003590 // Gentoo is weird and places its headers inside the GCC install,
3591 // so if the first attempt to find the headers fails, try these patterns.
3592 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
3593 Version.MinorStr,
3594 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
3595 // Android standalone toolchain has C++ headers in yet another place.
3596 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
3597 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
3598 // without a subdirectory corresponding to the gcc version.
3599 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003600 };
3601
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003602 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003603 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
3604 /*GCCMultiarchTriple*/ "",
3605 /*TargetMultiarchTriple*/ "",
3606 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003607 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003608 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003609}
3610
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003611bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003612
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003613SanitizerMask Linux::getSupportedSanitizers() const {
3614 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3615 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3616 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3617 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00003618 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
3619 getTriple().getArch() == llvm::Triple::ppc64le;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003620 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3621 Res |= SanitizerKind::Address;
3622 Res |= SanitizerKind::KernelAddress;
3623 Res |= SanitizerKind::Vptr;
3624 if (IsX86_64 || IsMIPS64) {
3625 Res |= SanitizerKind::DataFlow;
3626 Res |= SanitizerKind::Leak;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003627 Res |= SanitizerKind::Thread;
3628 }
Jay Foade967dd02015-06-25 10:35:19 +00003629 if (IsX86_64 || IsMIPS64 || IsPowerPC64)
3630 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003631 if (IsX86 || IsX86_64) {
3632 Res |= SanitizerKind::Function;
3633 Res |= SanitizerKind::SafeStack;
3634 }
3635 return Res;
3636}
3637
Daniel Dunbarcc912342009-05-02 18:28:39 +00003638/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
3639
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003640DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
3641 const ArgList &Args)
3642 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00003643
3644 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00003645 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00003646 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00003647 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00003648
Daniel Dunbar083edf72009-12-21 18:54:17 +00003649 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00003650 getFilePaths().push_back("/usr/lib");
John McCall65b8da02013-04-11 22:55:55 +00003651 if (llvm::sys::fs::exists("/usr/lib/gcc47"))
3652 getFilePaths().push_back("/usr/lib/gcc47");
3653 else
3654 getFilePaths().push_back("/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00003655}
3656
Rafael Espindola7cf32212013-03-20 03:05:54 +00003657Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003658 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003659}
3660
3661Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003662 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00003663}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003664
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003665/// Stub for CUDA toolchain. At the moment we don't have assembler or
3666/// linker and need toolchain mainly to propagate device-side options
3667/// to CC1.
3668
3669CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
3670 const ArgList &Args)
3671 : Linux(D, Triple, Args) {}
3672
3673void
3674CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
3675 llvm::opt::ArgStringList &CC1Args) const {
3676 Linux::addClangTargetOptions(DriverArgs, CC1Args);
3677 CC1Args.push_back("-fcuda-is-device");
3678}
3679
3680llvm::opt::DerivedArgList *
3681CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
3682 const char *BoundArch) const {
3683 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
3684 const OptTable &Opts = getDriver().getOpts();
3685
3686 for (Arg *A : Args) {
3687 if (A->getOption().matches(options::OPT_Xarch__)) {
3688 // Skip this argument unless the architecture matches BoundArch
3689 if (A->getValue(0) != StringRef(BoundArch))
3690 continue;
3691
3692 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
3693 unsigned Prev = Index;
3694 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
3695
3696 // If the argument parsing failed or more than one argument was
3697 // consumed, the -Xarch_ argument's parameter tried to consume
3698 // extra arguments. Emit an error and ignore.
3699 //
3700 // We also want to disallow any options which would alter the
3701 // driver behavior; that isn't going to work in our model. We
3702 // use isDriverOption() as an approximation, although things
3703 // like -O4 are going to slip through.
3704 if (!XarchArg || Index > Prev + 1) {
3705 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
3706 << A->getAsString(Args);
3707 continue;
3708 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
3709 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
3710 << A->getAsString(Args);
3711 continue;
3712 }
3713 XarchArg->setBaseArg(A);
3714 A = XarchArg.release();
3715 DAL->AddSynthesizedArg(A);
3716 }
3717 DAL->append(A);
3718 }
3719
3720 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
3721 return DAL;
3722}
3723
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003724/// XCore tool chain
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003725XCore::XCore(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3726 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003727 // ProgramPaths are found via 'PATH' environment variable.
3728}
3729
3730Tool *XCore::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003731 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003732}
3733
Douglas Katzman95354292015-06-23 20:42:09 +00003734Tool *XCore::buildLinker() const { return new tools::XCore::Linker(*this); }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003735
Douglas Katzman95354292015-06-23 20:42:09 +00003736bool XCore::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003737
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003738bool XCore::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003739
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003740bool XCore::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003741
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003742bool XCore::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003743
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003744bool XCore::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003745
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003746void XCore::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3747 ArgStringList &CC1Args) const {
3748 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
3749 DriverArgs.hasArg(options::OPT_nostdlibinc))
3750 return;
3751 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
3752 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003753 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003754 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3755 ArrayRef<StringRef> DirVec(Dirs);
3756 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3757 }
3758}
3759
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00003760void XCore::addClangTargetOptions(const ArgList &DriverArgs,
3761 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003762 CC1Args.push_back("-nostdsysteminc");
3763}
3764
3765void XCore::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3766 ArgStringList &CC1Args) const {
3767 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00003768 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3769 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003770 return;
3771 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
3772 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003773 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003774 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3775 ArrayRef<StringRef> DirVec(Dirs);
3776 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3777 }
3778}
3779
3780void XCore::AddCXXStdlibLibArgs(const ArgList &Args,
3781 ArgStringList &CmdArgs) const {
3782 // We don't output any lib args. This is handled by xcc.
3783}
Douglas Katzman84a75642015-06-19 14:55:19 +00003784
3785// SHAVEToolChain does not call Clang's C compiler.
3786// We override SelectTool to avoid testing ShouldUseClangCompiler().
3787Tool *SHAVEToolChain::SelectTool(const JobAction &JA) const {
3788 switch (JA.getKind()) {
3789 case Action::CompileJobClass:
3790 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00003791 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00003792 return Compiler.get();
3793 case Action::AssembleJobClass:
3794 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00003795 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00003796 return Assembler.get();
3797 default:
3798 return ToolChain::getTool(JA.getKind());
3799 }
3800}
3801
3802SHAVEToolChain::SHAVEToolChain(const Driver &D, const llvm::Triple &Triple,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003803 const ArgList &Args)
Douglas Katzman84a75642015-06-19 14:55:19 +00003804 : Generic_GCC(D, Triple, Args) {}
3805
3806SHAVEToolChain::~SHAVEToolChain() {}
3807
3808/// Following are methods necessary to avoid having moviClang be an abstract
3809/// class.
3810
3811Tool *SHAVEToolChain::getTool(Action::ActionClass AC) const {
3812 // SelectTool() must find a tool using the method in the superclass.
3813 // There's nothing we can do if that fails.
3814 llvm_unreachable("SHAVEToolChain can't getTool");
3815}
3816
3817Tool *SHAVEToolChain::buildLinker() const {
3818 // SHAVEToolChain executables can not be linked except by the vendor tools.
3819 llvm_unreachable("SHAVEToolChain can't buildLinker");
3820}
3821
3822Tool *SHAVEToolChain::buildAssembler() const {
3823 // This one you'd think should be reachable since we expose an
3824 // assembler to the driver, except not the way it expects.
3825 llvm_unreachable("SHAVEToolChain can't buildAssembler");
3826}