blob: f57d0871c20a919d60e46718d00fbc191903de5e [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
Chris Bieneman586d24b2015-11-20 00:19:21 +0000326 // TODO: Clean this up once autoconf is gone
327 SmallString<128> P(getDriver().ResourceDir);
328 llvm::sys::path::append(P, "lib", "darwin");
329 const char *Library = "libclang_rt.profile_osx.a";
330
Justin Bognerc7701242015-05-12 05:44:36 +0000331 // Select the appropriate runtime library for the target.
Chris Bieneman586d24b2015-11-20 00:19:21 +0000332 if (isTargetWatchOS()) {
333 Library = "libclang_rt.profile_watchos.a";
334 } else if (isTargetWatchOSSimulator()) {
335 llvm::sys::path::append(P, "libclang_rt.profile_watchossim.a");
336 Library = getVFS().exists(P) ? "libclang_rt.profile_watchossim.a"
337 : "libclang_rt.profile_watchos.a";
338 } else if (isTargetTvOS()) {
339 Library = "libclang_rt.profile_tvos.a";
340 } else if (isTargetTvOSSimulator()) {
341 llvm::sys::path::append(P, "libclang_rt.profile_tvossim.a");
342 Library = getVFS().exists(P) ? "libclang_rt.profile_tvossim.a"
343 : "libclang_rt.profile_tvos.a";
344 } else if (isTargetIPhoneOS()) {
345 Library = "libclang_rt.profile_ios.a";
346 } else if (isTargetIOSSimulator()) {
347 llvm::sys::path::append(P, "libclang_rt.profile_iossim.a");
348 Library = getVFS().exists(P) ? "libclang_rt.profile_iossim.a"
349 : "libclang_rt.profile_ios.a";
Vedant Kumar0affb932015-11-10 00:20:34 +0000350 } else {
351 assert(isTargetMacOS() && "unexpected non MacOS platform");
Vedant Kumar0affb932015-11-10 00:20:34 +0000352 }
Chris Bieneman586d24b2015-11-20 00:19:21 +0000353 AddLinkRuntimeLib(Args, CmdArgs, Library,
354 /*AlwaysLink*/ true);
Xinliang David Li69306c02015-10-22 06:15:31 +0000355 return;
Justin Bognerc7701242015-05-12 05:44:36 +0000356}
357
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000358void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
359 ArgStringList &CmdArgs,
360 StringRef Sanitizer) const {
361 if (!Args.hasArg(options::OPT_dynamiclib) &&
362 !Args.hasArg(options::OPT_bundle)) {
363 // Sanitizer runtime libraries requires C++.
364 AddCXXStdlibLibArgs(Args, CmdArgs);
365 }
Tim Northover6f3ff222015-10-30 16:30:27 +0000366 // ASan is not supported on watchOS.
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000367 assert(isTargetMacOS() || isTargetIOSSimulator());
368 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000369 AddLinkRuntimeLib(
370 Args, CmdArgs,
371 (Twine("libclang_rt.") + Sanitizer + "_" + OS + "_dynamic.dylib").str(),
372 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
373 /*AddRPath*/ true);
Hans Wennborg10821e52015-04-09 18:47:01 +0000374
375 if (GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) {
376 // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
377 // all RTTI-related symbols that UBSan uses.
378 CmdArgs.push_back("-lc++abi");
379 }
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000380}
381
Daniel Dunbar6276f992009-09-18 08:15:13 +0000382void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
383 ArgStringList &CmdArgs) const {
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000384 // Darwin only supports the compiler-rt based runtime libraries.
385 switch (GetRuntimeLibType(Args)) {
386 case ToolChain::RLT_CompilerRT:
387 break;
388 default:
389 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000390 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000391 return;
392 }
393
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000394 // Darwin doesn't support real static executables, don't link any runtime
395 // libraries with -static.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000396 if (Args.hasArg(options::OPT_static) ||
397 Args.hasArg(options::OPT_fapple_kext) ||
398 Args.hasArg(options::OPT_mkernel))
Daniel Dunbar6276f992009-09-18 08:15:13 +0000399 return;
Daniel Dunbar6276f992009-09-18 08:15:13 +0000400
401 // Reject -static-libgcc for now, we can deal with this when and if someone
402 // cares. This is useful in situations where someone wants to statically link
403 // something like libstdc++, and needs its runtime support routines.
404 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000405 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
Daniel Dunbar6276f992009-09-18 08:15:13 +0000406 return;
407 }
408
Peter Collingbourne32701642013-11-01 18:16:25 +0000409 const SanitizerArgs &Sanitize = getSanitizerArgs();
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +0000410 if (Sanitize.needsAsanRt())
411 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
412 if (Sanitize.needsUbsanRt())
413 AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
Kuba Brecka85e01c02015-11-06 15:09:20 +0000414 if (Sanitize.needsTsanRt())
415 AddLinkSanitizerLibArgs(Args, CmdArgs, "tsan");
Peter Collingbournedc134532016-01-16 00:31:22 +0000416 if (Sanitize.needsStatsRt()) {
417 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
418 AddLinkRuntimeLib(Args, CmdArgs,
419 (Twine("libclang_rt.stats_client_") + OS + ".a").str(),
420 /*AlwaysLink=*/true);
421 AddLinkSanitizerLibArgs(Args, CmdArgs, "stats");
422 }
Daniel Dunbar1d6469f2011-12-01 23:40:18 +0000423
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000424 // Otherwise link libSystem, then the dynamic runtime library, and finally any
425 // target specific static runtime library.
Daniel Dunbar6276f992009-09-18 08:15:13 +0000426 CmdArgs.push_back("-lSystem");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000427
428 // Select the dynamic runtime library and the target specific static library.
Tim Northover6f3ff222015-10-30 16:30:27 +0000429 if (isTargetWatchOSBased()) {
430 // We currently always need a static runtime library for watchOS.
431 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.watchos.a");
432 } else if (isTargetTvOSBased()) {
433 // We currently always need a static runtime library for tvOS.
434 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.tvos.a");
435 } else if (isTargetIOSBased()) {
Daniel Dunbar2f31fb92011-04-30 04:25:16 +0000436 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
437 // it never went into the SDK.
Bob Wilson102be442011-10-07 17:54:41 +0000438 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
Tim Northovera2ee4332014-03-29 15:09:45 +0000439 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
Tim Northover40956e62014-07-23 12:32:58 +0000440 getTriple().getArch() != llvm::Triple::aarch64)
Bob Wilson102be442011-10-07 17:54:41 +0000441 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000442
Daniel Dunbard1076382011-04-18 23:48:36 +0000443 // We currently always need a static runtime library for iOS.
Eric Christopherc235d0c62011-06-22 17:41:40 +0000444 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000445 } else {
Tim Northover9c7e0352013-12-12 11:55:52 +0000446 assert(isTargetMacOS() && "unexpected non MacOS platform");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000447 // The dynamic runtime library was merged with libSystem for 10.6 and
448 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000449 if (isMacosxVersionLT(10, 5))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000450 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000451 else if (isMacosxVersionLT(10, 6))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000452 CmdArgs.push_back("-lgcc_s.10.5");
453
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000454 // For OS X, we thought we would only need a static runtime library when
Chris Lattner57540c52011-04-15 05:22:18 +0000455 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000456 // omitted from 10.4.dylib.
457 //
458 // Unfortunately, that turned out to not be true, because Darwin system
459 // headers can still use eprintf on i386, and it is not exported from
460 // libSystem. Therefore, we still must provide a runtime library just for
461 // the tiny tiny handful of projects that *might* use that symbol.
462 if (isMacosxVersionLT(10, 5)) {
Eric Christopherc235d0c62011-06-22 17:41:40 +0000463 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000464 } else {
465 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopherc235d0c62011-06-22 17:41:40 +0000466 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
467 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000468 }
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000469 }
Daniel Dunbar6276f992009-09-18 08:15:13 +0000470}
471
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000472void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +0000473 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000474
Daniel Dunbar455a0492012-08-17 18:43:50 +0000475 // Support allowing the SDKROOT environment variable used by xcrun and other
476 // Xcode tools to define the default sysroot, by making it the default for
477 // isysroot.
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000478 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
479 // Warn if the path does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000480 if (!getVFS().exists(A->getValue()))
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000481 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
482 } else {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000483 if (char *env = ::getenv("SDKROOT")) {
Daniel Dunbarb2543042013-01-15 20:33:56 +0000484 // We only use this value as the default if it is an absolute path,
485 // exists, and it is not the root path.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000486 if (llvm::sys::path::is_absolute(env) && getVFS().exists(env) &&
Daniel Dunbarb2543042013-01-15 20:33:56 +0000487 StringRef(env) != "/") {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000488 Args.append(Args.MakeSeparateArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000489 nullptr, Opts.getOption(options::OPT_isysroot), env));
Daniel Dunbar455a0492012-08-17 18:43:50 +0000490 }
491 }
492 }
493
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000494 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000495 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
Tim Northover6f3ff222015-10-30 16:30:27 +0000496 Arg *TvOSVersion = Args.getLastArg(options::OPT_mtvos_version_min_EQ);
497 Arg *WatchOSVersion = Args.getLastArg(options::OPT_mwatchos_version_min_EQ);
Eli Friedman027e9c32012-01-11 02:41:15 +0000498
Tim Northover6f3ff222015-10-30 16:30:27 +0000499 if (OSXVersion && (iOSVersion || TvOSVersion || WatchOSVersion)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000500 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Tim Northover6f3ff222015-10-30 16:30:27 +0000501 << OSXVersion->getAsString(Args)
502 << (iOSVersion ? iOSVersion :
503 TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
504 iOSVersion = TvOSVersion = WatchOSVersion = nullptr;
505 } else if (iOSVersion && (TvOSVersion || WatchOSVersion)) {
506 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
507 << iOSVersion->getAsString(Args)
508 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
509 TvOSVersion = WatchOSVersion = nullptr;
510 } else if (TvOSVersion && WatchOSVersion) {
511 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
512 << TvOSVersion->getAsString(Args)
513 << WatchOSVersion->getAsString(Args);
514 WatchOSVersion = nullptr;
515 } else if (!OSXVersion && !iOSVersion && !TvOSVersion && !WatchOSVersion) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000516 // If no deployment target was specified on the command line, check for
Daniel Dunbard54669d2010-01-26 01:45:19 +0000517 // environment defines.
Alexey Samsonov905c8022015-06-18 21:46:05 +0000518 std::string OSXTarget;
519 std::string iOSTarget;
Tim Northover6f3ff222015-10-30 16:30:27 +0000520 std::string TvOSTarget;
521 std::string WatchOSTarget;
522
Chad Rosier64707fe2011-08-31 20:56:25 +0000523 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
524 OSXTarget = env;
525 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
526 iOSTarget = env;
Tim Northover6f3ff222015-10-30 16:30:27 +0000527 if (char *env = ::getenv("TVOS_DEPLOYMENT_TARGET"))
528 TvOSTarget = env;
529 if (char *env = ::getenv("WATCHOS_DEPLOYMENT_TARGET"))
530 WatchOSTarget = env;
Daniel Dunbarb5023e92009-04-10 21:00:07 +0000531
Steven Wu7a1372c2015-06-25 01:59:35 +0000532 // If there is no command-line argument to specify the Target version and
533 // no environment variable defined, see if we can set the default based
534 // on -isysroot.
Tim Northover6f3ff222015-10-30 16:30:27 +0000535 if (OSXTarget.empty() && iOSTarget.empty() && WatchOSTarget.empty() &&
Frederic Riss3ad83bd2016-01-12 23:47:59 +0000536 TvOSTarget.empty() && Args.hasArg(options::OPT_isysroot)) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000537 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000538 StringRef isysroot = A->getValue();
Steven Wu7a1372c2015-06-25 01:59:35 +0000539 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
540 size_t BeginSDK = isysroot.rfind("SDKs/");
541 size_t EndSDK = isysroot.rfind(".sdk");
542 if (BeginSDK != StringRef::npos && EndSDK != StringRef::npos) {
543 StringRef SDK = isysroot.slice(BeginSDK + 5, EndSDK);
544 // Slice the version number out.
545 // Version number is between the first and the last number.
546 size_t StartVer = SDK.find_first_of("0123456789");
547 size_t EndVer = SDK.find_last_of("0123456789");
548 if (StartVer != StringRef::npos && EndVer > StartVer) {
549 StringRef Version = SDK.slice(StartVer, EndVer + 1);
550 if (SDK.startswith("iPhoneOS") ||
551 SDK.startswith("iPhoneSimulator"))
552 iOSTarget = Version;
553 else if (SDK.startswith("MacOSX"))
554 OSXTarget = Version;
Tim Northover6f3ff222015-10-30 16:30:27 +0000555 else if (SDK.startswith("WatchOS") ||
556 SDK.startswith("WatchSimulator"))
557 WatchOSTarget = Version;
558 else if (SDK.startswith("AppleTVOS") ||
559 SDK.startswith("AppleTVSimulator"))
560 TvOSTarget = Version;
Steven Wu7a1372c2015-06-25 01:59:35 +0000561 }
562 }
Chad Rosier64707fe2011-08-31 20:56:25 +0000563 }
564 }
Daniel Dunbard54669d2010-01-26 01:45:19 +0000565
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000566 // If no OSX or iOS target has been specified, try to guess platform
Alexey Samsonov905c8022015-06-18 21:46:05 +0000567 // from arch name and compute the version from the triple.
Tim Northover6f3ff222015-10-30 16:30:27 +0000568 if (OSXTarget.empty() && iOSTarget.empty() && TvOSTarget.empty() &&
569 WatchOSTarget.empty()) {
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000570 StringRef MachOArchName = getMachOArchName(Args);
Alexey Samsonov905c8022015-06-18 21:46:05 +0000571 unsigned Major, Minor, Micro;
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000572 if (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
Alexey Samsonov905c8022015-06-18 21:46:05 +0000573 MachOArchName == "arm64") {
574 getTriple().getiOSVersion(Major, Minor, Micro);
575 llvm::raw_string_ostream(iOSTarget) << Major << '.' << Minor << '.'
576 << Micro;
Tim Northover6f3ff222015-10-30 16:30:27 +0000577 } else if (MachOArchName == "armv7k") {
578 getTriple().getWatchOSVersion(Major, Minor, Micro);
579 llvm::raw_string_ostream(WatchOSTarget) << Major << '.' << Minor << '.'
580 << Micro;
Alexey Samsonov905c8022015-06-18 21:46:05 +0000581 } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
582 MachOArchName != "armv7em") {
583 if (!getTriple().getMacOSXVersion(Major, Minor, Micro)) {
584 getDriver().Diag(diag::err_drv_invalid_darwin_version)
585 << getTriple().getOSName();
586 }
587 llvm::raw_string_ostream(OSXTarget) << Major << '.' << Minor << '.'
588 << Micro;
589 }
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000590 }
Chad Rosierfe6fd362011-09-28 00:46:32 +0000591
Tim Northover6f3ff222015-10-30 16:30:27 +0000592 // Do not allow conflicts with the watchOS target.
593 if (!WatchOSTarget.empty() && (!iOSTarget.empty() || !TvOSTarget.empty())) {
594 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
595 << "WATCHOS_DEPLOYMENT_TARGET"
596 << (!iOSTarget.empty() ? "IPHONEOS_DEPLOYMENT_TARGET" :
597 "TVOS_DEPLOYMENT_TARGET");
598 }
599
600 // Do not allow conflicts with the tvOS target.
601 if (!TvOSTarget.empty() && !iOSTarget.empty()) {
602 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
603 << "TVOS_DEPLOYMENT_TARGET"
604 << "IPHONEOS_DEPLOYMENT_TARGET";
605 }
606
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000607 // Allow conflicts among OSX and iOS for historical reasons, but choose the
608 // default platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000609 if (!OSXTarget.empty() && (!iOSTarget.empty() ||
610 !WatchOSTarget.empty() ||
611 !TvOSTarget.empty())) {
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000612 if (getTriple().getArch() == llvm::Triple::arm ||
Tim Northover573cbee2014-05-24 12:52:07 +0000613 getTriple().getArch() == llvm::Triple::aarch64 ||
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000614 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosier64707fe2011-08-31 20:56:25 +0000615 OSXTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000616 else
Tim Northover6f3ff222015-10-30 16:30:27 +0000617 iOSTarget = WatchOSTarget = TvOSTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000618 }
Daniel Dunbar65969842010-01-29 17:02:25 +0000619
Chad Rosier64707fe2011-08-31 20:56:25 +0000620 if (!OSXTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000621 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000622 OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000623 Args.append(OSXVersion);
Chad Rosier64707fe2011-08-31 20:56:25 +0000624 } else if (!iOSTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000625 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000626 iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000627 Args.append(iOSVersion);
Tim Northover6f3ff222015-10-30 16:30:27 +0000628 } else if (!TvOSTarget.empty()) {
629 const Option O = Opts.getOption(options::OPT_mtvos_version_min_EQ);
630 TvOSVersion = Args.MakeJoinedArg(nullptr, O, TvOSTarget);
631 Args.append(TvOSVersion);
632 } else if (!WatchOSTarget.empty()) {
633 const Option O = Opts.getOption(options::OPT_mwatchos_version_min_EQ);
634 WatchOSVersion = Args.MakeJoinedArg(nullptr, O, WatchOSTarget);
635 Args.append(WatchOSVersion);
Daniel Dunbar84e727f2009-09-04 18:35:21 +0000636 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000637 }
Mike Stump11289f42009-09-09 15:08:12 +0000638
Tim Northover9c7e0352013-12-12 11:55:52 +0000639 DarwinPlatformKind Platform;
640 if (OSXVersion)
641 Platform = MacOS;
642 else if (iOSVersion)
643 Platform = IPhoneOS;
Tim Northover6f3ff222015-10-30 16:30:27 +0000644 else if (TvOSVersion)
645 Platform = TvOS;
646 else if (WatchOSVersion)
647 Platform = WatchOS;
Tim Northover9c7e0352013-12-12 11:55:52 +0000648 else
Tim Northover157d9112014-01-16 08:48:16 +0000649 llvm_unreachable("Unable to infer Darwin variant");
Tim Northover9c7e0352013-12-12 11:55:52 +0000650
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000651 // Set the tool chain target information.
652 unsigned Major, Minor, Micro;
653 bool HadExtra;
Tim Northover9c7e0352013-12-12 11:55:52 +0000654 if (Platform == MacOS) {
Tim Northover6f3ff222015-10-30 16:30:27 +0000655 assert((!iOSVersion && !TvOSVersion && !WatchOSVersion) &&
656 "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000657 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, Micro,
658 HadExtra) ||
659 HadExtra || Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000660 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000661 << OSXVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000662 } else if (Platform == IPhoneOS) {
663 assert(iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000664 if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
665 HadExtra) ||
666 HadExtra || Major >= 10 || Minor >= 100 || Micro >= 100)
Eli Friedman027e9c32012-01-11 02:41:15 +0000667 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000668 << iOSVersion->getAsString(Args);
Tim Northover6f3ff222015-10-30 16:30:27 +0000669 } else if (Platform == TvOS) {
670 if (!Driver::GetReleaseVersion(TvOSVersion->getValue(), Major, Minor,
671 Micro, HadExtra) || HadExtra ||
672 Major >= 10 || Minor >= 100 || Micro >= 100)
673 getDriver().Diag(diag::err_drv_invalid_version_number)
674 << TvOSVersion->getAsString(Args);
675 } else if (Platform == WatchOS) {
676 if (!Driver::GetReleaseVersion(WatchOSVersion->getValue(), Major, Minor,
677 Micro, HadExtra) || HadExtra ||
678 Major >= 10 || Minor >= 100 || Micro >= 100)
679 getDriver().Diag(diag::err_drv_invalid_version_number)
680 << WatchOSVersion->getAsString(Args);
Tim Northover157d9112014-01-16 08:48:16 +0000681 } else
682 llvm_unreachable("unknown kind of Darwin platform");
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000683
Bob Wilson7f294b52014-10-10 23:10:10 +0000684 // Recognize iOS targets with an x86 architecture as the iOS simulator.
Daniel Dunbarb1189432011-04-30 04:18:16 +0000685 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
686 getTriple().getArch() == llvm::Triple::x86_64))
Tim Northover9c7e0352013-12-12 11:55:52 +0000687 Platform = IPhoneOSSimulator;
Tim Northover6f3ff222015-10-30 16:30:27 +0000688 if (TvOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
689 getTriple().getArch() == llvm::Triple::x86_64))
690 Platform = TvOSSimulator;
691 if (WatchOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
692 getTriple().getArch() == llvm::Triple::x86_64))
693 Platform = WatchOSSimulator;
Daniel Dunbarb1189432011-04-30 04:18:16 +0000694
Tim Northover9c7e0352013-12-12 11:55:52 +0000695 setTarget(Platform, Major, Minor, Micro);
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000696}
697
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000698void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000699 ArgStringList &CmdArgs) const {
700 CXXStdlibType Type = GetCXXStdlibType(Args);
701
702 switch (Type) {
703 case ToolChain::CST_Libcxx:
704 CmdArgs.push_back("-lc++");
705 break;
706
Hans Wennborgdcfba332015-10-06 23:40:43 +0000707 case ToolChain::CST_Libstdcxx:
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000708 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
709 // it was previously found in the gcc lib dir. However, for all the Darwin
710 // platforms we care about it was -lstdc++.6, so we search for that
711 // explicitly if we can't see an obvious -lstdc++ candidate.
712
713 // Check in the sysroot first.
714 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000715 SmallString<128> P(A->getValue());
Benjamin Kramer17381a02013-06-28 16:25:46 +0000716 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000717
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000718 if (!getVFS().exists(P)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000719 llvm::sys::path::remove_filename(P);
720 llvm::sys::path::append(P, "libstdc++.6.dylib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000721 if (getVFS().exists(P)) {
Yaron Keren92e1b622015-03-18 10:17:07 +0000722 CmdArgs.push_back(Args.MakeArgString(P));
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000723 return;
724 }
725 }
726 }
727
728 // Otherwise, look in the root.
Bob Wilson1a9ad0f2011-11-11 07:47:04 +0000729 // FIXME: This should be removed someday when we don't have to care about
730 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000731 if (!getVFS().exists("/usr/lib/libstdc++.dylib") &&
732 getVFS().exists("/usr/lib/libstdc++.6.dylib")) {
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000733 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
734 return;
735 }
736
737 // Otherwise, let the linker search.
738 CmdArgs.push_back("-lstdc++");
739 break;
740 }
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000741}
742
Shantonu Senafeb03b2010-09-17 18:39:08 +0000743void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
744 ArgStringList &CmdArgs) const {
745
746 // For Darwin platforms, use the compiler-rt-based support library
747 // instead of the gcc-provided one (which is also incidentally
748 // only present in the gcc lib dir, which makes it hard to find).
749
Rafael Espindola358256c2013-06-26 02:13:00 +0000750 SmallString<128> P(getDriver().ResourceDir);
Benjamin Kramer17381a02013-06-28 16:25:46 +0000751 llvm::sys::path::append(P, "lib", "darwin");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000752
753 // Use the newer cc_kext for iOS ARM after 6.0.
Tim Northover6f3ff222015-10-30 16:30:27 +0000754 if (isTargetWatchOS()) {
755 llvm::sys::path::append(P, "libclang_rt.cc_kext_watchos.a");
756 } else if (isTargetTvOS()) {
757 llvm::sys::path::append(P, "libclang_rt.cc_kext_tvos.a");
758 } else if (isTargetIPhoneOS()) {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000759 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000760 } else {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000761 llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000762 }
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000763
Shantonu Senafeb03b2010-09-17 18:39:08 +0000764 // For now, allow missing resource libraries to support developers who may
765 // not have compiler-rt checked out or integrated into their build.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000766 if (getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000767 CmdArgs.push_back(Args.MakeArgString(P));
Shantonu Senafeb03b2010-09-17 18:39:08 +0000768}
769
Tim Northover157d9112014-01-16 08:48:16 +0000770DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
771 const char *BoundArch) const {
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000772 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
773 const OptTable &Opts = getDriver().getOpts();
774
775 // FIXME: We really want to get out of the tool chain level argument
776 // translation business, as it makes the driver functionality much
777 // more opaque. For now, we follow gcc closely solely for the
778 // purpose of easily achieving feature parity & testability. Once we
779 // have something that works, we should reevaluate each translation
780 // and try to push it down into tool specific logic.
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000781
Simon Atanasyan6f657c42014-05-08 19:32:46 +0000782 for (Arg *A : Args) {
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000783 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar471c4f82011-06-21 00:20:17 +0000784 // Skip this argument unless the architecture matches either the toolchain
785 // triple arch, or the arch being bound.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000786 llvm::Triple::ArchType XarchArch =
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000787 tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
788 if (!(XarchArch == getArch() ||
789 (BoundArch &&
790 XarchArch ==
791 tools::darwin::getArchTypeForMachOArchName(BoundArch))))
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000792 continue;
793
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000794 Arg *OriginalArg = A;
Richard Smithbd55daf2012-11-01 04:30:05 +0000795 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000796 unsigned Prev = Index;
Nico Webera04d5f82014-05-11 17:27:13 +0000797 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
Mike Stump11289f42009-09-09 15:08:12 +0000798
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000799 // If the argument parsing failed or more than one argument was
800 // consumed, the -Xarch_ argument's parameter tried to consume
801 // extra arguments. Emit an error and ignore.
802 //
803 // We also want to disallow any options which would alter the
804 // driver behavior; that isn't going to work in our model. We
805 // use isDriverOption() as an approximation, although things
806 // like -O4 are going to slip through.
Daniel Dunbar5a784c82011-04-21 17:41:34 +0000807 if (!XarchArg || Index > Prev + 1) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000808 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000809 << A->getAsString(Args);
Daniel Dunbar6914a982011-04-21 17:32:21 +0000810 continue;
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000811 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000812 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000813 << A->getAsString(Args);
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000814 continue;
815 }
816
Daniel Dunbar53b406f2009-03-29 22:29:05 +0000817 XarchArg->setBaseArg(A);
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000818
Nico Webera04d5f82014-05-11 17:27:13 +0000819 A = XarchArg.release();
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000820 DAL->AddSynthesizedArg(A);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000821
822 // Linker input arguments require custom handling. The problem is that we
823 // have already constructed the phase actions, so we can not treat them as
824 // "input arguments".
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000825 if (A->getOption().hasFlag(options::LinkerInput)) {
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000826 // Convert the argument into individual Zlinker_input_args.
Douglas Katzman6bbffc42015-06-25 18:51:37 +0000827 for (const char *Value : A->getValues()) {
828 DAL->AddSeparateArg(
829 OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000830 }
831 continue;
832 }
Mike Stump11289f42009-09-09 15:08:12 +0000833 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000834
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000835 // Sob. These is strictly gcc compatible for the time being. Apple
836 // gcc translates options twice, which means that self-expanding
837 // options add duplicates.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000838 switch ((options::ID)A->getOption().getID()) {
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000839 default:
840 DAL->append(A);
841 break;
842
843 case options::OPT_mkernel:
844 case options::OPT_fapple_kext:
845 DAL->append(A);
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000846 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000847 break;
Mike Stump11289f42009-09-09 15:08:12 +0000848
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000849 case options::OPT_dependency_file:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000850 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000851 break;
852
853 case options::OPT_gfull:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000854 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000855 DAL->AddFlagArg(
856 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000857 break;
858
859 case options::OPT_gused:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000860 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000861 DAL->AddFlagArg(
862 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000863 break;
864
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000865 case options::OPT_shared:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000866 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000867 break;
868
869 case options::OPT_fconstant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000870 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000871 break;
872
873 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000874 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000875 break;
876
877 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000878 DAL->AddFlagArg(A,
879 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000880 break;
881
882 case options::OPT_Wno_nonportable_cfstrings:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000883 DAL->AddFlagArg(
884 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000885 break;
886
887 case options::OPT_fpascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000888 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000889 break;
890
891 case options::OPT_fno_pascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000892 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000893 break;
894 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000895 }
896
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000897 if (getTriple().getArch() == llvm::Triple::x86 ||
898 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbarfffd1812009-11-19 04:00:53 +0000899 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000900 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
901 "core2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000902
903 // Add the arch options based on the particular spelling of -arch, to match
Chad Rosier7c5d9082012-04-27 14:58:16 +0000904 // how the driver driver works.
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000905 if (BoundArch) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000906 StringRef Name = BoundArch;
Michael J. Spencerfc790902012-10-19 22:36:40 +0000907 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
908 const Option MArch = Opts.getOption(options::OPT_march_EQ);
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000909
910 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
911 // which defines the list of which architectures we accept.
912 if (Name == "ppc")
913 ;
914 else if (Name == "ppc601")
Craig Topper92fc2df2014-05-17 16:56:41 +0000915 DAL->AddJoinedArg(nullptr, MCpu, "601");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000916 else if (Name == "ppc603")
Craig Topper92fc2df2014-05-17 16:56:41 +0000917 DAL->AddJoinedArg(nullptr, MCpu, "603");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000918 else if (Name == "ppc604")
Craig Topper92fc2df2014-05-17 16:56:41 +0000919 DAL->AddJoinedArg(nullptr, MCpu, "604");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000920 else if (Name == "ppc604e")
Craig Topper92fc2df2014-05-17 16:56:41 +0000921 DAL->AddJoinedArg(nullptr, MCpu, "604e");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000922 else if (Name == "ppc750")
Craig Topper92fc2df2014-05-17 16:56:41 +0000923 DAL->AddJoinedArg(nullptr, MCpu, "750");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000924 else if (Name == "ppc7400")
Craig Topper92fc2df2014-05-17 16:56:41 +0000925 DAL->AddJoinedArg(nullptr, MCpu, "7400");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000926 else if (Name == "ppc7450")
Craig Topper92fc2df2014-05-17 16:56:41 +0000927 DAL->AddJoinedArg(nullptr, MCpu, "7450");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000928 else if (Name == "ppc970")
Craig Topper92fc2df2014-05-17 16:56:41 +0000929 DAL->AddJoinedArg(nullptr, MCpu, "970");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000930
Bill Schmidt778d3872013-07-26 01:36:11 +0000931 else if (Name == "ppc64" || Name == "ppc64le")
Craig Topper92fc2df2014-05-17 16:56:41 +0000932 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000933
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000934 else if (Name == "i386")
935 ;
936 else if (Name == "i486")
Craig Topper92fc2df2014-05-17 16:56:41 +0000937 DAL->AddJoinedArg(nullptr, MArch, "i486");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000938 else if (Name == "i586")
Craig Topper92fc2df2014-05-17 16:56:41 +0000939 DAL->AddJoinedArg(nullptr, MArch, "i586");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000940 else if (Name == "i686")
Craig Topper92fc2df2014-05-17 16:56:41 +0000941 DAL->AddJoinedArg(nullptr, MArch, "i686");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000942 else if (Name == "pentium")
Craig Topper92fc2df2014-05-17 16:56:41 +0000943 DAL->AddJoinedArg(nullptr, MArch, "pentium");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000944 else if (Name == "pentium2")
Craig Topper92fc2df2014-05-17 16:56:41 +0000945 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000946 else if (Name == "pentpro")
Craig Topper92fc2df2014-05-17 16:56:41 +0000947 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000948 else if (Name == "pentIIm3")
Craig Topper92fc2df2014-05-17 16:56:41 +0000949 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000950
951 else if (Name == "x86_64")
Craig Topper92fc2df2014-05-17 16:56:41 +0000952 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Jim Grosbach82eee262013-11-16 00:53:35 +0000953 else if (Name == "x86_64h") {
Craig Topper92fc2df2014-05-17 16:56:41 +0000954 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
955 DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
Jim Grosbach82eee262013-11-16 00:53:35 +0000956 }
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000957
958 else if (Name == "arm")
Craig Topper92fc2df2014-05-17 16:56:41 +0000959 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000960 else if (Name == "armv4t")
Craig Topper92fc2df2014-05-17 16:56:41 +0000961 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000962 else if (Name == "armv5")
Craig Topper92fc2df2014-05-17 16:56:41 +0000963 DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000964 else if (Name == "xscale")
Craig Topper92fc2df2014-05-17 16:56:41 +0000965 DAL->AddJoinedArg(nullptr, MArch, "xscale");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000966 else if (Name == "armv6")
Craig Topper92fc2df2014-05-17 16:56:41 +0000967 DAL->AddJoinedArg(nullptr, MArch, "armv6k");
Bob Wilson743bf672013-03-04 22:37:49 +0000968 else if (Name == "armv6m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000969 DAL->AddJoinedArg(nullptr, MArch, "armv6m");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000970 else if (Name == "armv7")
Craig Topper92fc2df2014-05-17 16:56:41 +0000971 DAL->AddJoinedArg(nullptr, MArch, "armv7a");
Bob Wilson743bf672013-03-04 22:37:49 +0000972 else if (Name == "armv7em")
Craig Topper92fc2df2014-05-17 16:56:41 +0000973 DAL->AddJoinedArg(nullptr, MArch, "armv7em");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000974 else if (Name == "armv7k")
Craig Topper92fc2df2014-05-17 16:56:41 +0000975 DAL->AddJoinedArg(nullptr, MArch, "armv7k");
Bob Wilson743bf672013-03-04 22:37:49 +0000976 else if (Name == "armv7m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000977 DAL->AddJoinedArg(nullptr, MArch, "armv7m");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000978 else if (Name == "armv7s")
Craig Topper92fc2df2014-05-17 16:56:41 +0000979 DAL->AddJoinedArg(nullptr, MArch, "armv7s");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000980 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000981
Tim Northover157d9112014-01-16 08:48:16 +0000982 return DAL;
983}
984
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000985void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
986 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000987 // Embedded targets are simple at the moment, not supporting sanitizers and
988 // with different libraries for each member of the product { static, PIC } x
989 // { hard-float, soft-float }
990 llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000991 CompilerRT +=
992 (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
993 ? "hard"
994 : "soft";
Tim Northover157d9112014-01-16 08:48:16 +0000995 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
996
997 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
998}
999
Tim Northover157d9112014-01-16 08:48:16 +00001000DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
1001 const char *BoundArch) const {
1002 // First get the generic Apple args, before moving onto Darwin-specific ones.
1003 DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
1004 const OptTable &Opts = getDriver().getOpts();
1005
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001006 // If no architecture is bound, none of the translations here are relevant.
1007 if (!BoundArch)
1008 return DAL;
1009
Daniel Dunbar354e96d2010-07-19 17:11:36 +00001010 // Add an explicit version min argument for the deployment target. We do this
1011 // after argument translation because -Xarch_ arguments may add a version min
1012 // argument.
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001013 AddDeploymentTarget(*DAL);
Daniel Dunbar354e96d2010-07-19 17:11:36 +00001014
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001015 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
1016 // FIXME: It would be far better to avoid inserting those -static arguments,
1017 // but we can't check the deployment target in the translation code until
1018 // it is set here.
Tim Northover6f3ff222015-10-30 16:30:27 +00001019 if (isTargetWatchOSBased() ||
1020 (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0))) {
1021 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001022 Arg *A = *it;
1023 ++it;
1024 if (A->getOption().getID() != options::OPT_mkernel &&
1025 A->getOption().getID() != options::OPT_fapple_kext)
1026 continue;
1027 assert(it != ie && "unexpected argument translation");
1028 A = *it;
1029 assert(A->getOption().getID() == options::OPT_static &&
1030 "missing expected -static argument");
1031 it = DAL->getArgs().erase(it);
1032 }
1033 }
1034
Bob Wilson0f7445b2013-11-02 23:19:53 +00001035 // Default to use libc++ on OS X 10.9+ and iOS 7+.
1036 if (((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
Tim Northover6f3ff222015-10-30 16:30:27 +00001037 (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0)) ||
1038 isTargetWatchOSBased()) &&
Bob Wilson0f7445b2013-11-02 23:19:53 +00001039 !Args.getLastArg(options::OPT_stdlib_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +00001040 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
1041 "libc++");
Bob Wilson0f7445b2013-11-02 23:19:53 +00001042
Bob Wilson102be442011-10-07 17:54:41 +00001043 // Validate the C++ standard library choice.
1044 CXXStdlibType Type = GetCXXStdlibType(*DAL);
1045 if (Type == ToolChain::CST_Libcxx) {
John McCall5fb5df92012-06-20 06:18:46 +00001046 // Check whether the target provides libc++.
1047 StringRef where;
1048
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001049 // Complain about targeting iOS < 5.0 in any way.
Tim Northover9c7e0352013-12-12 11:55:52 +00001050 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
Bob Wilson5ad5a952012-11-09 01:59:30 +00001051 where = "iOS 5.0";
John McCall5fb5df92012-06-20 06:18:46 +00001052
1053 if (where != StringRef()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001054 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where;
Bob Wilson102be442011-10-07 17:54:41 +00001055 }
1056 }
1057
Daniel Dunbaraabb0b12009-03-25 06:12:34 +00001058 return DAL;
Mike Stump11289f42009-09-09 15:08:12 +00001059}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001060
Tim Northover157d9112014-01-16 08:48:16 +00001061bool MachO::IsUnwindTablesDefault() const {
Rafael Espindolae8bd4e52012-10-07 03:23:40 +00001062 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001063}
1064
Tim Northover157d9112014-01-16 08:48:16 +00001065bool MachO::UseDwarfDebugFlags() const {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00001066 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
1067 return S[0] != '\0';
1068 return false;
1069}
1070
Tim Northovere931f9f2015-10-30 16:30:41 +00001071bool Darwin::UseSjLjExceptions(const ArgList &Args) const {
Daniel Dunbar3241d402010-02-10 18:49:11 +00001072 // Darwin uses SjLj exceptions on ARM.
Tim Northovere931f9f2015-10-30 16:30:41 +00001073 if (getTriple().getArch() != llvm::Triple::arm &&
1074 getTriple().getArch() != llvm::Triple::thumb)
1075 return false;
1076
Tim Northoverc741b042015-11-17 18:27:27 +00001077 // Only watchOS uses the new DWARF/Compact unwinding method.
1078 return !isTargetWatchOS();
Daniel Dunbar3241d402010-02-10 18:49:11 +00001079}
1080
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001081bool MachO::isPICDefault() const { return true; }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001082
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001083bool MachO::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001084
Tim Northover157d9112014-01-16 08:48:16 +00001085bool MachO::isPICDefaultForced() const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001086 return (getArch() == llvm::Triple::x86_64 ||
Tim Northover573cbee2014-05-24 12:52:07 +00001087 getArch() == llvm::Triple::aarch64);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001088}
1089
Tim Northover157d9112014-01-16 08:48:16 +00001090bool MachO::SupportsProfiling() const {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001091 // Profiling instrumentation is only supported on x86.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00001092 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001093}
1094
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001095void Darwin::addMinVersionArgs(const ArgList &Args,
1096 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001097 VersionTuple TargetVersion = getTargetVersion();
1098
Tim Northover6f3ff222015-10-30 16:30:27 +00001099 if (isTargetWatchOS())
1100 CmdArgs.push_back("-watchos_version_min");
1101 else if (isTargetWatchOSSimulator())
1102 CmdArgs.push_back("-watchos_simulator_version_min");
1103 else if (isTargetTvOS())
1104 CmdArgs.push_back("-tvos_version_min");
1105 else if (isTargetTvOSSimulator())
1106 CmdArgs.push_back("-tvos_simulator_version_min");
1107 else if (isTargetIOSSimulator())
Tim Northover157d9112014-01-16 08:48:16 +00001108 CmdArgs.push_back("-ios_simulator_version_min");
Bob Wilson5cfc55e2014-02-01 21:06:21 +00001109 else if (isTargetIOSBased())
Tim Northover157d9112014-01-16 08:48:16 +00001110 CmdArgs.push_back("-iphoneos_version_min");
1111 else {
1112 assert(isTargetMacOS() && "unexpected target");
1113 CmdArgs.push_back("-macosx_version_min");
1114 }
1115
1116 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
1117}
1118
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001119void Darwin::addStartObjectFileArgs(const ArgList &Args,
1120 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001121 // Derived from startfile spec.
1122 if (Args.hasArg(options::OPT_dynamiclib)) {
1123 // Derived from darwin_dylib1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001124 if (isTargetWatchOSBased()) {
1125 ; // watchOS does not need dylib1.o.
1126 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001127 ; // iOS simulator does not need dylib1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001128 } else if (isTargetIPhoneOS()) {
1129 if (isIPhoneOSVersionLT(3, 1))
1130 CmdArgs.push_back("-ldylib1.o");
1131 } else {
1132 if (isMacosxVersionLT(10, 5))
1133 CmdArgs.push_back("-ldylib1.o");
1134 else if (isMacosxVersionLT(10, 6))
1135 CmdArgs.push_back("-ldylib1.10.5.o");
1136 }
1137 } else {
1138 if (Args.hasArg(options::OPT_bundle)) {
1139 if (!Args.hasArg(options::OPT_static)) {
1140 // Derived from darwin_bundle1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001141 if (isTargetWatchOSBased()) {
1142 ; // watchOS does not need bundle1.o.
1143 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001144 ; // iOS simulator does not need bundle1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001145 } else if (isTargetIPhoneOS()) {
1146 if (isIPhoneOSVersionLT(3, 1))
1147 CmdArgs.push_back("-lbundle1.o");
1148 } else {
1149 if (isMacosxVersionLT(10, 6))
1150 CmdArgs.push_back("-lbundle1.o");
1151 }
1152 }
1153 } else {
1154 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1155 if (Args.hasArg(options::OPT_static) ||
1156 Args.hasArg(options::OPT_object) ||
1157 Args.hasArg(options::OPT_preload)) {
1158 CmdArgs.push_back("-lgcrt0.o");
1159 } else {
1160 CmdArgs.push_back("-lgcrt1.o");
1161
1162 // darwin_crt2 spec is empty.
1163 }
1164 // By default on OS X 10.8 and later, we don't link with a crt1.o
1165 // file and the linker knows to use _main as the entry point. But,
1166 // when compiling with -pg, we need to link with the gcrt1.o file,
1167 // so pass the -no_new_main option to tell the linker to use the
1168 // "start" symbol as the entry point.
1169 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1170 CmdArgs.push_back("-no_new_main");
1171 } else {
1172 if (Args.hasArg(options::OPT_static) ||
1173 Args.hasArg(options::OPT_object) ||
1174 Args.hasArg(options::OPT_preload)) {
1175 CmdArgs.push_back("-lcrt0.o");
1176 } else {
1177 // Derived from darwin_crt1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001178 if (isTargetWatchOSBased()) {
1179 ; // watchOS does not need crt1.o.
1180 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001181 ; // iOS simulator does not need crt1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001182 } else if (isTargetIPhoneOS()) {
Tim Northover40956e62014-07-23 12:32:58 +00001183 if (getArch() == llvm::Triple::aarch64)
Tim Northovera2ee4332014-03-29 15:09:45 +00001184 ; // iOS does not need any crt1 files for arm64
1185 else if (isIPhoneOSVersionLT(3, 1))
Tim Northover157d9112014-01-16 08:48:16 +00001186 CmdArgs.push_back("-lcrt1.o");
1187 else if (isIPhoneOSVersionLT(6, 0))
1188 CmdArgs.push_back("-lcrt1.3.1.o");
1189 } else {
1190 if (isMacosxVersionLT(10, 5))
1191 CmdArgs.push_back("-lcrt1.o");
1192 else if (isMacosxVersionLT(10, 6))
1193 CmdArgs.push_back("-lcrt1.10.5.o");
1194 else if (isMacosxVersionLT(10, 8))
1195 CmdArgs.push_back("-lcrt1.10.6.o");
1196
1197 // darwin_crt2 spec is empty.
1198 }
1199 }
1200 }
1201 }
1202 }
1203
1204 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
Tim Northover6f3ff222015-10-30 16:30:27 +00001205 !isTargetWatchOS() &&
Tim Northover157d9112014-01-16 08:48:16 +00001206 isMacosxVersionLT(10, 5)) {
1207 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1208 CmdArgs.push_back(Str);
1209 }
1210}
1211
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001212bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
Daniel Dunbar16334e12010-04-10 16:20:23 +00001213
John McCall3deb1ad2012-08-21 02:47:43 +00001214void Darwin::CheckObjCARC() const {
Tim Northover6f3ff222015-10-30 16:30:27 +00001215 if (isTargetIOSBased() || isTargetWatchOSBased() ||
1216 (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
John McCall3deb1ad2012-08-21 02:47:43 +00001217 return;
John McCall93207072012-08-27 01:56:21 +00001218 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00001219}
1220
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001221SanitizerMask Darwin::getSupportedSanitizers() const {
1222 SanitizerMask Res = ToolChain::getSupportedSanitizers();
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001223 if (isTargetMacOS() || isTargetIOSSimulator())
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001224 Res |= SanitizerKind::Address;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001225 if (isTargetMacOS()) {
1226 if (!isMacosxVersionLT(10, 9))
1227 Res |= SanitizerKind::Vptr;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001228 Res |= SanitizerKind::SafeStack;
Kuba Brecka85e01c02015-11-06 15:09:20 +00001229 Res |= SanitizerKind::Thread;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001230 }
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001231 return Res;
1232}
1233
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001234/// Generic_GCC - A tool chain using the 'gcc' command to perform
1235/// all subcommands; this relies on gcc translating the majority of
1236/// command line options.
1237
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001238/// \brief Parse a GCCVersion object out of a string of text.
1239///
1240/// This is the primary means of forming GCCVersion objects.
1241/*static*/
1242Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001243 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001244 std::pair<StringRef, StringRef> First = VersionText.split('.');
1245 std::pair<StringRef, StringRef> Second = First.second.split('.');
1246
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001247 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1248 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001249 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001250 GoodVersion.MajorStr = First.first.str();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001251 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001252 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001253 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001254
1255 // First look for a number prefix and parse that if present. Otherwise just
1256 // stash the entire patch string in the suffix, and leave the number
1257 // unspecified. This covers versions strings such as:
1258 // 4.4
1259 // 4.4.0
1260 // 4.4.x
1261 // 4.4.2-rc4
1262 // 4.4.x-patched
1263 // And retains any patch number it finds.
1264 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1265 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001266 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001267 // Try to parse the number and any suffix.
1268 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1269 GoodVersion.Patch < 0)
1270 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001271 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001272 }
1273 }
1274
1275 return GoodVersion;
1276}
1277
1278/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001279bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1280 int RHSPatch,
1281 StringRef RHSPatchSuffix) const {
1282 if (Major != RHSMajor)
1283 return Major < RHSMajor;
1284 if (Minor != RHSMinor)
1285 return Minor < RHSMinor;
1286 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001287 // Note that versions without a specified patch sort higher than those with
1288 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001289 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001290 return true;
1291 if (Patch == -1)
1292 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001293
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001294 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001295 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001296 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001297 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001298 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001299 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001300 return true;
1301 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001302 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001303
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001304 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001305 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001306 }
1307
1308 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001309 return false;
1310}
1311
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001312static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001313 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1314 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001315 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001316 return GCC_INSTALL_PREFIX;
1317}
1318
Roman Divacky326d9982013-12-06 18:32:18 +00001319/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001320///
1321/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001322/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001323///
1324/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1325/// should instead pull the target out of the driver. This is currently
1326/// necessary because the driver doesn't store the final version of the target
1327/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001328void Generic_GCC::GCCInstallationDetector::init(
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001329 const llvm::Triple &TargetTriple, const ArgList &Args,
Douglas Katzman8c39e6a2015-09-18 15:23:16 +00001330 ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001331 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1332 ? TargetTriple.get64BitArchVariant()
1333 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001334 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001335 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001336 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001337 SmallVector<StringRef, 16> CandidateTripleAliases;
1338 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001339 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1340 CandidateTripleAliases, CandidateBiarchLibDirs,
1341 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001342
1343 // Compute the set of prefixes for our search.
1344 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1345 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001346
Rafael Espindola1af7c212012-02-19 01:38:32 +00001347 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1348 if (GCCToolchainDir != "") {
1349 if (GCCToolchainDir.back() == '/')
1350 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001351
Rafael Espindola1af7c212012-02-19 01:38:32 +00001352 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001353 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001354 // If we have a SysRoot, try that first.
1355 if (!D.SysRoot.empty()) {
1356 Prefixes.push_back(D.SysRoot);
1357 Prefixes.push_back(D.SysRoot + "/usr");
1358 }
1359
1360 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001361 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001362
1363 // And finally in /usr.
1364 if (D.SysRoot.empty())
1365 Prefixes.push_back("/usr");
Rafael Espindolac29af942012-02-03 01:01:20 +00001366 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001367
1368 // Loop over the various components which exist and select the best GCC
1369 // installation available. GCC installs are ranked by version number.
1370 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001371 for (const std::string &Prefix : Prefixes) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001372 if (!D.getVFS().exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001373 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001374 for (StringRef Suffix : CandidateLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001375 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001376 if (!D.getVFS().exists(LibDir))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001377 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001378 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001379 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Benjamin Kramer72e64312015-09-24 14:48:49 +00001380 for (StringRef Candidate : CandidateTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001381 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001382 }
Benjamin Kramer72e64312015-09-24 14:48:49 +00001383 for (StringRef Suffix : CandidateBiarchLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001384 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001385 if (!D.getVFS().exists(LibDir))
Chandler Carruth866faab2012-01-25 07:21:38 +00001386 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001387 for (StringRef Candidate : CandidateBiarchTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001388 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001389 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001390 }
1391 }
1392}
1393
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001394void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001395 for (const auto &InstallPath : CandidateGCCInstallPaths)
1396 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001397
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001398 if (!GCCInstallPath.empty())
1399 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1400
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001401 for (const auto &Multilib : Multilibs)
1402 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001403
1404 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1405 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001406}
1407
1408bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1409 if (BiarchSibling.hasValue()) {
1410 M = BiarchSibling.getValue();
1411 return true;
1412 }
1413 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001414}
1415
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001416/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001417 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001418 SmallVectorImpl<StringRef> &LibDirs,
1419 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001420 SmallVectorImpl<StringRef> &BiarchLibDirs,
1421 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001422 // Declare a bunch of static data sets that we'll select between below. These
1423 // are specifically designed to always refer to string literals to avoid any
1424 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001425 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1426 static const char *const AArch64Triples[] = {
1427 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1428 "aarch64-redhat-linux"};
1429 static const char *const AArch64beLibDirs[] = {"/lib"};
1430 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1431 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001432
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001433 static const char *const ARMLibDirs[] = {"/lib"};
1434 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1435 "arm-linux-androideabi"};
1436 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1437 "armv7hl-redhat-linux-gnueabi"};
1438 static const char *const ARMebLibDirs[] = {"/lib"};
1439 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1440 "armeb-linux-androideabi"};
1441 static const char *const ARMebHFTriples[] = {
1442 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001443
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001444 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001445 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001446 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1447 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1448 "x86_64-redhat-linux", "x86_64-suse-linux",
1449 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1450 "x86_64-slackware-linux", "x86_64-linux-android",
1451 "x86_64-unknown-linux"};
1452 static const char *const X32LibDirs[] = {"/libx32"};
1453 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001454 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001455 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1456 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1457 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1458 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1459 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001460
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001461 static const char *const MIPSLibDirs[] = {"/lib"};
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001462 static const char *const MIPSTriples[] = {"mips-linux-gnu", "mips-mti-linux",
1463 "mips-mti-linux-gnu",
1464 "mips-img-linux-gnu"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001465 static const char *const MIPSELLibDirs[] = {"/lib"};
1466 static const char *const MIPSELTriples[] = {
1467 "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001468
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001469 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1470 static const char *const MIPS64Triples[] = {
1471 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1472 "mips64-linux-gnuabi64"};
1473 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1474 static const char *const MIPS64ELTriples[] = {
1475 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1476 "mips64el-linux-android", "mips64el-linux-gnuabi64"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001477
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001478 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001479 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001480 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1481 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1482 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1483 static const char *const PPC64Triples[] = {
1484 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1485 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1486 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1487 static const char *const PPC64LETriples[] = {
1488 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1489 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001490
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001491 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1492 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1493 "sparcv8-linux-gnu"};
1494 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1495 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1496 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001497
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001498 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001499 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001500 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1501 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001502
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001503 // Solaris.
1504 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1505 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1506 "i386-pc-solaris2.11"};
1507
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001508 using std::begin;
1509 using std::end;
1510
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001511 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1512 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1513 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001514 return;
1515 }
1516
Chandler Carruth866faab2012-01-25 07:21:38 +00001517 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001518 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001519 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1520 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1521 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1522 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001523 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001524 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001525 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1526 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1527 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1528 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001529 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001530 case llvm::Triple::arm:
1531 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001532 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001533 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001534 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001535 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001536 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001537 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001538 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001539 case llvm::Triple::armeb:
1540 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001541 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001542 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001543 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001544 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001545 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001546 }
1547 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001548 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001549 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1550 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1551 // x32 is always available when x86_64 is available, so adding it as
1552 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001553 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001554 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1555 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001556 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001557 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1558 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001559 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001560 break;
1561 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001562 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1563 TripleAliases.append(begin(X86Triples), end(X86Triples));
1564 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1565 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001566 break;
1567 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001568 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1569 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1570 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1571 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001572 break;
1573 case llvm::Triple::mipsel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001574 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1575 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1576 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1577 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1578 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001579 break;
1580 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001581 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1582 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1583 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1584 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001585 break;
1586 case llvm::Triple::mips64el:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001587 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1588 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1589 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1590 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1591 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001592 break;
1593 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001594 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1595 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1596 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1597 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001598 break;
1599 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001600 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1601 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1602 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1603 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001604 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001605 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001606 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1607 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001608 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001609 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001610 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001611 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1612 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1613 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1614 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001615 break;
1616 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001617 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1618 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1619 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1620 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001621 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001622 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001623 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1624 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001625 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001626 default:
1627 // By default, just rely on the standard lib directories and the original
1628 // triple.
1629 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001630 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001631
1632 // Always append the drivers target triple to the end, in case it doesn't
1633 // match any of our aliases.
1634 TripleAliases.push_back(TargetTriple.str());
1635
1636 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001637 if (TargetTriple.str() != BiarchTriple.str())
1638 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001639}
1640
Artem Belevich98607b62015-09-23 21:49:39 +00001641// \brief -- try common CUDA installation paths looking for files we need for
1642// CUDA compilation.
1643
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001644void Generic_GCC::CudaInstallationDetector::init(
1645 const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001646 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001647
1648 if (Args.hasArg(options::OPT_cuda_path_EQ))
1649 CudaPathCandidates.push_back(
1650 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1651 else {
1652 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
Artem Belevich86017332015-11-17 22:28:55 +00001653 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.5");
Artem Belevich98607b62015-09-23 21:49:39 +00001654 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1655 }
1656
Benjamin Kramere8b76412015-09-24 14:48:37 +00001657 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001658 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001659 continue;
1660
1661 CudaInstallPath = CudaPath;
Justin Lebar21e5d4f2016-01-14 21:41:27 +00001662 CudaBinPath = CudaPath + "/bin";
Artem Belevich98607b62015-09-23 21:49:39 +00001663 CudaIncludePath = CudaInstallPath + "/include";
1664 CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1665 CudaLibPath =
1666 CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1667
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001668 if (!(D.getVFS().exists(CudaIncludePath) &&
Justin Lebar21e5d4f2016-01-14 21:41:27 +00001669 D.getVFS().exists(CudaBinPath) && D.getVFS().exists(CudaLibPath) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001670 D.getVFS().exists(CudaLibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001671 continue;
1672
Artem Belevich34f481a2015-11-17 22:28:50 +00001673 std::error_code EC;
1674 for (llvm::sys::fs::directory_iterator LI(CudaLibDevicePath, EC), LE;
1675 !EC && LI != LE; LI = LI.increment(EC)) {
1676 StringRef FilePath = LI->path();
1677 StringRef FileName = llvm::sys::path::filename(FilePath);
1678 // Process all bitcode filenames that look like libdevice.compute_XX.YY.bc
1679 const StringRef LibDeviceName = "libdevice.";
1680 if (!(FileName.startswith(LibDeviceName) && FileName.endswith(".bc")))
1681 continue;
1682 StringRef GpuArch = FileName.slice(
1683 LibDeviceName.size(), FileName.find('.', LibDeviceName.size()));
1684 CudaLibDeviceMap[GpuArch] = FilePath.str();
1685 // Insert map entries for specifc devices with this compute capability.
1686 if (GpuArch == "compute_20") {
1687 CudaLibDeviceMap["sm_20"] = FilePath;
1688 CudaLibDeviceMap["sm_21"] = FilePath;
1689 } else if (GpuArch == "compute_30") {
1690 CudaLibDeviceMap["sm_30"] = FilePath;
1691 CudaLibDeviceMap["sm_32"] = FilePath;
1692 } else if (GpuArch == "compute_35") {
1693 CudaLibDeviceMap["sm_35"] = FilePath;
1694 CudaLibDeviceMap["sm_37"] = FilePath;
1695 }
1696 }
1697
Artem Belevich98607b62015-09-23 21:49:39 +00001698 IsValid = true;
1699 break;
1700 }
1701}
1702
1703void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1704 if (isValid())
1705 OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1706}
1707
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001708namespace {
1709// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001710class FilterNonExistent {
1711 StringRef Base;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001712 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001713
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001714public:
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001715 FilterNonExistent(StringRef Base, vfs::FileSystem &VFS)
1716 : Base(Base), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001717 bool operator()(const Multilib &M) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001718 return !VFS.exists(Base + M.gccSuffix() + "/crtbegin.o");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001719 }
1720};
1721} // end anonymous namespace
1722
1723static void addMultilibFlag(bool Enabled, const char *const Flag,
1724 std::vector<std::string> &Flags) {
1725 if (Enabled)
1726 Flags.push_back(std::string("+") + Flag);
1727 else
1728 Flags.push_back(std::string("-") + Flag);
1729}
1730
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001731static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001732 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1733 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1734}
1735
1736static bool isMips32(llvm::Triple::ArchType Arch) {
1737 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1738}
1739
1740static bool isMips64(llvm::Triple::ArchType Arch) {
1741 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1742}
1743
1744static bool isMipsEL(llvm::Triple::ArchType Arch) {
1745 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1746}
1747
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001748static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001749 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001750 return A && A->getOption().matches(options::OPT_mips16);
1751}
1752
1753static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001754 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001755 return A && A->getOption().matches(options::OPT_mmicromips);
1756}
1757
Benjamin Kramere003ca22015-10-28 13:54:16 +00001758namespace {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001759struct DetectedMultilibs {
1760 /// The set of multilibs that the detected installation supports.
1761 MultilibSet Multilibs;
1762
1763 /// The primary multilib appropriate for the given flags.
1764 Multilib SelectedMultilib;
1765
1766 /// On Biarch systems, this corresponds to the default multilib when
1767 /// targeting the non-default multilib. Otherwise, it is empty.
1768 llvm::Optional<Multilib> BiarchSibling;
1769};
Benjamin Kramere003ca22015-10-28 13:54:16 +00001770} // end anonymous namespace
Simon Atanasyan60280b42014-05-12 07:37:51 +00001771
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001772static Multilib makeMultilib(StringRef commonSuffix) {
1773 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1774}
1775
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001776static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
1777 StringRef Path, const ArgList &Args,
1778 DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001779 // Some MIPS toolchains put libraries and object files compiled
1780 // using different options in to the sub-directoris which names
1781 // reflects the flags used for compilation. For example sysroot
1782 // directory might looks like the following examples:
1783 //
1784 // /usr
1785 // /lib <= crt*.o files compiled with '-mips32'
1786 // /mips16
1787 // /usr
1788 // /lib <= crt*.o files compiled with '-mips16'
1789 // /el
1790 // /usr
1791 // /lib <= crt*.o files compiled with '-mips16 -EL'
1792 //
1793 // or
1794 //
1795 // /usr
1796 // /lib <= crt*.o files compiled with '-mips32r2'
1797 // /mips16
1798 // /usr
1799 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1800 // /mips32
1801 // /usr
1802 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001803
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001804 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001805
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001806 // Check for FSF toolchain multilibs
1807 MultilibSet FSFMipsMultilibs;
1808 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001809 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001810 .flag("+m32")
1811 .flag("-m64")
1812 .flag("-mmicromips")
1813 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001814
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001815 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001816 .flag("+m32")
1817 .flag("-m64")
1818 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001819
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001820 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001821 .flag("-m32")
1822 .flag("+m64")
1823 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001824
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001825 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1826 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001827
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001828 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001829 .flag("+m32")
1830 .flag("-m64")
1831 .flag("-mmicromips")
1832 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001833
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001834 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001835
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001836 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001837
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001838 auto MAbi64 =
1839 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001840
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001841 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001842
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001843 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001844
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001845 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001846
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001847 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001848
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001849 FSFMipsMultilibs =
1850 MultilibSet()
1851 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1852 MArchDefault)
1853 .Maybe(UCLibc)
1854 .Maybe(Mips16)
1855 .FilterOut("/mips64/mips16")
1856 .FilterOut("/mips64r2/mips16")
1857 .FilterOut("/micromips/mips16")
1858 .Maybe(MAbi64)
1859 .FilterOut("/micromips/64")
1860 .FilterOut("/mips32/64")
1861 .FilterOut("^/64")
1862 .FilterOut("/mips16/64")
1863 .Either(BigEndian, LittleEndian)
1864 .Maybe(SoftFloat)
1865 .Maybe(Nan2008)
1866 .FilterOut(".*sof/nan2008")
1867 .FilterOut(NonExistent)
1868 .setIncludeDirsCallback([](StringRef InstallDir,
1869 StringRef TripleStr, const Multilib &M) {
1870 std::vector<std::string> Dirs;
1871 Dirs.push_back((InstallDir + "/include").str());
1872 std::string SysRootInc =
1873 InstallDir.str() + "/../../../../sysroot";
1874 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1875 Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1876 else
1877 Dirs.push_back(SysRootInc + "/usr/include");
1878 return Dirs;
1879 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001880 }
1881
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001882 // Check for Musl toolchain multilibs
1883 MultilibSet MuslMipsMultilibs;
1884 {
1885 auto MArchMipsR2 = makeMultilib("")
1886 .osSuffix("/mips-r2-hard-musl")
1887 .flag("+EB")
1888 .flag("-EL")
1889 .flag("+march=mips32r2");
1890
1891 auto MArchMipselR2 = makeMultilib("/mipsel-r2-hard-musl")
1892 .flag("-EB")
1893 .flag("+EL")
1894 .flag("+march=mips32r2");
1895
1896 MuslMipsMultilibs = MultilibSet().Either(MArchMipsR2, MArchMipselR2);
1897
1898 // Specify the callback that computes the include directories.
1899 MuslMipsMultilibs.setIncludeDirsCallback([](
1900 StringRef InstallDir, StringRef TripleStr, const Multilib &M) {
1901 std::vector<std::string> Dirs;
1902 Dirs.push_back(
1903 (InstallDir + "/../sysroot" + M.osSuffix() + "/usr/include").str());
1904 return Dirs;
1905 });
1906 }
1907
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001908 // Check for Code Sourcery toolchain multilibs
1909 MultilibSet CSMipsMultilibs;
1910 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001911 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001912
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001913 auto MArchMicroMips =
1914 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001915
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001916 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001917
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001918 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001919
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001920 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001921
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001922 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001923
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001924 auto DefaultFloat =
1925 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001926
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001927 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001928
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001929 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001930
1931 // Note that this one's osSuffix is ""
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001932 auto MAbi64 = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001933 .gccSuffix("/64")
1934 .includeSuffix("/64")
1935 .flag("+mabi=n64")
1936 .flag("-mabi=n32")
1937 .flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001938
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001939 CSMipsMultilibs =
1940 MultilibSet()
1941 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1942 .Maybe(UCLibc)
1943 .Either(SoftFloat, Nan2008, DefaultFloat)
1944 .FilterOut("/micromips/nan2008")
1945 .FilterOut("/mips16/nan2008")
1946 .Either(BigEndian, LittleEndian)
1947 .Maybe(MAbi64)
1948 .FilterOut("/mips16.*/64")
1949 .FilterOut("/micromips.*/64")
1950 .FilterOut(NonExistent)
1951 .setIncludeDirsCallback([](StringRef InstallDir,
1952 StringRef TripleStr, const Multilib &M) {
1953 std::vector<std::string> Dirs;
1954 Dirs.push_back((InstallDir + "/include").str());
1955 std::string SysRootInc =
1956 InstallDir.str() + "/../../../../" + TripleStr.str();
1957 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1958 Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1959 else
1960 Dirs.push_back(SysRootInc + "/libc/usr/include");
1961 return Dirs;
1962 });
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001963 }
1964
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001965 MultilibSet AndroidMipsMultilibs =
1966 MultilibSet()
1967 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1968 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1969 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001970
1971 MultilibSet DebianMipsMultilibs;
1972 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001973 Multilib MAbiN32 =
1974 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001975
1976 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001977 .gccSuffix("/64")
1978 .includeSuffix("/64")
1979 .flag("+m64")
1980 .flag("-m32")
1981 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001982
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001983 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001984
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001985 DebianMipsMultilibs =
1986 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001987 }
1988
Daniel Sanders2bf13662014-07-10 14:40:57 +00001989 MultilibSet ImgMultilibs;
1990 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001991 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001992
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001993 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001994
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001995 auto MAbi64 =
1996 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001997
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001998 ImgMultilibs =
1999 MultilibSet()
2000 .Maybe(Mips64r6)
2001 .Maybe(MAbi64)
2002 .Maybe(LittleEndian)
2003 .FilterOut(NonExistent)
2004 .setIncludeDirsCallback([](StringRef InstallDir,
2005 StringRef TripleStr, const Multilib &M) {
2006 std::vector<std::string> Dirs;
2007 Dirs.push_back((InstallDir + "/include").str());
2008 Dirs.push_back(
2009 (InstallDir + "/../../../../sysroot/usr/include").str());
2010 return Dirs;
2011 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00002012 }
2013
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002014 StringRef CPUName;
2015 StringRef ABIName;
2016 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
2017
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002018 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2019
2020 Multilib::flags_list Flags;
2021 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
2022 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
2023 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002024 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002025 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00002026 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002027 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00002028 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002029 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002030 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
2031 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002032 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002033 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00002034 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00002035 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
2036 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002037 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
2038 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002039 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002040 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002041 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002042 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002043
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002044 if (TargetTriple.isAndroid()) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002045 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00002046 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2047 Result.Multilibs = AndroidMipsMultilibs;
2048 return true;
2049 }
2050 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002051 }
2052
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002053 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2054 TargetTriple.getOS() == llvm::Triple::Linux &&
2055 TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment) {
2056 if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2057 Result.Multilibs = MuslMipsMultilibs;
2058 return true;
2059 }
2060 return false;
2061 }
2062
Daniel Sanders2bf13662014-07-10 14:40:57 +00002063 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
2064 TargetTriple.getOS() == llvm::Triple::Linux &&
2065 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
2066 // Select mips-img-linux-gnu toolchain.
2067 if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
2068 Result.Multilibs = ImgMultilibs;
2069 return true;
2070 }
2071 return false;
2072 }
2073
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002074 // Sort candidates. Toolchain that best meets the directories goes first.
2075 // Then select the first toolchains matches command line flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002076 MultilibSet *candidates[] = {&DebianMipsMultilibs, &FSFMipsMultilibs,
2077 &CSMipsMultilibs};
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002078 std::sort(
2079 std::begin(candidates), std::end(candidates),
2080 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
2081 for (const auto &candidate : candidates) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00002082 if (candidate->select(Flags, Result.SelectedMultilib)) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002083 if (candidate == &DebianMipsMultilibs)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002084 Result.BiarchSibling = Multilib();
2085 Result.Multilibs = *candidate;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002086 return true;
2087 }
2088 }
2089
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002090 {
2091 // Fallback to the regular toolchain-tree structure.
2092 Multilib Default;
2093 Result.Multilibs.push_back(Default);
2094 Result.Multilibs.FilterOut(NonExistent);
2095
2096 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2097 Result.BiarchSibling = Multilib();
2098 return true;
2099 }
2100 }
2101
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002102 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002103}
2104
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002105static bool findBiarchMultilibs(const Driver &D,
2106 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002107 StringRef Path, const ArgList &Args,
2108 bool NeedsBiarchSuffix,
2109 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002110 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2111 // in what would normally be GCCInstallPath and put the 64-bit
2112 // libs in a subdirectory named 64. The simple logic we follow is that
2113 // *if* there is a subdirectory of the right name with crtbegin.o in it,
2114 // we use that. If not, and if not a biarch triple alias, we look for
2115 // crtbegin.o without the subdirectory.
2116
2117 Multilib Default;
2118 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002119 .gccSuffix("/64")
2120 .includeSuffix("/64")
2121 .flag("-m32")
2122 .flag("+m64")
2123 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002124 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002125 .gccSuffix("/32")
2126 .includeSuffix("/32")
2127 .flag("+m32")
2128 .flag("-m64")
2129 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00002130 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002131 .gccSuffix("/x32")
2132 .includeSuffix("/x32")
2133 .flag("-m32")
2134 .flag("-m64")
2135 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002136
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002137 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002138
Zinovy Nis1db95732014-07-10 15:27:19 +00002139 // Determine default multilib from: 32, 64, x32
2140 // Also handle cases such as 64 on 32, 32 on 64, etc.
2141 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00002142 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00002143 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002144 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002145 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002146 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002147 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00002148 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002149 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00002150 if (TargetTriple.isArch32Bit())
2151 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002152 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00002153 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002154 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002155 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00002156 }
2157
Zinovy Nis1db95732014-07-10 15:27:19 +00002158 if (Want == WANT32)
2159 Default.flag("+m32").flag("-m64").flag("-mx32");
2160 else if (Want == WANT64)
2161 Default.flag("-m32").flag("+m64").flag("-mx32");
2162 else if (Want == WANTX32)
2163 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002164 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002165 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002166
Simon Atanasyan60280b42014-05-12 07:37:51 +00002167 Result.Multilibs.push_back(Default);
2168 Result.Multilibs.push_back(Alt64);
2169 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00002170 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002171
Simon Atanasyan60280b42014-05-12 07:37:51 +00002172 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002173
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002174 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002175 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002176 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002177 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002178
Simon Atanasyan60280b42014-05-12 07:37:51 +00002179 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002180 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002181
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002182 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00002183 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002184 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002185
2186 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00002187}
2188
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002189void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2190 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2191 const std::string &LibDir, StringRef CandidateTriple,
2192 bool NeedsBiarchSuffix) {
2193 // Solaris is a special case. The GCC installation is under
2194 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2195 // need to iterate twice.
2196 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002197 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2198 !EC && LI != LE; LI = LI.increment(EC)) {
2199 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002200 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2201
2202 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002203 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002204 continue; // Saw this path before; no need to look at it again.
2205 if (CandidateVersion.isOlderThan(4, 1, 1))
2206 continue;
2207 if (CandidateVersion <= Version)
2208 continue;
2209
2210 GCCInstallPath =
2211 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002212 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002213 continue;
2214
2215 // If we make it here there has to be at least one GCC version, let's just
2216 // use the latest one.
2217 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002218 for (vfs::directory_iterator
2219 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2220 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002221 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2222
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002223 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002224 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2225
2226 if (CandidateSubVersion > Version)
2227 Version = CandidateSubVersion;
2228 }
2229
2230 GCCTriple.setTriple(CandidateTriple);
2231
2232 GCCInstallPath += "/" + Version.Text;
2233 GCCParentLibPath = GCCInstallPath + "/../../../../";
2234
2235 IsValid = true;
2236 }
2237}
2238
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002239void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002240 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002241 const std::string &LibDir, StringRef CandidateTriple,
2242 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002243 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002244 // There are various different suffixes involving the triple we
2245 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002246 // up to the lib directory. Specifically, the number of "up" steps
2247 // in the second half of each row is 1 + the number of path separators
2248 // in the first half.
2249 const std::string LibAndInstallSuffixes[][2] = {
2250 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2251
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002252 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002253 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2254
2255 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2256 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002257
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002258 // The Freescale PPC SDK has the gcc libraries in
2259 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002260 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002261
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002262 // Ubuntu has a strange mis-matched pair of triples that this happens to
2263 // match.
2264 // FIXME: It may be worthwhile to generalize this and look for a second
2265 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002266 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2267
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002268 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2269 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2270 NeedsBiarchSuffix);
2271 return;
2272 }
2273
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002274 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002275 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2276 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002277 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002278 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002279 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002280 for (vfs::directory_iterator
2281 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2282 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002283 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002284 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002285 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002286 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002287 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002288 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002289 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002290 continue;
2291 if (CandidateVersion <= Version)
2292 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002293
Simon Atanasyan60280b42014-05-12 07:37:51 +00002294 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002295
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002296 // Debian mips multilibs behave more like the rest of the biarch ones,
2297 // so handle them there
2298 if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002299 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002300 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002301 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002302 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002303 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002304 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002305
Simon Atanasyan60280b42014-05-12 07:37:51 +00002306 Multilibs = Detected.Multilibs;
2307 SelectedMultilib = Detected.SelectedMultilib;
2308 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002309 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002310 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002311 // FIXME: We hack together the directory name here instead of
2312 // using LI to ensure stable path separators across Windows and
2313 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002314 GCCInstallPath =
2315 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2316 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002317 IsValid = true;
2318 }
2319 }
2320}
2321
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002322Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002323 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002324 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002325 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002326 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002327 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002328}
2329
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002330Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002331
Rafael Espindola7cf32212013-03-20 03:05:54 +00002332Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002333 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002334 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002335 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002336 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002337 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002338 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002339 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002340 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002341 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002342 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002343 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002344 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002345}
2346
Rafael Espindola7cf32212013-03-20 03:05:54 +00002347Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002348 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002349}
2350
Douglas Katzman95354292015-06-23 20:42:09 +00002351Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002352
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002353void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2354 // Print the information about how we detected the GCC installation.
2355 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002356 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002357}
2358
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002359bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002360 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002361}
2362
David Majnemer17f448b2015-06-28 04:23:33 +00002363bool Generic_GCC::isPICDefault() const {
2364 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2365}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002366
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002367bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002368
David Majnemer17f448b2015-06-28 04:23:33 +00002369bool Generic_GCC::isPICDefaultForced() const {
2370 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2371}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002372
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002373bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002374 switch (getTriple().getArch()) {
2375 case llvm::Triple::x86:
2376 case llvm::Triple::x86_64:
2377 case llvm::Triple::aarch64:
2378 case llvm::Triple::aarch64_be:
2379 case llvm::Triple::arm:
2380 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002381 case llvm::Triple::bpfel:
2382 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002383 case llvm::Triple::thumb:
2384 case llvm::Triple::thumbeb:
2385 case llvm::Triple::ppc:
2386 case llvm::Triple::ppc64:
2387 case llvm::Triple::ppc64le:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002388 case llvm::Triple::systemz:
2389 return true;
2390 default:
2391 return false;
2392 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002393}
2394
James Y Knighta6c9ee72015-10-16 18:46:26 +00002395/// \brief Helper to add the variant paths of a libstdc++ installation.
2396bool Generic_GCC::addLibStdCXXIncludePaths(
2397 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2398 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2399 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2400 if (!getVFS().exists(Base + Suffix))
2401 return false;
2402
2403 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2404
2405 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2406 // that path exists or we have neither a GCC nor target multiarch triple, use
2407 // this vanilla search path.
2408 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2409 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2410 addSystemInclude(DriverArgs, CC1Args,
2411 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2412 } else {
2413 // Otherwise try to use multiarch naming schemes which have normalized the
2414 // triples and put the triple before the suffix.
2415 //
2416 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2417 // the target triple, so we support that here.
2418 addSystemInclude(DriverArgs, CC1Args,
2419 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2420 addSystemInclude(DriverArgs, CC1Args,
2421 Base + "/" + TargetMultiarchTriple + Suffix);
2422 }
2423
2424 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2425 return true;
2426}
2427
2428
Kristof Beylsfb387292014-01-10 13:44:34 +00002429void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2430 ArgStringList &CC1Args) const {
2431 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002432 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002433 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002434 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002435 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002436 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002437 getTriple().getOS() == llvm::Triple::NaCl ||
2438 (getTriple().getVendor() == llvm::Triple::MipsTechnologies &&
2439 !getTriple().hasEnvironment());
Kristof Beylsfb387292014-01-10 13:44:34 +00002440
2441 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002442 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002443 CC1Args.push_back("-fuse-init-array");
2444}
2445
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002446/// Mips Toolchain
2447MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
2448 const llvm::Triple &Triple,
2449 const ArgList &Args)
2450 : Linux(D, Triple, Args) {
2451 // Select the correct multilib according to the given arguments.
2452 DetectedMultilibs Result;
2453 findMIPSMultilibs(D, Triple, "", Args, Result);
2454 Multilibs = Result.Multilibs;
2455 SelectedMultilib = Result.SelectedMultilib;
2456
2457 // Find out the library suffix based on the ABI.
2458 LibSuffix = tools::mips::getMipsABILibSuffix(Args, Triple);
2459 getFilePaths().clear();
2460 getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix);
2461
2462 // Use LLD by default.
Peter Collingbourne39719a72015-11-20 20:49:39 +00002463 DefaultLinker = "lld";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002464}
2465
2466void MipsLLVMToolChain::AddClangSystemIncludeArgs(
2467 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2468 if (DriverArgs.hasArg(options::OPT_nostdinc))
2469 return;
2470
2471 const Driver &D = getDriver();
2472
2473 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2474 SmallString<128> P(D.ResourceDir);
2475 llvm::sys::path::append(P, "include");
2476 addSystemInclude(DriverArgs, CC1Args, P);
2477 }
2478
2479 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2480 return;
2481
2482 const auto &Callback = Multilibs.includeDirsCallback();
2483 if (Callback) {
2484 const auto IncludePaths =
2485 Callback(D.getInstalledDir(), getTripleString(), SelectedMultilib);
2486 for (const auto &Path : IncludePaths)
2487 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
2488 }
2489}
2490
2491Tool *MipsLLVMToolChain::buildLinker() const {
2492 return new tools::gnutools::Linker(*this);
2493}
2494
2495std::string MipsLLVMToolChain::computeSysRoot() const {
2496 if (!getDriver().SysRoot.empty())
2497 return getDriver().SysRoot + SelectedMultilib.osSuffix();
2498
2499 const std::string InstalledDir(getDriver().getInstalledDir());
2500 std::string SysRootPath =
2501 InstalledDir + "/../sysroot" + SelectedMultilib.osSuffix();
2502 if (llvm::sys::fs::exists(SysRootPath))
2503 return SysRootPath;
2504
2505 return std::string();
2506}
2507
2508ToolChain::CXXStdlibType
2509MipsLLVMToolChain::GetCXXStdlibType(const ArgList &Args) const {
2510 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2511 if (A) {
2512 StringRef Value = A->getValue();
2513 if (Value != "libc++")
2514 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2515 << A->getAsString(Args);
2516 }
2517
2518 return ToolChain::CST_Libcxx;
2519}
2520
2521void MipsLLVMToolChain::AddClangCXXStdlibIncludeArgs(
2522 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2523 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2524 DriverArgs.hasArg(options::OPT_nostdincxx))
2525 return;
2526
2527 assert((GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) &&
2528 "Only -lc++ (aka libcxx) is suported in this toolchain.");
2529
2530 const auto &Callback = Multilibs.includeDirsCallback();
2531 if (Callback) {
2532 const auto IncludePaths = Callback(getDriver().getInstalledDir(),
2533 getTripleString(), SelectedMultilib);
2534 for (const auto &Path : IncludePaths) {
2535 if (llvm::sys::fs::exists(Path + "/c++/v1")) {
2536 addSystemInclude(DriverArgs, CC1Args, Path + "/c++/v1");
2537 break;
2538 }
2539 }
2540 }
2541}
2542
2543void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2544 ArgStringList &CmdArgs) const {
2545 assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
2546 "Only -lc++ (aka libxx) is suported in this toolchain.");
2547
2548 CmdArgs.push_back("-lc++");
2549 CmdArgs.push_back("-lc++abi");
2550 CmdArgs.push_back("-lunwind");
2551}
2552
2553std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
2554 StringRef Component,
2555 bool Shared) const {
2556 SmallString<128> Path(getDriver().ResourceDir);
2557 llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
2558 getOS());
2559 llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" +
Vasileios Kalintirisbbc99302015-11-16 15:41:30 +00002560 "mips" + (Shared ? ".so" : ".a")));
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002561 return Path.str();
2562}
2563
Tony Linthicum76329bf2011-12-12 21:14:55 +00002564/// Hexagon Toolchain
2565
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002566std::string HexagonToolChain::getHexagonTargetDir(
2567 const std::string &InstalledDir,
2568 const SmallVectorImpl<std::string> &PrefixDirs) const {
2569 std::string InstallRelDir;
2570 const Driver &D = getDriver();
2571
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002572 // Locate the rest of the toolchain ...
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002573 for (auto &I : PrefixDirs)
2574 if (D.getVFS().exists(I))
2575 return I;
Samuel Antaoc909c992014-11-07 17:48:03 +00002576
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002577 if (getVFS().exists(InstallRelDir = InstalledDir + "/../target"))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002578 return InstallRelDir;
2579
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002580 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/target";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002581 if (getVFS().exists(PrefixRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002582 return PrefixRelDir;
2583
2584 return InstallRelDir;
2585}
2586
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002587
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002588Optional<unsigned> HexagonToolChain::getSmallDataThreshold(
2589 const ArgList &Args) {
2590 StringRef Gn = "";
2591 if (Arg *A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
2592 options::OPT_msmall_data_threshold_EQ)) {
2593 Gn = A->getValue();
2594 } else if (Args.getLastArg(options::OPT_shared, options::OPT_fpic,
2595 options::OPT_fPIC)) {
2596 Gn = "0";
2597 }
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002598
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002599 unsigned G;
2600 if (!Gn.getAsInteger(10, G))
2601 return G;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002602
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002603 return None;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002604}
2605
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002606
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002607void HexagonToolChain::getHexagonLibraryPaths(const ArgList &Args,
2608 ToolChain::path_list &LibPaths) const {
2609 const Driver &D = getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00002610
2611 //----------------------------------------------------------------------------
2612 // -L Args
2613 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002614 for (Arg *A : Args.filtered(options::OPT_L))
2615 for (const char *Value : A->getValues())
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002616 LibPaths.push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002617
2618 //----------------------------------------------------------------------------
2619 // Other standard paths
2620 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002621 std::vector<std::string> RootDirs;
Krzysztof Parzyszekf4467cd2016-01-06 14:13:11 +00002622 std::copy(D.PrefixDirs.begin(), D.PrefixDirs.end(),
2623 std::back_inserter(RootDirs));
Matthew Curtise689b052012-12-06 15:46:07 +00002624
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002625 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2626 D.PrefixDirs);
2627 if (std::find(RootDirs.begin(), RootDirs.end(), TargetDir) == RootDirs.end())
2628 RootDirs.push_back(TargetDir);
2629
2630 bool HasPIC = Args.hasArg(options::OPT_fpic, options::OPT_fPIC);
2631 // Assume G0 with -shared.
2632 bool HasG0 = Args.hasArg(options::OPT_shared);
2633 if (auto G = getSmallDataThreshold(Args))
2634 HasG0 = G.getValue() == 0;
2635
2636 const std::string CpuVer = GetTargetCPUVersion(Args).str();
2637 for (auto &Dir : RootDirs) {
2638 std::string LibDir = Dir + "/hexagon/lib";
2639 std::string LibDirCpu = LibDir + '/' + CpuVer;
2640 if (HasG0) {
2641 if (HasPIC)
2642 LibPaths.push_back(LibDirCpu + "/G0/pic");
2643 LibPaths.push_back(LibDirCpu + "/G0");
2644 }
2645 LibPaths.push_back(LibDirCpu);
2646 LibPaths.push_back(LibDir);
Matthew Curtise689b052012-12-06 15:46:07 +00002647 }
Matthew Curtise689b052012-12-06 15:46:07 +00002648}
2649
Douglas Katzman54366072015-07-27 16:53:08 +00002650HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002651 const llvm::opt::ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002652 : Linux(D, Triple, Args) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002653 const std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2654 D.PrefixDirs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002655
2656 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2657 // program paths
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002658 const std::string BinDir(TargetDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002659 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002660 getProgramPaths().push_back(BinDir);
2661
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002662 ToolChain::path_list &LibPaths = getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002663
2664 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2665 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2666 // support 'linux' we'll need to fix this up
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002667 LibPaths.clear();
2668 getHexagonLibraryPaths(Args, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002669}
2670
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002671HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002672
Douglas Katzman54366072015-07-27 16:53:08 +00002673Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002674 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002675}
2676
Douglas Katzman54366072015-07-27 16:53:08 +00002677Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002678 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002679}
2680
Douglas Katzman54366072015-07-27 16:53:08 +00002681void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2682 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002683 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2684 DriverArgs.hasArg(options::OPT_nostdlibinc))
2685 return;
2686
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002687 const Driver &D = getDriver();
2688 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2689 D.PrefixDirs);
2690 addExternCSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002691}
2692
Douglas Katzman54366072015-07-27 16:53:08 +00002693void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2694 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002695 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2696 DriverArgs.hasArg(options::OPT_nostdincxx))
2697 return;
2698
2699 const Driver &D = getDriver();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002700 std::string TargetDir = getHexagonTargetDir(D.InstalledDir, D.PrefixDirs);
2701 addSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include/c++");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002702}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002703
Matthew Curtise689b052012-12-06 15:46:07 +00002704ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002705HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002706 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2707 if (!A)
2708 return ToolChain::CST_Libstdcxx;
2709
2710 StringRef Value = A->getValue();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002711 if (Value != "libstdc++")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002712 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002713
2714 return ToolChain::CST_Libstdcxx;
2715}
2716
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002717//
2718// Returns the default CPU for Hexagon. This is the default compilation target
2719// if no Hexagon processor is selected at the command-line.
2720//
2721const StringRef HexagonToolChain::GetDefaultCPU() {
2722 return "hexagonv60";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002723}
2724
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002725const StringRef HexagonToolChain::GetTargetCPUVersion(const ArgList &Args) {
2726 Arg *CpuArg = nullptr;
Krzysztof Parzyszek972f72c2016-01-06 21:12:03 +00002727 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ, options::OPT_march_EQ))
2728 CpuArg = A;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002729
2730 StringRef CPU = CpuArg ? CpuArg->getValue() : GetDefaultCPU();
2731 if (CPU.startswith("hexagon"))
2732 return CPU.substr(sizeof("hexagon") - 1);
2733 return CPU;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002734}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002735// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002736
Tom Stellard8fa33092015-07-18 01:49:05 +00002737/// AMDGPU Toolchain
2738AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2739 const ArgList &Args)
2740 : Generic_ELF(D, Triple, Args) { }
2741
2742Tool *AMDGPUToolChain::buildLinker() const {
2743 return new tools::amdgpu::Linker(*this);
2744}
2745// End AMDGPU
2746
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002747/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00002748NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2749 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002750 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002751
2752 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2753 // default paths, and must instead only use the paths provided
2754 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002755 path_list &file_paths = getFilePaths();
2756 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002757
2758 file_paths.clear();
2759 prog_paths.clear();
2760
2761 // Path for library files (libc.a, ...)
2762 std::string FilePath(getDriver().Dir + "/../");
2763
2764 // Path for tools (clang, ld, etc..)
2765 std::string ProgPath(getDriver().Dir + "/../");
2766
2767 // Path for toolchain libraries (libgcc.a, ...)
2768 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2769
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002770 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00002771 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002772 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00002773 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002774 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2775 file_paths.push_back(ToolPath + "i686-nacl");
2776 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002777 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002778 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2779 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2780 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2781 file_paths.push_back(ToolPath + "x86_64-nacl");
2782 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002783 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002784 file_paths.push_back(FilePath + "arm-nacl/lib");
2785 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2786 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2787 file_paths.push_back(ToolPath + "arm-nacl");
2788 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002789 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002790 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2791 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2792 prog_paths.push_back(ProgPath + "bin");
2793 file_paths.push_back(ToolPath + "mipsel-nacl");
2794 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002795 default:
2796 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002797 }
2798
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002799 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2800}
2801
Douglas Katzman54366072015-07-27 16:53:08 +00002802void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2803 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002804 const Driver &D = getDriver();
2805 if (DriverArgs.hasArg(options::OPT_nostdinc))
2806 return;
2807
2808 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2809 SmallString<128> P(D.ResourceDir);
2810 llvm::sys::path::append(P, "include");
2811 addSystemInclude(DriverArgs, CC1Args, P.str());
2812 }
2813
2814 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2815 return;
2816
2817 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002818 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00002819 case llvm::Triple::x86:
2820 // x86 is special because multilib style uses x86_64-nacl/include for libc
2821 // headers but the SDK wants i686-nacl/usr/include. The other architectures
2822 // have the same substring.
2823 llvm::sys::path::append(P, "i686-nacl/usr/include");
2824 addSystemInclude(DriverArgs, CC1Args, P.str());
2825 llvm::sys::path::remove_filename(P);
2826 llvm::sys::path::remove_filename(P);
2827 llvm::sys::path::remove_filename(P);
2828 llvm::sys::path::append(P, "x86_64-nacl/include");
2829 addSystemInclude(DriverArgs, CC1Args, P.str());
2830 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002831 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002832 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002833 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002834 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002835 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002836 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002837 case llvm::Triple::mipsel:
2838 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2839 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002840 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002841 return;
2842 }
2843
2844 addSystemInclude(DriverArgs, CC1Args, P.str());
2845 llvm::sys::path::remove_filename(P);
2846 llvm::sys::path::remove_filename(P);
2847 llvm::sys::path::append(P, "include");
2848 addSystemInclude(DriverArgs, CC1Args, P.str());
2849}
2850
Douglas Katzman54366072015-07-27 16:53:08 +00002851void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2852 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002853 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2854 // if the value is libc++, and emits an error for other values.
2855 GetCXXStdlibType(Args);
2856 CmdArgs.push_back("-lc++");
2857}
2858
Douglas Katzman54366072015-07-27 16:53:08 +00002859void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2860 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002861 const Driver &D = getDriver();
2862 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2863 DriverArgs.hasArg(options::OPT_nostdincxx))
2864 return;
2865
2866 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2867 // if the value is libc++, and emits an error for other values.
2868 GetCXXStdlibType(DriverArgs);
2869
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002870 SmallString<128> P(D.Dir + "/../");
2871 switch (getTriple().getArch()) {
2872 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002873 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2874 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002875 break;
2876 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002877 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2878 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002879 break;
2880 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002881 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2882 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002883 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002884 case llvm::Triple::mipsel:
2885 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2886 addSystemInclude(DriverArgs, CC1Args, P.str());
2887 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002888 default:
2889 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002890 }
2891}
2892
Douglas Katzman54366072015-07-27 16:53:08 +00002893ToolChain::CXXStdlibType
2894NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002895 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2896 StringRef Value = A->getValue();
2897 if (Value == "libc++")
2898 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002899 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002900 }
2901
2902 return ToolChain::CST_Libcxx;
2903}
2904
Douglas Katzman54366072015-07-27 16:53:08 +00002905std::string
2906NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2907 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002908 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2909 if (TheTriple.getArch() == llvm::Triple::arm &&
2910 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2911 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2912 return TheTriple.getTriple();
2913}
2914
Douglas Katzman54366072015-07-27 16:53:08 +00002915Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002916 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002917}
2918
Douglas Katzman54366072015-07-27 16:53:08 +00002919Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002920 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002921 return new tools::nacltools::AssemblerARM(*this);
2922 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002923}
2924// End NaCl
2925
Chris Lattner09797542010-03-04 21:07:38 +00002926/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2927/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2928/// Currently does not support anything else but compilation.
2929
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002930TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002931 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002932 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002933 // Path mangling to find libexec
2934 std::string Path(getDriver().Dir);
2935
2936 Path += "/../libexec";
2937 getProgramPaths().push_back(Path);
2938}
2939
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002940TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002941
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002942bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002943
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002944bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002945
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002946bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002947
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002948bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002949
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002950// CloudABI - CloudABI tool chain which can call ld(1) directly.
2951
2952CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2953 const ArgList &Args)
2954 : Generic_ELF(D, Triple, Args) {
2955 SmallString<128> P(getDriver().Dir);
2956 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2957 getFilePaths().push_back(P.str());
2958}
2959
2960void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2961 ArgStringList &CC1Args) const {
2962 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2963 DriverArgs.hasArg(options::OPT_nostdincxx))
2964 return;
2965
2966 SmallString<128> P(getDriver().Dir);
2967 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2968 addSystemInclude(DriverArgs, CC1Args, P.str());
2969}
2970
2971void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
2972 ArgStringList &CmdArgs) const {
2973 CmdArgs.push_back("-lc++");
2974 CmdArgs.push_back("-lc++abi");
2975 CmdArgs.push_back("-lunwind");
2976}
2977
Douglas Katzman95354292015-06-23 20:42:09 +00002978Tool *CloudABI::buildLinker() const {
2979 return new tools::cloudabi::Linker(*this);
2980}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002981
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002982/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
2983
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002984OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
2985 const ArgList &Args)
2986 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00002987 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002988 getFilePaths().push_back("/usr/lib");
2989}
2990
Rafael Espindola7cf32212013-03-20 03:05:54 +00002991Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002992 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002993}
2994
Douglas Katzman95354292015-06-23 20:42:09 +00002995Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002996
Eli Friedman9fa28852012-08-08 23:57:20 +00002997/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
2998
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002999Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3000 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003001 getFilePaths().push_back(getDriver().Dir + "/../lib");
3002 getFilePaths().push_back("/usr/lib");
3003}
3004
Rafael Espindola7cf32212013-03-20 03:05:54 +00003005Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003006 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003007}
3008
Douglas Katzman95354292015-06-23 20:42:09 +00003009Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00003010
Douglas Katzman95354292015-06-23 20:42:09 +00003011ToolChain::CXXStdlibType Bitrig::GetCXXStdlibType(const ArgList &Args) const {
Richard Smith51af5192014-05-01 23:24:24 +00003012 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3013 StringRef Value = A->getValue();
3014 if (Value == "libstdc++")
3015 return ToolChain::CST_Libstdcxx;
3016 if (Value == "libc++")
3017 return ToolChain::CST_Libcxx;
3018
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003019 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Richard Smith51af5192014-05-01 23:24:24 +00003020 }
3021 return ToolChain::CST_Libcxx;
3022}
3023
Eli Friedman9fa28852012-08-08 23:57:20 +00003024void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3025 ArgStringList &CC1Args) const {
3026 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3027 DriverArgs.hasArg(options::OPT_nostdincxx))
3028 return;
3029
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003030 switch (GetCXXStdlibType(DriverArgs)) {
3031 case ToolChain::CST_Libcxx:
3032 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00003033 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003034 break;
3035 case ToolChain::CST_Libstdcxx:
3036 addSystemInclude(DriverArgs, CC1Args,
3037 getDriver().SysRoot + "/usr/include/c++/stdc++");
3038 addSystemInclude(DriverArgs, CC1Args,
3039 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00003040
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003041 StringRef Triple = getTriple().str();
3042 if (Triple.startswith("amd64"))
3043 addSystemInclude(DriverArgs, CC1Args,
3044 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003045 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003046 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003047 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
3048 "/usr/include/c++/stdc++/" +
3049 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003050 break;
3051 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003052}
3053
3054void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
3055 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003056 switch (GetCXXStdlibType(Args)) {
3057 case ToolChain::CST_Libcxx:
3058 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00003059 CmdArgs.push_back("-lc++abi");
3060 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003061 break;
3062 case ToolChain::CST_Libstdcxx:
3063 CmdArgs.push_back("-lstdc++");
3064 break;
3065 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003066}
3067
Daniel Dunbare24297c2009-03-30 21:06:03 +00003068/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
3069
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003070FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
3071 const ArgList &Args)
3072 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00003073
Chandler Carruth0b1756b2012-01-26 01:35:15 +00003074 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
3075 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003076 if ((Triple.getArch() == llvm::Triple::x86 ||
3077 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003078 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003079 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
3080 else
3081 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00003082}
3083
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003084ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
David Chisnall867ccd82013-11-09 15:10:56 +00003085 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3086 StringRef Value = A->getValue();
3087 if (Value == "libstdc++")
3088 return ToolChain::CST_Libstdcxx;
3089 if (Value == "libc++")
3090 return ToolChain::CST_Libcxx;
3091
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003092 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
David Chisnall867ccd82013-11-09 15:10:56 +00003093 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003094 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00003095 return ToolChain::CST_Libcxx;
3096 return ToolChain::CST_Libstdcxx;
3097}
3098
3099void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3100 ArgStringList &CC1Args) const {
3101 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3102 DriverArgs.hasArg(options::OPT_nostdincxx))
3103 return;
3104
3105 switch (GetCXXStdlibType(DriverArgs)) {
3106 case ToolChain::CST_Libcxx:
3107 addSystemInclude(DriverArgs, CC1Args,
3108 getDriver().SysRoot + "/usr/include/c++/v1");
3109 break;
3110 case ToolChain::CST_Libstdcxx:
3111 addSystemInclude(DriverArgs, CC1Args,
3112 getDriver().SysRoot + "/usr/include/c++/4.2");
3113 addSystemInclude(DriverArgs, CC1Args,
3114 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
3115 break;
3116 }
3117}
3118
Rafael Espindola7cf32212013-03-20 03:05:54 +00003119Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003120 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003121}
3122
Douglas Katzman95354292015-06-23 20:42:09 +00003123Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00003124
Tim Northovere931f9f2015-10-30 16:30:41 +00003125bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003126 // FreeBSD uses SjLj exceptions on ARM oabi.
3127 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00003128 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003129 case llvm::Triple::GNUEABI:
3130 case llvm::Triple::EABI:
3131 return false;
3132
3133 default:
3134 return (getTriple().getArch() == llvm::Triple::arm ||
3135 getTriple().getArch() == llvm::Triple::thumb);
3136 }
3137}
3138
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003139bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003140
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003141bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003142
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003143SanitizerMask FreeBSD::getSupportedSanitizers() const {
3144 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3145 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3146 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3147 getTriple().getArch() == llvm::Triple::mips64el;
3148 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3149 Res |= SanitizerKind::Address;
3150 Res |= SanitizerKind::Vptr;
3151 if (IsX86_64 || IsMIPS64) {
3152 Res |= SanitizerKind::Leak;
3153 Res |= SanitizerKind::Thread;
3154 }
3155 if (IsX86 || IsX86_64) {
3156 Res |= SanitizerKind::SafeStack;
3157 }
3158 return Res;
3159}
3160
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003161/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3162
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003163NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3164 : Generic_ELF(D, Triple, Args) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003165
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003166 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003167 // When targeting a 32-bit platform, try the special directory used on
3168 // 64-bit hosts, and only fall back to the main library directory if that
3169 // doesn't work.
3170 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3171 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003172 switch (Triple.getArch()) {
3173 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003174 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003175 break;
3176 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003177 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003178 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003179 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003180 switch (Triple.getEnvironment()) {
3181 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003182 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003183 getFilePaths().push_back("=/usr/lib/eabi");
3184 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003185 case llvm::Triple::EABIHF:
3186 case llvm::Triple::GNUEABIHF:
3187 getFilePaths().push_back("=/usr/lib/eabihf");
3188 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003189 default:
3190 getFilePaths().push_back("=/usr/lib/oabi");
3191 break;
3192 }
3193 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003194 case llvm::Triple::mips64:
3195 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003196 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003197 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003198 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003199 getFilePaths().push_back("=/usr/lib/64");
3200 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003201 case llvm::Triple::ppc:
3202 getFilePaths().push_back("=/usr/lib/powerpc");
3203 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003204 case llvm::Triple::sparc:
3205 getFilePaths().push_back("=/usr/lib/sparc");
3206 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003207 default:
3208 break;
3209 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003210
3211 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003212 }
3213}
3214
Rafael Espindola7cf32212013-03-20 03:05:54 +00003215Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003216 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003217}
3218
Douglas Katzman95354292015-06-23 20:42:09 +00003219Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003220
Douglas Katzman95354292015-06-23 20:42:09 +00003221ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003222 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3223 StringRef Value = A->getValue();
3224 if (Value == "libstdc++")
3225 return ToolChain::CST_Libstdcxx;
3226 if (Value == "libc++")
3227 return ToolChain::CST_Libcxx;
3228
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003229 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003230 }
3231
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003232 unsigned Major, Minor, Micro;
3233 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003234 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003235 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003236 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003237 case llvm::Triple::arm:
3238 case llvm::Triple::armeb:
3239 case llvm::Triple::thumb:
3240 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003241 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003242 case llvm::Triple::ppc64:
3243 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003244 case llvm::Triple::x86:
3245 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003246 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003247 default:
3248 break;
3249 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003250 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003251 return ToolChain::CST_Libstdcxx;
3252}
3253
3254void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3255 ArgStringList &CC1Args) const {
3256 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3257 DriverArgs.hasArg(options::OPT_nostdincxx))
3258 return;
3259
3260 switch (GetCXXStdlibType(DriverArgs)) {
3261 case ToolChain::CST_Libcxx:
3262 addSystemInclude(DriverArgs, CC1Args,
3263 getDriver().SysRoot + "/usr/include/c++/");
3264 break;
3265 case ToolChain::CST_Libstdcxx:
3266 addSystemInclude(DriverArgs, CC1Args,
3267 getDriver().SysRoot + "/usr/include/g++");
3268 addSystemInclude(DriverArgs, CC1Args,
3269 getDriver().SysRoot + "/usr/include/g++/backward");
3270 break;
3271 }
3272}
3273
Chris Lattner3e2ee142010-07-07 16:01:42 +00003274/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3275
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003276Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3277 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003278 getFilePaths().push_back(getDriver().Dir + "/../lib");
3279 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003280}
3281
Rafael Espindola7cf32212013-03-20 03:05:54 +00003282Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003283 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003284}
3285
Douglas Katzman95354292015-06-23 20:42:09 +00003286Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003287
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003288static void addPathIfExists(const Driver &D, const Twine &Path,
3289 ToolChain::path_list &Paths) {
3290 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003291 Paths.push_back(Path.str());
3292}
3293
David Chisnallf571cde2012-02-15 13:39:01 +00003294/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3295
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003296Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003297 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003298 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003299
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003300 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003301
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003302 path_list &Paths = getFilePaths();
3303 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003304 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003305
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003306 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003307 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003308 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003309
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003310 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003311
3312 std::string LibPath = "/usr/lib/";
3313 switch (Triple.getArch()) {
3314 case llvm::Triple::x86:
3315 case llvm::Triple::sparc:
3316 break;
3317 case llvm::Triple::x86_64:
3318 LibPath += "amd64/";
3319 break;
3320 case llvm::Triple::sparcv9:
3321 LibPath += "sparcv9/";
3322 break;
3323 default:
3324 llvm_unreachable("Unsupported architecture");
3325 }
3326
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003327 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003328}
3329
Rafael Espindola7cf32212013-03-20 03:05:54 +00003330Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003331 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003332}
3333
Douglas Katzman95354292015-06-23 20:42:09 +00003334Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003335
Rafael Espindolad5117262015-09-09 13:36:00 +00003336void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3337 ArgStringList &CC1Args) const {
3338 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3339 DriverArgs.hasArg(options::OPT_nostdincxx))
3340 return;
3341
3342 // Include the support directory for things like xlocale and fudged system
3343 // headers.
3344 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3345
3346 if (GCCInstallation.isValid()) {
3347 GCCVersion Version = GCCInstallation.getVersion();
3348 addSystemInclude(DriverArgs, CC1Args,
3349 getDriver().SysRoot + "/usr/gcc/" +
3350 Version.MajorStr + "." +
3351 Version.MinorStr +
3352 "/include/c++/" + Version.Text);
3353 addSystemInclude(DriverArgs, CC1Args,
3354 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3355 "." + Version.MinorStr + "/include/c++/" +
3356 Version.Text + "/" +
3357 GCCInstallation.getTriple().str());
3358 }
3359}
3360
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003361/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003362
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003363enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003364 // NB: Releases of a particular Linux distro should be kept together
3365 // in this enum, because some tests are done by integer comparison against
3366 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003367 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003368 DebianLenny,
3369 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003370 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003371 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003372 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003373 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003374 RHEL4,
3375 RHEL5,
3376 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003377 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003378 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003379 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003380 UbuntuHardy,
3381 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003382 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003383 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003384 UbuntuLucid,
3385 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003386 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003387 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003388 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003389 UbuntuQuantal,
3390 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003391 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003392 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003393 UbuntuUtopic,
3394 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003395 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003396 UbuntuXenial,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003397 UnknownDistro
3398};
3399
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003400static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003401 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003402}
3403
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003404static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003405
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003406static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003407 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003408}
3409
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003410static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003411 return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003412}
3413
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003414static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003415 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3416 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3417 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003418 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003419 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003420 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003421 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003422 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003423 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3424 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3425 .Case("hardy", UbuntuHardy)
3426 .Case("intrepid", UbuntuIntrepid)
3427 .Case("jaunty", UbuntuJaunty)
3428 .Case("karmic", UbuntuKarmic)
3429 .Case("lucid", UbuntuLucid)
3430 .Case("maverick", UbuntuMaverick)
3431 .Case("natty", UbuntuNatty)
3432 .Case("oneiric", UbuntuOneiric)
3433 .Case("precise", UbuntuPrecise)
3434 .Case("quantal", UbuntuQuantal)
3435 .Case("raring", UbuntuRaring)
3436 .Case("saucy", UbuntuSaucy)
3437 .Case("trusty", UbuntuTrusty)
3438 .Case("utopic", UbuntuUtopic)
3439 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003440 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003441 .Case("xenial", UbuntuXenial)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003442 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003443 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003444 }
3445
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003446 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3447 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003448 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003449 if (Data.startswith("Fedora release"))
3450 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003451 if (Data.startswith("Red Hat Enterprise Linux") ||
3452 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003453 if (Data.find("release 7") != StringRef::npos)
3454 return RHEL7;
3455 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003456 return RHEL6;
3457 else if (Data.find("release 5") != StringRef::npos)
3458 return RHEL5;
3459 else if (Data.find("release 4") != StringRef::npos)
3460 return RHEL4;
3461 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003462 return UnknownDistro;
3463 }
3464
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003465 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3466 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003467 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003468 if (Data[0] == '5')
3469 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003470 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003471 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003472 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003473 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003474 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003475 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003476 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3477 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003478 return UnknownDistro;
3479 }
3480
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003481 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003482 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003483
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003484 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003485 return Exherbo;
3486
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003487 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003488 return ArchLinux;
3489
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003490 return UnknownDistro;
3491}
3492
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003493/// \brief Get our best guess at the multiarch triple for a target.
3494///
3495/// Debian-based systems are starting to use a multiarch setup where they use
3496/// a target-triple directory in the library and header search paths.
3497/// Unfortunately, this triple does not align with the vanilla target triple,
3498/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003499static std::string getMultiarchTriple(const Driver &D,
3500 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003501 StringRef SysRoot) {
Eric Christopherefef8ef2015-12-07 22:43:05 +00003502 llvm::Triple::EnvironmentType TargetEnvironment =
3503 TargetTriple.getEnvironment();
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003504
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003505 // For most architectures, just use whatever we have rather than trying to be
3506 // clever.
3507 switch (TargetTriple.getArch()) {
3508 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003509 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003510
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003511 // We use the existence of '/lib/<triple>' as a directory to detect some
3512 // common linux triples that don't quite match the Clang triple for both
3513 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3514 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003515 case llvm::Triple::arm:
3516 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003517 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003518 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003519 return "arm-linux-gnueabihf";
3520 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003521 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003522 return "arm-linux-gnueabi";
3523 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003524 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003525 case llvm::Triple::armeb:
3526 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003527 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003528 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003529 return "armeb-linux-gnueabihf";
3530 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003531 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003532 return "armeb-linux-gnueabi";
3533 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003534 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003535 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003536 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003537 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003538 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003539 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003540 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003541 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003542 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003543 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003544 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003545 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003546 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003547 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003548 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003549 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003550 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003551 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003552 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003553 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003554 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003555 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003556 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003557 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003558 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003559 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003560 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003561 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003562 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003563 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003564 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003565 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003566 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003567 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003568 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003569 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003570 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003571 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003572 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003573 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003574 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003575 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003576 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003577 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003578 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003579 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003580 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003581 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003582 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003583 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003584 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003585 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003586 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003587 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003588 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003589 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003590 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003591 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003592 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003593 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003594 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003595 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003596 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003597 return "s390x-linux-gnu";
3598 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003599 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003600 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003601}
3602
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003603static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003604 if (isMipsArch(Triple.getArch())) {
3605 // lib32 directory has a special meaning on MIPS targets.
3606 // It contains N32 ABI binaries. Use this folder if produce
3607 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003608 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003609 return "lib32";
3610 return Triple.isArch32Bit() ? "lib" : "lib64";
3611 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003612
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003613 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003614 // using that variant while targeting other architectures causes problems
3615 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003616 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003617 // them when we know we may need it.
3618 //
3619 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003620 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003621 // GCCInstallationDetector, but that is a more significant refactoring.
3622 if (Triple.getArch() == llvm::Triple::x86 ||
3623 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003624 return "lib32";
3625
Zinovy Nis1db95732014-07-10 15:27:19 +00003626 if (Triple.getArch() == llvm::Triple::x86_64 &&
3627 Triple.getEnvironment() == llvm::Triple::GNUX32)
3628 return "libx32";
3629
Simon Atanasyand4413882012-09-14 11:27:24 +00003630 return Triple.isArch32Bit() ? "lib" : "lib64";
3631}
3632
Rafael Espindola1af7c212012-02-19 01:38:32 +00003633Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003634 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003635 GCCInstallation.init(Triple, Args);
3636 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003637 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003638 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003639 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003640
Rafael Espindola10a63c22013-07-03 14:14:00 +00003641 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003642 // least) put various tools in a triple-prefixed directory off of the parent
3643 // of the GCC installation. We use the GCC triple here to ensure that we end
3644 // up with tools that support the same amount of cross compiling as the
3645 // detected GCC installation. For example, if we find a GCC installation
3646 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3647 // used to target i386.
3648 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003649 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003650 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003651 GCCInstallation.getTriple().str() + "/bin")
3652 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003653
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003654 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003655
Rafael Espindola10a63c22013-07-03 14:14:00 +00003656 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003657 ExtraOpts.push_back("-z");
3658 ExtraOpts.push_back("relro");
3659 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003660
Douglas Gregord9bb1522011-03-06 19:11:49 +00003661 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003662 ExtraOpts.push_back("-X");
3663
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003664 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003665 const bool IsMips = isMipsArch(Arch);
3666
3667 if (IsMips && !SysRoot.empty())
3668 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003669
Chandler Carruth0b842912011-12-09 04:45:18 +00003670 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3671 // and the MIPS ABI require .dynsym to be sorted in different ways.
3672 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3673 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003674 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003675 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003676 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003677 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003678 ExtraOpts.push_back("--hash-style=gnu");
3679
Rafael Espindola10a63c22013-07-03 14:14:00 +00003680 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003681 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3682 ExtraOpts.push_back("--hash-style=both");
3683 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003684
Chris Lattner84e38552011-05-22 05:36:06 +00003685 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003686 ExtraOpts.push_back("--no-add-needed");
3687
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003688 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003689 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003690 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003691 ExtraOpts.push_back("--build-id");
3692
Rafael Espindola10a63c22013-07-03 14:14:00 +00003693 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003694 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003695
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003696 // The selection of paths to try here is designed to match the patterns which
3697 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3698 // This was determined by running GCC in a fake filesystem, creating all
3699 // possible permutations of these directories, and seeing which ones it added
3700 // to the link paths.
3701 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003702
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003703 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003704 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003705
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003706 // Add the multilib suffixed paths where they are available.
3707 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003708 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003709 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003710 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003711
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003712 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003713 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003714 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003715 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003716
3717 // GCC cross compiling toolchains will install target libraries which ship
3718 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3719 // any part of the GCC installation in
3720 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3721 // debatable, but is the reality today. We need to search this tree even
3722 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003723 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003724 // installation that is *not* within the system root to ensure two things:
3725 //
3726 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003727 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003728 // appropriate rpath.
3729 // 2) There must not be libraries installed into
3730 // <prefix>/<triple>/<libdir> unless they should be preferred over
3731 // those within the system root.
3732 //
3733 // Note that this matches the GCC behavior. See the below comment for where
3734 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003735 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
3736 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003737 Paths);
3738
Chandler Carruth69a125b2012-04-06 16:32:06 +00003739 // If the GCC installation we found is inside of the sysroot, we want to
3740 // prefer libraries installed in the parent prefix of the GCC installation.
3741 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003742 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003743 // This usually happens when there is an external cross compiler on the
3744 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003745 // the cross. Note that GCC does include some of these directories in some
3746 // configurations but this seems somewhere between questionable and simply
3747 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003748 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003749 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
3750 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003751 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003752 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003753
3754 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003755 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003756 // those searched.
3757 // FIXME: It's not clear whether we should use the driver's installed
3758 // directory ('Dir' below) or the ResourceDir.
3759 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003760 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
3761 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003762 }
3763
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003764 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
3765 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
3766 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3767 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003768
Chandler Carruthb427c562013-06-22 11:35:51 +00003769 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003770 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003771 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003772 addPathIfExists(D,
3773 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003774 "/../../" + OSLibDir,
3775 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003776
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003777 // Add the 'other' biarch variant path
3778 Multilib BiarchSibling;
3779 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003780 addPathIfExists(D, GCCInstallation.getInstallPath() +
3781 BiarchSibling.gccSuffix(),
3782 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003783 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003784
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003785 // See comments above on the multilib variant for details of why this is
3786 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003787 const std::string &LibPath = GCCInstallation.getParentLibPath();
3788 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3789 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003790 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
3791 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003792 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003793
3794 // See comments above on the multilib variant for details of why this is
3795 // only included from within the sysroot.
3796 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003797 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003798 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003799
3800 // Similar to the logic for GCC above, if we are currently running Clang
3801 // inside of the requested system root, add its parent library path to those
3802 // searched.
3803 // FIXME: It's not clear whether we should use the driver's installed
3804 // directory ('Dir' below) or the ResourceDir.
3805 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003806 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003807
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003808 addPathIfExists(D, SysRoot + "/lib", Paths);
3809 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003810}
3811
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003812bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003813
Douglas Katzman95354292015-06-23 20:42:09 +00003814Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003815
3816Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003817 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003818}
3819
Simon Atanasyana0d89572013-10-05 14:37:55 +00003820std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003821 if (!getDriver().SysRoot.empty())
3822 return getDriver().SysRoot;
3823
3824 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3825 return std::string();
3826
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003827 // Standalone MIPS toolchains use different names for sysroot folder
3828 // and put it into different places. Here we try to check some known
3829 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003830
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003831 const StringRef InstallDir = GCCInstallation.getInstallPath();
3832 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003833 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003834
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003835 std::string Path =
3836 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3837 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003838
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003839 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003840 return Path;
3841
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003842 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003843
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003844 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003845 return Path;
3846
3847 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003848}
3849
Chandler Carrutha796f532011-11-05 20:17:13 +00003850void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3851 ArgStringList &CC1Args) const {
3852 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003853 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003854
3855 if (DriverArgs.hasArg(options::OPT_nostdinc))
3856 return;
3857
3858 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003859 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003860
3861 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003862 SmallString<128> P(D.ResourceDir);
3863 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003864 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003865 }
3866
3867 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3868 return;
3869
3870 // Check for configure-time C include directories.
3871 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3872 if (CIncludeDirs != "") {
3873 SmallVector<StringRef, 5> dirs;
3874 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003875 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003876 StringRef Prefix =
3877 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003878 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003879 }
3880 return;
3881 }
3882
3883 // Lacking those, try to detect the correct set of system includes for the
3884 // target triple.
3885
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003886 // Add include directories specific to the selected multilib set and multilib.
3887 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003888 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003889 if (Callback) {
3890 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3891 GCCInstallation.getTriple().str(),
3892 GCCInstallation.getMultilib());
3893 for (const auto &Path : IncludePaths)
3894 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3895 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003896 }
3897
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003898 // Implement generic Debian multiarch support.
3899 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003900 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003901
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003902 // FIXME: These are older forms of multiarch. It's not clear that they're
3903 // in use in any released version of Debian, so we should consider
3904 // removing them.
3905 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003906 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003907 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003908
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003909 // FIXME: These are older forms of multiarch. It's not clear that they're
3910 // in use in any released version of Debian, so we should consider
3911 // removing them.
3912 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3913 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003914 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003915 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003916 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003917 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003918 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003919 "/usr/include/arm-linux-gnueabihf"};
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00003920 const StringRef ARMEBMultiarchIncludeDirs[] = {
3921 "/usr/include/armeb-linux-gnueabi"};
3922 const StringRef ARMEBHFMultiarchIncludeDirs[] = {
3923 "/usr/include/armeb-linux-gnueabihf"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003924 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003925 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003926 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003927 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003928 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003929 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003930 "/usr/include/mips64el-linux-gnu",
3931 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003932 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003933 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003934 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003935 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003936 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003937 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003938 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003939 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003940 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003941 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003942 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
3943 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003944 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003945 switch (getTriple().getArch()) {
3946 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003947 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003948 break;
3949 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003950 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003951 break;
3952 case llvm::Triple::aarch64:
3953 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003954 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003955 break;
3956 case llvm::Triple::arm:
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00003957 case llvm::Triple::thumb:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003958 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3959 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3960 else
3961 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003962 break;
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00003963 case llvm::Triple::armeb:
3964 case llvm::Triple::thumbeb:
3965 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3966 MultiarchIncludeDirs = ARMEBHFMultiarchIncludeDirs;
3967 else
3968 MultiarchIncludeDirs = ARMEBMultiarchIncludeDirs;
3969 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003970 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00003971 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003972 break;
3973 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00003974 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003975 break;
3976 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003977 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003978 break;
3979 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003980 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003981 break;
3982 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003983 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003984 break;
3985 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003986 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003987 break;
3988 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003989 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003990 break;
3991 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00003992 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003993 break;
3994 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00003995 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003996 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003997 case llvm::Triple::systemz:
3998 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
3999 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004000 default:
4001 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004002 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004003 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004004 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004005 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004006 break;
4007 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004008 }
4009
4010 if (getTriple().getOS() == llvm::Triple::RTEMS)
4011 return;
4012
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004013 // Add an include of '/include' directly. This isn't provided by default by
4014 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
4015 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004016 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004017
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004018 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004019}
4020
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004021
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004022static std::string DetectLibcxxIncludePath(StringRef base) {
4023 std::error_code EC;
4024 int MaxVersion = 0;
4025 std::string MaxVersionString = "";
4026 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
4027 LI = LI.increment(EC)) {
4028 StringRef VersionText = llvm::sys::path::filename(LI->path());
4029 int Version;
4030 if (VersionText[0] == 'v' &&
4031 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
4032 if (Version > MaxVersion) {
4033 MaxVersion = Version;
4034 MaxVersionString = VersionText;
4035 }
4036 }
4037 }
4038 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
4039}
4040
Chandler Carrutha796f532011-11-05 20:17:13 +00004041void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4042 ArgStringList &CC1Args) const {
4043 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4044 DriverArgs.hasArg(options::OPT_nostdincxx))
4045 return;
4046
Chandler Carruthf4701732011-11-07 09:01:17 +00004047 // Check if libc++ has been enabled and provide its include paths if so.
4048 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004049 const std::string LibCXXIncludePathCandidates[] = {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004050 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004051
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004052 // We also check the system as for a long time this is the only place
4053 // Clang looked.
4054 // FIXME: We should really remove this. It doesn't make any sense.
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004055 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++")};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004056 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004057 if (IncludePath.empty() || !getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004058 continue;
4059 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004060 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004061 break;
4062 }
Chandler Carruthf4701732011-11-07 09:01:17 +00004063 return;
4064 }
4065
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00004066 // We need a detected GCC installation on Linux to provide libstdc++'s
4067 // headers. We handled the libc++ case above.
4068 if (!GCCInstallation.isValid())
4069 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00004070
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004071 // By default, look for the C++ headers in an include directory adjacent to
4072 // the lib directory of the GCC installation. Note that this is expect to be
4073 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
4074 StringRef LibDir = GCCInstallation.getParentLibPath();
4075 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004076 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004077 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004078 const std::string GCCMultiarchTriple = getMultiarchTriple(
4079 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004080 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004081 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00004082 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004083
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004084 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00004085 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004086 "/c++/" + Version.Text, TripleStr,
4087 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004088 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004089 return;
4090
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004091 // Otherwise, fall back on a bunch of options which don't use multiarch
4092 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004093 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004094 // Gentoo is weird and places its headers inside the GCC install,
4095 // so if the first attempt to find the headers fails, try these patterns.
4096 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
4097 Version.MinorStr,
4098 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
4099 // Android standalone toolchain has C++ headers in yet another place.
4100 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4101 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
4102 // without a subdirectory corresponding to the gcc version.
4103 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004104 };
4105
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004106 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004107 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
4108 /*GCCMultiarchTriple*/ "",
4109 /*TargetMultiarchTriple*/ "",
4110 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004111 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004112 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004113}
4114
Artem Belevichfa11ab52015-11-17 22:28:46 +00004115void Linux::AddCudaIncludeArgs(const ArgList &DriverArgs,
4116 ArgStringList &CC1Args) const {
4117 if (DriverArgs.hasArg(options::OPT_nocudainc))
4118 return;
4119
Artem Belevich86017332015-11-17 22:28:55 +00004120 if (CudaInstallation.isValid()) {
Artem Belevichfa11ab52015-11-17 22:28:46 +00004121 addSystemInclude(DriverArgs, CC1Args, CudaInstallation.getIncludePath());
Artem Belevich86017332015-11-17 22:28:55 +00004122 CC1Args.push_back("-include");
Artem Belevich7fda3c92015-12-16 18:51:59 +00004123 CC1Args.push_back("__clang_cuda_runtime_wrapper.h");
Artem Belevich86017332015-11-17 22:28:55 +00004124 }
Artem Belevichfa11ab52015-11-17 22:28:46 +00004125}
4126
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004127bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004128
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004129SanitizerMask Linux::getSupportedSanitizers() const {
4130 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
4131 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
4132 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
4133 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00004134 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
4135 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004136 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
4137 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004138 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4139 Res |= SanitizerKind::Address;
4140 Res |= SanitizerKind::KernelAddress;
4141 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00004142 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004143 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004144 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00004145 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004146 Res |= SanitizerKind::Leak;
Bill Schmidt4b8841a2015-12-08 22:48:02 +00004147 if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004148 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00004149 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00004150 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004151 if (IsX86 || IsX86_64) {
4152 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004153 }
4154 return Res;
4155}
4156
Xinliang David Li170cd102015-10-27 05:15:35 +00004157void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
4158 llvm::opt::ArgStringList &CmdArgs) const {
4159 if (!needsProfileRT(Args)) return;
4160
4161 // Add linker option -u__llvm_runtime_variable to cause runtime
4162 // initialization module to be linked in.
4163 if (!Args.hasArg(options::OPT_coverage))
4164 CmdArgs.push_back(Args.MakeArgString(
4165 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
4166 ToolChain::addProfileRTLibs(Args, CmdArgs);
4167}
4168
Daniel Dunbarcc912342009-05-02 18:28:39 +00004169/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
4170
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004171DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
4172 const ArgList &Args)
4173 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00004174
4175 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00004176 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00004177 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00004178 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004179
Daniel Dunbar083edf72009-12-21 18:54:17 +00004180 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004181 getFilePaths().push_back("/usr/lib");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00004182 getFilePaths().push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004183}
4184
Rafael Espindola7cf32212013-03-20 03:05:54 +00004185Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004186 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004187}
4188
4189Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004190 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004191}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004192
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004193/// CUDA toolchain. Our assembler is ptxas, and our "linker" is fatbinary,
4194/// which isn't properly a linker but nonetheless performs the step of stitching
4195/// together object files from the assembler into a single blob.
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004196
4197CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4198 const ArgList &Args)
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004199 : Linux(D, Triple, Args) {
4200 if (CudaInstallation.isValid())
4201 getProgramPaths().push_back(CudaInstallation.getBinPath());
4202}
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004203
4204void
4205CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4206 llvm::opt::ArgStringList &CC1Args) const {
4207 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4208 CC1Args.push_back("-fcuda-is-device");
Artem Belevich34f481a2015-11-17 22:28:50 +00004209
4210 if (DriverArgs.hasArg(options::OPT_nocudalib))
4211 return;
4212
4213 std::string LibDeviceFile = CudaInstallation.getLibDeviceFile(
4214 DriverArgs.getLastArgValue(options::OPT_march_EQ));
4215 if (!LibDeviceFile.empty()) {
4216 CC1Args.push_back("-mlink-cuda-bitcode");
4217 CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
4218
4219 // Libdevice in CUDA-7.0 requires PTX version that's more recent
4220 // than LLVM defaults to. Use PTX4.2 which is the PTX version that
4221 // came with CUDA-7.0.
4222 CC1Args.push_back("-target-feature");
4223 CC1Args.push_back("+ptx42");
4224 }
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004225}
4226
4227llvm::opt::DerivedArgList *
4228CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
4229 const char *BoundArch) const {
4230 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
4231 const OptTable &Opts = getDriver().getOpts();
4232
4233 for (Arg *A : Args) {
4234 if (A->getOption().matches(options::OPT_Xarch__)) {
4235 // Skip this argument unless the architecture matches BoundArch
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004236 if (!BoundArch || A->getValue(0) != StringRef(BoundArch))
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004237 continue;
4238
4239 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
4240 unsigned Prev = Index;
4241 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
4242
4243 // If the argument parsing failed or more than one argument was
4244 // consumed, the -Xarch_ argument's parameter tried to consume
4245 // extra arguments. Emit an error and ignore.
4246 //
4247 // We also want to disallow any options which would alter the
4248 // driver behavior; that isn't going to work in our model. We
4249 // use isDriverOption() as an approximation, although things
4250 // like -O4 are going to slip through.
4251 if (!XarchArg || Index > Prev + 1) {
4252 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
4253 << A->getAsString(Args);
4254 continue;
4255 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
4256 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
4257 << A->getAsString(Args);
4258 continue;
4259 }
4260 XarchArg->setBaseArg(A);
4261 A = XarchArg.release();
4262 DAL->AddSynthesizedArg(A);
4263 }
4264 DAL->append(A);
4265 }
4266
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004267 if (BoundArch)
4268 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004269 return DAL;
4270}
4271
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004272Tool *CudaToolChain::buildAssembler() const {
4273 return new tools::NVPTX::Assembler(*this);
4274}
4275
4276Tool *CudaToolChain::buildLinker() const {
4277 return new tools::NVPTX::Linker(*this);
4278}
4279
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004280/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00004281XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
4282 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004283 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004284 // ProgramPaths are found via 'PATH' environment variable.
4285}
4286
Douglas Katzman54366072015-07-27 16:53:08 +00004287Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004288 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004289}
4290
Douglas Katzman54366072015-07-27 16:53:08 +00004291Tool *XCoreToolChain::buildLinker() const {
4292 return new tools::XCore::Linker(*this);
4293}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004294
Douglas Katzman54366072015-07-27 16:53:08 +00004295bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004296
Douglas Katzman54366072015-07-27 16:53:08 +00004297bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004298
Douglas Katzman54366072015-07-27 16:53:08 +00004299bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004300
Douglas Katzman54366072015-07-27 16:53:08 +00004301bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004302
Douglas Katzman54366072015-07-27 16:53:08 +00004303bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004304
Douglas Katzman54366072015-07-27 16:53:08 +00004305void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4306 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004307 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
4308 DriverArgs.hasArg(options::OPT_nostdlibinc))
4309 return;
4310 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
4311 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004312 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004313 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4314 ArrayRef<StringRef> DirVec(Dirs);
4315 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4316 }
4317}
4318
Douglas Katzman54366072015-07-27 16:53:08 +00004319void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
4320 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004321 CC1Args.push_back("-nostdsysteminc");
4322}
4323
Douglas Katzman54366072015-07-27 16:53:08 +00004324void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
4325 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004326 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00004327 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4328 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004329 return;
4330 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
4331 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004332 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004333 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4334 ArrayRef<StringRef> DirVec(Dirs);
4335 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4336 }
4337}
4338
Douglas Katzman54366072015-07-27 16:53:08 +00004339void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
4340 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004341 // We don't output any lib args. This is handled by xcc.
4342}
Douglas Katzman84a75642015-06-19 14:55:19 +00004343
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004344MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
4345 const ArgList &Args)
4346 : Generic_GCC(D, Triple, Args) {
4347 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
4348 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
4349 // This won't work to find gcc. Instead we give the installation detector an
4350 // extra triple, which is preferable to further hacks of the logic that at
4351 // present is based solely on getArch(). In particular, it would be wrong to
4352 // choose the myriad installation when targeting a non-myriad sparc install.
4353 switch (Triple.getArch()) {
4354 default:
Eric Christopherefef8ef2015-12-07 22:43:05 +00004355 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
4356 << "myriad";
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004357 case llvm::Triple::sparc:
4358 case llvm::Triple::sparcel:
4359 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004360 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004361 }
Douglas Katzman674a3122015-11-18 16:24:46 +00004362
4363 if (GCCInstallation.isValid()) {
4364 // The contents of LibDir are independent of the version of gcc.
4365 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4366 SmallString<128> LibDir(GCCInstallation.getParentLibPath());
4367 if (Triple.getArch() == llvm::Triple::sparcel)
4368 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib/le");
4369 else
4370 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib");
4371 addPathIfExists(D, LibDir, getFilePaths());
4372
4373 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4374 // These files are tied to a particular version of gcc.
4375 SmallString<128> CompilerSupportDir(GCCInstallation.getInstallPath());
4376 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4377 // but as this toolchain is for LEON sparc, it can assume FPU.
4378 if (Triple.getArch() == llvm::Triple::sparcel)
4379 llvm::sys::path::append(CompilerSupportDir, "le");
4380 addPathIfExists(D, CompilerSupportDir, getFilePaths());
4381 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004382}
4383
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00004384MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004385
Douglas Katzmanb1278f32015-09-17 21:20:16 +00004386void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4387 ArgStringList &CC1Args) const {
4388 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4389 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4390}
4391
Eric Christopherefef8ef2015-12-07 22:43:05 +00004392void MyriadToolChain::AddClangCXXStdlibIncludeArgs(
4393 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
James Y Knighta6c9ee72015-10-16 18:46:26 +00004394 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4395 DriverArgs.hasArg(options::OPT_nostdincxx))
4396 return;
4397
4398 // Only libstdc++, for now.
4399 StringRef LibDir = GCCInstallation.getParentLibPath();
4400 const GCCVersion &Version = GCCInstallation.getVersion();
4401 StringRef TripleStr = GCCInstallation.getTriple().str();
4402 const Multilib &Multilib = GCCInstallation.getMultilib();
4403
Eric Christopherefef8ef2015-12-07 22:43:05 +00004404 addLibStdCXXIncludePaths(
4405 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4406 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
James Y Knighta6c9ee72015-10-16 18:46:26 +00004407}
4408
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004409// MyriadToolChain handles several triples:
4410// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
4411Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4412 // The inherited method works fine if not targeting the SHAVE.
4413 if (!isShaveCompilation(getTriple()))
4414 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004415 switch (JA.getKind()) {
Douglas Katzman9dc4c622015-11-20 04:58:12 +00004416 case Action::PreprocessJobClass:
Douglas Katzman84a75642015-06-19 14:55:19 +00004417 case Action::CompileJobClass:
4418 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004419 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004420 return Compiler.get();
4421 case Action::AssembleJobClass:
4422 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004423 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004424 return Assembler.get();
4425 default:
4426 return ToolChain::getTool(JA.getKind());
4427 }
4428}
4429
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004430Tool *MyriadToolChain::buildLinker() const {
4431 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004432}
Dan Gohmanc2853072015-09-03 22:51:53 +00004433
Dan Gohman52816862015-12-16 23:30:41 +00004434WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple,
4435 const llvm::opt::ArgList &Args)
4436 : ToolChain(D, Triple, Args) {
4437 // Use LLD by default.
4438 DefaultLinker = "lld";
4439}
4440
Dan Gohmanc2853072015-09-03 22:51:53 +00004441bool WebAssembly::IsMathErrnoDefault() const { return false; }
4442
4443bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4444
4445bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4446
4447bool WebAssembly::isPICDefault() const { return false; }
4448
4449bool WebAssembly::isPIEDefault() const { return false; }
4450
4451bool WebAssembly::isPICDefaultForced() const { return false; }
4452
4453bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4454
4455// TODO: Support Objective C stuff.
4456bool WebAssembly::SupportsObjCGC() const { return false; }
4457
4458bool WebAssembly::hasBlocksRuntime() const { return false; }
4459
4460// TODO: Support profiling.
4461bool WebAssembly::SupportsProfiling() const { return false; }
4462
Dan Gohman52816862015-12-16 23:30:41 +00004463bool WebAssembly::HasNativeLLVMSupport() const { return true; }
4464
Dan Gohmanc2853072015-09-03 22:51:53 +00004465void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4466 ArgStringList &CC1Args) const {
4467 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4468 options::OPT_fno_use_init_array, true))
4469 CC1Args.push_back("-fuse-init-array");
4470}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004471
Dan Gohman6ad8f612016-01-14 16:00:13 +00004472ToolChain::RuntimeLibType WebAssembly::GetDefaultRuntimeLibType() const {
4473 return ToolChain::RLT_CompilerRT;
4474}
4475
4476ToolChain::CXXStdlibType WebAssembly::GetCXXStdlibType(const ArgList &Args) const {
4477 return ToolChain::CST_Libcxx;
4478}
4479
4480void WebAssembly::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4481 ArgStringList &CC1Args) const {
4482 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4483 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4484}
4485
4486void WebAssembly::AddClangCXXStdlibIncludeArgs(
4487 const llvm::opt::ArgList &DriverArgs,
4488 llvm::opt::ArgStringList &CC1Args) const {
4489 if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
4490 !DriverArgs.hasArg(options::OPT_nostdincxx))
4491 addSystemInclude(DriverArgs, CC1Args,
4492 getDriver().SysRoot + "/include/c++/v1");
4493}
4494
Dan Gohman52816862015-12-16 23:30:41 +00004495Tool *WebAssembly::buildLinker() const {
4496 return new tools::wasm::Linker(*this);
4497}
4498
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004499PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4500 : Generic_ELF(D, Triple, Args) {
4501 if (Args.hasArg(options::OPT_static))
4502 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4503
4504 // Determine where to find the PS4 libraries. We use SCE_PS4_SDK_DIR
4505 // if it exists; otherwise use the driver's installation path, which
4506 // should be <SDK_DIR>/host_tools/bin.
4507
4508 SmallString<512> PS4SDKDir;
4509 if (const char *EnvValue = getenv("SCE_PS4_SDK_DIR")) {
4510 if (!llvm::sys::fs::exists(EnvValue))
4511 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4512 PS4SDKDir = EnvValue;
4513 } else {
4514 PS4SDKDir = getDriver().Dir;
4515 llvm::sys::path::append(PS4SDKDir, "/../../");
Eric Christopherefef8ef2015-12-07 22:43:05 +00004516 }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004517
Eric Christopherefef8ef2015-12-07 22:43:05 +00004518 // By default, the driver won't report a warning if it can't find
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004519 // PS4's include or lib directories. This behavior could be changed if
Eric Christopherefef8ef2015-12-07 22:43:05 +00004520 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004521 // If -isysroot was passed, use that as the SDK base path.
4522 std::string PrefixDir;
4523 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4524 PrefixDir = A->getValue();
4525 if (!llvm::sys::fs::exists(PrefixDir))
4526 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4527 } else
4528 PrefixDir = PS4SDKDir.str();
4529
4530 SmallString<512> PS4SDKIncludeDir(PrefixDir);
4531 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4532 if (!Args.hasArg(options::OPT_nostdinc) &&
4533 !Args.hasArg(options::OPT_nostdlibinc) &&
4534 !Args.hasArg(options::OPT_isysroot) &&
4535 !Args.hasArg(options::OPT__sysroot_EQ) &&
4536 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4537 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4538 << "PS4 system headers" << PS4SDKIncludeDir;
4539 }
4540
4541 SmallString<512> PS4SDKLibDir(PS4SDKDir);
4542 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4543 if (!Args.hasArg(options::OPT_nostdlib) &&
4544 !Args.hasArg(options::OPT_nodefaultlibs) &&
4545 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
4546 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
4547 !Args.hasArg(options::OPT_emit_ast) &&
4548 !llvm::sys::fs::exists(PS4SDKLibDir)) {
4549 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4550 << "PS4 system libraries" << PS4SDKLibDir;
4551 return;
4552 }
4553 getFilePaths().push_back(PS4SDKLibDir.str());
4554}
4555
4556Tool *PS4CPU::buildAssembler() const {
4557 return new tools::PS4cpu::Assemble(*this);
4558}
4559
4560Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
4561
4562bool PS4CPU::isPICDefault() const { return true; }
4563
4564bool PS4CPU::HasNativeLLVMSupport() const { return true; }
4565
4566SanitizerMask PS4CPU::getSupportedSanitizers() const {
4567 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4568 Res |= SanitizerKind::Address;
4569 Res |= SanitizerKind::Vptr;
4570 return Res;
4571}