blob: 668fc0252f57641bd9aa6181904f75907f4d8a4c [file] [log] [blame]
Nick Lewycky6da90772010-12-31 17:31:54 +00001//===--- ToolChains.cpp - ToolChain Implementations -----------------------===//
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "ToolChains.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "clang/Basic/ObjCRuntime.h"
12#include "clang/Basic/Version.h"
Alp Toker1d257e12014-06-04 03:28:55 +000013#include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
Daniel Dunbar6232d342010-05-20 21:48:38 +000014#include "clang/Driver/Compilation.h"
Daniel Dunbar76ce7412009-03-23 16:15:50 +000015#include "clang/Driver/Driver.h"
Daniel Dunbaraabb0b12009-03-25 06:12:34 +000016#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000017#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000018#include "clang/Driver/SanitizerArgs.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "llvm/ADT/STLExtras.h"
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +000020#include "llvm/ADT/SmallString.h"
Daniel Dunbar76ce7412009-03-23 16:15:50 +000021#include "llvm/ADT/StringExtras.h"
Bob Wilson997a97f2011-10-07 00:37:57 +000022#include "llvm/ADT/StringSwitch.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000023#include "llvm/Option/Arg.h"
24#include "llvm/Option/ArgList.h"
25#include "llvm/Option/OptTable.h"
26#include "llvm/Option/Option.h"
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +000027#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000028#include "llvm/Support/FileSystem.h"
Rafael Espindolac8f008f2010-11-07 20:14:31 +000029#include "llvm/Support/MemoryBuffer.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000030#include "llvm/Support/Path.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000031#include "llvm/Support/Program.h"
Renato Golin33e1f822015-05-28 15:49:28 +000032#include "llvm/Support/TargetParser.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000033#include "llvm/Support/raw_ostream.h"
Daniel Dunbarb5023e92009-04-10 21:00:07 +000034#include <cstdlib> // ::getenv
Rafael Espindola8a8e5542014-06-12 17:19:42 +000035#include <system_error>
Daniel Dunbarb5023e92009-04-10 21:00:07 +000036
Daniel Dunbar59e5e882009-03-20 00:20:03 +000037using namespace clang::driver;
38using namespace clang::driver::toolchains;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000039using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000040using namespace llvm::opt;
Daniel Dunbar59e5e882009-03-20 00:20:03 +000041
Douglas Katzmana67e50c2015-06-26 15:47:46 +000042MachO::MachO(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
43 : ToolChain(D, Triple, Args) {
Tim Northover15ff71d2014-05-22 13:12:14 +000044 // We expect 'as', 'ld', etc. to be adjacent to our install dir.
45 getProgramPaths().push_back(getDriver().getInstalledDir());
46 if (getDriver().getInstalledDir() != getDriver().Dir)
47 getProgramPaths().push_back(getDriver().Dir);
Tim Northover157d9112014-01-16 08:48:16 +000048}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +000049
Tim Northover157d9112014-01-16 08:48:16 +000050/// Darwin - Darwin tool chain for i386 and x86_64.
Alexey Samsonov905c8022015-06-18 21:46:05 +000051Darwin::Darwin(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
52 : MachO(D, Triple, Args), TargetInitialized(false) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +000053
Tim Northover157d9112014-01-16 08:48:16 +000054types::ID MachO::LookupTypeForExtension(const char *Ext) const {
Daniel Dunbarcc7df6c2010-08-02 05:43:56 +000055 types::ID Ty = types::lookupTypeForExtension(Ext);
56
57 // Darwin always preprocesses assembly files (unless -x is used explicitly).
58 if (Ty == types::TY_PP_Asm)
59 return types::TY_Asm;
60
61 return Ty;
62}
63
Douglas Katzmana67e50c2015-06-26 15:47:46 +000064bool MachO::HasNativeLLVMSupport() const { return true; }
Daniel Dunbar62123a12010-09-17 00:24:52 +000065
John McCall24fc0de2011-07-06 00:26:06 +000066/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
John McCall5fb5df92012-06-20 06:18:46 +000067ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
Tim Northover9c7e0352013-12-12 11:55:52 +000068 if (isTargetIOSBased())
John McCall5fb5df92012-06-20 06:18:46 +000069 return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
Bob Wilson5ad5a952012-11-09 01:59:30 +000070 if (isNonFragile)
71 return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
72 return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
John McCall24fc0de2011-07-06 00:26:06 +000073}
74
John McCall7959fee2011-09-09 20:41:01 +000075/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
76bool Darwin::hasBlocksRuntime() const {
Tim Northover9c7e0352013-12-12 11:55:52 +000077 if (isTargetIOSBased())
John McCall7959fee2011-09-09 20:41:01 +000078 return !isIPhoneOSVersionLT(3, 2);
Tim Northover9c7e0352013-12-12 11:55:52 +000079 else {
Tim Northover157d9112014-01-16 08:48:16 +000080 assert(isTargetMacOS() && "unexpected darwin target");
81 return !isMacosxVersionLT(10, 6);
Tim Northover9c7e0352013-12-12 11:55:52 +000082 }
John McCall7959fee2011-09-09 20:41:01 +000083}
84
Renato Golin33e1f822015-05-28 15:49:28 +000085// This is just a MachO name translation routine and there's no
86// way to join this into ARMTargetParser without breaking all
87// other assumptions. Maybe MachO should consider standardising
88// their nomenclature.
89static const char *ArmMachOArchName(StringRef Arch) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000090 return llvm::StringSwitch<const char *>(Arch)
91 .Case("armv6k", "armv6")
92 .Case("armv6m", "armv6m")
93 .Case("armv5tej", "armv5")
94 .Case("xscale", "xscale")
95 .Case("armv4t", "armv4t")
96 .Case("armv7", "armv7")
97 .Cases("armv7a", "armv7-a", "armv7")
98 .Cases("armv7r", "armv7-r", "armv7")
99 .Cases("armv7em", "armv7e-m", "armv7em")
100 .Cases("armv7k", "armv7-k", "armv7k")
101 .Cases("armv7m", "armv7-m", "armv7m")
102 .Cases("armv7s", "armv7-s", "armv7s")
103 .Default(nullptr);
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000104}
105
Renato Golin33e1f822015-05-28 15:49:28 +0000106static const char *ArmMachOArchNameCPU(StringRef CPU) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000107 unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
Renato Golin33e1f822015-05-28 15:49:28 +0000108 if (ArchKind == llvm::ARM::AK_INVALID)
109 return nullptr;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000110 StringRef Arch = llvm::ARM::getArchName(ArchKind);
Renato Golin33e1f822015-05-28 15:49:28 +0000111
112 // FIXME: Make sure this MachO triple mangling is really necessary.
113 // ARMv5* normalises to ARMv5.
114 if (Arch.startswith("armv5"))
115 Arch = Arch.substr(0, 5);
116 // ARMv6*, except ARMv6M, normalises to ARMv6.
117 else if (Arch.startswith("armv6") && !Arch.endswith("6m"))
118 Arch = Arch.substr(0, 5);
119 // ARMv7A normalises to ARMv7.
120 else if (Arch.endswith("v7a"))
121 Arch = Arch.substr(0, 5);
122 return Arch.data();
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000123}
124
Tim Northover9c7e0352013-12-12 11:55:52 +0000125static bool isSoftFloatABI(const ArgList &Args) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000126 Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
Tim Northover9c7e0352013-12-12 11:55:52 +0000127 options::OPT_mfloat_abi_EQ);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000128 if (!A)
129 return false;
Rafael Auler3f7abf72014-09-29 21:50:34 +0000130
Tim Northover9c7e0352013-12-12 11:55:52 +0000131 return A->getOption().matches(options::OPT_msoft_float) ||
132 (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
133 A->getValue() == StringRef("soft"));
134}
135
Tim Northover157d9112014-01-16 08:48:16 +0000136StringRef MachO::getMachOArchName(const ArgList &Args) const {
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000137 switch (getTriple().getArch()) {
138 default:
Rafael Espindolaed1233e2014-08-28 21:23:05 +0000139 return getDefaultUniversalArchName();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000140
Tim Northover40956e62014-07-23 12:32:58 +0000141 case llvm::Triple::aarch64:
142 return "arm64";
143
Douglas Gregord9bb1522011-03-06 19:11:49 +0000144 case llvm::Triple::thumb:
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000145 case llvm::Triple::arm: {
146 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000147 if (const char *Arch = ArmMachOArchName(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000148 return Arch;
149
150 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000151 if (const char *Arch = ArmMachOArchNameCPU(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000152 return Arch;
153
154 return "arm";
155 }
156 }
157}
158
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000159Darwin::~Darwin() {}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000160
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000161MachO::~MachO() {}
Tim Northover157d9112014-01-16 08:48:16 +0000162
163std::string MachO::ComputeEffectiveClangTriple(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000164 types::ID InputType) const {
Tim Northover157d9112014-01-16 08:48:16 +0000165 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
166
167 return Triple.getTriple();
168}
169
Chad Rosierd3a0f952011-09-20 20:44:06 +0000170std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
171 types::ID InputType) const {
172 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000173
174 // If the target isn't initialized (e.g., an unknown Darwin platform, return
175 // the default triple).
176 if (!isTargetInitialized())
177 return Triple.getTriple();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000178
Tim Northover157d9112014-01-16 08:48:16 +0000179 SmallString<16> Str;
180 Str += isTargetIOSBased() ? "ios" : "macosx";
181 Str += getTargetVersion().getAsString();
182 Triple.setOSName(Str);
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000183
184 return Triple.getTriple();
185}
186
David Blaikie68e081d2011-12-20 02:48:34 +0000187void Generic_ELF::anchor() {}
188
Tim Northover157d9112014-01-16 08:48:16 +0000189Tool *MachO::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +0000190 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000191 case Action::LipoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000192 if (!Lipo)
193 Lipo.reset(new tools::darwin::Lipo(*this));
194 return Lipo.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000195 case Action::DsymutilJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000196 if (!Dsymutil)
197 Dsymutil.reset(new tools::darwin::Dsymutil(*this));
198 return Dsymutil.get();
Ben Langmuir9b9a8d32014-02-06 18:53:25 +0000199 case Action::VerifyDebugInfoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000200 if (!VerifyDebug)
201 VerifyDebug.reset(new tools::darwin::VerifyDebug(*this));
202 return VerifyDebug.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +0000203 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000204 return ToolChain::getTool(AC);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000205 }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000206}
207
Douglas Katzman95354292015-06-23 20:42:09 +0000208Tool *MachO::buildLinker() const { return new tools::darwin::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +0000209
Tim Northover157d9112014-01-16 08:48:16 +0000210Tool *MachO::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +0000211 return new tools::darwin::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +0000212}
Daniel Dunbar26d482a2009-09-18 08:15:03 +0000213
Douglas Katzman95354292015-06-23 20:42:09 +0000214DarwinClang::DarwinClang(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +0000215 const ArgList &Args)
Douglas Katzman95354292015-06-23 20:42:09 +0000216 : Darwin(D, Triple, Args) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +0000217
Tim Northover336f1892014-03-29 13:16:12 +0000218void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
219 // For iOS, 64-bit, promote certain warnings to errors.
220 if (!isTargetMacOS() && getTriple().isArch64Bit()) {
221 // Always enable -Wdeprecated-objc-isa-usage and promote it
222 // to an error.
223 CC1Args.push_back("-Wdeprecated-objc-isa-usage");
224 CC1Args.push_back("-Werror=deprecated-objc-isa-usage");
225
226 // Also error about implicit function declarations, as that
227 // can impact calling conventions.
228 CC1Args.push_back("-Werror=implicit-function-declaration");
229 }
230}
231
Tim Northover157d9112014-01-16 08:48:16 +0000232/// \brief Determine whether Objective-C automated reference counting is
233/// enabled.
234static bool isObjCAutoRefCount(const ArgList &Args) {
235 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
236}
237
John McCall31168b02011-06-15 23:02:42 +0000238void DarwinClang::AddLinkARCArgs(const ArgList &Args,
239 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000240 // Avoid linking compatibility stubs on i386 mac.
241 if (isTargetMacOS() && getArch() == llvm::Triple::x86)
242 return;
243
244 ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true);
245
246 if ((runtime.hasNativeARC() || !isObjCAutoRefCount(Args)) &&
247 runtime.hasSubscripting())
248 return;
Eric Christopher551ef452011-08-23 17:56:55 +0000249
250 CmdArgs.push_back("-force_load");
Rafael Espindola358256c2013-06-26 02:13:00 +0000251 SmallString<128> P(getDriver().ClangExecutable);
252 llvm::sys::path::remove_filename(P); // 'clang'
253 llvm::sys::path::remove_filename(P); // 'bin'
Benjamin Kramer17381a02013-06-28 16:25:46 +0000254 llvm::sys::path::append(P, "lib", "arc", "libarclite_");
John McCall31168b02011-06-15 23:02:42 +0000255 // Mash in the platform.
Argyrios Kyrtzidis058b4512011-10-18 17:40:15 +0000256 if (isTargetIOSSimulator())
Rafael Espindola358256c2013-06-26 02:13:00 +0000257 P += "iphonesimulator";
Argyrios Kyrtzidis058b4512011-10-18 17:40:15 +0000258 else if (isTargetIPhoneOS())
Rafael Espindola358256c2013-06-26 02:13:00 +0000259 P += "iphoneos";
John McCall31168b02011-06-15 23:02:42 +0000260 else
Rafael Espindola358256c2013-06-26 02:13:00 +0000261 P += "macosx";
262 P += ".a";
John McCall31168b02011-06-15 23:02:42 +0000263
Rafael Espindola358256c2013-06-26 02:13:00 +0000264 CmdArgs.push_back(Args.MakeArgString(P));
John McCall31168b02011-06-15 23:02:42 +0000265}
266
Tim Northover157d9112014-01-16 08:48:16 +0000267void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
Kuba Brecka2735a0252014-10-31 00:08:57 +0000268 StringRef DarwinLibName, bool AlwaysLink,
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000269 bool IsEmbedded, bool AddRPath) const {
270 SmallString<128> Dir(getDriver().ResourceDir);
271 llvm::sys::path::append(Dir, "lib", IsEmbedded ? "macho_embedded" : "darwin");
272
273 SmallString<128> P(Dir);
274 llvm::sys::path::append(P, DarwinLibName);
Eric Christopher551ef452011-08-23 17:56:55 +0000275
Eric Christopherc235d0c62011-06-22 17:41:40 +0000276 // For now, allow missing resource libraries to support developers who may
Alexey Samsonov8368b372012-11-21 14:17:42 +0000277 // not have compiler-rt checked out or integrated into their build (unless
278 // we explicitly force linking with this library).
Yaron Keren92e1b622015-03-18 10:17:07 +0000279 if (AlwaysLink || llvm::sys::fs::exists(P))
280 CmdArgs.push_back(Args.MakeArgString(P));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000281
282 // Adding the rpaths might negatively interact when other rpaths are involved,
283 // so we should make sure we add the rpaths last, after all user-specified
284 // rpaths. This is currently true from this place, but we need to be
285 // careful if this function is ever called before user's rpaths are emitted.
286 if (AddRPath) {
287 assert(DarwinLibName.endswith(".dylib") && "must be a dynamic library");
288
289 // Add @executable_path to rpath to support having the dylib copied with
290 // the executable.
291 CmdArgs.push_back("-rpath");
292 CmdArgs.push_back("@executable_path");
293
294 // Add the path to the resource dir to rpath to support using the dylib
295 // from the default location without copying.
296 CmdArgs.push_back("-rpath");
Yaron Keren92e1b622015-03-18 10:17:07 +0000297 CmdArgs.push_back(Args.MakeArgString(Dir));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000298 }
Eric Christopherc235d0c62011-06-22 17:41:40 +0000299}
300
Justin Bogner2fd95f62015-05-12 06:30:48 +0000301void Darwin::addProfileRTLibs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000302 ArgStringList &CmdArgs) const {
Justin Bognerc7701242015-05-12 05:44:36 +0000303 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
304 false) ||
305 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +0000306 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bognerc7701242015-05-12 05:44:36 +0000307 Args.hasArg(options::OPT_fprofile_instr_generate) ||
308 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
309 Args.hasArg(options::OPT_fcreate_profile) ||
310 Args.hasArg(options::OPT_coverage)))
311 return;
312
313 // Select the appropriate runtime library for the target.
314 if (isTargetIOSBased())
315 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a",
316 /*AlwaysLink*/ true);
317 else
318 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a",
319 /*AlwaysLink*/ true);
320}
321
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000322void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
323 ArgStringList &CmdArgs,
324 StringRef Sanitizer) const {
325 if (!Args.hasArg(options::OPT_dynamiclib) &&
326 !Args.hasArg(options::OPT_bundle)) {
327 // Sanitizer runtime libraries requires C++.
328 AddCXXStdlibLibArgs(Args, CmdArgs);
329 }
330 assert(isTargetMacOS() || isTargetIOSSimulator());
331 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000332 AddLinkRuntimeLib(
333 Args, CmdArgs,
334 (Twine("libclang_rt.") + Sanitizer + "_" + OS + "_dynamic.dylib").str(),
335 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
336 /*AddRPath*/ true);
Hans Wennborg10821e52015-04-09 18:47:01 +0000337
338 if (GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) {
339 // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
340 // all RTTI-related symbols that UBSan uses.
341 CmdArgs.push_back("-lc++abi");
342 }
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000343}
344
Daniel Dunbar6276f992009-09-18 08:15:13 +0000345void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
346 ArgStringList &CmdArgs) const {
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000347 // Darwin only supports the compiler-rt based runtime libraries.
348 switch (GetRuntimeLibType(Args)) {
349 case ToolChain::RLT_CompilerRT:
350 break;
351 default:
352 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000353 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000354 return;
355 }
356
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000357 // Darwin doesn't support real static executables, don't link any runtime
358 // libraries with -static.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000359 if (Args.hasArg(options::OPT_static) ||
360 Args.hasArg(options::OPT_fapple_kext) ||
361 Args.hasArg(options::OPT_mkernel))
Daniel Dunbar6276f992009-09-18 08:15:13 +0000362 return;
Daniel Dunbar6276f992009-09-18 08:15:13 +0000363
364 // Reject -static-libgcc for now, we can deal with this when and if someone
365 // cares. This is useful in situations where someone wants to statically link
366 // something like libstdc++, and needs its runtime support routines.
367 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000368 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
Daniel Dunbar6276f992009-09-18 08:15:13 +0000369 return;
370 }
371
Peter Collingbourne32701642013-11-01 18:16:25 +0000372 const SanitizerArgs &Sanitize = getSanitizerArgs();
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +0000373 if (Sanitize.needsAsanRt())
374 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
375 if (Sanitize.needsUbsanRt())
376 AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
Daniel Dunbar1d6469f2011-12-01 23:40:18 +0000377
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000378 // Otherwise link libSystem, then the dynamic runtime library, and finally any
379 // target specific static runtime library.
Daniel Dunbar6276f992009-09-18 08:15:13 +0000380 CmdArgs.push_back("-lSystem");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000381
382 // Select the dynamic runtime library and the target specific static library.
Tim Northover9c7e0352013-12-12 11:55:52 +0000383 if (isTargetIOSBased()) {
Daniel Dunbar2f31fb92011-04-30 04:25:16 +0000384 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
385 // it never went into the SDK.
Bob Wilson102be442011-10-07 17:54:41 +0000386 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
Tim Northovera2ee4332014-03-29 15:09:45 +0000387 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
Tim Northover40956e62014-07-23 12:32:58 +0000388 getTriple().getArch() != llvm::Triple::aarch64)
Bob Wilson102be442011-10-07 17:54:41 +0000389 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000390
Daniel Dunbard1076382011-04-18 23:48:36 +0000391 // We currently always need a static runtime library for iOS.
Eric Christopherc235d0c62011-06-22 17:41:40 +0000392 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000393 } else {
Tim Northover9c7e0352013-12-12 11:55:52 +0000394 assert(isTargetMacOS() && "unexpected non MacOS platform");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000395 // The dynamic runtime library was merged with libSystem for 10.6 and
396 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000397 if (isMacosxVersionLT(10, 5))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000398 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000399 else if (isMacosxVersionLT(10, 6))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000400 CmdArgs.push_back("-lgcc_s.10.5");
401
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000402 // For OS X, we thought we would only need a static runtime library when
Chris Lattner57540c52011-04-15 05:22:18 +0000403 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000404 // omitted from 10.4.dylib.
405 //
406 // Unfortunately, that turned out to not be true, because Darwin system
407 // headers can still use eprintf on i386, and it is not exported from
408 // libSystem. Therefore, we still must provide a runtime library just for
409 // the tiny tiny handful of projects that *might* use that symbol.
410 if (isMacosxVersionLT(10, 5)) {
Eric Christopherc235d0c62011-06-22 17:41:40 +0000411 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000412 } else {
413 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopherc235d0c62011-06-22 17:41:40 +0000414 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
415 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000416 }
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000417 }
Daniel Dunbar6276f992009-09-18 08:15:13 +0000418}
419
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000420void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +0000421 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000422
Daniel Dunbar455a0492012-08-17 18:43:50 +0000423 // Support allowing the SDKROOT environment variable used by xcrun and other
424 // Xcode tools to define the default sysroot, by making it the default for
425 // isysroot.
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000426 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
427 // Warn if the path does not exist.
Rafael Espindola355670d2013-06-25 15:14:22 +0000428 if (!llvm::sys::fs::exists(A->getValue()))
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000429 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
430 } else {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000431 if (char *env = ::getenv("SDKROOT")) {
Daniel Dunbarb2543042013-01-15 20:33:56 +0000432 // We only use this value as the default if it is an absolute path,
433 // exists, and it is not the root path.
434 if (llvm::sys::path::is_absolute(env) && llvm::sys::fs::exists(env) &&
435 StringRef(env) != "/") {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000436 Args.append(Args.MakeSeparateArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000437 nullptr, Opts.getOption(options::OPT_isysroot), env));
Daniel Dunbar455a0492012-08-17 18:43:50 +0000438 }
439 }
440 }
441
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000442 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000443 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
Eli Friedman027e9c32012-01-11 02:41:15 +0000444
Bob Wilson7f294b52014-10-10 23:10:10 +0000445 if (OSXVersion && iOSVersion) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000446 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000447 << OSXVersion->getAsString(Args) << iOSVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000448 iOSVersion = nullptr;
449 } else if (!OSXVersion && !iOSVersion) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000450 // If no deployment target was specified on the command line, check for
Daniel Dunbard54669d2010-01-26 01:45:19 +0000451 // environment defines.
Alexey Samsonov905c8022015-06-18 21:46:05 +0000452 std::string OSXTarget;
453 std::string iOSTarget;
Chad Rosier64707fe2011-08-31 20:56:25 +0000454 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
455 OSXTarget = env;
456 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
457 iOSTarget = env;
Daniel Dunbarb5023e92009-04-10 21:00:07 +0000458
Steven Wu7a1372c2015-06-25 01:59:35 +0000459 // If there is no command-line argument to specify the Target version and
460 // no environment variable defined, see if we can set the default based
461 // on -isysroot.
462 if (iOSTarget.empty() && OSXTarget.empty() &&
463 Args.hasArg(options::OPT_isysroot)) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000464 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000465 StringRef isysroot = A->getValue();
Steven Wu7a1372c2015-06-25 01:59:35 +0000466 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
467 size_t BeginSDK = isysroot.rfind("SDKs/");
468 size_t EndSDK = isysroot.rfind(".sdk");
469 if (BeginSDK != StringRef::npos && EndSDK != StringRef::npos) {
470 StringRef SDK = isysroot.slice(BeginSDK + 5, EndSDK);
471 // Slice the version number out.
472 // Version number is between the first and the last number.
473 size_t StartVer = SDK.find_first_of("0123456789");
474 size_t EndVer = SDK.find_last_of("0123456789");
475 if (StartVer != StringRef::npos && EndVer > StartVer) {
476 StringRef Version = SDK.slice(StartVer, EndVer + 1);
477 if (SDK.startswith("iPhoneOS") ||
478 SDK.startswith("iPhoneSimulator"))
479 iOSTarget = Version;
480 else if (SDK.startswith("MacOSX"))
481 OSXTarget = Version;
482 }
483 }
Chad Rosier64707fe2011-08-31 20:56:25 +0000484 }
485 }
Daniel Dunbard54669d2010-01-26 01:45:19 +0000486
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000487 // If no OSX or iOS target has been specified, try to guess platform
Alexey Samsonov905c8022015-06-18 21:46:05 +0000488 // from arch name and compute the version from the triple.
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000489 if (OSXTarget.empty() && iOSTarget.empty()) {
490 StringRef MachOArchName = getMachOArchName(Args);
Alexey Samsonov905c8022015-06-18 21:46:05 +0000491 unsigned Major, Minor, Micro;
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000492 if (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
Alexey Samsonov905c8022015-06-18 21:46:05 +0000493 MachOArchName == "arm64") {
494 getTriple().getiOSVersion(Major, Minor, Micro);
495 llvm::raw_string_ostream(iOSTarget) << Major << '.' << Minor << '.'
496 << Micro;
497 } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
498 MachOArchName != "armv7em") {
499 if (!getTriple().getMacOSXVersion(Major, Minor, Micro)) {
500 getDriver().Diag(diag::err_drv_invalid_darwin_version)
501 << getTriple().getOSName();
502 }
503 llvm::raw_string_ostream(OSXTarget) << Major << '.' << Minor << '.'
504 << Micro;
505 }
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000506 }
Chad Rosierfe6fd362011-09-28 00:46:32 +0000507
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000508 // Allow conflicts among OSX and iOS for historical reasons, but choose the
509 // default platform.
Chad Rosier64707fe2011-08-31 20:56:25 +0000510 if (!OSXTarget.empty() && !iOSTarget.empty()) {
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000511 if (getTriple().getArch() == llvm::Triple::arm ||
Tim Northover573cbee2014-05-24 12:52:07 +0000512 getTriple().getArch() == llvm::Triple::aarch64 ||
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000513 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosier64707fe2011-08-31 20:56:25 +0000514 OSXTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000515 else
Chad Rosier64707fe2011-08-31 20:56:25 +0000516 iOSTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000517 }
Daniel Dunbar65969842010-01-29 17:02:25 +0000518
Chad Rosier64707fe2011-08-31 20:56:25 +0000519 if (!OSXTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000520 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000521 OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000522 Args.append(OSXVersion);
Chad Rosier64707fe2011-08-31 20:56:25 +0000523 } else if (!iOSTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000524 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000525 iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000526 Args.append(iOSVersion);
Daniel Dunbar84e727f2009-09-04 18:35:21 +0000527 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000528 }
Mike Stump11289f42009-09-09 15:08:12 +0000529
Tim Northover9c7e0352013-12-12 11:55:52 +0000530 DarwinPlatformKind Platform;
531 if (OSXVersion)
532 Platform = MacOS;
533 else if (iOSVersion)
534 Platform = IPhoneOS;
Tim Northover9c7e0352013-12-12 11:55:52 +0000535 else
Tim Northover157d9112014-01-16 08:48:16 +0000536 llvm_unreachable("Unable to infer Darwin variant");
Tim Northover9c7e0352013-12-12 11:55:52 +0000537
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000538 // Set the tool chain target information.
539 unsigned Major, Minor, Micro;
540 bool HadExtra;
Tim Northover9c7e0352013-12-12 11:55:52 +0000541 if (Platform == MacOS) {
Bob Wilson7f294b52014-10-10 23:10:10 +0000542 assert(!iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000543 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, Micro,
544 HadExtra) ||
545 HadExtra || Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000546 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000547 << OSXVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000548 } else if (Platform == IPhoneOS) {
549 assert(iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000550 if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
551 HadExtra) ||
552 HadExtra || Major >= 10 || Minor >= 100 || Micro >= 100)
Eli Friedman027e9c32012-01-11 02:41:15 +0000553 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000554 << iOSVersion->getAsString(Args);
Tim Northover157d9112014-01-16 08:48:16 +0000555 } else
556 llvm_unreachable("unknown kind of Darwin platform");
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000557
Bob Wilson7f294b52014-10-10 23:10:10 +0000558 // Recognize iOS targets with an x86 architecture as the iOS simulator.
Daniel Dunbarb1189432011-04-30 04:18:16 +0000559 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
560 getTriple().getArch() == llvm::Triple::x86_64))
Tim Northover9c7e0352013-12-12 11:55:52 +0000561 Platform = IPhoneOSSimulator;
Daniel Dunbarb1189432011-04-30 04:18:16 +0000562
Tim Northover9c7e0352013-12-12 11:55:52 +0000563 setTarget(Platform, Major, Minor, Micro);
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000564}
565
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000566void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000567 ArgStringList &CmdArgs) const {
568 CXXStdlibType Type = GetCXXStdlibType(Args);
569
570 switch (Type) {
571 case ToolChain::CST_Libcxx:
572 CmdArgs.push_back("-lc++");
573 break;
574
575 case ToolChain::CST_Libstdcxx: {
576 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
577 // it was previously found in the gcc lib dir. However, for all the Darwin
578 // platforms we care about it was -lstdc++.6, so we search for that
579 // explicitly if we can't see an obvious -lstdc++ candidate.
580
581 // Check in the sysroot first.
582 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000583 SmallString<128> P(A->getValue());
Benjamin Kramer17381a02013-06-28 16:25:46 +0000584 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000585
Yaron Keren92e1b622015-03-18 10:17:07 +0000586 if (!llvm::sys::fs::exists(P)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000587 llvm::sys::path::remove_filename(P);
588 llvm::sys::path::append(P, "libstdc++.6.dylib");
Yaron Keren92e1b622015-03-18 10:17:07 +0000589 if (llvm::sys::fs::exists(P)) {
590 CmdArgs.push_back(Args.MakeArgString(P));
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000591 return;
592 }
593 }
594 }
595
596 // Otherwise, look in the root.
Bob Wilson1a9ad0f2011-11-11 07:47:04 +0000597 // FIXME: This should be removed someday when we don't have to care about
598 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
Rafael Espindola355670d2013-06-25 15:14:22 +0000599 if (!llvm::sys::fs::exists("/usr/lib/libstdc++.dylib") &&
600 llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib")) {
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000601 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
602 return;
603 }
604
605 // Otherwise, let the linker search.
606 CmdArgs.push_back("-lstdc++");
607 break;
608 }
609 }
610}
611
Shantonu Senafeb03b2010-09-17 18:39:08 +0000612void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
613 ArgStringList &CmdArgs) const {
614
615 // For Darwin platforms, use the compiler-rt-based support library
616 // instead of the gcc-provided one (which is also incidentally
617 // only present in the gcc lib dir, which makes it hard to find).
618
Rafael Espindola358256c2013-06-26 02:13:00 +0000619 SmallString<128> P(getDriver().ResourceDir);
Benjamin Kramer17381a02013-06-28 16:25:46 +0000620 llvm::sys::path::append(P, "lib", "darwin");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000621
622 // Use the newer cc_kext for iOS ARM after 6.0.
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000623 if (isTargetIPhoneOS()) {
624 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000625 } else {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000626 llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000627 }
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000628
Shantonu Senafeb03b2010-09-17 18:39:08 +0000629 // For now, allow missing resource libraries to support developers who may
630 // not have compiler-rt checked out or integrated into their build.
Yaron Keren92e1b622015-03-18 10:17:07 +0000631 if (llvm::sys::fs::exists(P))
632 CmdArgs.push_back(Args.MakeArgString(P));
Shantonu Senafeb03b2010-09-17 18:39:08 +0000633}
634
Tim Northover157d9112014-01-16 08:48:16 +0000635DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
636 const char *BoundArch) const {
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000637 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
638 const OptTable &Opts = getDriver().getOpts();
639
640 // FIXME: We really want to get out of the tool chain level argument
641 // translation business, as it makes the driver functionality much
642 // more opaque. For now, we follow gcc closely solely for the
643 // purpose of easily achieving feature parity & testability. Once we
644 // have something that works, we should reevaluate each translation
645 // and try to push it down into tool specific logic.
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000646
Simon Atanasyan6f657c42014-05-08 19:32:46 +0000647 for (Arg *A : Args) {
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000648 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar471c4f82011-06-21 00:20:17 +0000649 // Skip this argument unless the architecture matches either the toolchain
650 // triple arch, or the arch being bound.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000651 llvm::Triple::ArchType XarchArch =
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000652 tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
653 if (!(XarchArch == getArch() ||
654 (BoundArch &&
655 XarchArch ==
656 tools::darwin::getArchTypeForMachOArchName(BoundArch))))
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000657 continue;
658
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000659 Arg *OriginalArg = A;
Richard Smithbd55daf2012-11-01 04:30:05 +0000660 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000661 unsigned Prev = Index;
Nico Webera04d5f82014-05-11 17:27:13 +0000662 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
Mike Stump11289f42009-09-09 15:08:12 +0000663
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000664 // If the argument parsing failed or more than one argument was
665 // consumed, the -Xarch_ argument's parameter tried to consume
666 // extra arguments. Emit an error and ignore.
667 //
668 // We also want to disallow any options which would alter the
669 // driver behavior; that isn't going to work in our model. We
670 // use isDriverOption() as an approximation, although things
671 // like -O4 are going to slip through.
Daniel Dunbar5a784c82011-04-21 17:41:34 +0000672 if (!XarchArg || Index > Prev + 1) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000673 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000674 << A->getAsString(Args);
Daniel Dunbar6914a982011-04-21 17:32:21 +0000675 continue;
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000676 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000677 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000678 << A->getAsString(Args);
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000679 continue;
680 }
681
Daniel Dunbar53b406f2009-03-29 22:29:05 +0000682 XarchArg->setBaseArg(A);
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000683
Nico Webera04d5f82014-05-11 17:27:13 +0000684 A = XarchArg.release();
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000685 DAL->AddSynthesizedArg(A);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000686
687 // Linker input arguments require custom handling. The problem is that we
688 // have already constructed the phase actions, so we can not treat them as
689 // "input arguments".
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000690 if (A->getOption().hasFlag(options::LinkerInput)) {
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000691 // Convert the argument into individual Zlinker_input_args.
Douglas Katzman6bbffc42015-06-25 18:51:37 +0000692 for (const char *Value : A->getValues()) {
693 DAL->AddSeparateArg(
694 OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000695 }
696 continue;
697 }
Mike Stump11289f42009-09-09 15:08:12 +0000698 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000699
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000700 // Sob. These is strictly gcc compatible for the time being. Apple
701 // gcc translates options twice, which means that self-expanding
702 // options add duplicates.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000703 switch ((options::ID)A->getOption().getID()) {
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000704 default:
705 DAL->append(A);
706 break;
707
708 case options::OPT_mkernel:
709 case options::OPT_fapple_kext:
710 DAL->append(A);
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000711 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000712 break;
Mike Stump11289f42009-09-09 15:08:12 +0000713
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000714 case options::OPT_dependency_file:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000715 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000716 break;
717
718 case options::OPT_gfull:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000719 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000720 DAL->AddFlagArg(
721 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000722 break;
723
724 case options::OPT_gused:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000725 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000726 DAL->AddFlagArg(
727 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000728 break;
729
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000730 case options::OPT_shared:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000731 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000732 break;
733
734 case options::OPT_fconstant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000735 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000736 break;
737
738 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000739 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000740 break;
741
742 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000743 DAL->AddFlagArg(A,
744 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000745 break;
746
747 case options::OPT_Wno_nonportable_cfstrings:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000748 DAL->AddFlagArg(
749 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000750 break;
751
752 case options::OPT_fpascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000753 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000754 break;
755
756 case options::OPT_fno_pascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000757 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000758 break;
759 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000760 }
761
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000762 if (getTriple().getArch() == llvm::Triple::x86 ||
763 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbarfffd1812009-11-19 04:00:53 +0000764 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000765 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
766 "core2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000767
768 // Add the arch options based on the particular spelling of -arch, to match
Chad Rosier7c5d9082012-04-27 14:58:16 +0000769 // how the driver driver works.
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000770 if (BoundArch) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000771 StringRef Name = BoundArch;
Michael J. Spencerfc790902012-10-19 22:36:40 +0000772 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
773 const Option MArch = Opts.getOption(options::OPT_march_EQ);
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000774
775 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
776 // which defines the list of which architectures we accept.
777 if (Name == "ppc")
778 ;
779 else if (Name == "ppc601")
Craig Topper92fc2df2014-05-17 16:56:41 +0000780 DAL->AddJoinedArg(nullptr, MCpu, "601");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000781 else if (Name == "ppc603")
Craig Topper92fc2df2014-05-17 16:56:41 +0000782 DAL->AddJoinedArg(nullptr, MCpu, "603");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000783 else if (Name == "ppc604")
Craig Topper92fc2df2014-05-17 16:56:41 +0000784 DAL->AddJoinedArg(nullptr, MCpu, "604");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000785 else if (Name == "ppc604e")
Craig Topper92fc2df2014-05-17 16:56:41 +0000786 DAL->AddJoinedArg(nullptr, MCpu, "604e");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000787 else if (Name == "ppc750")
Craig Topper92fc2df2014-05-17 16:56:41 +0000788 DAL->AddJoinedArg(nullptr, MCpu, "750");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000789 else if (Name == "ppc7400")
Craig Topper92fc2df2014-05-17 16:56:41 +0000790 DAL->AddJoinedArg(nullptr, MCpu, "7400");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000791 else if (Name == "ppc7450")
Craig Topper92fc2df2014-05-17 16:56:41 +0000792 DAL->AddJoinedArg(nullptr, MCpu, "7450");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000793 else if (Name == "ppc970")
Craig Topper92fc2df2014-05-17 16:56:41 +0000794 DAL->AddJoinedArg(nullptr, MCpu, "970");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000795
Bill Schmidt778d3872013-07-26 01:36:11 +0000796 else if (Name == "ppc64" || Name == "ppc64le")
Craig Topper92fc2df2014-05-17 16:56:41 +0000797 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000798
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000799 else if (Name == "i386")
800 ;
801 else if (Name == "i486")
Craig Topper92fc2df2014-05-17 16:56:41 +0000802 DAL->AddJoinedArg(nullptr, MArch, "i486");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000803 else if (Name == "i586")
Craig Topper92fc2df2014-05-17 16:56:41 +0000804 DAL->AddJoinedArg(nullptr, MArch, "i586");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000805 else if (Name == "i686")
Craig Topper92fc2df2014-05-17 16:56:41 +0000806 DAL->AddJoinedArg(nullptr, MArch, "i686");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000807 else if (Name == "pentium")
Craig Topper92fc2df2014-05-17 16:56:41 +0000808 DAL->AddJoinedArg(nullptr, MArch, "pentium");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000809 else if (Name == "pentium2")
Craig Topper92fc2df2014-05-17 16:56:41 +0000810 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000811 else if (Name == "pentpro")
Craig Topper92fc2df2014-05-17 16:56:41 +0000812 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000813 else if (Name == "pentIIm3")
Craig Topper92fc2df2014-05-17 16:56:41 +0000814 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000815
816 else if (Name == "x86_64")
Craig Topper92fc2df2014-05-17 16:56:41 +0000817 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Jim Grosbach82eee262013-11-16 00:53:35 +0000818 else if (Name == "x86_64h") {
Craig Topper92fc2df2014-05-17 16:56:41 +0000819 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
820 DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
Jim Grosbach82eee262013-11-16 00:53:35 +0000821 }
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000822
823 else if (Name == "arm")
Craig Topper92fc2df2014-05-17 16:56:41 +0000824 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000825 else if (Name == "armv4t")
Craig Topper92fc2df2014-05-17 16:56:41 +0000826 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000827 else if (Name == "armv5")
Craig Topper92fc2df2014-05-17 16:56:41 +0000828 DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000829 else if (Name == "xscale")
Craig Topper92fc2df2014-05-17 16:56:41 +0000830 DAL->AddJoinedArg(nullptr, MArch, "xscale");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000831 else if (Name == "armv6")
Craig Topper92fc2df2014-05-17 16:56:41 +0000832 DAL->AddJoinedArg(nullptr, MArch, "armv6k");
Bob Wilson743bf672013-03-04 22:37:49 +0000833 else if (Name == "armv6m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000834 DAL->AddJoinedArg(nullptr, MArch, "armv6m");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000835 else if (Name == "armv7")
Craig Topper92fc2df2014-05-17 16:56:41 +0000836 DAL->AddJoinedArg(nullptr, MArch, "armv7a");
Bob Wilson743bf672013-03-04 22:37:49 +0000837 else if (Name == "armv7em")
Craig Topper92fc2df2014-05-17 16:56:41 +0000838 DAL->AddJoinedArg(nullptr, MArch, "armv7em");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000839 else if (Name == "armv7k")
Craig Topper92fc2df2014-05-17 16:56:41 +0000840 DAL->AddJoinedArg(nullptr, MArch, "armv7k");
Bob Wilson743bf672013-03-04 22:37:49 +0000841 else if (Name == "armv7m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000842 DAL->AddJoinedArg(nullptr, MArch, "armv7m");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000843 else if (Name == "armv7s")
Craig Topper92fc2df2014-05-17 16:56:41 +0000844 DAL->AddJoinedArg(nullptr, MArch, "armv7s");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000845 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000846
Tim Northover157d9112014-01-16 08:48:16 +0000847 return DAL;
848}
849
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000850void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
851 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000852 // Embedded targets are simple at the moment, not supporting sanitizers and
853 // with different libraries for each member of the product { static, PIC } x
854 // { hard-float, soft-float }
855 llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000856 CompilerRT +=
857 (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
858 ? "hard"
859 : "soft";
Tim Northover157d9112014-01-16 08:48:16 +0000860 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
861
862 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
863}
864
Tim Northover157d9112014-01-16 08:48:16 +0000865DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
866 const char *BoundArch) const {
867 // First get the generic Apple args, before moving onto Darwin-specific ones.
868 DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
869 const OptTable &Opts = getDriver().getOpts();
870
Bob Wilsonf8cf1612014-02-21 00:20:07 +0000871 // If no architecture is bound, none of the translations here are relevant.
872 if (!BoundArch)
873 return DAL;
874
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000875 // Add an explicit version min argument for the deployment target. We do this
876 // after argument translation because -Xarch_ arguments may add a version min
877 // argument.
Bob Wilsonf8cf1612014-02-21 00:20:07 +0000878 AddDeploymentTarget(*DAL);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000879
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000880 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
881 // FIXME: It would be far better to avoid inserting those -static arguments,
882 // but we can't check the deployment target in the translation code until
883 // it is set here.
Bob Wilson5f4346d2014-12-02 00:27:35 +0000884 if (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000885 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie;) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000886 Arg *A = *it;
887 ++it;
888 if (A->getOption().getID() != options::OPT_mkernel &&
889 A->getOption().getID() != options::OPT_fapple_kext)
890 continue;
891 assert(it != ie && "unexpected argument translation");
892 A = *it;
893 assert(A->getOption().getID() == options::OPT_static &&
894 "missing expected -static argument");
895 it = DAL->getArgs().erase(it);
896 }
897 }
898
Bob Wilson0f7445b2013-11-02 23:19:53 +0000899 // Default to use libc++ on OS X 10.9+ and iOS 7+.
900 if (((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
Tim Northover9c7e0352013-12-12 11:55:52 +0000901 (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0))) &&
Bob Wilson0f7445b2013-11-02 23:19:53 +0000902 !Args.getLastArg(options::OPT_stdlib_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000903 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
904 "libc++");
Bob Wilson0f7445b2013-11-02 23:19:53 +0000905
Bob Wilson102be442011-10-07 17:54:41 +0000906 // Validate the C++ standard library choice.
907 CXXStdlibType Type = GetCXXStdlibType(*DAL);
908 if (Type == ToolChain::CST_Libcxx) {
John McCall5fb5df92012-06-20 06:18:46 +0000909 // Check whether the target provides libc++.
910 StringRef where;
911
Alp Tokerf6a24ce2013-12-05 16:25:25 +0000912 // Complain about targeting iOS < 5.0 in any way.
Tim Northover9c7e0352013-12-12 11:55:52 +0000913 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
Bob Wilson5ad5a952012-11-09 01:59:30 +0000914 where = "iOS 5.0";
John McCall5fb5df92012-06-20 06:18:46 +0000915
916 if (where != StringRef()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000917 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where;
Bob Wilson102be442011-10-07 17:54:41 +0000918 }
919 }
920
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000921 return DAL;
Mike Stump11289f42009-09-09 15:08:12 +0000922}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000923
Tim Northover157d9112014-01-16 08:48:16 +0000924bool MachO::IsUnwindTablesDefault() const {
Rafael Espindolae8bd4e52012-10-07 03:23:40 +0000925 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000926}
927
Tim Northover157d9112014-01-16 08:48:16 +0000928bool MachO::UseDwarfDebugFlags() const {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +0000929 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
930 return S[0] != '\0';
931 return false;
932}
933
Daniel Dunbar3241d402010-02-10 18:49:11 +0000934bool Darwin::UseSjLjExceptions() const {
935 // Darwin uses SjLj exceptions on ARM.
936 return (getTriple().getArch() == llvm::Triple::arm ||
937 getTriple().getArch() == llvm::Triple::thumb);
938}
939
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000940bool MachO::isPICDefault() const { return true; }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000941
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000942bool MachO::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +0000943
Tim Northover157d9112014-01-16 08:48:16 +0000944bool MachO::isPICDefaultForced() const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000945 return (getArch() == llvm::Triple::x86_64 ||
Tim Northover573cbee2014-05-24 12:52:07 +0000946 getArch() == llvm::Triple::aarch64);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000947}
948
Tim Northover157d9112014-01-16 08:48:16 +0000949bool MachO::SupportsProfiling() const {
Daniel Dunbar733b0f82011-03-01 18:49:30 +0000950 // Profiling instrumentation is only supported on x86.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000951 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
Daniel Dunbar733b0f82011-03-01 18:49:30 +0000952}
953
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000954void Darwin::addMinVersionArgs(const ArgList &Args,
955 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000956 VersionTuple TargetVersion = getTargetVersion();
957
Bob Wilson771b7cd2014-10-10 19:38:34 +0000958 if (isTargetIOSSimulator())
Tim Northover157d9112014-01-16 08:48:16 +0000959 CmdArgs.push_back("-ios_simulator_version_min");
Bob Wilson5cfc55e2014-02-01 21:06:21 +0000960 else if (isTargetIOSBased())
Tim Northover157d9112014-01-16 08:48:16 +0000961 CmdArgs.push_back("-iphoneos_version_min");
962 else {
963 assert(isTargetMacOS() && "unexpected target");
964 CmdArgs.push_back("-macosx_version_min");
965 }
966
967 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
968}
969
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000970void Darwin::addStartObjectFileArgs(const ArgList &Args,
971 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000972 // Derived from startfile spec.
973 if (Args.hasArg(options::OPT_dynamiclib)) {
974 // Derived from darwin_dylib1 spec.
975 if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +0000976 ; // iOS simulator does not need dylib1.o.
Tim Northover157d9112014-01-16 08:48:16 +0000977 } else if (isTargetIPhoneOS()) {
978 if (isIPhoneOSVersionLT(3, 1))
979 CmdArgs.push_back("-ldylib1.o");
980 } else {
981 if (isMacosxVersionLT(10, 5))
982 CmdArgs.push_back("-ldylib1.o");
983 else if (isMacosxVersionLT(10, 6))
984 CmdArgs.push_back("-ldylib1.10.5.o");
985 }
986 } else {
987 if (Args.hasArg(options::OPT_bundle)) {
988 if (!Args.hasArg(options::OPT_static)) {
989 // Derived from darwin_bundle1 spec.
990 if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +0000991 ; // iOS simulator does not need bundle1.o.
Tim Northover157d9112014-01-16 08:48:16 +0000992 } else if (isTargetIPhoneOS()) {
993 if (isIPhoneOSVersionLT(3, 1))
994 CmdArgs.push_back("-lbundle1.o");
995 } else {
996 if (isMacosxVersionLT(10, 6))
997 CmdArgs.push_back("-lbundle1.o");
998 }
999 }
1000 } else {
1001 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1002 if (Args.hasArg(options::OPT_static) ||
1003 Args.hasArg(options::OPT_object) ||
1004 Args.hasArg(options::OPT_preload)) {
1005 CmdArgs.push_back("-lgcrt0.o");
1006 } else {
1007 CmdArgs.push_back("-lgcrt1.o");
1008
1009 // darwin_crt2 spec is empty.
1010 }
1011 // By default on OS X 10.8 and later, we don't link with a crt1.o
1012 // file and the linker knows to use _main as the entry point. But,
1013 // when compiling with -pg, we need to link with the gcrt1.o file,
1014 // so pass the -no_new_main option to tell the linker to use the
1015 // "start" symbol as the entry point.
1016 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1017 CmdArgs.push_back("-no_new_main");
1018 } else {
1019 if (Args.hasArg(options::OPT_static) ||
1020 Args.hasArg(options::OPT_object) ||
1021 Args.hasArg(options::OPT_preload)) {
1022 CmdArgs.push_back("-lcrt0.o");
1023 } else {
1024 // Derived from darwin_crt1 spec.
1025 if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001026 ; // iOS simulator does not need crt1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001027 } else if (isTargetIPhoneOS()) {
Tim Northover40956e62014-07-23 12:32:58 +00001028 if (getArch() == llvm::Triple::aarch64)
Tim Northovera2ee4332014-03-29 15:09:45 +00001029 ; // iOS does not need any crt1 files for arm64
1030 else if (isIPhoneOSVersionLT(3, 1))
Tim Northover157d9112014-01-16 08:48:16 +00001031 CmdArgs.push_back("-lcrt1.o");
1032 else if (isIPhoneOSVersionLT(6, 0))
1033 CmdArgs.push_back("-lcrt1.3.1.o");
1034 } else {
1035 if (isMacosxVersionLT(10, 5))
1036 CmdArgs.push_back("-lcrt1.o");
1037 else if (isMacosxVersionLT(10, 6))
1038 CmdArgs.push_back("-lcrt1.10.5.o");
1039 else if (isMacosxVersionLT(10, 8))
1040 CmdArgs.push_back("-lcrt1.10.6.o");
1041
1042 // darwin_crt2 spec is empty.
1043 }
1044 }
1045 }
1046 }
1047 }
1048
1049 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
1050 isMacosxVersionLT(10, 5)) {
1051 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1052 CmdArgs.push_back(Str);
1053 }
1054}
1055
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001056bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
Daniel Dunbar16334e12010-04-10 16:20:23 +00001057
John McCall3deb1ad2012-08-21 02:47:43 +00001058void Darwin::CheckObjCARC() const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001059 if (isTargetIOSBased() || (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
John McCall3deb1ad2012-08-21 02:47:43 +00001060 return;
John McCall93207072012-08-27 01:56:21 +00001061 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00001062}
1063
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001064SanitizerMask Darwin::getSupportedSanitizers() const {
1065 SanitizerMask Res = ToolChain::getSupportedSanitizers();
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001066 if (isTargetMacOS() || isTargetIOSSimulator())
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001067 Res |= SanitizerKind::Address;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001068 if (isTargetMacOS()) {
1069 if (!isMacosxVersionLT(10, 9))
1070 Res |= SanitizerKind::Vptr;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001071 Res |= SanitizerKind::SafeStack;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001072 }
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001073 return Res;
1074}
1075
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001076/// Generic_GCC - A tool chain using the 'gcc' command to perform
1077/// all subcommands; this relies on gcc translating the majority of
1078/// command line options.
1079
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001080/// \brief Parse a GCCVersion object out of a string of text.
1081///
1082/// This is the primary means of forming GCCVersion objects.
1083/*static*/
1084Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001085 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001086 std::pair<StringRef, StringRef> First = VersionText.split('.');
1087 std::pair<StringRef, StringRef> Second = First.second.split('.');
1088
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001089 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1090 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001091 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001092 GoodVersion.MajorStr = First.first.str();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001093 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001094 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001095 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001096
1097 // First look for a number prefix and parse that if present. Otherwise just
1098 // stash the entire patch string in the suffix, and leave the number
1099 // unspecified. This covers versions strings such as:
1100 // 4.4
1101 // 4.4.0
1102 // 4.4.x
1103 // 4.4.2-rc4
1104 // 4.4.x-patched
1105 // And retains any patch number it finds.
1106 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1107 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001108 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001109 // Try to parse the number and any suffix.
1110 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1111 GoodVersion.Patch < 0)
1112 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001113 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001114 }
1115 }
1116
1117 return GoodVersion;
1118}
1119
1120/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001121bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1122 int RHSPatch,
1123 StringRef RHSPatchSuffix) const {
1124 if (Major != RHSMajor)
1125 return Major < RHSMajor;
1126 if (Minor != RHSMinor)
1127 return Minor < RHSMinor;
1128 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001129 // Note that versions without a specified patch sort higher than those with
1130 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001131 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001132 return true;
1133 if (Patch == -1)
1134 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001135
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001136 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001137 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001138 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001139 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001140 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001141 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001142 return true;
1143 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001144 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001145
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001146 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001147 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001148 }
1149
1150 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001151 return false;
1152}
1153
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001154static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001155 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1156 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001157 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001158 return GCC_INSTALL_PREFIX;
1159}
1160
Roman Divacky326d9982013-12-06 18:32:18 +00001161/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001162///
1163/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001164/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001165///
1166/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1167/// should instead pull the target out of the driver. This is currently
1168/// necessary because the driver doesn't store the final version of the target
1169/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001170void Generic_GCC::GCCInstallationDetector::init(
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001171 const Driver &D, const llvm::Triple &TargetTriple, const ArgList &Args,
Douglas Katzman8c39e6a2015-09-18 15:23:16 +00001172 ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001173 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1174 ? TargetTriple.get64BitArchVariant()
1175 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001176 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001177 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001178 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001179 SmallVector<StringRef, 16> CandidateTripleAliases;
1180 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001181 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1182 CandidateTripleAliases, CandidateBiarchLibDirs,
1183 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001184
1185 // Compute the set of prefixes for our search.
1186 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1187 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001188
Rafael Espindola1af7c212012-02-19 01:38:32 +00001189 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1190 if (GCCToolchainDir != "") {
1191 if (GCCToolchainDir.back() == '/')
1192 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001193
Rafael Espindola1af7c212012-02-19 01:38:32 +00001194 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001195 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001196 // If we have a SysRoot, try that first.
1197 if (!D.SysRoot.empty()) {
1198 Prefixes.push_back(D.SysRoot);
1199 Prefixes.push_back(D.SysRoot + "/usr");
1200 }
1201
1202 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001203 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001204
1205 // And finally in /usr.
1206 if (D.SysRoot.empty())
1207 Prefixes.push_back("/usr");
Rafael Espindolac29af942012-02-03 01:01:20 +00001208 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001209
1210 // Loop over the various components which exist and select the best GCC
1211 // installation available. GCC installs are ranked by version number.
1212 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001213 for (const std::string &Prefix : Prefixes) {
1214 if (!llvm::sys::fs::exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001215 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001216 for (StringRef Suffix : CandidateLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001217 const std::string LibDir = Prefix + Suffix.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001218 if (!llvm::sys::fs::exists(LibDir))
1219 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001220 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001221 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Benjamin Kramer72e64312015-09-24 14:48:49 +00001222 for (StringRef Candidate : CandidateTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001223 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001224 }
Benjamin Kramer72e64312015-09-24 14:48:49 +00001225 for (StringRef Suffix : CandidateBiarchLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001226 const std::string LibDir = Prefix + Suffix.str();
Chandler Carruth866faab2012-01-25 07:21:38 +00001227 if (!llvm::sys::fs::exists(LibDir))
1228 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001229 for (StringRef Candidate : CandidateBiarchTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001230 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001231 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001232 }
1233 }
1234}
1235
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001236void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001237 for (const auto &InstallPath : CandidateGCCInstallPaths)
1238 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001239
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001240 if (!GCCInstallPath.empty())
1241 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1242
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001243 for (const auto &Multilib : Multilibs)
1244 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001245
1246 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1247 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001248}
1249
1250bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1251 if (BiarchSibling.hasValue()) {
1252 M = BiarchSibling.getValue();
1253 return true;
1254 }
1255 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001256}
1257
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001258/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001259 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001260 SmallVectorImpl<StringRef> &LibDirs,
1261 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001262 SmallVectorImpl<StringRef> &BiarchLibDirs,
1263 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001264 // Declare a bunch of static data sets that we'll select between below. These
1265 // are specifically designed to always refer to string literals to avoid any
1266 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001267 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1268 static const char *const AArch64Triples[] = {
1269 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1270 "aarch64-redhat-linux"};
1271 static const char *const AArch64beLibDirs[] = {"/lib"};
1272 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1273 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001274
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001275 static const char *const ARMLibDirs[] = {"/lib"};
1276 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1277 "arm-linux-androideabi"};
1278 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1279 "armv7hl-redhat-linux-gnueabi"};
1280 static const char *const ARMebLibDirs[] = {"/lib"};
1281 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1282 "armeb-linux-androideabi"};
1283 static const char *const ARMebHFTriples[] = {
1284 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001285
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001286 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001287 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001288 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1289 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1290 "x86_64-redhat-linux", "x86_64-suse-linux",
1291 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1292 "x86_64-slackware-linux", "x86_64-linux-android",
1293 "x86_64-unknown-linux"};
1294 static const char *const X32LibDirs[] = {"/libx32"};
1295 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001296 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001297 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1298 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1299 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1300 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1301 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001302
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001303 static const char *const MIPSLibDirs[] = {"/lib"};
1304 static const char *const MIPSTriples[] = {
1305 "mips-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu"};
1306 static const char *const MIPSELLibDirs[] = {"/lib"};
1307 static const char *const MIPSELTriples[] = {
1308 "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001309
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001310 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1311 static const char *const MIPS64Triples[] = {
1312 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1313 "mips64-linux-gnuabi64"};
1314 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1315 static const char *const MIPS64ELTriples[] = {
1316 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1317 "mips64el-linux-android", "mips64el-linux-gnuabi64"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001318
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001319 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001320 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001321 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1322 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1323 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1324 static const char *const PPC64Triples[] = {
1325 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1326 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1327 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1328 static const char *const PPC64LETriples[] = {
1329 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1330 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001331
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001332 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1333 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1334 "sparcv8-linux-gnu"};
1335 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1336 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1337 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001338
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001339 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001340 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001341 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1342 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001343
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001344 // Solaris.
1345 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1346 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1347 "i386-pc-solaris2.11"};
1348
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001349 using std::begin;
1350 using std::end;
1351
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001352 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1353 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1354 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001355 return;
1356 }
1357
Chandler Carruth866faab2012-01-25 07:21:38 +00001358 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001359 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001360 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1361 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1362 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1363 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001364 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001365 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001366 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1367 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1368 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1369 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001370 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001371 case llvm::Triple::arm:
1372 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001373 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001374 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001375 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001376 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001377 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001378 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001379 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001380 case llvm::Triple::armeb:
1381 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001382 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001383 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001384 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001385 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001386 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001387 }
1388 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001389 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001390 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1391 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1392 // x32 is always available when x86_64 is available, so adding it as
1393 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001394 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001395 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1396 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001397 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001398 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1399 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001400 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001401 break;
1402 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001403 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1404 TripleAliases.append(begin(X86Triples), end(X86Triples));
1405 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1406 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001407 break;
1408 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001409 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1410 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1411 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1412 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001413 break;
1414 case llvm::Triple::mipsel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001415 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1416 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1417 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1418 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1419 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001420 break;
1421 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001422 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1423 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1424 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1425 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001426 break;
1427 case llvm::Triple::mips64el:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001428 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1429 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1430 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1431 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1432 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001433 break;
1434 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001435 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1436 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1437 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1438 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001439 break;
1440 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001441 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1442 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1443 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1444 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001445 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001446 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001447 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1448 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001449 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001450 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001451 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001452 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1453 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1454 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1455 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001456 break;
1457 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001458 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1459 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1460 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1461 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001462 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001463 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001464 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1465 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001466 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001467
1468 default:
1469 // By default, just rely on the standard lib directories and the original
1470 // triple.
1471 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001472 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001473
1474 // Always append the drivers target triple to the end, in case it doesn't
1475 // match any of our aliases.
1476 TripleAliases.push_back(TargetTriple.str());
1477
1478 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001479 if (TargetTriple.str() != BiarchTriple.str())
1480 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001481}
1482
Artem Belevich98607b62015-09-23 21:49:39 +00001483// \brief -- try common CUDA installation paths looking for files we need for
1484// CUDA compilation.
1485
1486void
1487Generic_GCC::CudaInstallationDetector::init(const Driver &D,
1488 const llvm::Triple &TargetTriple,
1489 const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001490 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001491
1492 if (Args.hasArg(options::OPT_cuda_path_EQ))
1493 CudaPathCandidates.push_back(
1494 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1495 else {
1496 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
1497 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1498 }
1499
Benjamin Kramere8b76412015-09-24 14:48:37 +00001500 for (const auto &CudaPath : CudaPathCandidates) {
Artem Belevich98607b62015-09-23 21:49:39 +00001501 if (CudaPath.empty() || !llvm::sys::fs::exists(CudaPath))
1502 continue;
1503
1504 CudaInstallPath = CudaPath;
1505 CudaIncludePath = CudaInstallPath + "/include";
1506 CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1507 CudaLibPath =
1508 CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1509
1510 if (!(llvm::sys::fs::exists(CudaIncludePath) &&
1511 llvm::sys::fs::exists(CudaLibPath) &&
1512 llvm::sys::fs::exists(CudaLibDevicePath)))
1513 continue;
1514
1515 IsValid = true;
1516 break;
1517 }
1518}
1519
1520void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1521 if (isValid())
1522 OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1523}
1524
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001525namespace {
1526// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001527class FilterNonExistent {
1528 StringRef Base;
1529
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001530public:
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001531 FilterNonExistent(StringRef Base) : Base(Base) {}
1532 bool operator()(const Multilib &M) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001533 return !llvm::sys::fs::exists(Base + M.gccSuffix() + "/crtbegin.o");
1534 }
1535};
1536} // end anonymous namespace
1537
1538static void addMultilibFlag(bool Enabled, const char *const Flag,
1539 std::vector<std::string> &Flags) {
1540 if (Enabled)
1541 Flags.push_back(std::string("+") + Flag);
1542 else
1543 Flags.push_back(std::string("-") + Flag);
1544}
1545
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001546static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001547 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1548 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1549}
1550
1551static bool isMips32(llvm::Triple::ArchType Arch) {
1552 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1553}
1554
1555static bool isMips64(llvm::Triple::ArchType Arch) {
1556 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1557}
1558
1559static bool isMipsEL(llvm::Triple::ArchType Arch) {
1560 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1561}
1562
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001563static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001564 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001565 return A && A->getOption().matches(options::OPT_mips16);
1566}
1567
1568static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001569 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001570 return A && A->getOption().matches(options::OPT_mmicromips);
1571}
1572
Simon Atanasyan60280b42014-05-12 07:37:51 +00001573struct DetectedMultilibs {
1574 /// The set of multilibs that the detected installation supports.
1575 MultilibSet Multilibs;
1576
1577 /// The primary multilib appropriate for the given flags.
1578 Multilib SelectedMultilib;
1579
1580 /// On Biarch systems, this corresponds to the default multilib when
1581 /// targeting the non-default multilib. Otherwise, it is empty.
1582 llvm::Optional<Multilib> BiarchSibling;
1583};
1584
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001585static Multilib makeMultilib(StringRef commonSuffix) {
1586 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1587}
1588
Simon Atanasyan60280b42014-05-12 07:37:51 +00001589static bool findMIPSMultilibs(const llvm::Triple &TargetTriple, StringRef Path,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001590 const ArgList &Args, DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001591 // Some MIPS toolchains put libraries and object files compiled
1592 // using different options in to the sub-directoris which names
1593 // reflects the flags used for compilation. For example sysroot
1594 // directory might looks like the following examples:
1595 //
1596 // /usr
1597 // /lib <= crt*.o files compiled with '-mips32'
1598 // /mips16
1599 // /usr
1600 // /lib <= crt*.o files compiled with '-mips16'
1601 // /el
1602 // /usr
1603 // /lib <= crt*.o files compiled with '-mips16 -EL'
1604 //
1605 // or
1606 //
1607 // /usr
1608 // /lib <= crt*.o files compiled with '-mips32r2'
1609 // /mips16
1610 // /usr
1611 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1612 // /mips32
1613 // /usr
1614 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001615
Alp Tokerf45fa3d2014-02-25 04:21:44 +00001616 FilterNonExistent NonExistent(Path);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001617
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001618 // Check for FSF toolchain multilibs
1619 MultilibSet FSFMipsMultilibs;
1620 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001621 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001622 .flag("+m32")
1623 .flag("-m64")
1624 .flag("-mmicromips")
1625 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001626
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001627 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001628 .flag("+m32")
1629 .flag("-m64")
1630 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001631
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001632 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001633 .flag("-m32")
1634 .flag("+m64")
1635 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001636
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001637 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1638 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001639
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001640 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001641 .flag("+m32")
1642 .flag("-m64")
1643 .flag("-mmicromips")
1644 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001645
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001646 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001647
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001648 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001649
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001650 auto MAbi64 =
1651 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001652
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001653 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001654
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001655 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001656
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001657 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001658
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001659 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001660
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001661 FSFMipsMultilibs =
1662 MultilibSet()
1663 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1664 MArchDefault)
1665 .Maybe(UCLibc)
1666 .Maybe(Mips16)
1667 .FilterOut("/mips64/mips16")
1668 .FilterOut("/mips64r2/mips16")
1669 .FilterOut("/micromips/mips16")
1670 .Maybe(MAbi64)
1671 .FilterOut("/micromips/64")
1672 .FilterOut("/mips32/64")
1673 .FilterOut("^/64")
1674 .FilterOut("/mips16/64")
1675 .Either(BigEndian, LittleEndian)
1676 .Maybe(SoftFloat)
1677 .Maybe(Nan2008)
1678 .FilterOut(".*sof/nan2008")
1679 .FilterOut(NonExistent)
1680 .setIncludeDirsCallback([](StringRef InstallDir,
1681 StringRef TripleStr, const Multilib &M) {
1682 std::vector<std::string> Dirs;
1683 Dirs.push_back((InstallDir + "/include").str());
1684 std::string SysRootInc =
1685 InstallDir.str() + "/../../../../sysroot";
1686 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1687 Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1688 else
1689 Dirs.push_back(SysRootInc + "/usr/include");
1690 return Dirs;
1691 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001692 }
1693
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001694 // Check for Code Sourcery toolchain multilibs
1695 MultilibSet CSMipsMultilibs;
1696 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001697 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001698
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001699 auto MArchMicroMips =
1700 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001701
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001702 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001703
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001704 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001705
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001706 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001707
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001708 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001709
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001710 auto DefaultFloat =
1711 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001712
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001713 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001714
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001715 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001716
1717 // Note that this one's osSuffix is ""
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001718 auto MAbi64 = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001719 .gccSuffix("/64")
1720 .includeSuffix("/64")
1721 .flag("+mabi=n64")
1722 .flag("-mabi=n32")
1723 .flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001724
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001725 CSMipsMultilibs =
1726 MultilibSet()
1727 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1728 .Maybe(UCLibc)
1729 .Either(SoftFloat, Nan2008, DefaultFloat)
1730 .FilterOut("/micromips/nan2008")
1731 .FilterOut("/mips16/nan2008")
1732 .Either(BigEndian, LittleEndian)
1733 .Maybe(MAbi64)
1734 .FilterOut("/mips16.*/64")
1735 .FilterOut("/micromips.*/64")
1736 .FilterOut(NonExistent)
1737 .setIncludeDirsCallback([](StringRef InstallDir,
1738 StringRef TripleStr, const Multilib &M) {
1739 std::vector<std::string> Dirs;
1740 Dirs.push_back((InstallDir + "/include").str());
1741 std::string SysRootInc =
1742 InstallDir.str() + "/../../../../" + TripleStr.str();
1743 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1744 Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1745 else
1746 Dirs.push_back(SysRootInc + "/libc/usr/include");
1747 return Dirs;
1748 });
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001749 }
1750
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001751 MultilibSet AndroidMipsMultilibs =
1752 MultilibSet()
1753 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1754 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1755 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001756
1757 MultilibSet DebianMipsMultilibs;
1758 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001759 Multilib MAbiN32 =
1760 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001761
1762 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001763 .gccSuffix("/64")
1764 .includeSuffix("/64")
1765 .flag("+m64")
1766 .flag("-m32")
1767 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001768
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001769 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001770
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001771 DebianMipsMultilibs =
1772 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001773 }
1774
Daniel Sanders2bf13662014-07-10 14:40:57 +00001775 MultilibSet ImgMultilibs;
1776 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001777 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001778
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001779 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001780
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001781 auto MAbi64 =
1782 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001783
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001784 ImgMultilibs =
1785 MultilibSet()
1786 .Maybe(Mips64r6)
1787 .Maybe(MAbi64)
1788 .Maybe(LittleEndian)
1789 .FilterOut(NonExistent)
1790 .setIncludeDirsCallback([](StringRef InstallDir,
1791 StringRef TripleStr, const Multilib &M) {
1792 std::vector<std::string> Dirs;
1793 Dirs.push_back((InstallDir + "/include").str());
1794 Dirs.push_back(
1795 (InstallDir + "/../../../../sysroot/usr/include").str());
1796 return Dirs;
1797 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00001798 }
1799
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001800 StringRef CPUName;
1801 StringRef ABIName;
1802 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
1803
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001804 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1805
1806 Multilib::flags_list Flags;
1807 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
1808 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
1809 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001810 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001811 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
1812 CPUName == "mips32r5",
1813 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00001814 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001815 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001816 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
1817 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001818 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001819 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001820 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00001821 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
1822 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001823 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
1824 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001825 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001826 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001827 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001828 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001829
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001830 if (TargetTriple.getEnvironment() == llvm::Triple::Android) {
1831 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00001832 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
1833 Result.Multilibs = AndroidMipsMultilibs;
1834 return true;
1835 }
1836 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001837 }
1838
Daniel Sanders2bf13662014-07-10 14:40:57 +00001839 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1840 TargetTriple.getOS() == llvm::Triple::Linux &&
1841 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
1842 // Select mips-img-linux-gnu toolchain.
1843 if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
1844 Result.Multilibs = ImgMultilibs;
1845 return true;
1846 }
1847 return false;
1848 }
1849
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001850 // Sort candidates. Toolchain that best meets the directories goes first.
1851 // Then select the first toolchains matches command line flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001852 MultilibSet *candidates[] = {&DebianMipsMultilibs, &FSFMipsMultilibs,
1853 &CSMipsMultilibs};
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001854 std::sort(
1855 std::begin(candidates), std::end(candidates),
1856 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
1857 for (const auto &candidate : candidates) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001858 if (candidate->select(Flags, Result.SelectedMultilib)) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001859 if (candidate == &DebianMipsMultilibs)
Simon Atanasyan60280b42014-05-12 07:37:51 +00001860 Result.BiarchSibling = Multilib();
1861 Result.Multilibs = *candidate;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001862 return true;
1863 }
1864 }
1865
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00001866 {
1867 // Fallback to the regular toolchain-tree structure.
1868 Multilib Default;
1869 Result.Multilibs.push_back(Default);
1870 Result.Multilibs.FilterOut(NonExistent);
1871
1872 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
1873 Result.BiarchSibling = Multilib();
1874 return true;
1875 }
1876 }
1877
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001878 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001879}
1880
Simon Atanasyan60280b42014-05-12 07:37:51 +00001881static bool findBiarchMultilibs(const llvm::Triple &TargetTriple,
1882 StringRef Path, const ArgList &Args,
1883 bool NeedsBiarchSuffix,
1884 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001885
1886 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
1887 // in what would normally be GCCInstallPath and put the 64-bit
1888 // libs in a subdirectory named 64. The simple logic we follow is that
1889 // *if* there is a subdirectory of the right name with crtbegin.o in it,
1890 // we use that. If not, and if not a biarch triple alias, we look for
1891 // crtbegin.o without the subdirectory.
1892
1893 Multilib Default;
1894 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001895 .gccSuffix("/64")
1896 .includeSuffix("/64")
1897 .flag("-m32")
1898 .flag("+m64")
1899 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001900 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001901 .gccSuffix("/32")
1902 .includeSuffix("/32")
1903 .flag("+m32")
1904 .flag("-m64")
1905 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00001906 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001907 .gccSuffix("/x32")
1908 .includeSuffix("/x32")
1909 .flag("-m32")
1910 .flag("-m64")
1911 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001912
Alp Tokerf45fa3d2014-02-25 04:21:44 +00001913 FilterNonExistent NonExistent(Path);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001914
Zinovy Nis1db95732014-07-10 15:27:19 +00001915 // Determine default multilib from: 32, 64, x32
1916 // Also handle cases such as 64 on 32, 32 on 64, etc.
1917 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00001918 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00001919 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00001920 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001921 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00001922 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001923 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00001924 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001925 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00001926 if (TargetTriple.isArch32Bit())
1927 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001928 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00001929 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001930 else
Zinovy Nis1db95732014-07-10 15:27:19 +00001931 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00001932 }
1933
Zinovy Nis1db95732014-07-10 15:27:19 +00001934 if (Want == WANT32)
1935 Default.flag("+m32").flag("-m64").flag("-mx32");
1936 else if (Want == WANT64)
1937 Default.flag("-m32").flag("+m64").flag("-mx32");
1938 else if (Want == WANTX32)
1939 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001940 else
Zinovy Nis1db95732014-07-10 15:27:19 +00001941 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001942
Simon Atanasyan60280b42014-05-12 07:37:51 +00001943 Result.Multilibs.push_back(Default);
1944 Result.Multilibs.push_back(Alt64);
1945 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00001946 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001947
Simon Atanasyan60280b42014-05-12 07:37:51 +00001948 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001949
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001950 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001951 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001952 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001953 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001954
Simon Atanasyan60280b42014-05-12 07:37:51 +00001955 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001956 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001957
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001958 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00001959 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00001960 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001961
1962 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001963}
1964
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001965void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
1966 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
1967 const std::string &LibDir, StringRef CandidateTriple,
1968 bool NeedsBiarchSuffix) {
1969 // Solaris is a special case. The GCC installation is under
1970 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
1971 // need to iterate twice.
1972 std::error_code EC;
1973 for (llvm::sys::fs::directory_iterator LI(LibDir, EC), LE; !EC && LI != LE;
1974 LI = LI.increment(EC)) {
1975 StringRef VersionText = llvm::sys::path::filename(LI->path());
1976 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
1977
1978 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
1979 if (!CandidateGCCInstallPaths.insert(LI->path()).second)
1980 continue; // Saw this path before; no need to look at it again.
1981 if (CandidateVersion.isOlderThan(4, 1, 1))
1982 continue;
1983 if (CandidateVersion <= Version)
1984 continue;
1985
1986 GCCInstallPath =
1987 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
1988 if (!llvm::sys::fs::exists(GCCInstallPath))
1989 continue;
1990
1991 // If we make it here there has to be at least one GCC version, let's just
1992 // use the latest one.
1993 std::error_code EEC;
1994 for (llvm::sys::fs::directory_iterator LLI(GCCInstallPath, EEC), LLE;
1995 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
1996
1997 StringRef SubVersionText = llvm::sys::path::filename(LLI->path());
1998 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
1999
2000 if (CandidateSubVersion > Version)
2001 Version = CandidateSubVersion;
2002 }
2003
2004 GCCTriple.setTriple(CandidateTriple);
2005
2006 GCCInstallPath += "/" + Version.Text;
2007 GCCParentLibPath = GCCInstallPath + "/../../../../";
2008
2009 IsValid = true;
2010 }
2011}
2012
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002013void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002014 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002015 const std::string &LibDir, StringRef CandidateTriple,
2016 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002017 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002018 // There are various different suffixes involving the triple we
2019 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002020 // up to the lib directory. Specifically, the number of "up" steps
2021 // in the second half of each row is 1 + the number of path separators
2022 // in the first half.
2023 const std::string LibAndInstallSuffixes[][2] = {
2024 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2025
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002026 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002027 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2028
2029 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2030 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002031
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002032 // The Freescale PPC SDK has the gcc libraries in
2033 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002034 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002035
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002036 // Ubuntu has a strange mis-matched pair of triples that this happens to
2037 // match.
2038 // FIXME: It may be worthwhile to generalize this and look for a second
2039 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002040 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2041
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002042 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2043 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2044 NeedsBiarchSuffix);
2045 return;
2046 }
2047
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002048 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002049 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2050 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002051 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002052 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002053 std::error_code EC;
Chandler Carruth866faab2012-01-25 07:21:38 +00002054 for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002055 !EC && LI != LE; LI = LI.increment(EC)) {
2056 StringRef VersionText = llvm::sys::path::filename(LI->path());
2057 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002058 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
2059 if (!CandidateGCCInstallPaths.insert(LI->path()).second)
2060 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002061 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002062 continue;
2063 if (CandidateVersion <= Version)
2064 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002065
Simon Atanasyan60280b42014-05-12 07:37:51 +00002066 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002067
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002068 // Debian mips multilibs behave more like the rest of the biarch ones,
2069 // so handle them there
2070 if (isMipsArch(TargetArch)) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00002071 if (!findMIPSMultilibs(TargetTriple, LI->path(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002072 continue;
2073 } else if (!findBiarchMultilibs(TargetTriple, LI->path(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002074 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002075 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002076 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002077
Simon Atanasyan60280b42014-05-12 07:37:51 +00002078 Multilibs = Detected.Multilibs;
2079 SelectedMultilib = Detected.SelectedMultilib;
2080 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002081 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002082 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002083 // FIXME: We hack together the directory name here instead of
2084 // using LI to ensure stable path separators across Windows and
2085 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002086 GCCInstallPath =
2087 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2088 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002089 IsValid = true;
2090 }
2091 }
2092}
2093
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002094Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002095 const ArgList &Args)
Artem Belevich98607b62015-09-23 21:49:39 +00002096 : ToolChain(D, Triple, Args), GCCInstallation(), CudaInstallation() {
Daniel Dunbar88979912010-08-01 22:29:51 +00002097 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002098 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002099 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002100}
2101
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002102Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002103
Rafael Espindola7cf32212013-03-20 03:05:54 +00002104Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002105 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002106 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002107 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002108 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002109 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002110 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002111 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002112 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002113 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002114 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002115 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002116 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002117}
2118
Rafael Espindola7cf32212013-03-20 03:05:54 +00002119Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002120 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002121}
2122
Douglas Katzman95354292015-06-23 20:42:09 +00002123Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002124
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002125void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2126 // Print the information about how we detected the GCC installation.
2127 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002128 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002129}
2130
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002131bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002132 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002133}
2134
David Majnemer17f448b2015-06-28 04:23:33 +00002135bool Generic_GCC::isPICDefault() const {
2136 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2137}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002138
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002139bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002140
David Majnemer17f448b2015-06-28 04:23:33 +00002141bool Generic_GCC::isPICDefaultForced() const {
2142 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2143}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002144
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002145bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002146 switch (getTriple().getArch()) {
2147 case llvm::Triple::x86:
2148 case llvm::Triple::x86_64:
2149 case llvm::Triple::aarch64:
2150 case llvm::Triple::aarch64_be:
2151 case llvm::Triple::arm:
2152 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002153 case llvm::Triple::bpfel:
2154 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002155 case llvm::Triple::thumb:
2156 case llvm::Triple::thumbeb:
2157 case llvm::Triple::ppc:
2158 case llvm::Triple::ppc64:
2159 case llvm::Triple::ppc64le:
2160 case llvm::Triple::sparc:
2161 case llvm::Triple::sparcel:
2162 case llvm::Triple::sparcv9:
2163 case llvm::Triple::systemz:
2164 return true;
2165 default:
2166 return false;
2167 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002168}
2169
Kristof Beylsfb387292014-01-10 13:44:34 +00002170void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2171 ArgStringList &CC1Args) const {
2172 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002173 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002174 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002175 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002176 (getTriple().getOS() == llvm::Triple::Linux &&
2177 (!V.isOlderThan(4, 7, 0) ||
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002178 getTriple().getEnvironment() == llvm::Triple::Android)) ||
2179 getTriple().getOS() == llvm::Triple::NaCl;
Kristof Beylsfb387292014-01-10 13:44:34 +00002180
2181 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002182 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002183 CC1Args.push_back("-fuse-init-array");
2184}
2185
Tony Linthicum76329bf2011-12-12 21:14:55 +00002186/// Hexagon Toolchain
2187
Douglas Katzman54366072015-07-27 16:53:08 +00002188std::string HexagonToolChain::GetGnuDir(const std::string &InstalledDir,
2189 const ArgList &Args) {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002190 // Locate the rest of the toolchain ...
Samuel Antaoc909c992014-11-07 17:48:03 +00002191 std::string GccToolchain = getGCCToolchainDir(Args);
2192
2193 if (!GccToolchain.empty())
2194 return GccToolchain;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002195
2196 std::string InstallRelDir = InstalledDir + "/../../gnu";
2197 if (llvm::sys::fs::exists(InstallRelDir))
2198 return InstallRelDir;
2199
2200 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
2201 if (llvm::sys::fs::exists(PrefixRelDir))
2202 return PrefixRelDir;
2203
2204 return InstallRelDir;
2205}
2206
Douglas Katzman54366072015-07-27 16:53:08 +00002207const char *HexagonToolChain::GetSmallDataThreshold(const ArgList &Args) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002208 Arg *A;
2209
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002210 A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002211 options::OPT_msmall_data_threshold_EQ);
2212 if (A)
2213 return A->getValue();
2214
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002215 A = Args.getLastArg(options::OPT_shared, options::OPT_fpic,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002216 options::OPT_fPIC);
2217 if (A)
2218 return "0";
2219
2220 return 0;
2221}
2222
Douglas Katzman54366072015-07-27 16:53:08 +00002223bool HexagonToolChain::UsesG0(const char *smallDataThreshold) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002224 return smallDataThreshold && smallDataThreshold[0] == '0';
2225}
2226
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002227static void GetHexagonLibraryPaths(const ArgList &Args, const std::string &Ver,
2228 const std::string &MarchString,
2229 const std::string &InstalledDir,
2230 ToolChain::path_list *LibPaths) {
Matthew Curtise689b052012-12-06 15:46:07 +00002231 bool buildingLib = Args.hasArg(options::OPT_shared);
2232
2233 //----------------------------------------------------------------------------
2234 // -L Args
2235 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002236 for (Arg *A : Args.filtered(options::OPT_L))
2237 for (const char *Value : A->getValues())
2238 LibPaths->push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002239
2240 //----------------------------------------------------------------------------
2241 // Other standard paths
2242 //----------------------------------------------------------------------------
2243 const std::string MarchSuffix = "/" + MarchString;
2244 const std::string G0Suffix = "/G0";
2245 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Douglas Katzman54366072015-07-27 16:53:08 +00002246 const std::string RootDir =
2247 HexagonToolChain::GetGnuDir(InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00002248
2249 // lib/gcc/hexagon/...
2250 std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
2251 if (buildingLib) {
2252 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
2253 LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
2254 }
2255 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
2256 LibPaths->push_back(LibGCCHexagonDir + Ver);
2257
2258 // lib/gcc/...
2259 LibPaths->push_back(RootDir + "lib/gcc");
2260
2261 // hexagon/lib/...
2262 std::string HexagonLibDir = RootDir + "hexagon/lib";
2263 if (buildingLib) {
2264 LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
2265 LibPaths->push_back(HexagonLibDir + G0Suffix);
2266 }
2267 LibPaths->push_back(HexagonLibDir + MarchSuffix);
2268 LibPaths->push_back(HexagonLibDir);
2269}
2270
Douglas Katzman54366072015-07-27 16:53:08 +00002271HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
2272 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002273 : Linux(D, Triple, Args) {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002274 const std::string InstalledDir(getDriver().getInstalledDir());
Douglas Katzman54366072015-07-27 16:53:08 +00002275 const std::string GnuDir = HexagonToolChain::GetGnuDir(InstalledDir, Args);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002276
2277 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2278 // program paths
2279 const std::string BinDir(GnuDir + "/bin");
2280 if (llvm::sys::fs::exists(BinDir))
2281 getProgramPaths().push_back(BinDir);
2282
2283 // Determine version of GCC libraries and headers to use.
2284 const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
Rafael Espindolac0809172014-06-12 14:02:15 +00002285 std::error_code ec;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002286 GCCVersion MaxVersion = GCCVersion::Parse("0.0.0");
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002287 for (llvm::sys::fs::directory_iterator di(HexagonDir, ec), de;
2288 !ec && di != de; di = di.increment(ec)) {
2289 GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->path()));
2290 if (MaxVersion < cv)
2291 MaxVersion = cv;
2292 }
2293 GCCLibAndIncVersion = MaxVersion;
Matthew Curtise689b052012-12-06 15:46:07 +00002294
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002295 ToolChain::path_list *LibPaths = &getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002296
2297 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2298 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2299 // support 'linux' we'll need to fix this up
2300 LibPaths->clear();
2301
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002302 GetHexagonLibraryPaths(Args, GetGCCLibAndIncVersion(), GetTargetCPU(Args),
2303 InstalledDir, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002304}
2305
Douglas Katzman54366072015-07-27 16:53:08 +00002306HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002307
Douglas Katzman54366072015-07-27 16:53:08 +00002308Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002309 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002310}
2311
Douglas Katzman54366072015-07-27 16:53:08 +00002312Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002313 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002314}
2315
Douglas Katzman54366072015-07-27 16:53:08 +00002316void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2317 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002318 const Driver &D = getDriver();
2319
2320 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2321 DriverArgs.hasArg(options::OPT_nostdlibinc))
2322 return;
2323
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002324 std::string Ver(GetGCCLibAndIncVersion());
Douglas Katzman54366072015-07-27 16:53:08 +00002325 std::string GnuDir = HexagonToolChain::GetGnuDir(D.InstalledDir, DriverArgs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002326 std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
2327 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
2328 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
2329 addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002330}
2331
Douglas Katzman54366072015-07-27 16:53:08 +00002332void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2333 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002334 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2335 DriverArgs.hasArg(options::OPT_nostdincxx))
2336 return;
2337
2338 const Driver &D = getDriver();
2339 std::string Ver(GetGCCLibAndIncVersion());
Samuel Antaoc909c992014-11-07 17:48:03 +00002340 SmallString<128> IncludeDir(
Douglas Katzman54366072015-07-27 16:53:08 +00002341 HexagonToolChain::GetGnuDir(D.InstalledDir, DriverArgs));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002342
Rafael Espindola358256c2013-06-26 02:13:00 +00002343 llvm::sys::path::append(IncludeDir, "hexagon/include/c++/");
2344 llvm::sys::path::append(IncludeDir, Ver);
Yaron Keren92e1b622015-03-18 10:17:07 +00002345 addSystemInclude(DriverArgs, CC1Args, IncludeDir);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002346}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002347
Matthew Curtise689b052012-12-06 15:46:07 +00002348ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002349HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002350 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2351 if (!A)
2352 return ToolChain::CST_Libstdcxx;
2353
2354 StringRef Value = A->getValue();
2355 if (Value != "libstdc++") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002356 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002357 }
2358
2359 return ToolChain::CST_Libstdcxx;
2360}
2361
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002362static int getHexagonVersion(const ArgList &Args) {
2363 Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ);
2364 // Select the default CPU (v4) if none was given.
2365 if (!A)
2366 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002367
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002368 // FIXME: produce errors if we cannot parse the version.
2369 StringRef WhichHexagon = A->getValue();
2370 if (WhichHexagon.startswith("hexagonv")) {
2371 int Val;
2372 if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val))
2373 return Val;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002374 }
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002375 if (WhichHexagon.startswith("v")) {
2376 int Val;
2377 if (!WhichHexagon.substr(1).getAsInteger(10, Val))
2378 return Val;
2379 }
2380
2381 // FIXME: should probably be an error.
2382 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002383}
2384
Douglas Katzman54366072015-07-27 16:53:08 +00002385StringRef HexagonToolChain::GetTargetCPU(const ArgList &Args) {
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002386 int V = getHexagonVersion(Args);
2387 // FIXME: We don't support versions < 4. We should error on them.
2388 switch (V) {
2389 default:
2390 llvm_unreachable("Unexpected version");
2391 case 5:
2392 return "v5";
2393 case 4:
2394 return "v4";
2395 case 3:
2396 return "v3";
2397 case 2:
2398 return "v2";
2399 case 1:
2400 return "v1";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002401 }
Matthew Curtisf10a5952012-12-06 14:16:43 +00002402}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002403// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002404
Tom Stellard8fa33092015-07-18 01:49:05 +00002405/// AMDGPU Toolchain
2406AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2407 const ArgList &Args)
2408 : Generic_ELF(D, Triple, Args) { }
2409
2410Tool *AMDGPUToolChain::buildLinker() const {
2411 return new tools::amdgpu::Linker(*this);
2412}
2413// End AMDGPU
2414
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002415/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00002416NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2417 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002418 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002419
2420 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2421 // default paths, and must instead only use the paths provided
2422 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002423 path_list &file_paths = getFilePaths();
2424 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002425
2426 file_paths.clear();
2427 prog_paths.clear();
2428
2429 // Path for library files (libc.a, ...)
2430 std::string FilePath(getDriver().Dir + "/../");
2431
2432 // Path for tools (clang, ld, etc..)
2433 std::string ProgPath(getDriver().Dir + "/../");
2434
2435 // Path for toolchain libraries (libgcc.a, ...)
2436 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2437
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002438 switch (Triple.getArch()) {
2439 case llvm::Triple::x86: {
2440 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00002441 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002442 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2443 file_paths.push_back(ToolPath + "i686-nacl");
2444 break;
2445 }
2446 case llvm::Triple::x86_64: {
2447 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2448 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2449 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2450 file_paths.push_back(ToolPath + "x86_64-nacl");
2451 break;
2452 }
2453 case llvm::Triple::arm: {
2454 file_paths.push_back(FilePath + "arm-nacl/lib");
2455 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2456 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2457 file_paths.push_back(ToolPath + "arm-nacl");
2458 break;
2459 }
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002460 case llvm::Triple::mipsel: {
2461 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2462 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2463 prog_paths.push_back(ProgPath + "bin");
2464 file_paths.push_back(ToolPath + "mipsel-nacl");
2465 break;
2466 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002467 default:
2468 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002469 }
2470
2471 // Use provided linker, not system linker
Derek Schuffef465d72015-08-24 23:53:25 +00002472 Linker = GetLinkerPath();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002473 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2474}
2475
Douglas Katzman54366072015-07-27 16:53:08 +00002476void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2477 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002478 const Driver &D = getDriver();
2479 if (DriverArgs.hasArg(options::OPT_nostdinc))
2480 return;
2481
2482 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2483 SmallString<128> P(D.ResourceDir);
2484 llvm::sys::path::append(P, "include");
2485 addSystemInclude(DriverArgs, CC1Args, P.str());
2486 }
2487
2488 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2489 return;
2490
2491 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002492 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00002493 case llvm::Triple::x86:
2494 // x86 is special because multilib style uses x86_64-nacl/include for libc
2495 // headers but the SDK wants i686-nacl/usr/include. The other architectures
2496 // have the same substring.
2497 llvm::sys::path::append(P, "i686-nacl/usr/include");
2498 addSystemInclude(DriverArgs, CC1Args, P.str());
2499 llvm::sys::path::remove_filename(P);
2500 llvm::sys::path::remove_filename(P);
2501 llvm::sys::path::remove_filename(P);
2502 llvm::sys::path::append(P, "x86_64-nacl/include");
2503 addSystemInclude(DriverArgs, CC1Args, P.str());
2504 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002505 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002506 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002507 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002508 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002509 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002510 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002511 case llvm::Triple::mipsel:
2512 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2513 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002514 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002515 return;
2516 }
2517
2518 addSystemInclude(DriverArgs, CC1Args, P.str());
2519 llvm::sys::path::remove_filename(P);
2520 llvm::sys::path::remove_filename(P);
2521 llvm::sys::path::append(P, "include");
2522 addSystemInclude(DriverArgs, CC1Args, P.str());
2523}
2524
Douglas Katzman54366072015-07-27 16:53:08 +00002525void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2526 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002527 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2528 // if the value is libc++, and emits an error for other values.
2529 GetCXXStdlibType(Args);
2530 CmdArgs.push_back("-lc++");
2531}
2532
Douglas Katzman54366072015-07-27 16:53:08 +00002533void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2534 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002535 const Driver &D = getDriver();
2536 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2537 DriverArgs.hasArg(options::OPT_nostdincxx))
2538 return;
2539
2540 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2541 // if the value is libc++, and emits an error for other values.
2542 GetCXXStdlibType(DriverArgs);
2543
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002544 SmallString<128> P(D.Dir + "/../");
2545 switch (getTriple().getArch()) {
2546 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002547 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2548 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002549 break;
2550 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002551 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2552 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002553 break;
2554 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002555 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2556 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002557 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002558 case llvm::Triple::mipsel:
2559 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2560 addSystemInclude(DriverArgs, CC1Args, P.str());
2561 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002562 default:
2563 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002564 }
2565}
2566
Douglas Katzman54366072015-07-27 16:53:08 +00002567ToolChain::CXXStdlibType
2568NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002569 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2570 StringRef Value = A->getValue();
2571 if (Value == "libc++")
2572 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002573 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002574 }
2575
2576 return ToolChain::CST_Libcxx;
2577}
2578
Douglas Katzman54366072015-07-27 16:53:08 +00002579std::string
2580NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2581 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002582 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2583 if (TheTriple.getArch() == llvm::Triple::arm &&
2584 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2585 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2586 return TheTriple.getTriple();
2587}
2588
Douglas Katzman54366072015-07-27 16:53:08 +00002589Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002590 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002591}
2592
Douglas Katzman54366072015-07-27 16:53:08 +00002593Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002594 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002595 return new tools::nacltools::AssemblerARM(*this);
2596 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002597}
2598// End NaCl
2599
Chris Lattner09797542010-03-04 21:07:38 +00002600/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2601/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2602/// Currently does not support anything else but compilation.
2603
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002604TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002605 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002606 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002607 // Path mangling to find libexec
2608 std::string Path(getDriver().Dir);
2609
2610 Path += "/../libexec";
2611 getProgramPaths().push_back(Path);
2612}
2613
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002614TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002615
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002616bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002617
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002618bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002619
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002620bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002621
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002622bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002623
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002624// CloudABI - CloudABI tool chain which can call ld(1) directly.
2625
2626CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2627 const ArgList &Args)
2628 : Generic_ELF(D, Triple, Args) {
2629 SmallString<128> P(getDriver().Dir);
2630 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2631 getFilePaths().push_back(P.str());
2632}
2633
2634void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2635 ArgStringList &CC1Args) const {
2636 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2637 DriverArgs.hasArg(options::OPT_nostdincxx))
2638 return;
2639
2640 SmallString<128> P(getDriver().Dir);
2641 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2642 addSystemInclude(DriverArgs, CC1Args, P.str());
2643}
2644
2645void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
2646 ArgStringList &CmdArgs) const {
2647 CmdArgs.push_back("-lc++");
2648 CmdArgs.push_back("-lc++abi");
2649 CmdArgs.push_back("-lunwind");
2650}
2651
Douglas Katzman95354292015-06-23 20:42:09 +00002652Tool *CloudABI::buildLinker() const {
2653 return new tools::cloudabi::Linker(*this);
2654}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002655
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002656/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
2657
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002658OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
2659 const ArgList &Args)
2660 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00002661 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002662 getFilePaths().push_back("/usr/lib");
2663}
2664
Rafael Espindola7cf32212013-03-20 03:05:54 +00002665Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002666 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002667}
2668
Douglas Katzman95354292015-06-23 20:42:09 +00002669Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002670
Eli Friedman9fa28852012-08-08 23:57:20 +00002671/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
2672
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002673Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2674 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00002675 getFilePaths().push_back(getDriver().Dir + "/../lib");
2676 getFilePaths().push_back("/usr/lib");
2677}
2678
Rafael Espindola7cf32212013-03-20 03:05:54 +00002679Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002680 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002681}
2682
Douglas Katzman95354292015-06-23 20:42:09 +00002683Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00002684
Douglas Katzman95354292015-06-23 20:42:09 +00002685ToolChain::CXXStdlibType Bitrig::GetCXXStdlibType(const ArgList &Args) const {
Richard Smith51af5192014-05-01 23:24:24 +00002686 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2687 StringRef Value = A->getValue();
2688 if (Value == "libstdc++")
2689 return ToolChain::CST_Libstdcxx;
2690 if (Value == "libc++")
2691 return ToolChain::CST_Libcxx;
2692
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002693 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Richard Smith51af5192014-05-01 23:24:24 +00002694 }
2695 return ToolChain::CST_Libcxx;
2696}
2697
Eli Friedman9fa28852012-08-08 23:57:20 +00002698void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2699 ArgStringList &CC1Args) const {
2700 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2701 DriverArgs.hasArg(options::OPT_nostdincxx))
2702 return;
2703
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002704 switch (GetCXXStdlibType(DriverArgs)) {
2705 case ToolChain::CST_Libcxx:
2706 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00002707 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002708 break;
2709 case ToolChain::CST_Libstdcxx:
2710 addSystemInclude(DriverArgs, CC1Args,
2711 getDriver().SysRoot + "/usr/include/c++/stdc++");
2712 addSystemInclude(DriverArgs, CC1Args,
2713 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00002714
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002715 StringRef Triple = getTriple().str();
2716 if (Triple.startswith("amd64"))
2717 addSystemInclude(DriverArgs, CC1Args,
2718 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002719 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002720 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002721 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
2722 "/usr/include/c++/stdc++/" +
2723 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002724 break;
2725 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002726}
2727
2728void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
2729 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002730 switch (GetCXXStdlibType(Args)) {
2731 case ToolChain::CST_Libcxx:
2732 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00002733 CmdArgs.push_back("-lc++abi");
2734 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002735 break;
2736 case ToolChain::CST_Libstdcxx:
2737 CmdArgs.push_back("-lstdc++");
2738 break;
2739 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002740}
2741
Daniel Dunbare24297c2009-03-30 21:06:03 +00002742/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
2743
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002744FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
2745 const ArgList &Args)
2746 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00002747
Chandler Carruth0b1756b2012-01-26 01:35:15 +00002748 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
2749 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002750 if ((Triple.getArch() == llvm::Triple::x86 ||
2751 Triple.getArch() == llvm::Triple::ppc) &&
Chandler Carruth0b1756b2012-01-26 01:35:15 +00002752 llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002753 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
2754 else
2755 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00002756}
2757
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002758ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
David Chisnall867ccd82013-11-09 15:10:56 +00002759 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2760 StringRef Value = A->getValue();
2761 if (Value == "libstdc++")
2762 return ToolChain::CST_Libstdcxx;
2763 if (Value == "libc++")
2764 return ToolChain::CST_Libcxx;
2765
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002766 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
David Chisnall867ccd82013-11-09 15:10:56 +00002767 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002768 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00002769 return ToolChain::CST_Libcxx;
2770 return ToolChain::CST_Libstdcxx;
2771}
2772
2773void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2774 ArgStringList &CC1Args) const {
2775 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2776 DriverArgs.hasArg(options::OPT_nostdincxx))
2777 return;
2778
2779 switch (GetCXXStdlibType(DriverArgs)) {
2780 case ToolChain::CST_Libcxx:
2781 addSystemInclude(DriverArgs, CC1Args,
2782 getDriver().SysRoot + "/usr/include/c++/v1");
2783 break;
2784 case ToolChain::CST_Libstdcxx:
2785 addSystemInclude(DriverArgs, CC1Args,
2786 getDriver().SysRoot + "/usr/include/c++/4.2");
2787 addSystemInclude(DriverArgs, CC1Args,
2788 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
2789 break;
2790 }
2791}
2792
Rafael Espindola7cf32212013-03-20 03:05:54 +00002793Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002794 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002795}
2796
Douglas Katzman95354292015-06-23 20:42:09 +00002797Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00002798
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002799bool FreeBSD::UseSjLjExceptions() const {
2800 // FreeBSD uses SjLj exceptions on ARM oabi.
2801 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00002802 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002803 case llvm::Triple::GNUEABI:
2804 case llvm::Triple::EABI:
2805 return false;
2806
2807 default:
2808 return (getTriple().getArch() == llvm::Triple::arm ||
2809 getTriple().getArch() == llvm::Triple::thumb);
2810 }
2811}
2812
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002813bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002814
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002815bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002816
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00002817SanitizerMask FreeBSD::getSupportedSanitizers() const {
2818 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
2819 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
2820 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
2821 getTriple().getArch() == llvm::Triple::mips64el;
2822 SanitizerMask Res = ToolChain::getSupportedSanitizers();
2823 Res |= SanitizerKind::Address;
2824 Res |= SanitizerKind::Vptr;
2825 if (IsX86_64 || IsMIPS64) {
2826 Res |= SanitizerKind::Leak;
2827 Res |= SanitizerKind::Thread;
2828 }
2829 if (IsX86 || IsX86_64) {
2830 Res |= SanitizerKind::SafeStack;
2831 }
2832 return Res;
2833}
2834
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002835/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
2836
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002837NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2838 : Generic_ELF(D, Triple, Args) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002839
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00002840 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00002841 // When targeting a 32-bit platform, try the special directory used on
2842 // 64-bit hosts, and only fall back to the main library directory if that
2843 // doesn't work.
2844 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
2845 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002846 switch (Triple.getArch()) {
2847 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00002848 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002849 break;
2850 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00002851 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002852 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00002853 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002854 switch (Triple.getEnvironment()) {
2855 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002856 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002857 getFilePaths().push_back("=/usr/lib/eabi");
2858 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00002859 case llvm::Triple::EABIHF:
2860 case llvm::Triple::GNUEABIHF:
2861 getFilePaths().push_back("=/usr/lib/eabihf");
2862 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002863 default:
2864 getFilePaths().push_back("=/usr/lib/oabi");
2865 break;
2866 }
2867 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002868 case llvm::Triple::mips64:
2869 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002870 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002871 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002872 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002873 getFilePaths().push_back("=/usr/lib/64");
2874 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00002875 case llvm::Triple::ppc:
2876 getFilePaths().push_back("=/usr/lib/powerpc");
2877 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00002878 case llvm::Triple::sparc:
2879 getFilePaths().push_back("=/usr/lib/sparc");
2880 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002881 default:
2882 break;
2883 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00002884
2885 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002886 }
2887}
2888
Rafael Espindola7cf32212013-03-20 03:05:54 +00002889Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002890 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002891}
2892
Douglas Katzman95354292015-06-23 20:42:09 +00002893Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002894
Douglas Katzman95354292015-06-23 20:42:09 +00002895ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002896 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2897 StringRef Value = A->getValue();
2898 if (Value == "libstdc++")
2899 return ToolChain::CST_Libstdcxx;
2900 if (Value == "libc++")
2901 return ToolChain::CST_Libcxx;
2902
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002903 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002904 }
2905
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002906 unsigned Major, Minor, Micro;
2907 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00002908 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002909 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00002910 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00002911 case llvm::Triple::arm:
2912 case llvm::Triple::armeb:
2913 case llvm::Triple::thumb:
2914 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00002915 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00002916 case llvm::Triple::ppc64:
2917 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002918 case llvm::Triple::x86:
2919 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002920 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002921 default:
2922 break;
2923 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002924 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002925 return ToolChain::CST_Libstdcxx;
2926}
2927
2928void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2929 ArgStringList &CC1Args) const {
2930 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2931 DriverArgs.hasArg(options::OPT_nostdincxx))
2932 return;
2933
2934 switch (GetCXXStdlibType(DriverArgs)) {
2935 case ToolChain::CST_Libcxx:
2936 addSystemInclude(DriverArgs, CC1Args,
2937 getDriver().SysRoot + "/usr/include/c++/");
2938 break;
2939 case ToolChain::CST_Libstdcxx:
2940 addSystemInclude(DriverArgs, CC1Args,
2941 getDriver().SysRoot + "/usr/include/g++");
2942 addSystemInclude(DriverArgs, CC1Args,
2943 getDriver().SysRoot + "/usr/include/g++/backward");
2944 break;
2945 }
2946}
2947
Chris Lattner3e2ee142010-07-07 16:01:42 +00002948/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
2949
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002950Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2951 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00002952 getFilePaths().push_back(getDriver().Dir + "/../lib");
2953 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00002954}
2955
Rafael Espindola7cf32212013-03-20 03:05:54 +00002956Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002957 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002958}
2959
Douglas Katzman95354292015-06-23 20:42:09 +00002960Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00002961
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002962static void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
2963 if (llvm::sys::fs::exists(Path))
2964 Paths.push_back(Path.str());
2965}
2966
David Chisnallf571cde2012-02-15 13:39:01 +00002967/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
2968
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002969Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002970 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002971 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00002972
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002973 GCCInstallation.init(D, Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00002974
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002975 path_list &Paths = getFilePaths();
2976 if (GCCInstallation.isValid())
2977 addPathIfExists(GCCInstallation.getInstallPath(), Paths);
2978
2979 addPathIfExists(getDriver().getInstalledDir(), Paths);
2980 if (getDriver().getInstalledDir() != getDriver().Dir)
2981 addPathIfExists(getDriver().Dir, Paths);
2982
2983 addPathIfExists(getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
2984
2985 std::string LibPath = "/usr/lib/";
2986 switch (Triple.getArch()) {
2987 case llvm::Triple::x86:
2988 case llvm::Triple::sparc:
2989 break;
2990 case llvm::Triple::x86_64:
2991 LibPath += "amd64/";
2992 break;
2993 case llvm::Triple::sparcv9:
2994 LibPath += "sparcv9/";
2995 break;
2996 default:
2997 llvm_unreachable("Unsupported architecture");
2998 }
2999
3000 addPathIfExists(getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003001}
3002
Rafael Espindola7cf32212013-03-20 03:05:54 +00003003Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003004 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003005}
3006
Douglas Katzman95354292015-06-23 20:42:09 +00003007Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003008
Rafael Espindolad5117262015-09-09 13:36:00 +00003009void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3010 ArgStringList &CC1Args) const {
3011 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3012 DriverArgs.hasArg(options::OPT_nostdincxx))
3013 return;
3014
3015 // Include the support directory for things like xlocale and fudged system
3016 // headers.
3017 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3018
3019 if (GCCInstallation.isValid()) {
3020 GCCVersion Version = GCCInstallation.getVersion();
3021 addSystemInclude(DriverArgs, CC1Args,
3022 getDriver().SysRoot + "/usr/gcc/" +
3023 Version.MajorStr + "." +
3024 Version.MinorStr +
3025 "/include/c++/" + Version.Text);
3026 addSystemInclude(DriverArgs, CC1Args,
3027 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3028 "." + Version.MinorStr + "/include/c++/" +
3029 Version.Text + "/" +
3030 GCCInstallation.getTriple().str());
3031 }
3032}
3033
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003034/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003035
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003036enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003037 // NB: Releases of a particular Linux distro should be kept together
3038 // in this enum, because some tests are done by integer comparison against
3039 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003040 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003041 DebianLenny,
3042 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003043 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003044 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003045 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003046 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003047 RHEL4,
3048 RHEL5,
3049 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003050 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003051 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003052 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003053 UbuntuHardy,
3054 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003055 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003056 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003057 UbuntuLucid,
3058 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003059 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003060 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003061 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003062 UbuntuQuantal,
3063 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003064 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003065 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003066 UbuntuUtopic,
3067 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003068 UbuntuWily,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003069 UnknownDistro
3070};
3071
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003072static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003073 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003074}
3075
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003076static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003077
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003078static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003079 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003080}
3081
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003082static bool IsUbuntu(enum Distro Distro) {
Benjamin Kramer2d469802015-07-09 15:31:17 +00003083 return Distro >= UbuntuHardy && Distro <= UbuntuWily;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003084}
3085
Rafael Espindolaa8398552013-10-28 23:14:34 +00003086static Distro DetectDistro(llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003087 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3088 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3089 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003090 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003091 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003092 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003093 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003094 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003095 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3096 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3097 .Case("hardy", UbuntuHardy)
3098 .Case("intrepid", UbuntuIntrepid)
3099 .Case("jaunty", UbuntuJaunty)
3100 .Case("karmic", UbuntuKarmic)
3101 .Case("lucid", UbuntuLucid)
3102 .Case("maverick", UbuntuMaverick)
3103 .Case("natty", UbuntuNatty)
3104 .Case("oneiric", UbuntuOneiric)
3105 .Case("precise", UbuntuPrecise)
3106 .Case("quantal", UbuntuQuantal)
3107 .Case("raring", UbuntuRaring)
3108 .Case("saucy", UbuntuSaucy)
3109 .Case("trusty", UbuntuTrusty)
3110 .Case("utopic", UbuntuUtopic)
3111 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003112 .Case("wily", UbuntuWily)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003113 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003114 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003115 }
3116
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003117 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3118 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003119 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003120 if (Data.startswith("Fedora release"))
3121 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003122 if (Data.startswith("Red Hat Enterprise Linux") ||
3123 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003124 if (Data.find("release 7") != StringRef::npos)
3125 return RHEL7;
3126 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003127 return RHEL6;
3128 else if (Data.find("release 5") != StringRef::npos)
3129 return RHEL5;
3130 else if (Data.find("release 4") != StringRef::npos)
3131 return RHEL4;
3132 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003133 return UnknownDistro;
3134 }
3135
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003136 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3137 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003138 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003139 if (Data[0] == '5')
3140 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003141 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003142 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003143 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003144 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003145 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003146 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003147 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3148 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003149 return UnknownDistro;
3150 }
3151
Rafael Espindolaa8398552013-10-28 23:14:34 +00003152 if (llvm::sys::fs::exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003153 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003154
Rafael Espindolaa8398552013-10-28 23:14:34 +00003155 if (llvm::sys::fs::exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003156 return Exherbo;
3157
Rafael Espindolaa8398552013-10-28 23:14:34 +00003158 if (llvm::sys::fs::exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003159 return ArchLinux;
3160
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003161 return UnknownDistro;
3162}
3163
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003164/// \brief Get our best guess at the multiarch triple for a target.
3165///
3166/// Debian-based systems are starting to use a multiarch setup where they use
3167/// a target-triple directory in the library and header search paths.
3168/// Unfortunately, this triple does not align with the vanilla target triple,
3169/// so we provide a rough mapping here.
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00003170static std::string getMultiarchTriple(const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003171 StringRef SysRoot) {
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003172 llvm::Triple::EnvironmentType TargetEnvironment = TargetTriple.getEnvironment();
3173
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003174 // For most architectures, just use whatever we have rather than trying to be
3175 // clever.
3176 switch (TargetTriple.getArch()) {
3177 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003178 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003179
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003180 // We use the existence of '/lib/<triple>' as a directory to detect some
3181 // common linux triples that don't quite match the Clang triple for both
3182 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3183 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003184 case llvm::Triple::arm:
3185 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003186 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003187 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf"))
3188 return "arm-linux-gnueabihf";
3189 } else {
3190 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi"))
3191 return "arm-linux-gnueabi";
3192 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003193 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003194 case llvm::Triple::armeb:
3195 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003196 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003197 if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
3198 return "armeb-linux-gnueabihf";
3199 } else {
3200 if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabi"))
3201 return "armeb-linux-gnueabi";
3202 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003203 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003204 case llvm::Triple::x86:
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003205 if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
3206 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003207 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003208 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003209 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003210 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00003211 llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003212 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003213 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003214 case llvm::Triple::aarch64:
3215 if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64-linux-gnu"))
3216 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003217 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003218 case llvm::Triple::aarch64_be:
3219 if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
3220 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003221 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003222 case llvm::Triple::mips:
3223 if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu"))
3224 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003225 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003226 case llvm::Triple::mipsel:
3227 if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu"))
3228 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003229 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003230 case llvm::Triple::mips64:
3231 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnu"))
3232 return "mips64-linux-gnu";
3233 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
3234 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003235 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003236 case llvm::Triple::mips64el:
3237 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnu"))
3238 return "mips64el-linux-gnu";
3239 if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
3240 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003241 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003242 case llvm::Triple::ppc:
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003243 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
3244 return "powerpc-linux-gnuspe";
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003245 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu"))
3246 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003247 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003248 case llvm::Triple::ppc64:
3249 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu"))
3250 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003251 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003252 case llvm::Triple::ppc64le:
3253 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
3254 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003255 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003256 case llvm::Triple::sparc:
3257 if (llvm::sys::fs::exists(SysRoot + "/lib/sparc-linux-gnu"))
3258 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003259 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003260 case llvm::Triple::sparcv9:
3261 if (llvm::sys::fs::exists(SysRoot + "/lib/sparc64-linux-gnu"))
3262 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003263 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003264 case llvm::Triple::systemz:
3265 if (llvm::sys::fs::exists(SysRoot + "/lib/s390x-linux-gnu"))
3266 return "s390x-linux-gnu";
3267 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003268 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003269 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003270}
3271
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003272static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003273 if (isMipsArch(Triple.getArch())) {
3274 // lib32 directory has a special meaning on MIPS targets.
3275 // It contains N32 ABI binaries. Use this folder if produce
3276 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003277 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003278 return "lib32";
3279 return Triple.isArch32Bit() ? "lib" : "lib64";
3280 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003281
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003282 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003283 // using that variant while targeting other architectures causes problems
3284 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003285 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003286 // them when we know we may need it.
3287 //
3288 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003289 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003290 // GCCInstallationDetector, but that is a more significant refactoring.
3291 if (Triple.getArch() == llvm::Triple::x86 ||
3292 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003293 return "lib32";
3294
Zinovy Nis1db95732014-07-10 15:27:19 +00003295 if (Triple.getArch() == llvm::Triple::x86_64 &&
3296 Triple.getEnvironment() == llvm::Triple::GNUX32)
3297 return "libx32";
3298
Simon Atanasyand4413882012-09-14 11:27:24 +00003299 return Triple.isArch32Bit() ? "lib" : "lib64";
3300}
3301
Rafael Espindola1af7c212012-02-19 01:38:32 +00003302Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003303 : Generic_ELF(D, Triple, Args) {
Roman Divacky326d9982013-12-06 18:32:18 +00003304 GCCInstallation.init(D, Triple, Args);
Artem Belevich98607b62015-09-23 21:49:39 +00003305 CudaInstallation.init(D, Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003306 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003307 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003308 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003309
Rafael Espindola10a63c22013-07-03 14:14:00 +00003310 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003311 // least) put various tools in a triple-prefixed directory off of the parent
3312 // of the GCC installation. We use the GCC triple here to ensure that we end
3313 // up with tools that support the same amount of cross compiling as the
3314 // detected GCC installation. For example, if we find a GCC installation
3315 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3316 // used to target i386.
3317 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003318 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003319 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003320 GCCInstallation.getTriple().str() + "/bin")
3321 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003322
Logan Chieneb9162f2014-06-26 14:23:45 +00003323 Linker = GetLinkerPath();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003324
Rafael Espindolaa8398552013-10-28 23:14:34 +00003325 Distro Distro = DetectDistro(Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003326
Rafael Espindola10a63c22013-07-03 14:14:00 +00003327 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003328 ExtraOpts.push_back("-z");
3329 ExtraOpts.push_back("relro");
3330 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003331
Douglas Gregord9bb1522011-03-06 19:11:49 +00003332 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003333 ExtraOpts.push_back("-X");
3334
Logan Chienc6fd8202012-09-02 09:30:11 +00003335 const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003336 const bool IsMips = isMipsArch(Arch);
3337
3338 if (IsMips && !SysRoot.empty())
3339 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003340
Chandler Carruth0b842912011-12-09 04:45:18 +00003341 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3342 // and the MIPS ABI require .dynsym to be sorted in different ways.
3343 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3344 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003345 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003346 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003347 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003348 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003349 ExtraOpts.push_back("--hash-style=gnu");
3350
Rafael Espindola10a63c22013-07-03 14:14:00 +00003351 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003352 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3353 ExtraOpts.push_back("--hash-style=both");
3354 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003355
Chris Lattner84e38552011-05-22 05:36:06 +00003356 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003357 ExtraOpts.push_back("--no-add-needed");
3358
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003359 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003360 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003361 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003362 ExtraOpts.push_back("--build-id");
3363
Rafael Espindola10a63c22013-07-03 14:14:00 +00003364 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003365 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003366
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003367 // The selection of paths to try here is designed to match the patterns which
3368 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3369 // This was determined by running GCC in a fake filesystem, creating all
3370 // possible permutations of these directories, and seeing which ones it added
3371 // to the link paths.
3372 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003373
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003374 const std::string OSLibDir = getOSLibDir(Triple, Args);
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003375 const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003376
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003377 // Add the multilib suffixed paths where they are available.
3378 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003379 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003380 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003381 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003382
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003383 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003384 // a biarch-like suffix of the GCC installation.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003385 addPathIfExists((GCCInstallation.getInstallPath() + Multilib.gccSuffix()),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003386 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003387
3388 // GCC cross compiling toolchains will install target libraries which ship
3389 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3390 // any part of the GCC installation in
3391 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3392 // debatable, but is the reality today. We need to search this tree even
3393 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003394 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003395 // installation that is *not* within the system root to ensure two things:
3396 //
3397 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003398 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003399 // appropriate rpath.
3400 // 2) There must not be libraries installed into
3401 // <prefix>/<triple>/<libdir> unless they should be preferred over
3402 // those within the system root.
3403 //
3404 // Note that this matches the GCC behavior. See the below comment for where
3405 // Clang diverges from GCC's behavior.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003406 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + OSLibDir +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003407 Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003408 Paths);
3409
Chandler Carruth69a125b2012-04-06 16:32:06 +00003410 // If the GCC installation we found is inside of the sysroot, we want to
3411 // prefer libraries installed in the parent prefix of the GCC installation.
3412 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003413 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003414 // This usually happens when there is an external cross compiler on the
3415 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003416 // the cross. Note that GCC does include some of these directories in some
3417 // configurations but this seems somewhere between questionable and simply
3418 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003419 if (StringRef(LibPath).startswith(SysRoot)) {
Chandler Carruth69a125b2012-04-06 16:32:06 +00003420 addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003421 addPathIfExists(LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003422 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003423 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003424
3425 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003426 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003427 // those searched.
3428 // FIXME: It's not clear whether we should use the driver's installed
3429 // directory ('Dir' below) or the ResourceDir.
3430 if (StringRef(D.Dir).startswith(SysRoot)) {
3431 addPathIfExists(D.Dir + "/../lib/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003432 addPathIfExists(D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003433 }
3434
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003435 addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003436 addPathIfExists(SysRoot + "/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003437 addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003438 addPathIfExists(SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003439
Chandler Carruthb427c562013-06-22 11:35:51 +00003440 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003441 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003442 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003443 addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003444 "/../../" + OSLibDir,
3445 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003446
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003447 // Add the 'other' biarch variant path
3448 Multilib BiarchSibling;
3449 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003450 addPathIfExists(
3451 GCCInstallation.getInstallPath() + BiarchSibling.gccSuffix(), Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003452 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003453
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003454 // See comments above on the multilib variant for details of why this is
3455 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003456 const std::string &LibPath = GCCInstallation.getParentLibPath();
3457 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3458 const Multilib &Multilib = GCCInstallation.getMultilib();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003459 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib" +
3460 Multilib.osSuffix(),
3461 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003462
3463 // See comments above on the multilib variant for details of why this is
3464 // only included from within the sysroot.
3465 if (StringRef(LibPath).startswith(SysRoot))
Chandler Carruth69a125b2012-04-06 16:32:06 +00003466 addPathIfExists(LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003467 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003468
3469 // Similar to the logic for GCC above, if we are currently running Clang
3470 // inside of the requested system root, add its parent library path to those
3471 // searched.
3472 // FIXME: It's not clear whether we should use the driver's installed
3473 // directory ('Dir' below) or the ResourceDir.
3474 if (StringRef(D.Dir).startswith(SysRoot))
3475 addPathIfExists(D.Dir + "/../lib", Paths);
3476
Chandler Carruth2a649c72011-10-03 06:41:08 +00003477 addPathIfExists(SysRoot + "/lib", Paths);
3478 addPathIfExists(SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003479}
3480
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003481bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003482
Douglas Katzman95354292015-06-23 20:42:09 +00003483Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003484
3485Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003486 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003487}
3488
Simon Atanasyana0d89572013-10-05 14:37:55 +00003489std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003490 if (!getDriver().SysRoot.empty())
3491 return getDriver().SysRoot;
3492
3493 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3494 return std::string();
3495
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003496 // Standalone MIPS toolchains use different names for sysroot folder
3497 // and put it into different places. Here we try to check some known
3498 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003499
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003500 const StringRef InstallDir = GCCInstallation.getInstallPath();
3501 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003502 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003503
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003504 std::string Path =
3505 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3506 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003507
3508 if (llvm::sys::fs::exists(Path))
3509 return Path;
3510
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003511 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003512
3513 if (llvm::sys::fs::exists(Path))
3514 return Path;
3515
3516 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003517}
3518
Chandler Carrutha796f532011-11-05 20:17:13 +00003519void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3520 ArgStringList &CC1Args) const {
3521 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003522 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003523
3524 if (DriverArgs.hasArg(options::OPT_nostdinc))
3525 return;
3526
3527 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003528 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003529
3530 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003531 SmallString<128> P(D.ResourceDir);
3532 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003533 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003534 }
3535
3536 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3537 return;
3538
3539 // Check for configure-time C include directories.
3540 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3541 if (CIncludeDirs != "") {
3542 SmallVector<StringRef, 5> dirs;
3543 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003544 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003545 StringRef Prefix =
3546 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003547 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003548 }
3549 return;
3550 }
3551
3552 // Lacking those, try to detect the correct set of system includes for the
3553 // target triple.
3554
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003555 // Add include directories specific to the selected multilib set and multilib.
3556 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003557 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003558 if (Callback) {
3559 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3560 GCCInstallation.getTriple().str(),
3561 GCCInstallation.getMultilib());
3562 for (const auto &Path : IncludePaths)
3563 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3564 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003565 }
3566
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003567 // Implement generic Debian multiarch support.
3568 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003569 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003570
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003571 // FIXME: These are older forms of multiarch. It's not clear that they're
3572 // in use in any released version of Debian, so we should consider
3573 // removing them.
3574 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003575 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003576 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003577
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003578 // FIXME: These are older forms of multiarch. It's not clear that they're
3579 // in use in any released version of Debian, so we should consider
3580 // removing them.
3581 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3582 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003583 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003584 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003585 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003586 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003587 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003588 "/usr/include/arm-linux-gnueabihf"};
3589 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003590 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003591 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003592 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003593 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003594 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003595 "/usr/include/mips64el-linux-gnu",
3596 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003597 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003598 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003599 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003600 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003601 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003602 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003603 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003604 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003605 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003606 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003607 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
3608 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003609 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003610 switch (getTriple().getArch()) {
3611 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003612 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003613 break;
3614 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003615 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003616 break;
3617 case llvm::Triple::aarch64:
3618 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003619 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003620 break;
3621 case llvm::Triple::arm:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003622 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3623 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3624 else
3625 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003626 break;
3627 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00003628 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003629 break;
3630 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00003631 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003632 break;
3633 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003634 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003635 break;
3636 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003637 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003638 break;
3639 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003640 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003641 break;
3642 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003643 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003644 break;
3645 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003646 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003647 break;
3648 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00003649 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003650 break;
3651 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00003652 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003653 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003654 case llvm::Triple::systemz:
3655 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
3656 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003657 default:
3658 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003659 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003660 for (StringRef Dir : MultiarchIncludeDirs) {
3661 if (llvm::sys::fs::exists(SysRoot + Dir)) {
3662 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003663 break;
3664 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003665 }
3666
3667 if (getTriple().getOS() == llvm::Triple::RTEMS)
3668 return;
3669
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003670 // Add an include of '/include' directly. This isn't provided by default by
3671 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
3672 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003673 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003674
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003675 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003676}
3677
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003678/// \brief Helper to add the variant paths of a libstdc++ installation.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003679/*static*/ bool Linux::addLibStdCXXIncludePaths(
3680 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
3681 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
3682 const ArgList &DriverArgs, ArgStringList &CC1Args) {
Chandler Carruthc26a79d2014-08-27 18:21:27 +00003683 if (!llvm::sys::fs::exists(Base + Suffix))
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003684 return false;
Chandler Carrutha796f532011-11-05 20:17:13 +00003685
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003686 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003687
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003688 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
3689 // that path exists or we have neither a GCC nor target multiarch triple, use
3690 // this vanilla search path.
3691 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
3692 llvm::sys::fs::exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
3693 addSystemInclude(DriverArgs, CC1Args,
3694 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
3695 } else {
3696 // Otherwise try to use multiarch naming schemes which have normalized the
3697 // triples and put the triple before the suffix.
3698 //
3699 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
3700 // the target triple, so we support that here.
3701 addSystemInclude(DriverArgs, CC1Args,
3702 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
3703 addSystemInclude(DriverArgs, CC1Args,
3704 Base + "/" + TargetMultiarchTriple + Suffix);
3705 }
3706
3707 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003708 return true;
3709}
3710
Chandler Carrutha796f532011-11-05 20:17:13 +00003711void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3712 ArgStringList &CC1Args) const {
3713 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3714 DriverArgs.hasArg(options::OPT_nostdincxx))
3715 return;
3716
Chandler Carruthf4701732011-11-07 09:01:17 +00003717 // Check if libc++ has been enabled and provide its include paths if so.
3718 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003719 const std::string LibCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003720 // The primary location is within the Clang installation.
3721 // FIXME: We shouldn't hard code 'v1' here to make Clang future proof to
3722 // newer ABI versions.
3723 getDriver().Dir + "/../include/c++/v1",
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003724
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003725 // We also check the system as for a long time this is the only place
3726 // Clang looked.
3727 // FIXME: We should really remove this. It doesn't make any sense.
3728 getDriver().SysRoot + "/usr/include/c++/v1"};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003729 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
3730 if (!llvm::sys::fs::exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003731 continue;
3732 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003733 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003734 break;
3735 }
Chandler Carruthf4701732011-11-07 09:01:17 +00003736 return;
3737 }
3738
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00003739 // We need a detected GCC installation on Linux to provide libstdc++'s
3740 // headers. We handled the libc++ case above.
3741 if (!GCCInstallation.isValid())
3742 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00003743
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003744 // By default, look for the C++ headers in an include directory adjacent to
3745 // the lib directory of the GCC installation. Note that this is expect to be
3746 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
3747 StringRef LibDir = GCCInstallation.getParentLibPath();
3748 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003749 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003750 const Multilib &Multilib = GCCInstallation.getMultilib();
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003751 const std::string GCCMultiarchTriple =
3752 getMultiarchTriple(GCCInstallation.getTriple(), getDriver().SysRoot);
3753 const std::string TargetMultiarchTriple =
3754 getMultiarchTriple(getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00003755 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003756
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003757 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00003758 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003759 "/c++/" + Version.Text, TripleStr,
3760 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003761 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003762 return;
3763
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003764 // Otherwise, fall back on a bunch of options which don't use multiarch
3765 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003766 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003767 // Gentoo is weird and places its headers inside the GCC install,
3768 // so if the first attempt to find the headers fails, try these patterns.
3769 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
3770 Version.MinorStr,
3771 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
3772 // Android standalone toolchain has C++ headers in yet another place.
3773 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
3774 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
3775 // without a subdirectory corresponding to the gcc version.
3776 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003777 };
3778
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003779 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003780 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
3781 /*GCCMultiarchTriple*/ "",
3782 /*TargetMultiarchTriple*/ "",
3783 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003784 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003785 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003786}
3787
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003788bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003789
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003790SanitizerMask Linux::getSupportedSanitizers() const {
3791 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3792 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3793 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3794 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00003795 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
3796 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003797 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
3798 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003799 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3800 Res |= SanitizerKind::Address;
3801 Res |= SanitizerKind::KernelAddress;
3802 Res |= SanitizerKind::Vptr;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003803 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003804 Res |= SanitizerKind::DataFlow;
Renato Golind45c2df2015-08-05 18:42:41 +00003805 if (IsX86_64 || IsMIPS64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003806 Res |= SanitizerKind::Leak;
Renato Golind45c2df2015-08-05 18:42:41 +00003807 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003808 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00003809 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00003810 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003811 if (IsX86 || IsX86_64) {
3812 Res |= SanitizerKind::Function;
3813 Res |= SanitizerKind::SafeStack;
3814 }
3815 return Res;
3816}
3817
Daniel Dunbarcc912342009-05-02 18:28:39 +00003818/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
3819
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003820DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
3821 const ArgList &Args)
3822 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00003823
3824 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00003825 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00003826 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00003827 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00003828
Daniel Dunbar083edf72009-12-21 18:54:17 +00003829 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00003830 getFilePaths().push_back("/usr/lib");
John McCall65b8da02013-04-11 22:55:55 +00003831 if (llvm::sys::fs::exists("/usr/lib/gcc47"))
3832 getFilePaths().push_back("/usr/lib/gcc47");
3833 else
3834 getFilePaths().push_back("/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00003835}
3836
Rafael Espindola7cf32212013-03-20 03:05:54 +00003837Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003838 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003839}
3840
3841Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003842 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00003843}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003844
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003845/// Stub for CUDA toolchain. At the moment we don't have assembler or
3846/// linker and need toolchain mainly to propagate device-side options
3847/// to CC1.
3848
3849CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
3850 const ArgList &Args)
3851 : Linux(D, Triple, Args) {}
3852
3853void
3854CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
3855 llvm::opt::ArgStringList &CC1Args) const {
3856 Linux::addClangTargetOptions(DriverArgs, CC1Args);
3857 CC1Args.push_back("-fcuda-is-device");
3858}
3859
3860llvm::opt::DerivedArgList *
3861CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
3862 const char *BoundArch) const {
3863 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
3864 const OptTable &Opts = getDriver().getOpts();
3865
3866 for (Arg *A : Args) {
3867 if (A->getOption().matches(options::OPT_Xarch__)) {
3868 // Skip this argument unless the architecture matches BoundArch
3869 if (A->getValue(0) != StringRef(BoundArch))
3870 continue;
3871
3872 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
3873 unsigned Prev = Index;
3874 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
3875
3876 // If the argument parsing failed or more than one argument was
3877 // consumed, the -Xarch_ argument's parameter tried to consume
3878 // extra arguments. Emit an error and ignore.
3879 //
3880 // We also want to disallow any options which would alter the
3881 // driver behavior; that isn't going to work in our model. We
3882 // use isDriverOption() as an approximation, although things
3883 // like -O4 are going to slip through.
3884 if (!XarchArg || Index > Prev + 1) {
3885 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
3886 << A->getAsString(Args);
3887 continue;
3888 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
3889 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
3890 << A->getAsString(Args);
3891 continue;
3892 }
3893 XarchArg->setBaseArg(A);
3894 A = XarchArg.release();
3895 DAL->AddSynthesizedArg(A);
3896 }
3897 DAL->append(A);
3898 }
3899
3900 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
3901 return DAL;
3902}
3903
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003904/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00003905XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
3906 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003907 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003908 // ProgramPaths are found via 'PATH' environment variable.
3909}
3910
Douglas Katzman54366072015-07-27 16:53:08 +00003911Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003912 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003913}
3914
Douglas Katzman54366072015-07-27 16:53:08 +00003915Tool *XCoreToolChain::buildLinker() const {
3916 return new tools::XCore::Linker(*this);
3917}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003918
Douglas Katzman54366072015-07-27 16:53:08 +00003919bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003920
Douglas Katzman54366072015-07-27 16:53:08 +00003921bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003922
Douglas Katzman54366072015-07-27 16:53:08 +00003923bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003924
Douglas Katzman54366072015-07-27 16:53:08 +00003925bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003926
Douglas Katzman54366072015-07-27 16:53:08 +00003927bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003928
Douglas Katzman54366072015-07-27 16:53:08 +00003929void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3930 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003931 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
3932 DriverArgs.hasArg(options::OPT_nostdlibinc))
3933 return;
3934 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
3935 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003936 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003937 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3938 ArrayRef<StringRef> DirVec(Dirs);
3939 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3940 }
3941}
3942
Douglas Katzman54366072015-07-27 16:53:08 +00003943void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
3944 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003945 CC1Args.push_back("-nostdsysteminc");
3946}
3947
Douglas Katzman54366072015-07-27 16:53:08 +00003948void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
3949 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003950 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00003951 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3952 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003953 return;
3954 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
3955 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003956 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003957 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3958 ArrayRef<StringRef> DirVec(Dirs);
3959 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3960 }
3961}
3962
Douglas Katzman54366072015-07-27 16:53:08 +00003963void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
3964 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003965 // We don't output any lib args. This is handled by xcc.
3966}
Douglas Katzman84a75642015-06-19 14:55:19 +00003967
Douglas Katzmand6e597c2015-09-17 19:56:40 +00003968MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
3969 const ArgList &Args)
3970 : Generic_GCC(D, Triple, Args) {
3971 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
3972 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
3973 // This won't work to find gcc. Instead we give the installation detector an
3974 // extra triple, which is preferable to further hacks of the logic that at
3975 // present is based solely on getArch(). In particular, it would be wrong to
3976 // choose the myriad installation when targeting a non-myriad sparc install.
3977 switch (Triple.getArch()) {
3978 default:
3979 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName() << "myriad";
3980 case llvm::Triple::sparc:
3981 case llvm::Triple::sparcel:
3982 case llvm::Triple::shave:
3983 GCCInstallation.init(D, Triple, Args, {"sparc-myriad-elf"});
3984 }
3985}
3986
3987MyriadToolChain::~MyriadToolChain() {}
3988
Douglas Katzmanb1278f32015-09-17 21:20:16 +00003989void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3990 ArgStringList &CC1Args) const {
3991 if (!DriverArgs.hasArg(options::OPT_nostdinc))
3992 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
3993}
3994
Douglas Katzmand6e597c2015-09-17 19:56:40 +00003995// MyriadToolChain handles several triples:
3996// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
3997Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
3998 // The inherited method works fine if not targeting the SHAVE.
3999 if (!isShaveCompilation(getTriple()))
4000 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004001 switch (JA.getKind()) {
4002 case Action::CompileJobClass:
4003 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004004 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004005 return Compiler.get();
4006 case Action::AssembleJobClass:
4007 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004008 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004009 return Assembler.get();
4010 default:
4011 return ToolChain::getTool(JA.getKind());
4012 }
4013}
4014
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004015void MyriadToolChain::getCompilerSupportDir(std::string &Dir) const {
4016 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4017 // These files are tied to a particular version of gcc.
4018 SmallString<128> Result(GCCInstallation.getInstallPath());
4019 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4020 // but as this toolchain is for LEON sparc, it can assume FPU.
4021 if (this->getTriple().getArch() == llvm::Triple::sparcel)
4022 llvm::sys::path::append(Result, "le");
4023 Dir.assign(Result.str());
4024}
4025void MyriadToolChain::getBuiltinLibDir(std::string &Dir) const {
4026 // The contents of LibDir are independent of the version of gcc.
4027 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4028 SmallString<128> Result(GCCInstallation.getParentLibPath());
4029 if (this->getTriple().getArch() == llvm::Triple::sparcel)
4030 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib/le");
4031 else
4032 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib");
4033 Dir.assign(Result.str());
Douglas Katzman84a75642015-06-19 14:55:19 +00004034}
4035
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004036Tool *MyriadToolChain::buildLinker() const {
4037 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004038}
Dan Gohmanc2853072015-09-03 22:51:53 +00004039
4040bool WebAssembly::IsMathErrnoDefault() const { return false; }
4041
4042bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4043
4044bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4045
4046bool WebAssembly::isPICDefault() const { return false; }
4047
4048bool WebAssembly::isPIEDefault() const { return false; }
4049
4050bool WebAssembly::isPICDefaultForced() const { return false; }
4051
4052bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4053
4054// TODO: Support Objective C stuff.
4055bool WebAssembly::SupportsObjCGC() const { return false; }
4056
4057bool WebAssembly::hasBlocksRuntime() const { return false; }
4058
4059// TODO: Support profiling.
4060bool WebAssembly::SupportsProfiling() const { return false; }
4061
4062void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4063 ArgStringList &CC1Args) const {
4064 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4065 options::OPT_fno_use_init_array, true))
4066 CC1Args.push_back("-fuse-init-array");
4067}