blob: 5df96ce54e3f52092b8c2dc08a1376c252ba3dea [file] [log] [blame]
Hans Wennborgdcfba332015-10-06 23:40:43 +00001//===--- ToolChains.cpp - ToolChain Implementations -------------*- C++ -*-===//
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"
Benjamin Kramerd45b2052015-10-07 15:48:01 +000013#include "clang/Basic/VirtualFileSystem.h"
Alp Toker1d257e12014-06-04 03:28:55 +000014#include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
Daniel Dunbar6232d342010-05-20 21:48:38 +000015#include "clang/Driver/Compilation.h"
Daniel Dunbar76ce7412009-03-23 16:15:50 +000016#include "clang/Driver/Driver.h"
Daniel Dunbaraabb0b12009-03-25 06:12:34 +000017#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000018#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000019#include "clang/Driver/SanitizerArgs.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000020#include "llvm/ADT/STLExtras.h"
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +000021#include "llvm/ADT/SmallString.h"
Daniel Dunbar76ce7412009-03-23 16:15:50 +000022#include "llvm/ADT/StringExtras.h"
Bob Wilson997a97f2011-10-07 00:37:57 +000023#include "llvm/ADT/StringSwitch.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000024#include "llvm/Option/Arg.h"
25#include "llvm/Option/ArgList.h"
26#include "llvm/Option/OptTable.h"
27#include "llvm/Option/Option.h"
Xinliang David Li170cd102015-10-27 05:15:35 +000028#include "llvm/ProfileData/InstrProf.h"
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +000029#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000030#include "llvm/Support/FileSystem.h"
Rafael Espindolac8f008f2010-11-07 20:14:31 +000031#include "llvm/Support/MemoryBuffer.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000032#include "llvm/Support/Path.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000033#include "llvm/Support/Program.h"
Renato Golin33e1f822015-05-28 15:49:28 +000034#include "llvm/Support/TargetParser.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000035#include "llvm/Support/raw_ostream.h"
Daniel Dunbarb5023e92009-04-10 21:00:07 +000036#include <cstdlib> // ::getenv
Rafael Espindola8a8e5542014-06-12 17:19:42 +000037#include <system_error>
Daniel Dunbarb5023e92009-04-10 21:00:07 +000038
Daniel Dunbar59e5e882009-03-20 00:20:03 +000039using namespace clang::driver;
40using namespace clang::driver::toolchains;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000041using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000042using namespace llvm::opt;
Daniel Dunbar59e5e882009-03-20 00:20:03 +000043
Douglas Katzmana67e50c2015-06-26 15:47:46 +000044MachO::MachO(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
45 : ToolChain(D, Triple, Args) {
Tim Northover15ff71d2014-05-22 13:12:14 +000046 // We expect 'as', 'ld', etc. to be adjacent to our install dir.
47 getProgramPaths().push_back(getDriver().getInstalledDir());
48 if (getDriver().getInstalledDir() != getDriver().Dir)
49 getProgramPaths().push_back(getDriver().Dir);
Tim Northover157d9112014-01-16 08:48:16 +000050}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +000051
Tim Northover157d9112014-01-16 08:48:16 +000052/// Darwin - Darwin tool chain for i386 and x86_64.
Alexey Samsonov905c8022015-06-18 21:46:05 +000053Darwin::Darwin(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
54 : MachO(D, Triple, Args), TargetInitialized(false) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +000055
Tim Northover157d9112014-01-16 08:48:16 +000056types::ID MachO::LookupTypeForExtension(const char *Ext) const {
Daniel Dunbarcc7df6c2010-08-02 05:43:56 +000057 types::ID Ty = types::lookupTypeForExtension(Ext);
58
59 // Darwin always preprocesses assembly files (unless -x is used explicitly).
60 if (Ty == types::TY_PP_Asm)
61 return types::TY_Asm;
62
63 return Ty;
64}
65
Douglas Katzmana67e50c2015-06-26 15:47:46 +000066bool MachO::HasNativeLLVMSupport() const { return true; }
Daniel Dunbar62123a12010-09-17 00:24:52 +000067
John McCall24fc0de2011-07-06 00:26:06 +000068/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
John McCall5fb5df92012-06-20 06:18:46 +000069ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
Tim Northover6f3ff222015-10-30 16:30:27 +000070 if (isTargetWatchOSBased())
Tim Northover756447a2015-10-30 16:30:36 +000071 return ObjCRuntime(ObjCRuntime::WatchOS, TargetVersion);
Tim Northover9c7e0352013-12-12 11:55:52 +000072 if (isTargetIOSBased())
John McCall5fb5df92012-06-20 06:18:46 +000073 return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
Bob Wilson5ad5a952012-11-09 01:59:30 +000074 if (isNonFragile)
75 return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
76 return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
John McCall24fc0de2011-07-06 00:26:06 +000077}
78
John McCall7959fee2011-09-09 20:41:01 +000079/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
80bool Darwin::hasBlocksRuntime() const {
Tim Northover6f3ff222015-10-30 16:30:27 +000081 if (isTargetWatchOSBased())
82 return true;
83 else if (isTargetIOSBased())
John McCall7959fee2011-09-09 20:41:01 +000084 return !isIPhoneOSVersionLT(3, 2);
Tim Northover9c7e0352013-12-12 11:55:52 +000085 else {
Tim Northover157d9112014-01-16 08:48:16 +000086 assert(isTargetMacOS() && "unexpected darwin target");
87 return !isMacosxVersionLT(10, 6);
Tim Northover9c7e0352013-12-12 11:55:52 +000088 }
John McCall7959fee2011-09-09 20:41:01 +000089}
90
Renato Golin33e1f822015-05-28 15:49:28 +000091// This is just a MachO name translation routine and there's no
92// way to join this into ARMTargetParser without breaking all
93// other assumptions. Maybe MachO should consider standardising
94// their nomenclature.
95static const char *ArmMachOArchName(StringRef Arch) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000096 return llvm::StringSwitch<const char *>(Arch)
97 .Case("armv6k", "armv6")
98 .Case("armv6m", "armv6m")
99 .Case("armv5tej", "armv5")
100 .Case("xscale", "xscale")
101 .Case("armv4t", "armv4t")
102 .Case("armv7", "armv7")
103 .Cases("armv7a", "armv7-a", "armv7")
104 .Cases("armv7r", "armv7-r", "armv7")
105 .Cases("armv7em", "armv7e-m", "armv7em")
106 .Cases("armv7k", "armv7-k", "armv7k")
107 .Cases("armv7m", "armv7-m", "armv7m")
108 .Cases("armv7s", "armv7-s", "armv7s")
109 .Default(nullptr);
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000110}
111
Renato Golin33e1f822015-05-28 15:49:28 +0000112static const char *ArmMachOArchNameCPU(StringRef CPU) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000113 unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
Renato Golin33e1f822015-05-28 15:49:28 +0000114 if (ArchKind == llvm::ARM::AK_INVALID)
115 return nullptr;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000116 StringRef Arch = llvm::ARM::getArchName(ArchKind);
Renato Golin33e1f822015-05-28 15:49:28 +0000117
118 // FIXME: Make sure this MachO triple mangling is really necessary.
119 // ARMv5* normalises to ARMv5.
120 if (Arch.startswith("armv5"))
121 Arch = Arch.substr(0, 5);
122 // ARMv6*, except ARMv6M, normalises to ARMv6.
123 else if (Arch.startswith("armv6") && !Arch.endswith("6m"))
124 Arch = Arch.substr(0, 5);
125 // ARMv7A normalises to ARMv7.
126 else if (Arch.endswith("v7a"))
127 Arch = Arch.substr(0, 5);
128 return Arch.data();
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000129}
130
Tim Northover9c7e0352013-12-12 11:55:52 +0000131static bool isSoftFloatABI(const ArgList &Args) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000132 Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
Tim Northover9c7e0352013-12-12 11:55:52 +0000133 options::OPT_mfloat_abi_EQ);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000134 if (!A)
135 return false;
Rafael Auler3f7abf72014-09-29 21:50:34 +0000136
Tim Northover9c7e0352013-12-12 11:55:52 +0000137 return A->getOption().matches(options::OPT_msoft_float) ||
138 (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
139 A->getValue() == StringRef("soft"));
140}
141
Tim Northover157d9112014-01-16 08:48:16 +0000142StringRef MachO::getMachOArchName(const ArgList &Args) const {
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000143 switch (getTriple().getArch()) {
144 default:
Rafael Espindolaed1233e2014-08-28 21:23:05 +0000145 return getDefaultUniversalArchName();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000146
Tim Northover40956e62014-07-23 12:32:58 +0000147 case llvm::Triple::aarch64:
148 return "arm64";
149
Douglas Gregord9bb1522011-03-06 19:11:49 +0000150 case llvm::Triple::thumb:
Hans Wennborgdcfba332015-10-06 23:40:43 +0000151 case llvm::Triple::arm:
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000152 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000153 if (const char *Arch = ArmMachOArchName(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000154 return Arch;
155
156 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000157 if (const char *Arch = ArmMachOArchNameCPU(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000158 return Arch;
159
160 return "arm";
161 }
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000162}
163
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +0000164Darwin::~Darwin() {}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000165
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +0000166MachO::~MachO() {}
Tim Northover157d9112014-01-16 08:48:16 +0000167
168std::string MachO::ComputeEffectiveClangTriple(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000169 types::ID InputType) const {
Tim Northover157d9112014-01-16 08:48:16 +0000170 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
171
172 return Triple.getTriple();
173}
174
Chad Rosierd3a0f952011-09-20 20:44:06 +0000175std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
176 types::ID InputType) const {
177 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000178
179 // If the target isn't initialized (e.g., an unknown Darwin platform, return
180 // the default triple).
181 if (!isTargetInitialized())
182 return Triple.getTriple();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000183
Tim Northover157d9112014-01-16 08:48:16 +0000184 SmallString<16> Str;
Tim Northover6f3ff222015-10-30 16:30:27 +0000185 if (isTargetWatchOSBased())
186 Str += "watchos";
187 else if (isTargetTvOSBased())
188 Str += "tvos";
189 else if (isTargetIOSBased())
190 Str += "ios";
191 else
192 Str += "macosx";
Tim Northover157d9112014-01-16 08:48:16 +0000193 Str += getTargetVersion().getAsString();
194 Triple.setOSName(Str);
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000195
196 return Triple.getTriple();
197}
198
David Blaikie68e081d2011-12-20 02:48:34 +0000199void Generic_ELF::anchor() {}
200
Tim Northover157d9112014-01-16 08:48:16 +0000201Tool *MachO::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +0000202 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000203 case Action::LipoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000204 if (!Lipo)
205 Lipo.reset(new tools::darwin::Lipo(*this));
206 return Lipo.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000207 case Action::DsymutilJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000208 if (!Dsymutil)
209 Dsymutil.reset(new tools::darwin::Dsymutil(*this));
210 return Dsymutil.get();
Ben Langmuir9b9a8d32014-02-06 18:53:25 +0000211 case Action::VerifyDebugInfoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000212 if (!VerifyDebug)
213 VerifyDebug.reset(new tools::darwin::VerifyDebug(*this));
214 return VerifyDebug.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +0000215 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000216 return ToolChain::getTool(AC);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000217 }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000218}
219
Douglas Katzman95354292015-06-23 20:42:09 +0000220Tool *MachO::buildLinker() const { return new tools::darwin::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +0000221
Tim Northover157d9112014-01-16 08:48:16 +0000222Tool *MachO::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +0000223 return new tools::darwin::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +0000224}
Daniel Dunbar26d482a2009-09-18 08:15:03 +0000225
Douglas Katzman95354292015-06-23 20:42:09 +0000226DarwinClang::DarwinClang(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +0000227 const ArgList &Args)
Douglas Katzman95354292015-06-23 20:42:09 +0000228 : Darwin(D, Triple, Args) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +0000229
Tim Northover336f1892014-03-29 13:16:12 +0000230void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
Tim Northover6f3ff222015-10-30 16:30:27 +0000231 // For modern targets, promote certain warnings to errors.
232 if (isTargetWatchOSBased() || getTriple().isArch64Bit()) {
Tim Northover336f1892014-03-29 13:16:12 +0000233 // Always enable -Wdeprecated-objc-isa-usage and promote it
234 // to an error.
235 CC1Args.push_back("-Wdeprecated-objc-isa-usage");
236 CC1Args.push_back("-Werror=deprecated-objc-isa-usage");
237
Tim Northover6f3ff222015-10-30 16:30:27 +0000238 // For iOS and watchOS, also error about implicit function declarations,
239 // as that can impact calling conventions.
240 if (!isTargetMacOS())
241 CC1Args.push_back("-Werror=implicit-function-declaration");
Tim Northover336f1892014-03-29 13:16:12 +0000242 }
243}
244
Tim Northover157d9112014-01-16 08:48:16 +0000245/// \brief Determine whether Objective-C automated reference counting is
246/// enabled.
247static bool isObjCAutoRefCount(const ArgList &Args) {
248 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
249}
250
John McCall31168b02011-06-15 23:02:42 +0000251void DarwinClang::AddLinkARCArgs(const ArgList &Args,
252 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000253 // Avoid linking compatibility stubs on i386 mac.
254 if (isTargetMacOS() && getArch() == llvm::Triple::x86)
255 return;
256
257 ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true);
258
259 if ((runtime.hasNativeARC() || !isObjCAutoRefCount(Args)) &&
260 runtime.hasSubscripting())
261 return;
Eric Christopher551ef452011-08-23 17:56:55 +0000262
263 CmdArgs.push_back("-force_load");
Rafael Espindola358256c2013-06-26 02:13:00 +0000264 SmallString<128> P(getDriver().ClangExecutable);
265 llvm::sys::path::remove_filename(P); // 'clang'
266 llvm::sys::path::remove_filename(P); // 'bin'
Benjamin Kramer17381a02013-06-28 16:25:46 +0000267 llvm::sys::path::append(P, "lib", "arc", "libarclite_");
John McCall31168b02011-06-15 23:02:42 +0000268 // Mash in the platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000269 if (isTargetWatchOSSimulator())
270 P += "watchsimulator";
271 else if (isTargetWatchOS())
272 P += "watchos";
273 else if (isTargetTvOSSimulator())
274 P += "appletvsimulator";
275 else if (isTargetTvOS())
276 P += "appletvos";
277 else if (isTargetIOSSimulator())
Rafael Espindola358256c2013-06-26 02:13:00 +0000278 P += "iphonesimulator";
Argyrios Kyrtzidis058b4512011-10-18 17:40:15 +0000279 else if (isTargetIPhoneOS())
Rafael Espindola358256c2013-06-26 02:13:00 +0000280 P += "iphoneos";
John McCall31168b02011-06-15 23:02:42 +0000281 else
Rafael Espindola358256c2013-06-26 02:13:00 +0000282 P += "macosx";
283 P += ".a";
John McCall31168b02011-06-15 23:02:42 +0000284
Rafael Espindola358256c2013-06-26 02:13:00 +0000285 CmdArgs.push_back(Args.MakeArgString(P));
John McCall31168b02011-06-15 23:02:42 +0000286}
287
Tim Northover157d9112014-01-16 08:48:16 +0000288void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
Kuba Brecka2735a0252014-10-31 00:08:57 +0000289 StringRef DarwinLibName, bool AlwaysLink,
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000290 bool IsEmbedded, bool AddRPath) const {
291 SmallString<128> Dir(getDriver().ResourceDir);
292 llvm::sys::path::append(Dir, "lib", IsEmbedded ? "macho_embedded" : "darwin");
293
294 SmallString<128> P(Dir);
295 llvm::sys::path::append(P, DarwinLibName);
Eric Christopher551ef452011-08-23 17:56:55 +0000296
Eric Christopherc235d0c62011-06-22 17:41:40 +0000297 // For now, allow missing resource libraries to support developers who may
Alexey Samsonov8368b372012-11-21 14:17:42 +0000298 // not have compiler-rt checked out or integrated into their build (unless
299 // we explicitly force linking with this library).
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000300 if (AlwaysLink || getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000301 CmdArgs.push_back(Args.MakeArgString(P));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000302
303 // Adding the rpaths might negatively interact when other rpaths are involved,
304 // so we should make sure we add the rpaths last, after all user-specified
305 // rpaths. This is currently true from this place, but we need to be
306 // careful if this function is ever called before user's rpaths are emitted.
307 if (AddRPath) {
308 assert(DarwinLibName.endswith(".dylib") && "must be a dynamic library");
309
310 // Add @executable_path to rpath to support having the dylib copied with
311 // the executable.
312 CmdArgs.push_back("-rpath");
313 CmdArgs.push_back("@executable_path");
314
315 // Add the path to the resource dir to rpath to support using the dylib
316 // from the default location without copying.
317 CmdArgs.push_back("-rpath");
Yaron Keren92e1b622015-03-18 10:17:07 +0000318 CmdArgs.push_back(Args.MakeArgString(Dir));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000319 }
Eric Christopherc235d0c62011-06-22 17:41:40 +0000320}
321
Justin Bogner2fd95f62015-05-12 06:30:48 +0000322void Darwin::addProfileRTLibs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000323 ArgStringList &CmdArgs) const {
Xinliang David Li69306c02015-10-22 06:15:31 +0000324 if (!needsProfileRT(Args)) return;
Justin Bognerc7701242015-05-12 05:44:36 +0000325
326 // Select the appropriate runtime library for the target.
327 if (isTargetIOSBased())
328 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a",
329 /*AlwaysLink*/ true);
330 else
331 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a",
332 /*AlwaysLink*/ true);
Xinliang David Li69306c02015-10-22 06:15:31 +0000333 return;
Justin Bognerc7701242015-05-12 05:44:36 +0000334}
335
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000336void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
337 ArgStringList &CmdArgs,
338 StringRef Sanitizer) const {
339 if (!Args.hasArg(options::OPT_dynamiclib) &&
340 !Args.hasArg(options::OPT_bundle)) {
341 // Sanitizer runtime libraries requires C++.
342 AddCXXStdlibLibArgs(Args, CmdArgs);
343 }
Tim Northover6f3ff222015-10-30 16:30:27 +0000344 // ASan is not supported on watchOS.
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000345 assert(isTargetMacOS() || isTargetIOSSimulator());
346 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000347 AddLinkRuntimeLib(
348 Args, CmdArgs,
349 (Twine("libclang_rt.") + Sanitizer + "_" + OS + "_dynamic.dylib").str(),
350 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
351 /*AddRPath*/ true);
Hans Wennborg10821e52015-04-09 18:47:01 +0000352
353 if (GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) {
354 // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
355 // all RTTI-related symbols that UBSan uses.
356 CmdArgs.push_back("-lc++abi");
357 }
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000358}
359
Daniel Dunbar6276f992009-09-18 08:15:13 +0000360void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
361 ArgStringList &CmdArgs) const {
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000362 // Darwin only supports the compiler-rt based runtime libraries.
363 switch (GetRuntimeLibType(Args)) {
364 case ToolChain::RLT_CompilerRT:
365 break;
366 default:
367 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000368 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000369 return;
370 }
371
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000372 // Darwin doesn't support real static executables, don't link any runtime
373 // libraries with -static.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000374 if (Args.hasArg(options::OPT_static) ||
375 Args.hasArg(options::OPT_fapple_kext) ||
376 Args.hasArg(options::OPT_mkernel))
Daniel Dunbar6276f992009-09-18 08:15:13 +0000377 return;
Daniel Dunbar6276f992009-09-18 08:15:13 +0000378
379 // Reject -static-libgcc for now, we can deal with this when and if someone
380 // cares. This is useful in situations where someone wants to statically link
381 // something like libstdc++, and needs its runtime support routines.
382 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000383 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
Daniel Dunbar6276f992009-09-18 08:15:13 +0000384 return;
385 }
386
Peter Collingbourne32701642013-11-01 18:16:25 +0000387 const SanitizerArgs &Sanitize = getSanitizerArgs();
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +0000388 if (Sanitize.needsAsanRt())
389 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
390 if (Sanitize.needsUbsanRt())
391 AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
Kuba Brecka85e01c02015-11-06 15:09:20 +0000392 if (Sanitize.needsTsanRt())
393 AddLinkSanitizerLibArgs(Args, CmdArgs, "tsan");
Daniel Dunbar1d6469f2011-12-01 23:40:18 +0000394
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000395 // Otherwise link libSystem, then the dynamic runtime library, and finally any
396 // target specific static runtime library.
Daniel Dunbar6276f992009-09-18 08:15:13 +0000397 CmdArgs.push_back("-lSystem");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000398
399 // Select the dynamic runtime library and the target specific static library.
Tim Northover6f3ff222015-10-30 16:30:27 +0000400 if (isTargetWatchOSBased()) {
401 // We currently always need a static runtime library for watchOS.
402 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.watchos.a");
403 } else if (isTargetTvOSBased()) {
404 // We currently always need a static runtime library for tvOS.
405 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.tvos.a");
406 } else if (isTargetIOSBased()) {
Daniel Dunbar2f31fb92011-04-30 04:25:16 +0000407 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
408 // it never went into the SDK.
Bob Wilson102be442011-10-07 17:54:41 +0000409 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
Tim Northovera2ee4332014-03-29 15:09:45 +0000410 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
Tim Northover40956e62014-07-23 12:32:58 +0000411 getTriple().getArch() != llvm::Triple::aarch64)
Bob Wilson102be442011-10-07 17:54:41 +0000412 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000413
Daniel Dunbard1076382011-04-18 23:48:36 +0000414 // We currently always need a static runtime library for iOS.
Eric Christopherc235d0c62011-06-22 17:41:40 +0000415 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000416 } else {
Tim Northover9c7e0352013-12-12 11:55:52 +0000417 assert(isTargetMacOS() && "unexpected non MacOS platform");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000418 // The dynamic runtime library was merged with libSystem for 10.6 and
419 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000420 if (isMacosxVersionLT(10, 5))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000421 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000422 else if (isMacosxVersionLT(10, 6))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000423 CmdArgs.push_back("-lgcc_s.10.5");
424
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000425 // For OS X, we thought we would only need a static runtime library when
Chris Lattner57540c52011-04-15 05:22:18 +0000426 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000427 // omitted from 10.4.dylib.
428 //
429 // Unfortunately, that turned out to not be true, because Darwin system
430 // headers can still use eprintf on i386, and it is not exported from
431 // libSystem. Therefore, we still must provide a runtime library just for
432 // the tiny tiny handful of projects that *might* use that symbol.
433 if (isMacosxVersionLT(10, 5)) {
Eric Christopherc235d0c62011-06-22 17:41:40 +0000434 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000435 } else {
436 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopherc235d0c62011-06-22 17:41:40 +0000437 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
438 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000439 }
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000440 }
Daniel Dunbar6276f992009-09-18 08:15:13 +0000441}
442
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000443void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +0000444 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000445
Daniel Dunbar455a0492012-08-17 18:43:50 +0000446 // Support allowing the SDKROOT environment variable used by xcrun and other
447 // Xcode tools to define the default sysroot, by making it the default for
448 // isysroot.
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000449 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
450 // Warn if the path does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000451 if (!getVFS().exists(A->getValue()))
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000452 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
453 } else {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000454 if (char *env = ::getenv("SDKROOT")) {
Daniel Dunbarb2543042013-01-15 20:33:56 +0000455 // We only use this value as the default if it is an absolute path,
456 // exists, and it is not the root path.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000457 if (llvm::sys::path::is_absolute(env) && getVFS().exists(env) &&
Daniel Dunbarb2543042013-01-15 20:33:56 +0000458 StringRef(env) != "/") {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000459 Args.append(Args.MakeSeparateArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000460 nullptr, Opts.getOption(options::OPT_isysroot), env));
Daniel Dunbar455a0492012-08-17 18:43:50 +0000461 }
462 }
463 }
464
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000465 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000466 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
Tim Northover6f3ff222015-10-30 16:30:27 +0000467 Arg *TvOSVersion = Args.getLastArg(options::OPT_mtvos_version_min_EQ);
468 Arg *WatchOSVersion = Args.getLastArg(options::OPT_mwatchos_version_min_EQ);
Eli Friedman027e9c32012-01-11 02:41:15 +0000469
Tim Northover6f3ff222015-10-30 16:30:27 +0000470 if (OSXVersion && (iOSVersion || TvOSVersion || WatchOSVersion)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000471 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Tim Northover6f3ff222015-10-30 16:30:27 +0000472 << OSXVersion->getAsString(Args)
473 << (iOSVersion ? iOSVersion :
474 TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
475 iOSVersion = TvOSVersion = WatchOSVersion = nullptr;
476 } else if (iOSVersion && (TvOSVersion || WatchOSVersion)) {
477 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
478 << iOSVersion->getAsString(Args)
479 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
480 TvOSVersion = WatchOSVersion = nullptr;
481 } else if (TvOSVersion && WatchOSVersion) {
482 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
483 << TvOSVersion->getAsString(Args)
484 << WatchOSVersion->getAsString(Args);
485 WatchOSVersion = nullptr;
486 } else if (!OSXVersion && !iOSVersion && !TvOSVersion && !WatchOSVersion) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000487 // If no deployment target was specified on the command line, check for
Daniel Dunbard54669d2010-01-26 01:45:19 +0000488 // environment defines.
Alexey Samsonov905c8022015-06-18 21:46:05 +0000489 std::string OSXTarget;
490 std::string iOSTarget;
Tim Northover6f3ff222015-10-30 16:30:27 +0000491 std::string TvOSTarget;
492 std::string WatchOSTarget;
493
Chad Rosier64707fe2011-08-31 20:56:25 +0000494 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
495 OSXTarget = env;
496 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
497 iOSTarget = env;
Tim Northover6f3ff222015-10-30 16:30:27 +0000498 if (char *env = ::getenv("TVOS_DEPLOYMENT_TARGET"))
499 TvOSTarget = env;
500 if (char *env = ::getenv("WATCHOS_DEPLOYMENT_TARGET"))
501 WatchOSTarget = env;
Daniel Dunbarb5023e92009-04-10 21:00:07 +0000502
Steven Wu7a1372c2015-06-25 01:59:35 +0000503 // If there is no command-line argument to specify the Target version and
504 // no environment variable defined, see if we can set the default based
505 // on -isysroot.
Tim Northover6f3ff222015-10-30 16:30:27 +0000506 if (OSXTarget.empty() && iOSTarget.empty() && WatchOSTarget.empty() &&
Steven Wu7a1372c2015-06-25 01:59:35 +0000507 Args.hasArg(options::OPT_isysroot)) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000508 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000509 StringRef isysroot = A->getValue();
Steven Wu7a1372c2015-06-25 01:59:35 +0000510 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
511 size_t BeginSDK = isysroot.rfind("SDKs/");
512 size_t EndSDK = isysroot.rfind(".sdk");
513 if (BeginSDK != StringRef::npos && EndSDK != StringRef::npos) {
514 StringRef SDK = isysroot.slice(BeginSDK + 5, EndSDK);
515 // Slice the version number out.
516 // Version number is between the first and the last number.
517 size_t StartVer = SDK.find_first_of("0123456789");
518 size_t EndVer = SDK.find_last_of("0123456789");
519 if (StartVer != StringRef::npos && EndVer > StartVer) {
520 StringRef Version = SDK.slice(StartVer, EndVer + 1);
521 if (SDK.startswith("iPhoneOS") ||
522 SDK.startswith("iPhoneSimulator"))
523 iOSTarget = Version;
524 else if (SDK.startswith("MacOSX"))
525 OSXTarget = Version;
Tim Northover6f3ff222015-10-30 16:30:27 +0000526 else if (SDK.startswith("WatchOS") ||
527 SDK.startswith("WatchSimulator"))
528 WatchOSTarget = Version;
529 else if (SDK.startswith("AppleTVOS") ||
530 SDK.startswith("AppleTVSimulator"))
531 TvOSTarget = Version;
Steven Wu7a1372c2015-06-25 01:59:35 +0000532 }
533 }
Chad Rosier64707fe2011-08-31 20:56:25 +0000534 }
535 }
Daniel Dunbard54669d2010-01-26 01:45:19 +0000536
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000537 // If no OSX or iOS target has been specified, try to guess platform
Alexey Samsonov905c8022015-06-18 21:46:05 +0000538 // from arch name and compute the version from the triple.
Tim Northover6f3ff222015-10-30 16:30:27 +0000539 if (OSXTarget.empty() && iOSTarget.empty() && TvOSTarget.empty() &&
540 WatchOSTarget.empty()) {
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000541 StringRef MachOArchName = getMachOArchName(Args);
Alexey Samsonov905c8022015-06-18 21:46:05 +0000542 unsigned Major, Minor, Micro;
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000543 if (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
Alexey Samsonov905c8022015-06-18 21:46:05 +0000544 MachOArchName == "arm64") {
545 getTriple().getiOSVersion(Major, Minor, Micro);
546 llvm::raw_string_ostream(iOSTarget) << Major << '.' << Minor << '.'
547 << Micro;
Tim Northover6f3ff222015-10-30 16:30:27 +0000548 } else if (MachOArchName == "armv7k") {
549 getTriple().getWatchOSVersion(Major, Minor, Micro);
550 llvm::raw_string_ostream(WatchOSTarget) << Major << '.' << Minor << '.'
551 << Micro;
Alexey Samsonov905c8022015-06-18 21:46:05 +0000552 } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
553 MachOArchName != "armv7em") {
554 if (!getTriple().getMacOSXVersion(Major, Minor, Micro)) {
555 getDriver().Diag(diag::err_drv_invalid_darwin_version)
556 << getTriple().getOSName();
557 }
558 llvm::raw_string_ostream(OSXTarget) << Major << '.' << Minor << '.'
559 << Micro;
560 }
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000561 }
Chad Rosierfe6fd362011-09-28 00:46:32 +0000562
Tim Northover6f3ff222015-10-30 16:30:27 +0000563 // Do not allow conflicts with the watchOS target.
564 if (!WatchOSTarget.empty() && (!iOSTarget.empty() || !TvOSTarget.empty())) {
565 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
566 << "WATCHOS_DEPLOYMENT_TARGET"
567 << (!iOSTarget.empty() ? "IPHONEOS_DEPLOYMENT_TARGET" :
568 "TVOS_DEPLOYMENT_TARGET");
569 }
570
571 // Do not allow conflicts with the tvOS target.
572 if (!TvOSTarget.empty() && !iOSTarget.empty()) {
573 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
574 << "TVOS_DEPLOYMENT_TARGET"
575 << "IPHONEOS_DEPLOYMENT_TARGET";
576 }
577
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000578 // Allow conflicts among OSX and iOS for historical reasons, but choose the
579 // default platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000580 if (!OSXTarget.empty() && (!iOSTarget.empty() ||
581 !WatchOSTarget.empty() ||
582 !TvOSTarget.empty())) {
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000583 if (getTriple().getArch() == llvm::Triple::arm ||
Tim Northover573cbee2014-05-24 12:52:07 +0000584 getTriple().getArch() == llvm::Triple::aarch64 ||
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000585 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosier64707fe2011-08-31 20:56:25 +0000586 OSXTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000587 else
Tim Northover6f3ff222015-10-30 16:30:27 +0000588 iOSTarget = WatchOSTarget = TvOSTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000589 }
Daniel Dunbar65969842010-01-29 17:02:25 +0000590
Chad Rosier64707fe2011-08-31 20:56:25 +0000591 if (!OSXTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000592 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000593 OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000594 Args.append(OSXVersion);
Chad Rosier64707fe2011-08-31 20:56:25 +0000595 } else if (!iOSTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000596 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000597 iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000598 Args.append(iOSVersion);
Tim Northover6f3ff222015-10-30 16:30:27 +0000599 } else if (!TvOSTarget.empty()) {
600 const Option O = Opts.getOption(options::OPT_mtvos_version_min_EQ);
601 TvOSVersion = Args.MakeJoinedArg(nullptr, O, TvOSTarget);
602 Args.append(TvOSVersion);
603 } else if (!WatchOSTarget.empty()) {
604 const Option O = Opts.getOption(options::OPT_mwatchos_version_min_EQ);
605 WatchOSVersion = Args.MakeJoinedArg(nullptr, O, WatchOSTarget);
606 Args.append(WatchOSVersion);
Daniel Dunbar84e727f2009-09-04 18:35:21 +0000607 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000608 }
Mike Stump11289f42009-09-09 15:08:12 +0000609
Tim Northover9c7e0352013-12-12 11:55:52 +0000610 DarwinPlatformKind Platform;
611 if (OSXVersion)
612 Platform = MacOS;
613 else if (iOSVersion)
614 Platform = IPhoneOS;
Tim Northover6f3ff222015-10-30 16:30:27 +0000615 else if (TvOSVersion)
616 Platform = TvOS;
617 else if (WatchOSVersion)
618 Platform = WatchOS;
Tim Northover9c7e0352013-12-12 11:55:52 +0000619 else
Tim Northover157d9112014-01-16 08:48:16 +0000620 llvm_unreachable("Unable to infer Darwin variant");
Tim Northover9c7e0352013-12-12 11:55:52 +0000621
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000622 // Set the tool chain target information.
623 unsigned Major, Minor, Micro;
624 bool HadExtra;
Tim Northover9c7e0352013-12-12 11:55:52 +0000625 if (Platform == MacOS) {
Tim Northover6f3ff222015-10-30 16:30:27 +0000626 assert((!iOSVersion && !TvOSVersion && !WatchOSVersion) &&
627 "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000628 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, Micro,
629 HadExtra) ||
630 HadExtra || Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000631 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000632 << OSXVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000633 } else if (Platform == IPhoneOS) {
634 assert(iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000635 if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
636 HadExtra) ||
637 HadExtra || Major >= 10 || Minor >= 100 || Micro >= 100)
Eli Friedman027e9c32012-01-11 02:41:15 +0000638 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000639 << iOSVersion->getAsString(Args);
Tim Northover6f3ff222015-10-30 16:30:27 +0000640 } else if (Platform == TvOS) {
641 if (!Driver::GetReleaseVersion(TvOSVersion->getValue(), Major, Minor,
642 Micro, HadExtra) || HadExtra ||
643 Major >= 10 || Minor >= 100 || Micro >= 100)
644 getDriver().Diag(diag::err_drv_invalid_version_number)
645 << TvOSVersion->getAsString(Args);
646 } else if (Platform == WatchOS) {
647 if (!Driver::GetReleaseVersion(WatchOSVersion->getValue(), Major, Minor,
648 Micro, HadExtra) || HadExtra ||
649 Major >= 10 || Minor >= 100 || Micro >= 100)
650 getDriver().Diag(diag::err_drv_invalid_version_number)
651 << WatchOSVersion->getAsString(Args);
Tim Northover157d9112014-01-16 08:48:16 +0000652 } else
653 llvm_unreachable("unknown kind of Darwin platform");
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000654
Bob Wilson7f294b52014-10-10 23:10:10 +0000655 // Recognize iOS targets with an x86 architecture as the iOS simulator.
Daniel Dunbarb1189432011-04-30 04:18:16 +0000656 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
657 getTriple().getArch() == llvm::Triple::x86_64))
Tim Northover9c7e0352013-12-12 11:55:52 +0000658 Platform = IPhoneOSSimulator;
Tim Northover6f3ff222015-10-30 16:30:27 +0000659 if (TvOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
660 getTriple().getArch() == llvm::Triple::x86_64))
661 Platform = TvOSSimulator;
662 if (WatchOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
663 getTriple().getArch() == llvm::Triple::x86_64))
664 Platform = WatchOSSimulator;
Daniel Dunbarb1189432011-04-30 04:18:16 +0000665
Tim Northover9c7e0352013-12-12 11:55:52 +0000666 setTarget(Platform, Major, Minor, Micro);
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000667}
668
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000669void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000670 ArgStringList &CmdArgs) const {
671 CXXStdlibType Type = GetCXXStdlibType(Args);
672
673 switch (Type) {
674 case ToolChain::CST_Libcxx:
675 CmdArgs.push_back("-lc++");
676 break;
677
Hans Wennborgdcfba332015-10-06 23:40:43 +0000678 case ToolChain::CST_Libstdcxx:
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000679 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
680 // it was previously found in the gcc lib dir. However, for all the Darwin
681 // platforms we care about it was -lstdc++.6, so we search for that
682 // explicitly if we can't see an obvious -lstdc++ candidate.
683
684 // Check in the sysroot first.
685 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000686 SmallString<128> P(A->getValue());
Benjamin Kramer17381a02013-06-28 16:25:46 +0000687 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000688
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000689 if (!getVFS().exists(P)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000690 llvm::sys::path::remove_filename(P);
691 llvm::sys::path::append(P, "libstdc++.6.dylib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000692 if (getVFS().exists(P)) {
Yaron Keren92e1b622015-03-18 10:17:07 +0000693 CmdArgs.push_back(Args.MakeArgString(P));
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000694 return;
695 }
696 }
697 }
698
699 // Otherwise, look in the root.
Bob Wilson1a9ad0f2011-11-11 07:47:04 +0000700 // FIXME: This should be removed someday when we don't have to care about
701 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000702 if (!getVFS().exists("/usr/lib/libstdc++.dylib") &&
703 getVFS().exists("/usr/lib/libstdc++.6.dylib")) {
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000704 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
705 return;
706 }
707
708 // Otherwise, let the linker search.
709 CmdArgs.push_back("-lstdc++");
710 break;
711 }
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000712}
713
Shantonu Senafeb03b2010-09-17 18:39:08 +0000714void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
715 ArgStringList &CmdArgs) const {
716
717 // For Darwin platforms, use the compiler-rt-based support library
718 // instead of the gcc-provided one (which is also incidentally
719 // only present in the gcc lib dir, which makes it hard to find).
720
Rafael Espindola358256c2013-06-26 02:13:00 +0000721 SmallString<128> P(getDriver().ResourceDir);
Benjamin Kramer17381a02013-06-28 16:25:46 +0000722 llvm::sys::path::append(P, "lib", "darwin");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000723
724 // Use the newer cc_kext for iOS ARM after 6.0.
Tim Northover6f3ff222015-10-30 16:30:27 +0000725 if (isTargetWatchOS()) {
726 llvm::sys::path::append(P, "libclang_rt.cc_kext_watchos.a");
727 } else if (isTargetTvOS()) {
728 llvm::sys::path::append(P, "libclang_rt.cc_kext_tvos.a");
729 } else if (isTargetIPhoneOS()) {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000730 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000731 } else {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000732 llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000733 }
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000734
Shantonu Senafeb03b2010-09-17 18:39:08 +0000735 // For now, allow missing resource libraries to support developers who may
736 // not have compiler-rt checked out or integrated into their build.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000737 if (getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000738 CmdArgs.push_back(Args.MakeArgString(P));
Shantonu Senafeb03b2010-09-17 18:39:08 +0000739}
740
Tim Northover157d9112014-01-16 08:48:16 +0000741DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
742 const char *BoundArch) const {
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000743 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
744 const OptTable &Opts = getDriver().getOpts();
745
746 // FIXME: We really want to get out of the tool chain level argument
747 // translation business, as it makes the driver functionality much
748 // more opaque. For now, we follow gcc closely solely for the
749 // purpose of easily achieving feature parity & testability. Once we
750 // have something that works, we should reevaluate each translation
751 // and try to push it down into tool specific logic.
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000752
Simon Atanasyan6f657c42014-05-08 19:32:46 +0000753 for (Arg *A : Args) {
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000754 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar471c4f82011-06-21 00:20:17 +0000755 // Skip this argument unless the architecture matches either the toolchain
756 // triple arch, or the arch being bound.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000757 llvm::Triple::ArchType XarchArch =
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000758 tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
759 if (!(XarchArch == getArch() ||
760 (BoundArch &&
761 XarchArch ==
762 tools::darwin::getArchTypeForMachOArchName(BoundArch))))
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000763 continue;
764
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000765 Arg *OriginalArg = A;
Richard Smithbd55daf2012-11-01 04:30:05 +0000766 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000767 unsigned Prev = Index;
Nico Webera04d5f82014-05-11 17:27:13 +0000768 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
Mike Stump11289f42009-09-09 15:08:12 +0000769
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000770 // If the argument parsing failed or more than one argument was
771 // consumed, the -Xarch_ argument's parameter tried to consume
772 // extra arguments. Emit an error and ignore.
773 //
774 // We also want to disallow any options which would alter the
775 // driver behavior; that isn't going to work in our model. We
776 // use isDriverOption() as an approximation, although things
777 // like -O4 are going to slip through.
Daniel Dunbar5a784c82011-04-21 17:41:34 +0000778 if (!XarchArg || Index > Prev + 1) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000779 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000780 << A->getAsString(Args);
Daniel Dunbar6914a982011-04-21 17:32:21 +0000781 continue;
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000782 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000783 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000784 << A->getAsString(Args);
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000785 continue;
786 }
787
Daniel Dunbar53b406f2009-03-29 22:29:05 +0000788 XarchArg->setBaseArg(A);
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000789
Nico Webera04d5f82014-05-11 17:27:13 +0000790 A = XarchArg.release();
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000791 DAL->AddSynthesizedArg(A);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000792
793 // Linker input arguments require custom handling. The problem is that we
794 // have already constructed the phase actions, so we can not treat them as
795 // "input arguments".
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000796 if (A->getOption().hasFlag(options::LinkerInput)) {
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000797 // Convert the argument into individual Zlinker_input_args.
Douglas Katzman6bbffc42015-06-25 18:51:37 +0000798 for (const char *Value : A->getValues()) {
799 DAL->AddSeparateArg(
800 OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000801 }
802 continue;
803 }
Mike Stump11289f42009-09-09 15:08:12 +0000804 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000805
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000806 // Sob. These is strictly gcc compatible for the time being. Apple
807 // gcc translates options twice, which means that self-expanding
808 // options add duplicates.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000809 switch ((options::ID)A->getOption().getID()) {
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000810 default:
811 DAL->append(A);
812 break;
813
814 case options::OPT_mkernel:
815 case options::OPT_fapple_kext:
816 DAL->append(A);
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000817 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000818 break;
Mike Stump11289f42009-09-09 15:08:12 +0000819
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000820 case options::OPT_dependency_file:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000821 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000822 break;
823
824 case options::OPT_gfull:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000825 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000826 DAL->AddFlagArg(
827 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000828 break;
829
830 case options::OPT_gused:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000831 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000832 DAL->AddFlagArg(
833 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000834 break;
835
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000836 case options::OPT_shared:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000837 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000838 break;
839
840 case options::OPT_fconstant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000841 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000842 break;
843
844 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000845 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000846 break;
847
848 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000849 DAL->AddFlagArg(A,
850 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000851 break;
852
853 case options::OPT_Wno_nonportable_cfstrings:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000854 DAL->AddFlagArg(
855 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000856 break;
857
858 case options::OPT_fpascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000859 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000860 break;
861
862 case options::OPT_fno_pascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000863 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000864 break;
865 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000866 }
867
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000868 if (getTriple().getArch() == llvm::Triple::x86 ||
869 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbarfffd1812009-11-19 04:00:53 +0000870 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000871 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
872 "core2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000873
874 // Add the arch options based on the particular spelling of -arch, to match
Chad Rosier7c5d9082012-04-27 14:58:16 +0000875 // how the driver driver works.
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000876 if (BoundArch) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000877 StringRef Name = BoundArch;
Michael J. Spencerfc790902012-10-19 22:36:40 +0000878 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
879 const Option MArch = Opts.getOption(options::OPT_march_EQ);
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000880
881 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
882 // which defines the list of which architectures we accept.
883 if (Name == "ppc")
884 ;
885 else if (Name == "ppc601")
Craig Topper92fc2df2014-05-17 16:56:41 +0000886 DAL->AddJoinedArg(nullptr, MCpu, "601");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000887 else if (Name == "ppc603")
Craig Topper92fc2df2014-05-17 16:56:41 +0000888 DAL->AddJoinedArg(nullptr, MCpu, "603");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000889 else if (Name == "ppc604")
Craig Topper92fc2df2014-05-17 16:56:41 +0000890 DAL->AddJoinedArg(nullptr, MCpu, "604");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000891 else if (Name == "ppc604e")
Craig Topper92fc2df2014-05-17 16:56:41 +0000892 DAL->AddJoinedArg(nullptr, MCpu, "604e");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000893 else if (Name == "ppc750")
Craig Topper92fc2df2014-05-17 16:56:41 +0000894 DAL->AddJoinedArg(nullptr, MCpu, "750");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000895 else if (Name == "ppc7400")
Craig Topper92fc2df2014-05-17 16:56:41 +0000896 DAL->AddJoinedArg(nullptr, MCpu, "7400");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000897 else if (Name == "ppc7450")
Craig Topper92fc2df2014-05-17 16:56:41 +0000898 DAL->AddJoinedArg(nullptr, MCpu, "7450");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000899 else if (Name == "ppc970")
Craig Topper92fc2df2014-05-17 16:56:41 +0000900 DAL->AddJoinedArg(nullptr, MCpu, "970");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000901
Bill Schmidt778d3872013-07-26 01:36:11 +0000902 else if (Name == "ppc64" || Name == "ppc64le")
Craig Topper92fc2df2014-05-17 16:56:41 +0000903 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000904
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000905 else if (Name == "i386")
906 ;
907 else if (Name == "i486")
Craig Topper92fc2df2014-05-17 16:56:41 +0000908 DAL->AddJoinedArg(nullptr, MArch, "i486");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000909 else if (Name == "i586")
Craig Topper92fc2df2014-05-17 16:56:41 +0000910 DAL->AddJoinedArg(nullptr, MArch, "i586");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000911 else if (Name == "i686")
Craig Topper92fc2df2014-05-17 16:56:41 +0000912 DAL->AddJoinedArg(nullptr, MArch, "i686");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000913 else if (Name == "pentium")
Craig Topper92fc2df2014-05-17 16:56:41 +0000914 DAL->AddJoinedArg(nullptr, MArch, "pentium");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000915 else if (Name == "pentium2")
Craig Topper92fc2df2014-05-17 16:56:41 +0000916 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000917 else if (Name == "pentpro")
Craig Topper92fc2df2014-05-17 16:56:41 +0000918 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000919 else if (Name == "pentIIm3")
Craig Topper92fc2df2014-05-17 16:56:41 +0000920 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000921
922 else if (Name == "x86_64")
Craig Topper92fc2df2014-05-17 16:56:41 +0000923 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Jim Grosbach82eee262013-11-16 00:53:35 +0000924 else if (Name == "x86_64h") {
Craig Topper92fc2df2014-05-17 16:56:41 +0000925 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
926 DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
Jim Grosbach82eee262013-11-16 00:53:35 +0000927 }
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000928
929 else if (Name == "arm")
Craig Topper92fc2df2014-05-17 16:56:41 +0000930 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000931 else if (Name == "armv4t")
Craig Topper92fc2df2014-05-17 16:56:41 +0000932 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000933 else if (Name == "armv5")
Craig Topper92fc2df2014-05-17 16:56:41 +0000934 DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000935 else if (Name == "xscale")
Craig Topper92fc2df2014-05-17 16:56:41 +0000936 DAL->AddJoinedArg(nullptr, MArch, "xscale");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000937 else if (Name == "armv6")
Craig Topper92fc2df2014-05-17 16:56:41 +0000938 DAL->AddJoinedArg(nullptr, MArch, "armv6k");
Bob Wilson743bf672013-03-04 22:37:49 +0000939 else if (Name == "armv6m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000940 DAL->AddJoinedArg(nullptr, MArch, "armv6m");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000941 else if (Name == "armv7")
Craig Topper92fc2df2014-05-17 16:56:41 +0000942 DAL->AddJoinedArg(nullptr, MArch, "armv7a");
Bob Wilson743bf672013-03-04 22:37:49 +0000943 else if (Name == "armv7em")
Craig Topper92fc2df2014-05-17 16:56:41 +0000944 DAL->AddJoinedArg(nullptr, MArch, "armv7em");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000945 else if (Name == "armv7k")
Craig Topper92fc2df2014-05-17 16:56:41 +0000946 DAL->AddJoinedArg(nullptr, MArch, "armv7k");
Bob Wilson743bf672013-03-04 22:37:49 +0000947 else if (Name == "armv7m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000948 DAL->AddJoinedArg(nullptr, MArch, "armv7m");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000949 else if (Name == "armv7s")
Craig Topper92fc2df2014-05-17 16:56:41 +0000950 DAL->AddJoinedArg(nullptr, MArch, "armv7s");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000951 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000952
Tim Northover157d9112014-01-16 08:48:16 +0000953 return DAL;
954}
955
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000956void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
957 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000958 // Embedded targets are simple at the moment, not supporting sanitizers and
959 // with different libraries for each member of the product { static, PIC } x
960 // { hard-float, soft-float }
961 llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000962 CompilerRT +=
963 (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
964 ? "hard"
965 : "soft";
Tim Northover157d9112014-01-16 08:48:16 +0000966 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
967
968 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
969}
970
Tim Northover157d9112014-01-16 08:48:16 +0000971DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
972 const char *BoundArch) const {
973 // First get the generic Apple args, before moving onto Darwin-specific ones.
974 DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
975 const OptTable &Opts = getDriver().getOpts();
976
Bob Wilsonf8cf1612014-02-21 00:20:07 +0000977 // If no architecture is bound, none of the translations here are relevant.
978 if (!BoundArch)
979 return DAL;
980
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000981 // Add an explicit version min argument for the deployment target. We do this
982 // after argument translation because -Xarch_ arguments may add a version min
983 // argument.
Bob Wilsonf8cf1612014-02-21 00:20:07 +0000984 AddDeploymentTarget(*DAL);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000985
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000986 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
987 // FIXME: It would be far better to avoid inserting those -static arguments,
988 // but we can't check the deployment target in the translation code until
989 // it is set here.
Tim Northover6f3ff222015-10-30 16:30:27 +0000990 if (isTargetWatchOSBased() ||
991 (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0))) {
992 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000993 Arg *A = *it;
994 ++it;
995 if (A->getOption().getID() != options::OPT_mkernel &&
996 A->getOption().getID() != options::OPT_fapple_kext)
997 continue;
998 assert(it != ie && "unexpected argument translation");
999 A = *it;
1000 assert(A->getOption().getID() == options::OPT_static &&
1001 "missing expected -static argument");
1002 it = DAL->getArgs().erase(it);
1003 }
1004 }
1005
Bob Wilson0f7445b2013-11-02 23:19:53 +00001006 // Default to use libc++ on OS X 10.9+ and iOS 7+.
1007 if (((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
Tim Northover6f3ff222015-10-30 16:30:27 +00001008 (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0)) ||
1009 isTargetWatchOSBased()) &&
Bob Wilson0f7445b2013-11-02 23:19:53 +00001010 !Args.getLastArg(options::OPT_stdlib_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +00001011 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
1012 "libc++");
Bob Wilson0f7445b2013-11-02 23:19:53 +00001013
Bob Wilson102be442011-10-07 17:54:41 +00001014 // Validate the C++ standard library choice.
1015 CXXStdlibType Type = GetCXXStdlibType(*DAL);
1016 if (Type == ToolChain::CST_Libcxx) {
John McCall5fb5df92012-06-20 06:18:46 +00001017 // Check whether the target provides libc++.
1018 StringRef where;
1019
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001020 // Complain about targeting iOS < 5.0 in any way.
Tim Northover9c7e0352013-12-12 11:55:52 +00001021 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
Bob Wilson5ad5a952012-11-09 01:59:30 +00001022 where = "iOS 5.0";
John McCall5fb5df92012-06-20 06:18:46 +00001023
1024 if (where != StringRef()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001025 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where;
Bob Wilson102be442011-10-07 17:54:41 +00001026 }
1027 }
1028
Daniel Dunbaraabb0b12009-03-25 06:12:34 +00001029 return DAL;
Mike Stump11289f42009-09-09 15:08:12 +00001030}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001031
Tim Northover157d9112014-01-16 08:48:16 +00001032bool MachO::IsUnwindTablesDefault() const {
Rafael Espindolae8bd4e52012-10-07 03:23:40 +00001033 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001034}
1035
Tim Northover157d9112014-01-16 08:48:16 +00001036bool MachO::UseDwarfDebugFlags() const {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00001037 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
1038 return S[0] != '\0';
1039 return false;
1040}
1041
Tim Northovere931f9f2015-10-30 16:30:41 +00001042bool Darwin::UseSjLjExceptions(const ArgList &Args) const {
Daniel Dunbar3241d402010-02-10 18:49:11 +00001043 // Darwin uses SjLj exceptions on ARM.
Tim Northovere931f9f2015-10-30 16:30:41 +00001044 if (getTriple().getArch() != llvm::Triple::arm &&
1045 getTriple().getArch() != llvm::Triple::thumb)
1046 return false;
1047
1048 // We can't check directly for watchOS here. ComputeLLVMTriple only
1049 // fills in the ArchName correctly.
1050 llvm::Triple Triple(ComputeLLVMTriple(Args));
1051 return !(Triple.getArchName() == "armv7k" ||
1052 Triple.getArchName() == "thumbv7k");
1053
Daniel Dunbar3241d402010-02-10 18:49:11 +00001054}
1055
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001056bool MachO::isPICDefault() const { return true; }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001057
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001058bool MachO::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001059
Tim Northover157d9112014-01-16 08:48:16 +00001060bool MachO::isPICDefaultForced() const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001061 return (getArch() == llvm::Triple::x86_64 ||
Tim Northover573cbee2014-05-24 12:52:07 +00001062 getArch() == llvm::Triple::aarch64);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001063}
1064
Tim Northover157d9112014-01-16 08:48:16 +00001065bool MachO::SupportsProfiling() const {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001066 // Profiling instrumentation is only supported on x86.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00001067 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001068}
1069
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001070void Darwin::addMinVersionArgs(const ArgList &Args,
1071 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001072 VersionTuple TargetVersion = getTargetVersion();
1073
Tim Northover6f3ff222015-10-30 16:30:27 +00001074 if (isTargetWatchOS())
1075 CmdArgs.push_back("-watchos_version_min");
1076 else if (isTargetWatchOSSimulator())
1077 CmdArgs.push_back("-watchos_simulator_version_min");
1078 else if (isTargetTvOS())
1079 CmdArgs.push_back("-tvos_version_min");
1080 else if (isTargetTvOSSimulator())
1081 CmdArgs.push_back("-tvos_simulator_version_min");
1082 else if (isTargetIOSSimulator())
Tim Northover157d9112014-01-16 08:48:16 +00001083 CmdArgs.push_back("-ios_simulator_version_min");
Bob Wilson5cfc55e2014-02-01 21:06:21 +00001084 else if (isTargetIOSBased())
Tim Northover157d9112014-01-16 08:48:16 +00001085 CmdArgs.push_back("-iphoneos_version_min");
1086 else {
1087 assert(isTargetMacOS() && "unexpected target");
1088 CmdArgs.push_back("-macosx_version_min");
1089 }
1090
1091 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
1092}
1093
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001094void Darwin::addStartObjectFileArgs(const ArgList &Args,
1095 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001096 // Derived from startfile spec.
1097 if (Args.hasArg(options::OPT_dynamiclib)) {
1098 // Derived from darwin_dylib1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001099 if (isTargetWatchOSBased()) {
1100 ; // watchOS does not need dylib1.o.
1101 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001102 ; // iOS simulator does not need dylib1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001103 } else if (isTargetIPhoneOS()) {
1104 if (isIPhoneOSVersionLT(3, 1))
1105 CmdArgs.push_back("-ldylib1.o");
1106 } else {
1107 if (isMacosxVersionLT(10, 5))
1108 CmdArgs.push_back("-ldylib1.o");
1109 else if (isMacosxVersionLT(10, 6))
1110 CmdArgs.push_back("-ldylib1.10.5.o");
1111 }
1112 } else {
1113 if (Args.hasArg(options::OPT_bundle)) {
1114 if (!Args.hasArg(options::OPT_static)) {
1115 // Derived from darwin_bundle1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001116 if (isTargetWatchOSBased()) {
1117 ; // watchOS does not need bundle1.o.
1118 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001119 ; // iOS simulator does not need bundle1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001120 } else if (isTargetIPhoneOS()) {
1121 if (isIPhoneOSVersionLT(3, 1))
1122 CmdArgs.push_back("-lbundle1.o");
1123 } else {
1124 if (isMacosxVersionLT(10, 6))
1125 CmdArgs.push_back("-lbundle1.o");
1126 }
1127 }
1128 } else {
1129 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1130 if (Args.hasArg(options::OPT_static) ||
1131 Args.hasArg(options::OPT_object) ||
1132 Args.hasArg(options::OPT_preload)) {
1133 CmdArgs.push_back("-lgcrt0.o");
1134 } else {
1135 CmdArgs.push_back("-lgcrt1.o");
1136
1137 // darwin_crt2 spec is empty.
1138 }
1139 // By default on OS X 10.8 and later, we don't link with a crt1.o
1140 // file and the linker knows to use _main as the entry point. But,
1141 // when compiling with -pg, we need to link with the gcrt1.o file,
1142 // so pass the -no_new_main option to tell the linker to use the
1143 // "start" symbol as the entry point.
1144 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1145 CmdArgs.push_back("-no_new_main");
1146 } else {
1147 if (Args.hasArg(options::OPT_static) ||
1148 Args.hasArg(options::OPT_object) ||
1149 Args.hasArg(options::OPT_preload)) {
1150 CmdArgs.push_back("-lcrt0.o");
1151 } else {
1152 // Derived from darwin_crt1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001153 if (isTargetWatchOSBased()) {
1154 ; // watchOS does not need crt1.o.
1155 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001156 ; // iOS simulator does not need crt1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001157 } else if (isTargetIPhoneOS()) {
Tim Northover40956e62014-07-23 12:32:58 +00001158 if (getArch() == llvm::Triple::aarch64)
Tim Northovera2ee4332014-03-29 15:09:45 +00001159 ; // iOS does not need any crt1 files for arm64
1160 else if (isIPhoneOSVersionLT(3, 1))
Tim Northover157d9112014-01-16 08:48:16 +00001161 CmdArgs.push_back("-lcrt1.o");
1162 else if (isIPhoneOSVersionLT(6, 0))
1163 CmdArgs.push_back("-lcrt1.3.1.o");
1164 } else {
1165 if (isMacosxVersionLT(10, 5))
1166 CmdArgs.push_back("-lcrt1.o");
1167 else if (isMacosxVersionLT(10, 6))
1168 CmdArgs.push_back("-lcrt1.10.5.o");
1169 else if (isMacosxVersionLT(10, 8))
1170 CmdArgs.push_back("-lcrt1.10.6.o");
1171
1172 // darwin_crt2 spec is empty.
1173 }
1174 }
1175 }
1176 }
1177 }
1178
1179 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
Tim Northover6f3ff222015-10-30 16:30:27 +00001180 !isTargetWatchOS() &&
Tim Northover157d9112014-01-16 08:48:16 +00001181 isMacosxVersionLT(10, 5)) {
1182 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1183 CmdArgs.push_back(Str);
1184 }
1185}
1186
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001187bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
Daniel Dunbar16334e12010-04-10 16:20:23 +00001188
John McCall3deb1ad2012-08-21 02:47:43 +00001189void Darwin::CheckObjCARC() const {
Tim Northover6f3ff222015-10-30 16:30:27 +00001190 if (isTargetIOSBased() || isTargetWatchOSBased() ||
1191 (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
John McCall3deb1ad2012-08-21 02:47:43 +00001192 return;
John McCall93207072012-08-27 01:56:21 +00001193 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00001194}
1195
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001196SanitizerMask Darwin::getSupportedSanitizers() const {
1197 SanitizerMask Res = ToolChain::getSupportedSanitizers();
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001198 if (isTargetMacOS() || isTargetIOSSimulator())
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001199 Res |= SanitizerKind::Address;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001200 if (isTargetMacOS()) {
1201 if (!isMacosxVersionLT(10, 9))
1202 Res |= SanitizerKind::Vptr;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001203 Res |= SanitizerKind::SafeStack;
Kuba Brecka85e01c02015-11-06 15:09:20 +00001204 Res |= SanitizerKind::Thread;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001205 }
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001206 return Res;
1207}
1208
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001209/// Generic_GCC - A tool chain using the 'gcc' command to perform
1210/// all subcommands; this relies on gcc translating the majority of
1211/// command line options.
1212
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001213/// \brief Parse a GCCVersion object out of a string of text.
1214///
1215/// This is the primary means of forming GCCVersion objects.
1216/*static*/
1217Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001218 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001219 std::pair<StringRef, StringRef> First = VersionText.split('.');
1220 std::pair<StringRef, StringRef> Second = First.second.split('.');
1221
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001222 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1223 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001224 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001225 GoodVersion.MajorStr = First.first.str();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001226 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001227 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001228 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001229
1230 // First look for a number prefix and parse that if present. Otherwise just
1231 // stash the entire patch string in the suffix, and leave the number
1232 // unspecified. This covers versions strings such as:
1233 // 4.4
1234 // 4.4.0
1235 // 4.4.x
1236 // 4.4.2-rc4
1237 // 4.4.x-patched
1238 // And retains any patch number it finds.
1239 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1240 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001241 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001242 // Try to parse the number and any suffix.
1243 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1244 GoodVersion.Patch < 0)
1245 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001246 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001247 }
1248 }
1249
1250 return GoodVersion;
1251}
1252
1253/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001254bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1255 int RHSPatch,
1256 StringRef RHSPatchSuffix) const {
1257 if (Major != RHSMajor)
1258 return Major < RHSMajor;
1259 if (Minor != RHSMinor)
1260 return Minor < RHSMinor;
1261 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001262 // Note that versions without a specified patch sort higher than those with
1263 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001264 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001265 return true;
1266 if (Patch == -1)
1267 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001268
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001269 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001270 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001271 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001272 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001273 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001274 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001275 return true;
1276 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001277 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001278
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001279 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001280 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001281 }
1282
1283 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001284 return false;
1285}
1286
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001287static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001288 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1289 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001290 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001291 return GCC_INSTALL_PREFIX;
1292}
1293
Roman Divacky326d9982013-12-06 18:32:18 +00001294/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001295///
1296/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001297/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001298///
1299/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1300/// should instead pull the target out of the driver. This is currently
1301/// necessary because the driver doesn't store the final version of the target
1302/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001303void Generic_GCC::GCCInstallationDetector::init(
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001304 const llvm::Triple &TargetTriple, const ArgList &Args,
Douglas Katzman8c39e6a2015-09-18 15:23:16 +00001305 ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001306 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1307 ? TargetTriple.get64BitArchVariant()
1308 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001309 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001310 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001311 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001312 SmallVector<StringRef, 16> CandidateTripleAliases;
1313 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001314 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1315 CandidateTripleAliases, CandidateBiarchLibDirs,
1316 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001317
1318 // Compute the set of prefixes for our search.
1319 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1320 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001321
Rafael Espindola1af7c212012-02-19 01:38:32 +00001322 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1323 if (GCCToolchainDir != "") {
1324 if (GCCToolchainDir.back() == '/')
1325 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001326
Rafael Espindola1af7c212012-02-19 01:38:32 +00001327 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001328 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001329 // If we have a SysRoot, try that first.
1330 if (!D.SysRoot.empty()) {
1331 Prefixes.push_back(D.SysRoot);
1332 Prefixes.push_back(D.SysRoot + "/usr");
1333 }
1334
1335 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001336 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001337
1338 // And finally in /usr.
1339 if (D.SysRoot.empty())
1340 Prefixes.push_back("/usr");
Rafael Espindolac29af942012-02-03 01:01:20 +00001341 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001342
1343 // Loop over the various components which exist and select the best GCC
1344 // installation available. GCC installs are ranked by version number.
1345 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001346 for (const std::string &Prefix : Prefixes) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001347 if (!D.getVFS().exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001348 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001349 for (StringRef Suffix : CandidateLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001350 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001351 if (!D.getVFS().exists(LibDir))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001352 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001353 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001354 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Benjamin Kramer72e64312015-09-24 14:48:49 +00001355 for (StringRef Candidate : CandidateTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001356 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001357 }
Benjamin Kramer72e64312015-09-24 14:48:49 +00001358 for (StringRef Suffix : CandidateBiarchLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001359 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001360 if (!D.getVFS().exists(LibDir))
Chandler Carruth866faab2012-01-25 07:21:38 +00001361 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001362 for (StringRef Candidate : CandidateBiarchTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001363 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001364 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001365 }
1366 }
1367}
1368
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001369void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001370 for (const auto &InstallPath : CandidateGCCInstallPaths)
1371 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001372
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001373 if (!GCCInstallPath.empty())
1374 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1375
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001376 for (const auto &Multilib : Multilibs)
1377 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001378
1379 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1380 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001381}
1382
1383bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1384 if (BiarchSibling.hasValue()) {
1385 M = BiarchSibling.getValue();
1386 return true;
1387 }
1388 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001389}
1390
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001391/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001392 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001393 SmallVectorImpl<StringRef> &LibDirs,
1394 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001395 SmallVectorImpl<StringRef> &BiarchLibDirs,
1396 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001397 // Declare a bunch of static data sets that we'll select between below. These
1398 // are specifically designed to always refer to string literals to avoid any
1399 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001400 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1401 static const char *const AArch64Triples[] = {
1402 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1403 "aarch64-redhat-linux"};
1404 static const char *const AArch64beLibDirs[] = {"/lib"};
1405 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1406 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001407
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001408 static const char *const ARMLibDirs[] = {"/lib"};
1409 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1410 "arm-linux-androideabi"};
1411 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1412 "armv7hl-redhat-linux-gnueabi"};
1413 static const char *const ARMebLibDirs[] = {"/lib"};
1414 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1415 "armeb-linux-androideabi"};
1416 static const char *const ARMebHFTriples[] = {
1417 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001418
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001419 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001420 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001421 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1422 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1423 "x86_64-redhat-linux", "x86_64-suse-linux",
1424 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1425 "x86_64-slackware-linux", "x86_64-linux-android",
1426 "x86_64-unknown-linux"};
1427 static const char *const X32LibDirs[] = {"/libx32"};
1428 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001429 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001430 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1431 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1432 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1433 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1434 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001435
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001436 static const char *const MIPSLibDirs[] = {"/lib"};
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00001437 static const char *const MIPSTriples[] = {
1438 "mips-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001439 static const char *const MIPSELLibDirs[] = {"/lib"};
1440 static const char *const MIPSELTriples[] = {
1441 "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001442
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001443 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1444 static const char *const MIPS64Triples[] = {
1445 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1446 "mips64-linux-gnuabi64"};
1447 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1448 static const char *const MIPS64ELTriples[] = {
1449 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1450 "mips64el-linux-android", "mips64el-linux-gnuabi64"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001451
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001452 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001453 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001454 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1455 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1456 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1457 static const char *const PPC64Triples[] = {
1458 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1459 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1460 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1461 static const char *const PPC64LETriples[] = {
1462 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1463 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001464
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001465 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1466 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1467 "sparcv8-linux-gnu"};
1468 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1469 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1470 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001471
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001472 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001473 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001474 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1475 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001476
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001477 // Solaris.
1478 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1479 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1480 "i386-pc-solaris2.11"};
1481
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001482 using std::begin;
1483 using std::end;
1484
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001485 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1486 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1487 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001488 return;
1489 }
1490
Chandler Carruth866faab2012-01-25 07:21:38 +00001491 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001492 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001493 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1494 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1495 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1496 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001497 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001498 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001499 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1500 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1501 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1502 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001503 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001504 case llvm::Triple::arm:
1505 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001506 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001507 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001508 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001509 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001510 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001511 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001512 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001513 case llvm::Triple::armeb:
1514 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001515 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001516 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001517 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001518 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001519 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001520 }
1521 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001522 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001523 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1524 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1525 // x32 is always available when x86_64 is available, so adding it as
1526 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001527 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001528 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1529 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001530 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001531 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1532 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001533 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001534 break;
1535 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001536 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1537 TripleAliases.append(begin(X86Triples), end(X86Triples));
1538 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1539 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001540 break;
1541 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001542 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1543 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1544 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1545 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001546 break;
1547 case llvm::Triple::mipsel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001548 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1549 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1550 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1551 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1552 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001553 break;
1554 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001555 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1556 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1557 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1558 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001559 break;
1560 case llvm::Triple::mips64el:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001561 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1562 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1563 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1564 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1565 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001566 break;
1567 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001568 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1569 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1570 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1571 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001572 break;
1573 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001574 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1575 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1576 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1577 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001578 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001579 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001580 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1581 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001582 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001583 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001584 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001585 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1586 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1587 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1588 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001589 break;
1590 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001591 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1592 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1593 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1594 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001595 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001596 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001597 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1598 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001599 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001600 default:
1601 // By default, just rely on the standard lib directories and the original
1602 // triple.
1603 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001604 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001605
1606 // Always append the drivers target triple to the end, in case it doesn't
1607 // match any of our aliases.
1608 TripleAliases.push_back(TargetTriple.str());
1609
1610 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001611 if (TargetTriple.str() != BiarchTriple.str())
1612 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001613}
1614
Artem Belevich98607b62015-09-23 21:49:39 +00001615// \brief -- try common CUDA installation paths looking for files we need for
1616// CUDA compilation.
1617
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001618void Generic_GCC::CudaInstallationDetector::init(
1619 const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001620 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001621
1622 if (Args.hasArg(options::OPT_cuda_path_EQ))
1623 CudaPathCandidates.push_back(
1624 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1625 else {
1626 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
1627 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1628 }
1629
Benjamin Kramere8b76412015-09-24 14:48:37 +00001630 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001631 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001632 continue;
1633
1634 CudaInstallPath = CudaPath;
1635 CudaIncludePath = CudaInstallPath + "/include";
1636 CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1637 CudaLibPath =
1638 CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1639
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001640 if (!(D.getVFS().exists(CudaIncludePath) &&
1641 D.getVFS().exists(CudaLibPath) &&
1642 D.getVFS().exists(CudaLibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001643 continue;
1644
1645 IsValid = true;
1646 break;
1647 }
1648}
1649
1650void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1651 if (isValid())
1652 OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1653}
1654
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001655namespace {
1656// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001657class FilterNonExistent {
1658 StringRef Base;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001659 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001660
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001661public:
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001662 FilterNonExistent(StringRef Base, vfs::FileSystem &VFS)
1663 : Base(Base), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001664 bool operator()(const Multilib &M) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001665 return !VFS.exists(Base + M.gccSuffix() + "/crtbegin.o");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001666 }
1667};
1668} // end anonymous namespace
1669
1670static void addMultilibFlag(bool Enabled, const char *const Flag,
1671 std::vector<std::string> &Flags) {
1672 if (Enabled)
1673 Flags.push_back(std::string("+") + Flag);
1674 else
1675 Flags.push_back(std::string("-") + Flag);
1676}
1677
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001678static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001679 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1680 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1681}
1682
1683static bool isMips32(llvm::Triple::ArchType Arch) {
1684 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1685}
1686
1687static bool isMips64(llvm::Triple::ArchType Arch) {
1688 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1689}
1690
1691static bool isMipsEL(llvm::Triple::ArchType Arch) {
1692 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1693}
1694
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001695static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001696 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001697 return A && A->getOption().matches(options::OPT_mips16);
1698}
1699
1700static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001701 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001702 return A && A->getOption().matches(options::OPT_mmicromips);
1703}
1704
Benjamin Kramere003ca22015-10-28 13:54:16 +00001705namespace {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001706struct DetectedMultilibs {
1707 /// The set of multilibs that the detected installation supports.
1708 MultilibSet Multilibs;
1709
1710 /// The primary multilib appropriate for the given flags.
1711 Multilib SelectedMultilib;
1712
1713 /// On Biarch systems, this corresponds to the default multilib when
1714 /// targeting the non-default multilib. Otherwise, it is empty.
1715 llvm::Optional<Multilib> BiarchSibling;
1716};
Benjamin Kramere003ca22015-10-28 13:54:16 +00001717} // end anonymous namespace
Simon Atanasyan60280b42014-05-12 07:37:51 +00001718
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001719static Multilib makeMultilib(StringRef commonSuffix) {
1720 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1721}
1722
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001723static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
1724 StringRef Path, const ArgList &Args,
1725 DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001726 // Some MIPS toolchains put libraries and object files compiled
1727 // using different options in to the sub-directoris which names
1728 // reflects the flags used for compilation. For example sysroot
1729 // directory might looks like the following examples:
1730 //
1731 // /usr
1732 // /lib <= crt*.o files compiled with '-mips32'
1733 // /mips16
1734 // /usr
1735 // /lib <= crt*.o files compiled with '-mips16'
1736 // /el
1737 // /usr
1738 // /lib <= crt*.o files compiled with '-mips16 -EL'
1739 //
1740 // or
1741 //
1742 // /usr
1743 // /lib <= crt*.o files compiled with '-mips32r2'
1744 // /mips16
1745 // /usr
1746 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1747 // /mips32
1748 // /usr
1749 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001750
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001751 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001752
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001753 // Check for FSF toolchain multilibs
1754 MultilibSet FSFMipsMultilibs;
1755 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001756 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001757 .flag("+m32")
1758 .flag("-m64")
1759 .flag("-mmicromips")
1760 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001761
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001762 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001763 .flag("+m32")
1764 .flag("-m64")
1765 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001766
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001767 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001768 .flag("-m32")
1769 .flag("+m64")
1770 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001771
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001772 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1773 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001774
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001775 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001776 .flag("+m32")
1777 .flag("-m64")
1778 .flag("-mmicromips")
1779 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001780
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001781 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001782
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001783 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001784
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001785 auto MAbi64 =
1786 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001787
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001788 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001789
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001790 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001791
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001792 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001793
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001794 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001795
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001796 FSFMipsMultilibs =
1797 MultilibSet()
1798 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1799 MArchDefault)
1800 .Maybe(UCLibc)
1801 .Maybe(Mips16)
1802 .FilterOut("/mips64/mips16")
1803 .FilterOut("/mips64r2/mips16")
1804 .FilterOut("/micromips/mips16")
1805 .Maybe(MAbi64)
1806 .FilterOut("/micromips/64")
1807 .FilterOut("/mips32/64")
1808 .FilterOut("^/64")
1809 .FilterOut("/mips16/64")
1810 .Either(BigEndian, LittleEndian)
1811 .Maybe(SoftFloat)
1812 .Maybe(Nan2008)
1813 .FilterOut(".*sof/nan2008")
1814 .FilterOut(NonExistent)
1815 .setIncludeDirsCallback([](StringRef InstallDir,
1816 StringRef TripleStr, const Multilib &M) {
1817 std::vector<std::string> Dirs;
1818 Dirs.push_back((InstallDir + "/include").str());
1819 std::string SysRootInc =
1820 InstallDir.str() + "/../../../../sysroot";
1821 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1822 Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1823 else
1824 Dirs.push_back(SysRootInc + "/usr/include");
1825 return Dirs;
1826 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001827 }
1828
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001829 // Check for Code Sourcery toolchain multilibs
1830 MultilibSet CSMipsMultilibs;
1831 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001832 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001833
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001834 auto MArchMicroMips =
1835 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001836
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001837 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001838
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001839 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001840
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001841 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001842
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001843 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001844
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001845 auto DefaultFloat =
1846 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001847
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001848 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001849
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001850 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001851
1852 // Note that this one's osSuffix is ""
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001853 auto MAbi64 = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001854 .gccSuffix("/64")
1855 .includeSuffix("/64")
1856 .flag("+mabi=n64")
1857 .flag("-mabi=n32")
1858 .flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001859
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001860 CSMipsMultilibs =
1861 MultilibSet()
1862 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1863 .Maybe(UCLibc)
1864 .Either(SoftFloat, Nan2008, DefaultFloat)
1865 .FilterOut("/micromips/nan2008")
1866 .FilterOut("/mips16/nan2008")
1867 .Either(BigEndian, LittleEndian)
1868 .Maybe(MAbi64)
1869 .FilterOut("/mips16.*/64")
1870 .FilterOut("/micromips.*/64")
1871 .FilterOut(NonExistent)
1872 .setIncludeDirsCallback([](StringRef InstallDir,
1873 StringRef TripleStr, const Multilib &M) {
1874 std::vector<std::string> Dirs;
1875 Dirs.push_back((InstallDir + "/include").str());
1876 std::string SysRootInc =
1877 InstallDir.str() + "/../../../../" + TripleStr.str();
1878 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1879 Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1880 else
1881 Dirs.push_back(SysRootInc + "/libc/usr/include");
1882 return Dirs;
1883 });
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001884 }
1885
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001886 MultilibSet AndroidMipsMultilibs =
1887 MultilibSet()
1888 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1889 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1890 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001891
1892 MultilibSet DebianMipsMultilibs;
1893 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001894 Multilib MAbiN32 =
1895 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001896
1897 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001898 .gccSuffix("/64")
1899 .includeSuffix("/64")
1900 .flag("+m64")
1901 .flag("-m32")
1902 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001903
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001904 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001905
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001906 DebianMipsMultilibs =
1907 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001908 }
1909
Daniel Sanders2bf13662014-07-10 14:40:57 +00001910 MultilibSet ImgMultilibs;
1911 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001912 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001913
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001914 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001915
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001916 auto MAbi64 =
1917 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001918
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001919 ImgMultilibs =
1920 MultilibSet()
1921 .Maybe(Mips64r6)
1922 .Maybe(MAbi64)
1923 .Maybe(LittleEndian)
1924 .FilterOut(NonExistent)
1925 .setIncludeDirsCallback([](StringRef InstallDir,
1926 StringRef TripleStr, const Multilib &M) {
1927 std::vector<std::string> Dirs;
1928 Dirs.push_back((InstallDir + "/include").str());
1929 Dirs.push_back(
1930 (InstallDir + "/../../../../sysroot/usr/include").str());
1931 return Dirs;
1932 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00001933 }
1934
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001935 StringRef CPUName;
1936 StringRef ABIName;
1937 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
1938
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001939 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1940
1941 Multilib::flags_list Flags;
1942 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
1943 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
1944 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001945 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001946 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00001947 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001948 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00001949 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001950 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001951 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
1952 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001953 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001954 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001955 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00001956 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
1957 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001958 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
1959 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001960 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001961 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001962 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001963 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001964
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001965 if (TargetTriple.isAndroid()) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001966 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00001967 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
1968 Result.Multilibs = AndroidMipsMultilibs;
1969 return true;
1970 }
1971 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001972 }
1973
Daniel Sanders2bf13662014-07-10 14:40:57 +00001974 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1975 TargetTriple.getOS() == llvm::Triple::Linux &&
1976 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
1977 // Select mips-img-linux-gnu toolchain.
1978 if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
1979 Result.Multilibs = ImgMultilibs;
1980 return true;
1981 }
1982 return false;
1983 }
1984
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001985 // Sort candidates. Toolchain that best meets the directories goes first.
1986 // Then select the first toolchains matches command line flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001987 MultilibSet *candidates[] = {&DebianMipsMultilibs, &FSFMipsMultilibs,
1988 &CSMipsMultilibs};
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001989 std::sort(
1990 std::begin(candidates), std::end(candidates),
1991 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
1992 for (const auto &candidate : candidates) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001993 if (candidate->select(Flags, Result.SelectedMultilib)) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001994 if (candidate == &DebianMipsMultilibs)
Simon Atanasyan60280b42014-05-12 07:37:51 +00001995 Result.BiarchSibling = Multilib();
1996 Result.Multilibs = *candidate;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001997 return true;
1998 }
1999 }
2000
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002001 {
2002 // Fallback to the regular toolchain-tree structure.
2003 Multilib Default;
2004 Result.Multilibs.push_back(Default);
2005 Result.Multilibs.FilterOut(NonExistent);
2006
2007 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2008 Result.BiarchSibling = Multilib();
2009 return true;
2010 }
2011 }
2012
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002013 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002014}
2015
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002016static bool findBiarchMultilibs(const Driver &D,
2017 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002018 StringRef Path, const ArgList &Args,
2019 bool NeedsBiarchSuffix,
2020 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002021 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2022 // in what would normally be GCCInstallPath and put the 64-bit
2023 // libs in a subdirectory named 64. The simple logic we follow is that
2024 // *if* there is a subdirectory of the right name with crtbegin.o in it,
2025 // we use that. If not, and if not a biarch triple alias, we look for
2026 // crtbegin.o without the subdirectory.
2027
2028 Multilib Default;
2029 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002030 .gccSuffix("/64")
2031 .includeSuffix("/64")
2032 .flag("-m32")
2033 .flag("+m64")
2034 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002035 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002036 .gccSuffix("/32")
2037 .includeSuffix("/32")
2038 .flag("+m32")
2039 .flag("-m64")
2040 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00002041 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002042 .gccSuffix("/x32")
2043 .includeSuffix("/x32")
2044 .flag("-m32")
2045 .flag("-m64")
2046 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002047
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002048 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002049
Zinovy Nis1db95732014-07-10 15:27:19 +00002050 // Determine default multilib from: 32, 64, x32
2051 // Also handle cases such as 64 on 32, 32 on 64, etc.
2052 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00002053 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00002054 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002055 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002056 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002057 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002058 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00002059 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002060 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00002061 if (TargetTriple.isArch32Bit())
2062 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002063 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00002064 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002065 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002066 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00002067 }
2068
Zinovy Nis1db95732014-07-10 15:27:19 +00002069 if (Want == WANT32)
2070 Default.flag("+m32").flag("-m64").flag("-mx32");
2071 else if (Want == WANT64)
2072 Default.flag("-m32").flag("+m64").flag("-mx32");
2073 else if (Want == WANTX32)
2074 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002075 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002076 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002077
Simon Atanasyan60280b42014-05-12 07:37:51 +00002078 Result.Multilibs.push_back(Default);
2079 Result.Multilibs.push_back(Alt64);
2080 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00002081 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002082
Simon Atanasyan60280b42014-05-12 07:37:51 +00002083 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002084
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002085 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002086 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002087 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002088 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002089
Simon Atanasyan60280b42014-05-12 07:37:51 +00002090 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002091 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002092
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002093 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00002094 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002095 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002096
2097 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00002098}
2099
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002100void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2101 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2102 const std::string &LibDir, StringRef CandidateTriple,
2103 bool NeedsBiarchSuffix) {
2104 // Solaris is a special case. The GCC installation is under
2105 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2106 // need to iterate twice.
2107 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002108 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2109 !EC && LI != LE; LI = LI.increment(EC)) {
2110 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002111 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2112
2113 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002114 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002115 continue; // Saw this path before; no need to look at it again.
2116 if (CandidateVersion.isOlderThan(4, 1, 1))
2117 continue;
2118 if (CandidateVersion <= Version)
2119 continue;
2120
2121 GCCInstallPath =
2122 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002123 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002124 continue;
2125
2126 // If we make it here there has to be at least one GCC version, let's just
2127 // use the latest one.
2128 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002129 for (vfs::directory_iterator
2130 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2131 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002132 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2133
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002134 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002135 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2136
2137 if (CandidateSubVersion > Version)
2138 Version = CandidateSubVersion;
2139 }
2140
2141 GCCTriple.setTriple(CandidateTriple);
2142
2143 GCCInstallPath += "/" + Version.Text;
2144 GCCParentLibPath = GCCInstallPath + "/../../../../";
2145
2146 IsValid = true;
2147 }
2148}
2149
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002150void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002151 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002152 const std::string &LibDir, StringRef CandidateTriple,
2153 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002154 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002155 // There are various different suffixes involving the triple we
2156 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002157 // up to the lib directory. Specifically, the number of "up" steps
2158 // in the second half of each row is 1 + the number of path separators
2159 // in the first half.
2160 const std::string LibAndInstallSuffixes[][2] = {
2161 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2162
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002163 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002164 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2165
2166 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2167 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002168
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002169 // The Freescale PPC SDK has the gcc libraries in
2170 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002171 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002172
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002173 // Ubuntu has a strange mis-matched pair of triples that this happens to
2174 // match.
2175 // FIXME: It may be worthwhile to generalize this and look for a second
2176 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002177 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2178
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002179 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2180 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2181 NeedsBiarchSuffix);
2182 return;
2183 }
2184
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002185 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002186 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2187 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002188 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002189 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002190 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002191 for (vfs::directory_iterator
2192 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2193 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002194 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002195 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002196 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002197 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002198 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002199 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002200 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002201 continue;
2202 if (CandidateVersion <= Version)
2203 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002204
Simon Atanasyan60280b42014-05-12 07:37:51 +00002205 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002206
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002207 // Debian mips multilibs behave more like the rest of the biarch ones,
2208 // so handle them there
2209 if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002210 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002211 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002212 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002213 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002214 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002215 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002216
Simon Atanasyan60280b42014-05-12 07:37:51 +00002217 Multilibs = Detected.Multilibs;
2218 SelectedMultilib = Detected.SelectedMultilib;
2219 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002220 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002221 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002222 // FIXME: We hack together the directory name here instead of
2223 // using LI to ensure stable path separators across Windows and
2224 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002225 GCCInstallPath =
2226 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2227 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002228 IsValid = true;
2229 }
2230 }
2231}
2232
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002233Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002234 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002235 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002236 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002237 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002238 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002239}
2240
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002241Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002242
Rafael Espindola7cf32212013-03-20 03:05:54 +00002243Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002244 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002245 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002246 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002247 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002248 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002249 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002250 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002251 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002252 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002253 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002254 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002255 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002256}
2257
Rafael Espindola7cf32212013-03-20 03:05:54 +00002258Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002259 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002260}
2261
Douglas Katzman95354292015-06-23 20:42:09 +00002262Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002263
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002264void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2265 // Print the information about how we detected the GCC installation.
2266 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002267 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002268}
2269
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002270bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002271 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002272}
2273
David Majnemer17f448b2015-06-28 04:23:33 +00002274bool Generic_GCC::isPICDefault() const {
2275 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2276}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002277
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002278bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002279
David Majnemer17f448b2015-06-28 04:23:33 +00002280bool Generic_GCC::isPICDefaultForced() const {
2281 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2282}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002283
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002284bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002285 switch (getTriple().getArch()) {
2286 case llvm::Triple::x86:
2287 case llvm::Triple::x86_64:
2288 case llvm::Triple::aarch64:
2289 case llvm::Triple::aarch64_be:
2290 case llvm::Triple::arm:
2291 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002292 case llvm::Triple::bpfel:
2293 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002294 case llvm::Triple::thumb:
2295 case llvm::Triple::thumbeb:
2296 case llvm::Triple::ppc:
2297 case llvm::Triple::ppc64:
2298 case llvm::Triple::ppc64le:
2299 case llvm::Triple::sparc:
2300 case llvm::Triple::sparcel:
2301 case llvm::Triple::sparcv9:
2302 case llvm::Triple::systemz:
2303 return true;
2304 default:
2305 return false;
2306 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002307}
2308
James Y Knighta6c9ee72015-10-16 18:46:26 +00002309/// \brief Helper to add the variant paths of a libstdc++ installation.
2310bool Generic_GCC::addLibStdCXXIncludePaths(
2311 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2312 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2313 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2314 if (!getVFS().exists(Base + Suffix))
2315 return false;
2316
2317 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2318
2319 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2320 // that path exists or we have neither a GCC nor target multiarch triple, use
2321 // this vanilla search path.
2322 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2323 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2324 addSystemInclude(DriverArgs, CC1Args,
2325 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2326 } else {
2327 // Otherwise try to use multiarch naming schemes which have normalized the
2328 // triples and put the triple before the suffix.
2329 //
2330 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2331 // the target triple, so we support that here.
2332 addSystemInclude(DriverArgs, CC1Args,
2333 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2334 addSystemInclude(DriverArgs, CC1Args,
2335 Base + "/" + TargetMultiarchTriple + Suffix);
2336 }
2337
2338 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2339 return true;
2340}
2341
2342
Kristof Beylsfb387292014-01-10 13:44:34 +00002343void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2344 ArgStringList &CC1Args) const {
2345 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002346 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002347 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002348 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002349 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002350 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00002351 getTriple().getOS() == llvm::Triple::NaCl;
Kristof Beylsfb387292014-01-10 13:44:34 +00002352
2353 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002354 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002355 CC1Args.push_back("-fuse-init-array");
2356}
2357
Tony Linthicum76329bf2011-12-12 21:14:55 +00002358/// Hexagon Toolchain
2359
Douglas Katzman54366072015-07-27 16:53:08 +00002360std::string HexagonToolChain::GetGnuDir(const std::string &InstalledDir,
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002361 const ArgList &Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002362 // Locate the rest of the toolchain ...
Samuel Antaoc909c992014-11-07 17:48:03 +00002363 std::string GccToolchain = getGCCToolchainDir(Args);
2364
2365 if (!GccToolchain.empty())
2366 return GccToolchain;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002367
2368 std::string InstallRelDir = InstalledDir + "/../../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002369 if (getVFS().exists(InstallRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002370 return InstallRelDir;
2371
2372 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002373 if (getVFS().exists(PrefixRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002374 return PrefixRelDir;
2375
2376 return InstallRelDir;
2377}
2378
Douglas Katzman54366072015-07-27 16:53:08 +00002379const char *HexagonToolChain::GetSmallDataThreshold(const ArgList &Args) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002380 Arg *A;
2381
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002382 A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002383 options::OPT_msmall_data_threshold_EQ);
2384 if (A)
2385 return A->getValue();
2386
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002387 A = Args.getLastArg(options::OPT_shared, options::OPT_fpic,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002388 options::OPT_fPIC);
2389 if (A)
2390 return "0";
2391
Hans Wennborgdcfba332015-10-06 23:40:43 +00002392 return nullptr;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002393}
2394
Douglas Katzman54366072015-07-27 16:53:08 +00002395bool HexagonToolChain::UsesG0(const char *smallDataThreshold) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002396 return smallDataThreshold && smallDataThreshold[0] == '0';
2397}
2398
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002399static void GetHexagonLibraryPaths(const HexagonToolChain &TC,
2400 const ArgList &Args, const std::string &Ver,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002401 const std::string &MarchString,
2402 const std::string &InstalledDir,
2403 ToolChain::path_list *LibPaths) {
Matthew Curtise689b052012-12-06 15:46:07 +00002404 bool buildingLib = Args.hasArg(options::OPT_shared);
2405
2406 //----------------------------------------------------------------------------
2407 // -L Args
2408 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002409 for (Arg *A : Args.filtered(options::OPT_L))
2410 for (const char *Value : A->getValues())
2411 LibPaths->push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002412
2413 //----------------------------------------------------------------------------
2414 // Other standard paths
2415 //----------------------------------------------------------------------------
2416 const std::string MarchSuffix = "/" + MarchString;
2417 const std::string G0Suffix = "/G0";
2418 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002419 const std::string RootDir = TC.GetGnuDir(InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00002420
2421 // lib/gcc/hexagon/...
2422 std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
2423 if (buildingLib) {
2424 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
2425 LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
2426 }
2427 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
2428 LibPaths->push_back(LibGCCHexagonDir + Ver);
2429
2430 // lib/gcc/...
2431 LibPaths->push_back(RootDir + "lib/gcc");
2432
2433 // hexagon/lib/...
2434 std::string HexagonLibDir = RootDir + "hexagon/lib";
2435 if (buildingLib) {
2436 LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
2437 LibPaths->push_back(HexagonLibDir + G0Suffix);
2438 }
2439 LibPaths->push_back(HexagonLibDir + MarchSuffix);
2440 LibPaths->push_back(HexagonLibDir);
2441}
2442
Douglas Katzman54366072015-07-27 16:53:08 +00002443HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
2444 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002445 : Linux(D, Triple, Args) {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002446 const std::string InstalledDir(getDriver().getInstalledDir());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002447 const std::string GnuDir = GetGnuDir(InstalledDir, Args);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002448
2449 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2450 // program paths
2451 const std::string BinDir(GnuDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002452 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002453 getProgramPaths().push_back(BinDir);
2454
2455 // Determine version of GCC libraries and headers to use.
2456 const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
Rafael Espindolac0809172014-06-12 14:02:15 +00002457 std::error_code ec;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002458 GCCVersion MaxVersion = GCCVersion::Parse("0.0.0");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002459 for (vfs::directory_iterator di = D.getVFS().dir_begin(HexagonDir, ec), de;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002460 !ec && di != de; di = di.increment(ec)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002461 GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->getName()));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002462 if (MaxVersion < cv)
2463 MaxVersion = cv;
2464 }
2465 GCCLibAndIncVersion = MaxVersion;
Matthew Curtise689b052012-12-06 15:46:07 +00002466
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002467 ToolChain::path_list *LibPaths = &getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002468
2469 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2470 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2471 // support 'linux' we'll need to fix this up
2472 LibPaths->clear();
2473
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002474 GetHexagonLibraryPaths(*this, Args, GetGCCLibAndIncVersion(),
2475 GetTargetCPU(Args), InstalledDir, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002476}
2477
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002478HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002479
Douglas Katzman54366072015-07-27 16:53:08 +00002480Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002481 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002482}
2483
Douglas Katzman54366072015-07-27 16:53:08 +00002484Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002485 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002486}
2487
Douglas Katzman54366072015-07-27 16:53:08 +00002488void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2489 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002490 const Driver &D = getDriver();
2491
2492 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2493 DriverArgs.hasArg(options::OPT_nostdlibinc))
2494 return;
2495
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002496 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002497 std::string GnuDir = GetGnuDir(D.InstalledDir, DriverArgs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002498 std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
2499 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
2500 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
2501 addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002502}
2503
Douglas Katzman54366072015-07-27 16:53:08 +00002504void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2505 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002506 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2507 DriverArgs.hasArg(options::OPT_nostdincxx))
2508 return;
2509
2510 const Driver &D = getDriver();
2511 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002512 SmallString<128> IncludeDir(GetGnuDir(D.InstalledDir, DriverArgs));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002513
Rafael Espindola358256c2013-06-26 02:13:00 +00002514 llvm::sys::path::append(IncludeDir, "hexagon/include/c++/");
2515 llvm::sys::path::append(IncludeDir, Ver);
Yaron Keren92e1b622015-03-18 10:17:07 +00002516 addSystemInclude(DriverArgs, CC1Args, IncludeDir);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002517}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002518
Matthew Curtise689b052012-12-06 15:46:07 +00002519ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002520HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002521 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2522 if (!A)
2523 return ToolChain::CST_Libstdcxx;
2524
2525 StringRef Value = A->getValue();
2526 if (Value != "libstdc++") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002527 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002528 }
2529
2530 return ToolChain::CST_Libstdcxx;
2531}
2532
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002533static int getHexagonVersion(const ArgList &Args) {
2534 Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ);
2535 // Select the default CPU (v4) if none was given.
2536 if (!A)
2537 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002538
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002539 // FIXME: produce errors if we cannot parse the version.
2540 StringRef WhichHexagon = A->getValue();
2541 if (WhichHexagon.startswith("hexagonv")) {
2542 int Val;
2543 if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val))
2544 return Val;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002545 }
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002546 if (WhichHexagon.startswith("v")) {
2547 int Val;
2548 if (!WhichHexagon.substr(1).getAsInteger(10, Val))
2549 return Val;
2550 }
2551
2552 // FIXME: should probably be an error.
2553 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002554}
2555
Douglas Katzman54366072015-07-27 16:53:08 +00002556StringRef HexagonToolChain::GetTargetCPU(const ArgList &Args) {
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002557 int V = getHexagonVersion(Args);
2558 // FIXME: We don't support versions < 4. We should error on them.
2559 switch (V) {
2560 default:
2561 llvm_unreachable("Unexpected version");
2562 case 5:
2563 return "v5";
2564 case 4:
2565 return "v4";
2566 case 3:
2567 return "v3";
2568 case 2:
2569 return "v2";
2570 case 1:
2571 return "v1";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002572 }
Matthew Curtisf10a5952012-12-06 14:16:43 +00002573}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002574// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002575
Tom Stellard8fa33092015-07-18 01:49:05 +00002576/// AMDGPU Toolchain
2577AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2578 const ArgList &Args)
2579 : Generic_ELF(D, Triple, Args) { }
2580
2581Tool *AMDGPUToolChain::buildLinker() const {
2582 return new tools::amdgpu::Linker(*this);
2583}
2584// End AMDGPU
2585
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002586/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00002587NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2588 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002589 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002590
2591 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2592 // default paths, and must instead only use the paths provided
2593 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002594 path_list &file_paths = getFilePaths();
2595 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002596
2597 file_paths.clear();
2598 prog_paths.clear();
2599
2600 // Path for library files (libc.a, ...)
2601 std::string FilePath(getDriver().Dir + "/../");
2602
2603 // Path for tools (clang, ld, etc..)
2604 std::string ProgPath(getDriver().Dir + "/../");
2605
2606 // Path for toolchain libraries (libgcc.a, ...)
2607 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2608
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002609 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00002610 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002611 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00002612 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002613 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2614 file_paths.push_back(ToolPath + "i686-nacl");
2615 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002616 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002617 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2618 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2619 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2620 file_paths.push_back(ToolPath + "x86_64-nacl");
2621 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002622 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002623 file_paths.push_back(FilePath + "arm-nacl/lib");
2624 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2625 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2626 file_paths.push_back(ToolPath + "arm-nacl");
2627 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002628 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002629 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2630 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2631 prog_paths.push_back(ProgPath + "bin");
2632 file_paths.push_back(ToolPath + "mipsel-nacl");
2633 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002634 default:
2635 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002636 }
2637
2638 // Use provided linker, not system linker
Derek Schuffef465d72015-08-24 23:53:25 +00002639 Linker = GetLinkerPath();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002640 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2641}
2642
Douglas Katzman54366072015-07-27 16:53:08 +00002643void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2644 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002645 const Driver &D = getDriver();
2646 if (DriverArgs.hasArg(options::OPT_nostdinc))
2647 return;
2648
2649 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2650 SmallString<128> P(D.ResourceDir);
2651 llvm::sys::path::append(P, "include");
2652 addSystemInclude(DriverArgs, CC1Args, P.str());
2653 }
2654
2655 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2656 return;
2657
2658 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002659 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00002660 case llvm::Triple::x86:
2661 // x86 is special because multilib style uses x86_64-nacl/include for libc
2662 // headers but the SDK wants i686-nacl/usr/include. The other architectures
2663 // have the same substring.
2664 llvm::sys::path::append(P, "i686-nacl/usr/include");
2665 addSystemInclude(DriverArgs, CC1Args, P.str());
2666 llvm::sys::path::remove_filename(P);
2667 llvm::sys::path::remove_filename(P);
2668 llvm::sys::path::remove_filename(P);
2669 llvm::sys::path::append(P, "x86_64-nacl/include");
2670 addSystemInclude(DriverArgs, CC1Args, P.str());
2671 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002672 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002673 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002674 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002675 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002676 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002677 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002678 case llvm::Triple::mipsel:
2679 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2680 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002681 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002682 return;
2683 }
2684
2685 addSystemInclude(DriverArgs, CC1Args, P.str());
2686 llvm::sys::path::remove_filename(P);
2687 llvm::sys::path::remove_filename(P);
2688 llvm::sys::path::append(P, "include");
2689 addSystemInclude(DriverArgs, CC1Args, P.str());
2690}
2691
Douglas Katzman54366072015-07-27 16:53:08 +00002692void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2693 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002694 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2695 // if the value is libc++, and emits an error for other values.
2696 GetCXXStdlibType(Args);
2697 CmdArgs.push_back("-lc++");
2698}
2699
Douglas Katzman54366072015-07-27 16:53:08 +00002700void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2701 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002702 const Driver &D = getDriver();
2703 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2704 DriverArgs.hasArg(options::OPT_nostdincxx))
2705 return;
2706
2707 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2708 // if the value is libc++, and emits an error for other values.
2709 GetCXXStdlibType(DriverArgs);
2710
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002711 SmallString<128> P(D.Dir + "/../");
2712 switch (getTriple().getArch()) {
2713 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002714 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2715 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002716 break;
2717 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002718 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2719 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002720 break;
2721 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002722 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2723 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002724 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002725 case llvm::Triple::mipsel:
2726 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2727 addSystemInclude(DriverArgs, CC1Args, P.str());
2728 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002729 default:
2730 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002731 }
2732}
2733
Douglas Katzman54366072015-07-27 16:53:08 +00002734ToolChain::CXXStdlibType
2735NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002736 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2737 StringRef Value = A->getValue();
2738 if (Value == "libc++")
2739 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002740 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002741 }
2742
2743 return ToolChain::CST_Libcxx;
2744}
2745
Douglas Katzman54366072015-07-27 16:53:08 +00002746std::string
2747NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2748 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002749 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2750 if (TheTriple.getArch() == llvm::Triple::arm &&
2751 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2752 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2753 return TheTriple.getTriple();
2754}
2755
Douglas Katzman54366072015-07-27 16:53:08 +00002756Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002757 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002758}
2759
Douglas Katzman54366072015-07-27 16:53:08 +00002760Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002761 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002762 return new tools::nacltools::AssemblerARM(*this);
2763 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002764}
2765// End NaCl
2766
Chris Lattner09797542010-03-04 21:07:38 +00002767/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2768/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2769/// Currently does not support anything else but compilation.
2770
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002771TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002772 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002773 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002774 // Path mangling to find libexec
2775 std::string Path(getDriver().Dir);
2776
2777 Path += "/../libexec";
2778 getProgramPaths().push_back(Path);
2779}
2780
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002781TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002782
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002783bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002784
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002785bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002786
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002787bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002788
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002789bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002790
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002791// CloudABI - CloudABI tool chain which can call ld(1) directly.
2792
2793CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2794 const ArgList &Args)
2795 : Generic_ELF(D, Triple, Args) {
2796 SmallString<128> P(getDriver().Dir);
2797 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2798 getFilePaths().push_back(P.str());
2799}
2800
2801void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2802 ArgStringList &CC1Args) const {
2803 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2804 DriverArgs.hasArg(options::OPT_nostdincxx))
2805 return;
2806
2807 SmallString<128> P(getDriver().Dir);
2808 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2809 addSystemInclude(DriverArgs, CC1Args, P.str());
2810}
2811
2812void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
2813 ArgStringList &CmdArgs) const {
2814 CmdArgs.push_back("-lc++");
2815 CmdArgs.push_back("-lc++abi");
2816 CmdArgs.push_back("-lunwind");
2817}
2818
Douglas Katzman95354292015-06-23 20:42:09 +00002819Tool *CloudABI::buildLinker() const {
2820 return new tools::cloudabi::Linker(*this);
2821}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002822
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002823/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
2824
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002825OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
2826 const ArgList &Args)
2827 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00002828 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002829 getFilePaths().push_back("/usr/lib");
2830}
2831
Rafael Espindola7cf32212013-03-20 03:05:54 +00002832Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002833 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002834}
2835
Douglas Katzman95354292015-06-23 20:42:09 +00002836Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002837
Eli Friedman9fa28852012-08-08 23:57:20 +00002838/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
2839
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002840Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2841 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00002842 getFilePaths().push_back(getDriver().Dir + "/../lib");
2843 getFilePaths().push_back("/usr/lib");
2844}
2845
Rafael Espindola7cf32212013-03-20 03:05:54 +00002846Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002847 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002848}
2849
Douglas Katzman95354292015-06-23 20:42:09 +00002850Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00002851
Douglas Katzman95354292015-06-23 20:42:09 +00002852ToolChain::CXXStdlibType Bitrig::GetCXXStdlibType(const ArgList &Args) const {
Richard Smith51af5192014-05-01 23:24:24 +00002853 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2854 StringRef Value = A->getValue();
2855 if (Value == "libstdc++")
2856 return ToolChain::CST_Libstdcxx;
2857 if (Value == "libc++")
2858 return ToolChain::CST_Libcxx;
2859
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002860 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Richard Smith51af5192014-05-01 23:24:24 +00002861 }
2862 return ToolChain::CST_Libcxx;
2863}
2864
Eli Friedman9fa28852012-08-08 23:57:20 +00002865void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2866 ArgStringList &CC1Args) const {
2867 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2868 DriverArgs.hasArg(options::OPT_nostdincxx))
2869 return;
2870
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002871 switch (GetCXXStdlibType(DriverArgs)) {
2872 case ToolChain::CST_Libcxx:
2873 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00002874 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002875 break;
2876 case ToolChain::CST_Libstdcxx:
2877 addSystemInclude(DriverArgs, CC1Args,
2878 getDriver().SysRoot + "/usr/include/c++/stdc++");
2879 addSystemInclude(DriverArgs, CC1Args,
2880 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00002881
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002882 StringRef Triple = getTriple().str();
2883 if (Triple.startswith("amd64"))
2884 addSystemInclude(DriverArgs, CC1Args,
2885 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002886 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002887 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002888 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
2889 "/usr/include/c++/stdc++/" +
2890 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002891 break;
2892 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002893}
2894
2895void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
2896 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002897 switch (GetCXXStdlibType(Args)) {
2898 case ToolChain::CST_Libcxx:
2899 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00002900 CmdArgs.push_back("-lc++abi");
2901 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002902 break;
2903 case ToolChain::CST_Libstdcxx:
2904 CmdArgs.push_back("-lstdc++");
2905 break;
2906 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002907}
2908
Daniel Dunbare24297c2009-03-30 21:06:03 +00002909/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
2910
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002911FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
2912 const ArgList &Args)
2913 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00002914
Chandler Carruth0b1756b2012-01-26 01:35:15 +00002915 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
2916 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002917 if ((Triple.getArch() == llvm::Triple::x86 ||
2918 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002919 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002920 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
2921 else
2922 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00002923}
2924
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002925ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
David Chisnall867ccd82013-11-09 15:10:56 +00002926 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2927 StringRef Value = A->getValue();
2928 if (Value == "libstdc++")
2929 return ToolChain::CST_Libstdcxx;
2930 if (Value == "libc++")
2931 return ToolChain::CST_Libcxx;
2932
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002933 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
David Chisnall867ccd82013-11-09 15:10:56 +00002934 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002935 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00002936 return ToolChain::CST_Libcxx;
2937 return ToolChain::CST_Libstdcxx;
2938}
2939
2940void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2941 ArgStringList &CC1Args) const {
2942 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2943 DriverArgs.hasArg(options::OPT_nostdincxx))
2944 return;
2945
2946 switch (GetCXXStdlibType(DriverArgs)) {
2947 case ToolChain::CST_Libcxx:
2948 addSystemInclude(DriverArgs, CC1Args,
2949 getDriver().SysRoot + "/usr/include/c++/v1");
2950 break;
2951 case ToolChain::CST_Libstdcxx:
2952 addSystemInclude(DriverArgs, CC1Args,
2953 getDriver().SysRoot + "/usr/include/c++/4.2");
2954 addSystemInclude(DriverArgs, CC1Args,
2955 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
2956 break;
2957 }
2958}
2959
Rafael Espindola7cf32212013-03-20 03:05:54 +00002960Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002961 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002962}
2963
Douglas Katzman95354292015-06-23 20:42:09 +00002964Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00002965
Tim Northovere931f9f2015-10-30 16:30:41 +00002966bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002967 // FreeBSD uses SjLj exceptions on ARM oabi.
2968 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00002969 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002970 case llvm::Triple::GNUEABI:
2971 case llvm::Triple::EABI:
2972 return false;
2973
2974 default:
2975 return (getTriple().getArch() == llvm::Triple::arm ||
2976 getTriple().getArch() == llvm::Triple::thumb);
2977 }
2978}
2979
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002980bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002981
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002982bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002983
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00002984SanitizerMask FreeBSD::getSupportedSanitizers() const {
2985 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
2986 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
2987 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
2988 getTriple().getArch() == llvm::Triple::mips64el;
2989 SanitizerMask Res = ToolChain::getSupportedSanitizers();
2990 Res |= SanitizerKind::Address;
2991 Res |= SanitizerKind::Vptr;
2992 if (IsX86_64 || IsMIPS64) {
2993 Res |= SanitizerKind::Leak;
2994 Res |= SanitizerKind::Thread;
2995 }
2996 if (IsX86 || IsX86_64) {
2997 Res |= SanitizerKind::SafeStack;
2998 }
2999 return Res;
3000}
3001
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003002/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3003
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003004NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3005 : Generic_ELF(D, Triple, Args) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003006
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003007 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003008 // When targeting a 32-bit platform, try the special directory used on
3009 // 64-bit hosts, and only fall back to the main library directory if that
3010 // doesn't work.
3011 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3012 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003013 switch (Triple.getArch()) {
3014 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003015 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003016 break;
3017 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003018 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003019 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003020 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003021 switch (Triple.getEnvironment()) {
3022 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003023 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003024 getFilePaths().push_back("=/usr/lib/eabi");
3025 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003026 case llvm::Triple::EABIHF:
3027 case llvm::Triple::GNUEABIHF:
3028 getFilePaths().push_back("=/usr/lib/eabihf");
3029 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003030 default:
3031 getFilePaths().push_back("=/usr/lib/oabi");
3032 break;
3033 }
3034 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003035 case llvm::Triple::mips64:
3036 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003037 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003038 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003039 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003040 getFilePaths().push_back("=/usr/lib/64");
3041 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003042 case llvm::Triple::ppc:
3043 getFilePaths().push_back("=/usr/lib/powerpc");
3044 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003045 case llvm::Triple::sparc:
3046 getFilePaths().push_back("=/usr/lib/sparc");
3047 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003048 default:
3049 break;
3050 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003051
3052 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003053 }
3054}
3055
Rafael Espindola7cf32212013-03-20 03:05:54 +00003056Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003057 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003058}
3059
Douglas Katzman95354292015-06-23 20:42:09 +00003060Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003061
Douglas Katzman95354292015-06-23 20:42:09 +00003062ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003063 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3064 StringRef Value = A->getValue();
3065 if (Value == "libstdc++")
3066 return ToolChain::CST_Libstdcxx;
3067 if (Value == "libc++")
3068 return ToolChain::CST_Libcxx;
3069
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003070 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003071 }
3072
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003073 unsigned Major, Minor, Micro;
3074 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003075 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003076 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003077 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003078 case llvm::Triple::arm:
3079 case llvm::Triple::armeb:
3080 case llvm::Triple::thumb:
3081 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003082 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003083 case llvm::Triple::ppc64:
3084 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003085 case llvm::Triple::x86:
3086 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003087 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003088 default:
3089 break;
3090 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003091 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003092 return ToolChain::CST_Libstdcxx;
3093}
3094
3095void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3096 ArgStringList &CC1Args) const {
3097 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3098 DriverArgs.hasArg(options::OPT_nostdincxx))
3099 return;
3100
3101 switch (GetCXXStdlibType(DriverArgs)) {
3102 case ToolChain::CST_Libcxx:
3103 addSystemInclude(DriverArgs, CC1Args,
3104 getDriver().SysRoot + "/usr/include/c++/");
3105 break;
3106 case ToolChain::CST_Libstdcxx:
3107 addSystemInclude(DriverArgs, CC1Args,
3108 getDriver().SysRoot + "/usr/include/g++");
3109 addSystemInclude(DriverArgs, CC1Args,
3110 getDriver().SysRoot + "/usr/include/g++/backward");
3111 break;
3112 }
3113}
3114
Chris Lattner3e2ee142010-07-07 16:01:42 +00003115/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3116
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003117Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3118 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003119 getFilePaths().push_back(getDriver().Dir + "/../lib");
3120 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003121}
3122
Rafael Espindola7cf32212013-03-20 03:05:54 +00003123Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003124 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003125}
3126
Douglas Katzman95354292015-06-23 20:42:09 +00003127Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003128
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003129static void addPathIfExists(const Driver &D, const Twine &Path,
3130 ToolChain::path_list &Paths) {
3131 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003132 Paths.push_back(Path.str());
3133}
3134
David Chisnallf571cde2012-02-15 13:39:01 +00003135/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3136
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003137Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003138 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003139 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003140
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003141 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003142
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003143 path_list &Paths = getFilePaths();
3144 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003145 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003146
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003147 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003148 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003149 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003150
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003151 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003152
3153 std::string LibPath = "/usr/lib/";
3154 switch (Triple.getArch()) {
3155 case llvm::Triple::x86:
3156 case llvm::Triple::sparc:
3157 break;
3158 case llvm::Triple::x86_64:
3159 LibPath += "amd64/";
3160 break;
3161 case llvm::Triple::sparcv9:
3162 LibPath += "sparcv9/";
3163 break;
3164 default:
3165 llvm_unreachable("Unsupported architecture");
3166 }
3167
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003168 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003169}
3170
Rafael Espindola7cf32212013-03-20 03:05:54 +00003171Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003172 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003173}
3174
Douglas Katzman95354292015-06-23 20:42:09 +00003175Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003176
Rafael Espindolad5117262015-09-09 13:36:00 +00003177void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3178 ArgStringList &CC1Args) const {
3179 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3180 DriverArgs.hasArg(options::OPT_nostdincxx))
3181 return;
3182
3183 // Include the support directory for things like xlocale and fudged system
3184 // headers.
3185 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3186
3187 if (GCCInstallation.isValid()) {
3188 GCCVersion Version = GCCInstallation.getVersion();
3189 addSystemInclude(DriverArgs, CC1Args,
3190 getDriver().SysRoot + "/usr/gcc/" +
3191 Version.MajorStr + "." +
3192 Version.MinorStr +
3193 "/include/c++/" + Version.Text);
3194 addSystemInclude(DriverArgs, CC1Args,
3195 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3196 "." + Version.MinorStr + "/include/c++/" +
3197 Version.Text + "/" +
3198 GCCInstallation.getTriple().str());
3199 }
3200}
3201
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003202/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003203
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003204enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003205 // NB: Releases of a particular Linux distro should be kept together
3206 // in this enum, because some tests are done by integer comparison against
3207 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003208 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003209 DebianLenny,
3210 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003211 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003212 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003213 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003214 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003215 RHEL4,
3216 RHEL5,
3217 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003218 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003219 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003220 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003221 UbuntuHardy,
3222 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003223 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003224 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003225 UbuntuLucid,
3226 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003227 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003228 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003229 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003230 UbuntuQuantal,
3231 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003232 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003233 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003234 UbuntuUtopic,
3235 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003236 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003237 UbuntuXenial,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003238 UnknownDistro
3239};
3240
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003241static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003242 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003243}
3244
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003245static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003246
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003247static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003248 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003249}
3250
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003251static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003252 return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003253}
3254
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003255static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003256 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3257 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3258 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003259 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003260 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003261 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003262 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003263 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003264 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3265 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3266 .Case("hardy", UbuntuHardy)
3267 .Case("intrepid", UbuntuIntrepid)
3268 .Case("jaunty", UbuntuJaunty)
3269 .Case("karmic", UbuntuKarmic)
3270 .Case("lucid", UbuntuLucid)
3271 .Case("maverick", UbuntuMaverick)
3272 .Case("natty", UbuntuNatty)
3273 .Case("oneiric", UbuntuOneiric)
3274 .Case("precise", UbuntuPrecise)
3275 .Case("quantal", UbuntuQuantal)
3276 .Case("raring", UbuntuRaring)
3277 .Case("saucy", UbuntuSaucy)
3278 .Case("trusty", UbuntuTrusty)
3279 .Case("utopic", UbuntuUtopic)
3280 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003281 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003282 .Case("xenial", UbuntuXenial)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003283 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003284 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003285 }
3286
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003287 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3288 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003289 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003290 if (Data.startswith("Fedora release"))
3291 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003292 if (Data.startswith("Red Hat Enterprise Linux") ||
3293 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003294 if (Data.find("release 7") != StringRef::npos)
3295 return RHEL7;
3296 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003297 return RHEL6;
3298 else if (Data.find("release 5") != StringRef::npos)
3299 return RHEL5;
3300 else if (Data.find("release 4") != StringRef::npos)
3301 return RHEL4;
3302 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003303 return UnknownDistro;
3304 }
3305
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003306 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3307 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003308 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003309 if (Data[0] == '5')
3310 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003311 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003312 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003313 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003314 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003315 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003316 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003317 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3318 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003319 return UnknownDistro;
3320 }
3321
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003322 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003323 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003324
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003325 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003326 return Exherbo;
3327
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003328 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003329 return ArchLinux;
3330
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003331 return UnknownDistro;
3332}
3333
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003334/// \brief Get our best guess at the multiarch triple for a target.
3335///
3336/// Debian-based systems are starting to use a multiarch setup where they use
3337/// a target-triple directory in the library and header search paths.
3338/// Unfortunately, this triple does not align with the vanilla target triple,
3339/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003340static std::string getMultiarchTriple(const Driver &D,
3341 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003342 StringRef SysRoot) {
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003343 llvm::Triple::EnvironmentType TargetEnvironment = TargetTriple.getEnvironment();
3344
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003345 // For most architectures, just use whatever we have rather than trying to be
3346 // clever.
3347 switch (TargetTriple.getArch()) {
3348 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003349 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003350
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003351 // We use the existence of '/lib/<triple>' as a directory to detect some
3352 // common linux triples that don't quite match the Clang triple for both
3353 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3354 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003355 case llvm::Triple::arm:
3356 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003357 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003358 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003359 return "arm-linux-gnueabihf";
3360 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003361 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003362 return "arm-linux-gnueabi";
3363 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003364 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003365 case llvm::Triple::armeb:
3366 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003367 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003368 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003369 return "armeb-linux-gnueabihf";
3370 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003371 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003372 return "armeb-linux-gnueabi";
3373 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003374 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003375 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003376 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003377 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003378 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003379 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003380 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003381 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003382 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003383 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003384 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003385 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003386 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003387 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003388 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003389 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003390 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003391 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003392 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003393 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003394 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003395 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003396 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003397 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003398 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003399 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003400 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003401 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003402 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003403 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003404 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003405 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003406 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003407 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003408 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003409 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003410 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003411 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003412 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003413 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003414 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003415 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003416 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003417 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003418 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003419 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003420 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003421 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003422 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003423 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003424 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003425 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003426 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003427 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003428 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003429 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003430 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003431 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003432 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003433 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003434 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003435 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003436 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003437 return "s390x-linux-gnu";
3438 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003439 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003440 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003441}
3442
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003443static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003444 if (isMipsArch(Triple.getArch())) {
3445 // lib32 directory has a special meaning on MIPS targets.
3446 // It contains N32 ABI binaries. Use this folder if produce
3447 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003448 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003449 return "lib32";
3450 return Triple.isArch32Bit() ? "lib" : "lib64";
3451 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003452
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003453 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003454 // using that variant while targeting other architectures causes problems
3455 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003456 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003457 // them when we know we may need it.
3458 //
3459 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003460 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003461 // GCCInstallationDetector, but that is a more significant refactoring.
3462 if (Triple.getArch() == llvm::Triple::x86 ||
3463 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003464 return "lib32";
3465
Zinovy Nis1db95732014-07-10 15:27:19 +00003466 if (Triple.getArch() == llvm::Triple::x86_64 &&
3467 Triple.getEnvironment() == llvm::Triple::GNUX32)
3468 return "libx32";
3469
Simon Atanasyand4413882012-09-14 11:27:24 +00003470 return Triple.isArch32Bit() ? "lib" : "lib64";
3471}
3472
Rafael Espindola1af7c212012-02-19 01:38:32 +00003473Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003474 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003475 GCCInstallation.init(Triple, Args);
3476 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003477 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003478 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003479 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003480
Rafael Espindola10a63c22013-07-03 14:14:00 +00003481 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003482 // least) put various tools in a triple-prefixed directory off of the parent
3483 // of the GCC installation. We use the GCC triple here to ensure that we end
3484 // up with tools that support the same amount of cross compiling as the
3485 // detected GCC installation. For example, if we find a GCC installation
3486 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3487 // used to target i386.
3488 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003489 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003490 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003491 GCCInstallation.getTriple().str() + "/bin")
3492 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003493
Logan Chieneb9162f2014-06-26 14:23:45 +00003494 Linker = GetLinkerPath();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003495
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003496 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003497
Rafael Espindola10a63c22013-07-03 14:14:00 +00003498 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003499 ExtraOpts.push_back("-z");
3500 ExtraOpts.push_back("relro");
3501 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003502
Douglas Gregord9bb1522011-03-06 19:11:49 +00003503 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003504 ExtraOpts.push_back("-X");
3505
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003506 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003507 const bool IsMips = isMipsArch(Arch);
3508
3509 if (IsMips && !SysRoot.empty())
3510 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003511
Chandler Carruth0b842912011-12-09 04:45:18 +00003512 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3513 // and the MIPS ABI require .dynsym to be sorted in different ways.
3514 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3515 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003516 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003517 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003518 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003519 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003520 ExtraOpts.push_back("--hash-style=gnu");
3521
Rafael Espindola10a63c22013-07-03 14:14:00 +00003522 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003523 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3524 ExtraOpts.push_back("--hash-style=both");
3525 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003526
Chris Lattner84e38552011-05-22 05:36:06 +00003527 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003528 ExtraOpts.push_back("--no-add-needed");
3529
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003530 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003531 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003532 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003533 ExtraOpts.push_back("--build-id");
3534
Rafael Espindola10a63c22013-07-03 14:14:00 +00003535 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003536 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003537
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003538 // The selection of paths to try here is designed to match the patterns which
3539 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3540 // This was determined by running GCC in a fake filesystem, creating all
3541 // possible permutations of these directories, and seeing which ones it added
3542 // to the link paths.
3543 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003544
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003545 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003546 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003547
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003548 // Add the multilib suffixed paths where they are available.
3549 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003550 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003551 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003552 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003553
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003554 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003555 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003556 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003557 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003558
3559 // GCC cross compiling toolchains will install target libraries which ship
3560 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3561 // any part of the GCC installation in
3562 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3563 // debatable, but is the reality today. We need to search this tree even
3564 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003565 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003566 // installation that is *not* within the system root to ensure two things:
3567 //
3568 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003569 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003570 // appropriate rpath.
3571 // 2) There must not be libraries installed into
3572 // <prefix>/<triple>/<libdir> unless they should be preferred over
3573 // those within the system root.
3574 //
3575 // Note that this matches the GCC behavior. See the below comment for where
3576 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003577 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
3578 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003579 Paths);
3580
Chandler Carruth69a125b2012-04-06 16:32:06 +00003581 // If the GCC installation we found is inside of the sysroot, we want to
3582 // prefer libraries installed in the parent prefix of the GCC installation.
3583 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003584 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003585 // This usually happens when there is an external cross compiler on the
3586 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003587 // the cross. Note that GCC does include some of these directories in some
3588 // configurations but this seems somewhere between questionable and simply
3589 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003590 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003591 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
3592 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003593 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003594 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003595
3596 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003597 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003598 // those searched.
3599 // FIXME: It's not clear whether we should use the driver's installed
3600 // directory ('Dir' below) or the ResourceDir.
3601 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003602 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
3603 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003604 }
3605
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003606 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
3607 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
3608 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3609 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003610
Chandler Carruthb427c562013-06-22 11:35:51 +00003611 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003612 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003613 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003614 addPathIfExists(D,
3615 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003616 "/../../" + OSLibDir,
3617 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003618
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003619 // Add the 'other' biarch variant path
3620 Multilib BiarchSibling;
3621 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003622 addPathIfExists(D, GCCInstallation.getInstallPath() +
3623 BiarchSibling.gccSuffix(),
3624 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003625 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003626
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003627 // See comments above on the multilib variant for details of why this is
3628 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003629 const std::string &LibPath = GCCInstallation.getParentLibPath();
3630 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3631 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003632 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
3633 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003634 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003635
3636 // See comments above on the multilib variant for details of why this is
3637 // only included from within the sysroot.
3638 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003639 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003640 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003641
3642 // Similar to the logic for GCC above, if we are currently running Clang
3643 // inside of the requested system root, add its parent library path to those
3644 // searched.
3645 // FIXME: It's not clear whether we should use the driver's installed
3646 // directory ('Dir' below) or the ResourceDir.
3647 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003648 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003649
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003650 addPathIfExists(D, SysRoot + "/lib", Paths);
3651 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003652}
3653
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003654bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003655
Douglas Katzman95354292015-06-23 20:42:09 +00003656Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003657
3658Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003659 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003660}
3661
Simon Atanasyana0d89572013-10-05 14:37:55 +00003662std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003663 if (!getDriver().SysRoot.empty())
3664 return getDriver().SysRoot;
3665
3666 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3667 return std::string();
3668
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003669 // Standalone MIPS toolchains use different names for sysroot folder
3670 // and put it into different places. Here we try to check some known
3671 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003672
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003673 const StringRef InstallDir = GCCInstallation.getInstallPath();
3674 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003675 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003676
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003677 std::string Path =
3678 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3679 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003680
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003681 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003682 return Path;
3683
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003684 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003685
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003686 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003687 return Path;
3688
3689 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003690}
3691
Chandler Carrutha796f532011-11-05 20:17:13 +00003692void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3693 ArgStringList &CC1Args) const {
3694 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003695 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003696
3697 if (DriverArgs.hasArg(options::OPT_nostdinc))
3698 return;
3699
3700 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003701 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003702
3703 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003704 SmallString<128> P(D.ResourceDir);
3705 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003706 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003707 }
3708
3709 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3710 return;
3711
3712 // Check for configure-time C include directories.
3713 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3714 if (CIncludeDirs != "") {
3715 SmallVector<StringRef, 5> dirs;
3716 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003717 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003718 StringRef Prefix =
3719 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003720 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003721 }
3722 return;
3723 }
3724
3725 // Lacking those, try to detect the correct set of system includes for the
3726 // target triple.
3727
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003728 // Add include directories specific to the selected multilib set and multilib.
3729 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003730 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003731 if (Callback) {
3732 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3733 GCCInstallation.getTriple().str(),
3734 GCCInstallation.getMultilib());
3735 for (const auto &Path : IncludePaths)
3736 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3737 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003738 }
3739
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003740 // Implement generic Debian multiarch support.
3741 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003742 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003743
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003744 // FIXME: These are older forms of multiarch. It's not clear that they're
3745 // in use in any released version of Debian, so we should consider
3746 // removing them.
3747 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003748 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003749 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003750
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003751 // FIXME: These are older forms of multiarch. It's not clear that they're
3752 // in use in any released version of Debian, so we should consider
3753 // removing them.
3754 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3755 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003756 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003757 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003758 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003759 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003760 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003761 "/usr/include/arm-linux-gnueabihf"};
3762 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003763 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003764 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003765 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003766 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003767 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003768 "/usr/include/mips64el-linux-gnu",
3769 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003770 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003771 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003772 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003773 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003774 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003775 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003776 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003777 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003778 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003779 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003780 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
3781 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003782 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003783 switch (getTriple().getArch()) {
3784 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003785 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003786 break;
3787 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003788 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003789 break;
3790 case llvm::Triple::aarch64:
3791 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003792 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003793 break;
3794 case llvm::Triple::arm:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003795 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3796 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3797 else
3798 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003799 break;
3800 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00003801 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003802 break;
3803 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00003804 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003805 break;
3806 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003807 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003808 break;
3809 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003810 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003811 break;
3812 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003813 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003814 break;
3815 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003816 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003817 break;
3818 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003819 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003820 break;
3821 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00003822 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003823 break;
3824 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00003825 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003826 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003827 case llvm::Triple::systemz:
3828 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
3829 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003830 default:
3831 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003832 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003833 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003834 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003835 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003836 break;
3837 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003838 }
3839
3840 if (getTriple().getOS() == llvm::Triple::RTEMS)
3841 return;
3842
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003843 // Add an include of '/include' directly. This isn't provided by default by
3844 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
3845 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003846 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003847
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003848 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003849}
3850
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003851
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00003852static std::string DetectLibcxxIncludePath(StringRef base) {
3853 std::error_code EC;
3854 int MaxVersion = 0;
3855 std::string MaxVersionString = "";
3856 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
3857 LI = LI.increment(EC)) {
3858 StringRef VersionText = llvm::sys::path::filename(LI->path());
3859 int Version;
3860 if (VersionText[0] == 'v' &&
3861 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
3862 if (Version > MaxVersion) {
3863 MaxVersion = Version;
3864 MaxVersionString = VersionText;
3865 }
3866 }
3867 }
3868 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
3869}
3870
Chandler Carrutha796f532011-11-05 20:17:13 +00003871void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3872 ArgStringList &CC1Args) const {
3873 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3874 DriverArgs.hasArg(options::OPT_nostdincxx))
3875 return;
3876
Chandler Carruthf4701732011-11-07 09:01:17 +00003877 // Check if libc++ has been enabled and provide its include paths if so.
3878 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003879 const std::string LibCXXIncludePathCandidates[] = {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00003880 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003881
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003882 // We also check the system as for a long time this is the only place
3883 // Clang looked.
3884 // FIXME: We should really remove this. It doesn't make any sense.
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00003885 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++")};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003886 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00003887 if (IncludePath.empty() || !getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003888 continue;
3889 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003890 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003891 break;
3892 }
Chandler Carruthf4701732011-11-07 09:01:17 +00003893 return;
3894 }
3895
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00003896 // We need a detected GCC installation on Linux to provide libstdc++'s
3897 // headers. We handled the libc++ case above.
3898 if (!GCCInstallation.isValid())
3899 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00003900
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003901 // By default, look for the C++ headers in an include directory adjacent to
3902 // the lib directory of the GCC installation. Note that this is expect to be
3903 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
3904 StringRef LibDir = GCCInstallation.getParentLibPath();
3905 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003906 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003907 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003908 const std::string GCCMultiarchTriple = getMultiarchTriple(
3909 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003910 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003911 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00003912 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003913
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003914 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00003915 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003916 "/c++/" + Version.Text, TripleStr,
3917 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003918 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003919 return;
3920
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003921 // Otherwise, fall back on a bunch of options which don't use multiarch
3922 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003923 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003924 // Gentoo is weird and places its headers inside the GCC install,
3925 // so if the first attempt to find the headers fails, try these patterns.
3926 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
3927 Version.MinorStr,
3928 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
3929 // Android standalone toolchain has C++ headers in yet another place.
3930 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
3931 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
3932 // without a subdirectory corresponding to the gcc version.
3933 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003934 };
3935
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003936 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003937 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
3938 /*GCCMultiarchTriple*/ "",
3939 /*TargetMultiarchTriple*/ "",
3940 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003941 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003942 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003943}
3944
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003945bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003946
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003947SanitizerMask Linux::getSupportedSanitizers() const {
3948 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3949 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3950 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3951 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00003952 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
3953 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003954 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
3955 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003956 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3957 Res |= SanitizerKind::Address;
3958 Res |= SanitizerKind::KernelAddress;
3959 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00003960 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003961 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003962 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00003963 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003964 Res |= SanitizerKind::Leak;
Renato Golind45c2df2015-08-05 18:42:41 +00003965 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003966 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00003967 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00003968 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003969 if (IsX86 || IsX86_64) {
3970 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003971 }
3972 return Res;
3973}
3974
Xinliang David Li170cd102015-10-27 05:15:35 +00003975void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
3976 llvm::opt::ArgStringList &CmdArgs) const {
3977 if (!needsProfileRT(Args)) return;
3978
3979 // Add linker option -u__llvm_runtime_variable to cause runtime
3980 // initialization module to be linked in.
3981 if (!Args.hasArg(options::OPT_coverage))
3982 CmdArgs.push_back(Args.MakeArgString(
3983 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
3984 ToolChain::addProfileRTLibs(Args, CmdArgs);
3985}
3986
Daniel Dunbarcc912342009-05-02 18:28:39 +00003987/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
3988
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003989DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
3990 const ArgList &Args)
3991 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00003992
3993 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00003994 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00003995 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00003996 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00003997
Daniel Dunbar083edf72009-12-21 18:54:17 +00003998 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00003999 getFilePaths().push_back("/usr/lib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004000 if (D.getVFS().exists("/usr/lib/gcc47"))
John McCall65b8da02013-04-11 22:55:55 +00004001 getFilePaths().push_back("/usr/lib/gcc47");
4002 else
4003 getFilePaths().push_back("/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004004}
4005
Rafael Espindola7cf32212013-03-20 03:05:54 +00004006Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004007 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004008}
4009
4010Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004011 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004012}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004013
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004014/// Stub for CUDA toolchain. At the moment we don't have assembler or
4015/// linker and need toolchain mainly to propagate device-side options
4016/// to CC1.
4017
4018CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4019 const ArgList &Args)
4020 : Linux(D, Triple, Args) {}
4021
4022void
4023CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4024 llvm::opt::ArgStringList &CC1Args) const {
4025 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4026 CC1Args.push_back("-fcuda-is-device");
4027}
4028
4029llvm::opt::DerivedArgList *
4030CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
4031 const char *BoundArch) const {
4032 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
4033 const OptTable &Opts = getDriver().getOpts();
4034
4035 for (Arg *A : Args) {
4036 if (A->getOption().matches(options::OPT_Xarch__)) {
4037 // Skip this argument unless the architecture matches BoundArch
4038 if (A->getValue(0) != StringRef(BoundArch))
4039 continue;
4040
4041 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
4042 unsigned Prev = Index;
4043 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
4044
4045 // If the argument parsing failed or more than one argument was
4046 // consumed, the -Xarch_ argument's parameter tried to consume
4047 // extra arguments. Emit an error and ignore.
4048 //
4049 // We also want to disallow any options which would alter the
4050 // driver behavior; that isn't going to work in our model. We
4051 // use isDriverOption() as an approximation, although things
4052 // like -O4 are going to slip through.
4053 if (!XarchArg || Index > Prev + 1) {
4054 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
4055 << A->getAsString(Args);
4056 continue;
4057 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
4058 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
4059 << A->getAsString(Args);
4060 continue;
4061 }
4062 XarchArg->setBaseArg(A);
4063 A = XarchArg.release();
4064 DAL->AddSynthesizedArg(A);
4065 }
4066 DAL->append(A);
4067 }
4068
4069 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
4070 return DAL;
4071}
4072
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004073/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00004074XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
4075 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004076 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004077 // ProgramPaths are found via 'PATH' environment variable.
4078}
4079
Douglas Katzman54366072015-07-27 16:53:08 +00004080Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004081 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004082}
4083
Douglas Katzman54366072015-07-27 16:53:08 +00004084Tool *XCoreToolChain::buildLinker() const {
4085 return new tools::XCore::Linker(*this);
4086}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004087
Douglas Katzman54366072015-07-27 16:53:08 +00004088bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004089
Douglas Katzman54366072015-07-27 16:53:08 +00004090bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004091
Douglas Katzman54366072015-07-27 16:53:08 +00004092bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004093
Douglas Katzman54366072015-07-27 16:53:08 +00004094bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004095
Douglas Katzman54366072015-07-27 16:53:08 +00004096bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004097
Douglas Katzman54366072015-07-27 16:53:08 +00004098void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4099 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004100 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
4101 DriverArgs.hasArg(options::OPT_nostdlibinc))
4102 return;
4103 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
4104 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004105 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004106 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4107 ArrayRef<StringRef> DirVec(Dirs);
4108 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4109 }
4110}
4111
Douglas Katzman54366072015-07-27 16:53:08 +00004112void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
4113 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004114 CC1Args.push_back("-nostdsysteminc");
4115}
4116
Douglas Katzman54366072015-07-27 16:53:08 +00004117void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
4118 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004119 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00004120 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4121 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004122 return;
4123 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
4124 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004125 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004126 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4127 ArrayRef<StringRef> DirVec(Dirs);
4128 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4129 }
4130}
4131
Douglas Katzman54366072015-07-27 16:53:08 +00004132void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
4133 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004134 // We don't output any lib args. This is handled by xcc.
4135}
Douglas Katzman84a75642015-06-19 14:55:19 +00004136
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004137MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
4138 const ArgList &Args)
4139 : Generic_GCC(D, Triple, Args) {
4140 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
4141 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
4142 // This won't work to find gcc. Instead we give the installation detector an
4143 // extra triple, which is preferable to further hacks of the logic that at
4144 // present is based solely on getArch(). In particular, it would be wrong to
4145 // choose the myriad installation when targeting a non-myriad sparc install.
4146 switch (Triple.getArch()) {
4147 default:
4148 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName() << "myriad";
4149 case llvm::Triple::sparc:
4150 case llvm::Triple::sparcel:
4151 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004152 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004153 }
4154}
4155
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00004156MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004157
Douglas Katzmanb1278f32015-09-17 21:20:16 +00004158void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4159 ArgStringList &CC1Args) const {
4160 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4161 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4162}
4163
James Y Knighta6c9ee72015-10-16 18:46:26 +00004164void MyriadToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4165 ArgStringList &CC1Args) const {
4166 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4167 DriverArgs.hasArg(options::OPT_nostdincxx))
4168 return;
4169
4170 // Only libstdc++, for now.
4171 StringRef LibDir = GCCInstallation.getParentLibPath();
4172 const GCCVersion &Version = GCCInstallation.getVersion();
4173 StringRef TripleStr = GCCInstallation.getTriple().str();
4174 const Multilib &Multilib = GCCInstallation.getMultilib();
4175
4176 addLibStdCXXIncludePaths(LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4177 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
4178}
4179
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004180// MyriadToolChain handles several triples:
4181// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
4182Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4183 // The inherited method works fine if not targeting the SHAVE.
4184 if (!isShaveCompilation(getTriple()))
4185 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004186 switch (JA.getKind()) {
4187 case Action::CompileJobClass:
4188 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004189 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004190 return Compiler.get();
4191 case Action::AssembleJobClass:
4192 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004193 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004194 return Assembler.get();
4195 default:
4196 return ToolChain::getTool(JA.getKind());
4197 }
4198}
4199
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004200void MyriadToolChain::getCompilerSupportDir(std::string &Dir) const {
4201 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4202 // These files are tied to a particular version of gcc.
4203 SmallString<128> Result(GCCInstallation.getInstallPath());
4204 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4205 // but as this toolchain is for LEON sparc, it can assume FPU.
4206 if (this->getTriple().getArch() == llvm::Triple::sparcel)
4207 llvm::sys::path::append(Result, "le");
4208 Dir.assign(Result.str());
4209}
4210void MyriadToolChain::getBuiltinLibDir(std::string &Dir) const {
4211 // The contents of LibDir are independent of the version of gcc.
4212 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4213 SmallString<128> Result(GCCInstallation.getParentLibPath());
4214 if (this->getTriple().getArch() == llvm::Triple::sparcel)
4215 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib/le");
4216 else
4217 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib");
4218 Dir.assign(Result.str());
Douglas Katzman84a75642015-06-19 14:55:19 +00004219}
4220
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004221Tool *MyriadToolChain::buildLinker() const {
4222 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004223}
Dan Gohmanc2853072015-09-03 22:51:53 +00004224
4225bool WebAssembly::IsMathErrnoDefault() const { return false; }
4226
4227bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4228
4229bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4230
4231bool WebAssembly::isPICDefault() const { return false; }
4232
4233bool WebAssembly::isPIEDefault() const { return false; }
4234
4235bool WebAssembly::isPICDefaultForced() const { return false; }
4236
4237bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4238
4239// TODO: Support Objective C stuff.
4240bool WebAssembly::SupportsObjCGC() const { return false; }
4241
4242bool WebAssembly::hasBlocksRuntime() const { return false; }
4243
4244// TODO: Support profiling.
4245bool WebAssembly::SupportsProfiling() const { return false; }
4246
4247void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4248 ArgStringList &CC1Args) const {
4249 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4250 options::OPT_fno_use_init_array, true))
4251 CC1Args.push_back("-fuse-init-array");
4252}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004253
4254PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4255 : Generic_ELF(D, Triple, Args) {
4256 if (Args.hasArg(options::OPT_static))
4257 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4258
4259 // Determine where to find the PS4 libraries. We use SCE_PS4_SDK_DIR
4260 // if it exists; otherwise use the driver's installation path, which
4261 // should be <SDK_DIR>/host_tools/bin.
4262
4263 SmallString<512> PS4SDKDir;
4264 if (const char *EnvValue = getenv("SCE_PS4_SDK_DIR")) {
4265 if (!llvm::sys::fs::exists(EnvValue))
4266 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4267 PS4SDKDir = EnvValue;
4268 } else {
4269 PS4SDKDir = getDriver().Dir;
4270 llvm::sys::path::append(PS4SDKDir, "/../../");
4271 }
4272
4273 // By default, the driver won't report a warning if it can't find
4274 // PS4's include or lib directories. This behavior could be changed if
4275 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
4276 // If -isysroot was passed, use that as the SDK base path.
4277 std::string PrefixDir;
4278 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4279 PrefixDir = A->getValue();
4280 if (!llvm::sys::fs::exists(PrefixDir))
4281 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4282 } else
4283 PrefixDir = PS4SDKDir.str();
4284
4285 SmallString<512> PS4SDKIncludeDir(PrefixDir);
4286 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4287 if (!Args.hasArg(options::OPT_nostdinc) &&
4288 !Args.hasArg(options::OPT_nostdlibinc) &&
4289 !Args.hasArg(options::OPT_isysroot) &&
4290 !Args.hasArg(options::OPT__sysroot_EQ) &&
4291 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4292 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4293 << "PS4 system headers" << PS4SDKIncludeDir;
4294 }
4295
4296 SmallString<512> PS4SDKLibDir(PS4SDKDir);
4297 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4298 if (!Args.hasArg(options::OPT_nostdlib) &&
4299 !Args.hasArg(options::OPT_nodefaultlibs) &&
4300 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
4301 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
4302 !Args.hasArg(options::OPT_emit_ast) &&
4303 !llvm::sys::fs::exists(PS4SDKLibDir)) {
4304 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4305 << "PS4 system libraries" << PS4SDKLibDir;
4306 return;
4307 }
4308 getFilePaths().push_back(PS4SDKLibDir.str());
4309}
4310
4311Tool *PS4CPU::buildAssembler() const {
4312 return new tools::PS4cpu::Assemble(*this);
4313}
4314
4315Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
4316
4317bool PS4CPU::isPICDefault() const { return true; }
4318
4319bool PS4CPU::HasNativeLLVMSupport() const { return true; }
4320
4321SanitizerMask PS4CPU::getSupportedSanitizers() const {
4322 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4323 Res |= SanitizerKind::Address;
4324 Res |= SanitizerKind::Vptr;
4325 return Res;
4326}